From de87836c7a710507948a339bc8949e541bbc505f Mon Sep 17 00:00:00 2001 From: zhangshuai39 Date: Fri, 4 Jul 2025 11:28:52 +0800 Subject: [PATCH] netpkt: Add parameters to support specific network cards Supports sending and receiving data packets on specified interfaces. Signed-off-by: zhangshuai39 --- examples/netpkt/netpkt_main.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/examples/netpkt/netpkt_main.c b/examples/netpkt/netpkt_main.c index 5f9aec81f..ab0595be4 100644 --- a/examples/netpkt/netpkt_main.c +++ b/examples/netpkt/netpkt_main.c @@ -29,7 +29,10 @@ #include #include #include +#include +#include #include +#include /**************************************************************************** * 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 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) {