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
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