Skip to content

Commit de87836

Browse files
zs39xiaoxiang781216
authored andcommitted
netpkt: Add parameters to support specific network cards
Supports sending and receiving data packets on specified interfaces. Signed-off-by: zhangshuai39 <zhangshuai39@xiaomi.com>
1 parent 4b3070c commit de87836

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

examples/netpkt/netpkt_main.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929
#include <string.h>
3030
#include <sys/socket.h>
3131
#include <unistd.h>
32+
#include <netinet/if_ether.h>
33+
#include <netinet/in.h>
3234
#include <netpacket/packet.h>
35+
#include <net/if.h>
3336

3437
/****************************************************************************
3538
* Private Functions
@@ -39,11 +42,17 @@
3942
* Name: psock_create
4043
****************************************************************************/
4144

42-
static int psock_create(void)
45+
static int psock_create(const char *ifname)
4346
{
4447
int sd;
4548
struct sockaddr_ll addr;
4649
int addrlen = sizeof(addr);
50+
unsigned int ifindex = 0;
51+
52+
if (ifname && ifname[0])
53+
{
54+
ifindex = if_nametoindex(ifname);
55+
}
4756

4857
sd = socket(AF_PACKET, SOCK_RAW, 0);
4958
if (sd < 0)
@@ -55,7 +64,8 @@ static int psock_create(void)
5564
/* Prepare sockaddr struct */
5665

5766
addr.sll_family = AF_PACKET;
58-
addr.sll_ifindex = 0;
67+
addr.sll_ifindex = ifindex;
68+
addr.sll_protocol = htons(ETH_P_ALL);
5969
if (bind(sd, (const struct sockaddr *)&addr, addrlen) < 0)
6070
{
6171
perror("ERROR: binding socket failed");
@@ -105,6 +115,7 @@ static void netpkt_usage(void)
105115
printf(" -r receive\n");
106116
printf(" -t transmit\n");
107117
printf(" -v verbose\n");
118+
printf(" -i <IF> specify interface name (e.g. eth0)\n");
108119
printf("\n");
109120
}
110121

@@ -116,7 +127,7 @@ static void netpkt_usage(void)
116127
* Name: netpkt_main
117128
****************************************************************************/
118129

119-
int main(int argc, FAR char *argv[])
130+
int main(int argc, char *argv[])
120131
{
121132
int sd;
122133
int i;
@@ -140,6 +151,9 @@ int main(int argc, FAR char *argv[])
140151
int do_rxtimes = 3;
141152
int do_tx = 0;
142153
int do_txtimes = 3;
154+
char ifname[IFNAMSIZ];
155+
156+
memset(ifname, 0, sizeof(ifname));
143157

144158
if (argc == 1)
145159
{
@@ -149,7 +163,7 @@ int main(int argc, FAR char *argv[])
149163

150164
/* Parse arguments */
151165

152-
while ((opt = getopt(argc, argv, "artv")) != -1)
166+
while ((opt = getopt(argc, argv, "artvi:")) != -1)
153167
{
154168
switch (opt)
155169
{
@@ -170,13 +184,17 @@ int main(int argc, FAR char *argv[])
170184
verbose = 1;
171185
break;
172186

187+
case 'i':
188+
strlcpy(ifname, optarg, sizeof(ifname));
189+
break;
190+
173191
default:
174192
netpkt_usage();
175193
return -1;
176194
}
177195
}
178196

179-
sd = psock_create();
197+
sd = psock_create(ifname);
180198

181199
if (do_tx)
182200
{

0 commit comments

Comments
 (0)