mirror of
https://github.com/apache/nuttx-apps.git
synced 2026-08-01 20:29:00 +00:00
netpkt: Add parameters to support specific network cards
Supports sending and receiving data packets on specified interfaces. Signed-off-by: zhangshuai39 <zhangshuai39@xiaomi.com>
This commit is contained in:
parent
4b3070c081
commit
de87836c7a
1 changed files with 23 additions and 5 deletions
|
|
@ -29,7 +29,10 @@
|
|||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netpacket/packet.h>
|
||||
#include <net/if.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
|
|
@ -39,11 +42,17 @@
|
|||
* Name: psock_create
|
||||
****************************************************************************/
|
||||
|
||||
static int psock_create(void)
|
||||
static int psock_create(const char *ifname)
|
||||
{
|
||||
int sd;
|
||||
struct sockaddr_ll addr;
|
||||
int addrlen = sizeof(addr);
|
||||
unsigned int ifindex = 0;
|
||||
|
||||
if (ifname && ifname[0])
|
||||
{
|
||||
ifindex = if_nametoindex(ifname);
|
||||
}
|
||||
|
||||
sd = socket(AF_PACKET, SOCK_RAW, 0);
|
||||
if (sd < 0)
|
||||
|
|
@ -55,7 +64,8 @@ static int psock_create(void)
|
|||
/* Prepare sockaddr struct */
|
||||
|
||||
addr.sll_family = AF_PACKET;
|
||||
addr.sll_ifindex = 0;
|
||||
addr.sll_ifindex = ifindex;
|
||||
addr.sll_protocol = htons(ETH_P_ALL);
|
||||
if (bind(sd, (const struct sockaddr *)&addr, addrlen) < 0)
|
||||
{
|
||||
perror("ERROR: binding socket failed");
|
||||
|
|
@ -105,6 +115,7 @@ static void netpkt_usage(void)
|
|||
printf(" -r receive\n");
|
||||
printf(" -t transmit\n");
|
||||
printf(" -v verbose\n");
|
||||
printf(" -i <IF> specify interface name (e.g. eth0)\n");
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
|
@ -116,7 +127,7 @@ static void netpkt_usage(void)
|
|||
* Name: netpkt_main
|
||||
****************************************************************************/
|
||||
|
||||
int main(int argc, FAR char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int sd;
|
||||
int i;
|
||||
|
|
@ -140,6 +151,9 @@ int main(int argc, FAR char *argv[])
|
|||
int do_rxtimes = 3;
|
||||
int do_tx = 0;
|
||||
int do_txtimes = 3;
|
||||
char ifname[IFNAMSIZ];
|
||||
|
||||
memset(ifname, 0, sizeof(ifname));
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
|
|
@ -149,7 +163,7 @@ int main(int argc, FAR char *argv[])
|
|||
|
||||
/* Parse arguments */
|
||||
|
||||
while ((opt = getopt(argc, argv, "artv")) != -1)
|
||||
while ((opt = getopt(argc, argv, "artvi:")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
|
|
@ -170,13 +184,17 @@ int main(int argc, FAR char *argv[])
|
|||
verbose = 1;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
strlcpy(ifname, optarg, sizeof(ifname));
|
||||
break;
|
||||
|
||||
default:
|
||||
netpkt_usage();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
sd = psock_create();
|
||||
sd = psock_create(ifname);
|
||||
|
||||
if (do_tx)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue