This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 74c71145d net/ethernet: ARP can be configured on interface
74c71145d is described below
commit 74c71145da7eacbcc5edad378171e95f008e5c4a
Author: gaohedong <[email protected]>
AuthorDate: Tue May 20 00:44:52 2025 +0800
net/ethernet: ARP can be configured on interface
ARP can be configured on interface
Signed-off-by: gaohedong <[email protected]>
---
include/netutils/netlib.h | 2 +
netutils/netlib/netlib_setifstatus.c | 114 +++++++++++++++++++++++++++++++++--
nshlib/nsh_netcmds.c | 37 ++++++++++++
3 files changed, 149 insertions(+), 4 deletions(-)
diff --git a/include/netutils/netlib.h b/include/netutils/netlib.h
index 9f8f744cd..07a66906c 100644
--- a/include/netutils/netlib.h
+++ b/include/netutils/netlib.h
@@ -477,6 +477,8 @@ void netlib_server(uint16_t portno, pthread_startroutine_t
handler,
int netlib_getifstatus(FAR const char *ifname, FAR uint8_t *flags);
int netlib_ifup(FAR const char *ifname);
int netlib_ifdown(FAR const char *ifname);
+int netlib_ifarp(const char *ifname);
+int netlib_ifnoarp(const char *ifname);
/* DNS server addressing */
diff --git a/netutils/netlib/netlib_setifstatus.c
b/netutils/netlib/netlib_setifstatus.c
index 8a3f58db1..d2f56dd8b 100644
--- a/netutils/netlib/netlib_setifstatus.c
+++ b/netutils/netlib/netlib_setifstatus.c
@@ -74,12 +74,16 @@ int netlib_ifup(const char *ifname)
/* Put the driver name into the request */
strlcpy(req.ifr_name, ifname, IFNAMSIZ);
+ ret = ioctl(sockfd, SIOCGIFFLAGS, (unsigned long)&req);
+ if (ret >= 0)
+ {
+ /* Perform the ioctl to ifup flag */
- /* Perform the ioctl to ifup flag */
+ IFF_SET_UP(req.ifr_flags);
- req.ifr_flags |= IFF_UP;
+ ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&req);
+ }
- ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&req);
close(sockfd);
}
}
@@ -108,6 +112,53 @@ int netlib_ifdown(const char *ifname)
{
/* Get a socket (only so that we get access to the INET subsystem) */
+ int sockfd = socket(NET_SOCK_FAMILY, NET_SOCK_TYPE, NET_SOCK_PROTOCOL);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+ memset(&req, 0, sizeof(struct ifreq));
+
+ /* Put the driver name into the request */
+
+ strlcpy(req.ifr_name, ifname, IFNAMSIZ);
+ ret = ioctl(sockfd, SIOCGIFFLAGS, (unsigned long)&req);
+ if (ret >= 0)
+ {
+ /* Perform the ioctl to ifdown flag */
+
+ IFF_CLR_UP(req.ifr_flags);
+
+ ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&req);
+ }
+
+ close(sockfd);
+ }
+ }
+
+ return ret;
+}
+
+/****************************************************************************
+ * Name: netlib_ifarp
+ *
+ * Description:
+ * Enable ARP learning capability on the interface
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ *
+ * Return:
+ * 0 on success; -1 on failure
+ *
+ ****************************************************************************/
+
+int netlib_ifarp(const char *ifname)
+{
+ int ret = ERROR;
+ if (ifname)
+ {
+ /* Get a socket (only so that we get access to the INET subsystem) */
+
int sockfd = socket(NET_SOCK_FAMILY, NET_SOCK_TYPE, NET_SOCK_PROTOCOL);
if (sockfd >= 0)
{
@@ -120,7 +171,62 @@ int netlib_ifdown(const char *ifname)
/* Perform the ioctl to ifup flag */
- ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&req);
+ ret = ioctl(sockfd, SIOCGIFFLAGS, (unsigned long)&req);
+ if (ret >= 0)
+ {
+ IFF_CLR_NOARP(req.ifr_flags);
+
+ ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&req);
+ }
+
+ close(sockfd);
+ }
+ }
+
+ return ret;
+}
+
+/****************************************************************************
+ * Name: netlib_ifnoarp
+ *
+ * Description:
+ * Disable ARP learning capability on the interface
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ *
+ * Return:
+ * 0 on success; -1 on failure
+ *
+ ****************************************************************************/
+
+int netlib_ifnoarp(const char *ifname)
+{
+ int ret = ERROR;
+ if (ifname)
+ {
+ /* Get a socket (only so that we get access to the INET subsystem) */
+
+ int sockfd = socket(NET_SOCK_FAMILY, NET_SOCK_TYPE, NET_SOCK_PROTOCOL);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+ memset(&req, 0, sizeof(struct ifreq));
+
+ /* Put the driver name into the request */
+
+ strlcpy(req.ifr_name, ifname, IFNAMSIZ);
+
+ /* Perform the ioctl to ifup flag */
+
+ ret = ioctl(sockfd, SIOCGIFFLAGS, (unsigned long)&req);
+ if (ret >= 0)
+ {
+ IFF_SET_NOARP(req.ifr_flags);
+
+ ret = ioctl(sockfd, SIOCSIFFLAGS, (unsigned long)&req);
+ }
+
close(sockfd);
}
}
diff --git a/nshlib/nsh_netcmds.c b/nshlib/nsh_netcmds.c
index 791e1c922..1b2c8efd7 100644
--- a/nshlib/nsh_netcmds.c
+++ b/nshlib/nsh_netcmds.c
@@ -142,6 +142,15 @@ struct tftpc_args_s
};
#endif
+#ifdef CONFIG_NET_ARP
+typedef enum
+{
+ ARP_DEFAULT, /* Did not set arp configure in the command */
+ ARP_ENABLE, /* Clean the NOARP flag for the interface to
enable the arp learning function */
+ ARP_DISABLE /* Set the NOARP flag for the interface to
disable the arp learning function */
+} arp_cfg_e;
+#endif
+
typedef int (*nsh_netdev_callback_t)(FAR struct nsh_vtbl_s *vtbl,
FAR char *devname);
@@ -575,6 +584,9 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, FAR
char **argv)
#endif
bool missingarg = true;
bool badarg = false;
+#ifdef CONFIG_NET_ARP
+ arp_cfg_e arpflag = ARP_DEFAULT;
+#endif
#ifdef HAVE_HWADDR
mac_addr_t macaddr;
#endif
@@ -742,6 +754,20 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc,
FAR char **argv)
badarg = true;
}
}
+#ifdef CONFIG_NET_ARP
+ else if (!strcmp(tmp, "arp"))
+ {
+ /* Enable arp function on interface */
+
+ arpflag = ARP_ENABLE;
+ }
+ else if (!strcmp(tmp, "-arp"))
+ {
+ /* Disable arp function on interface */
+
+ arpflag = ARP_DISABLE;
+ }
+#endif
else if (hostip == NULL && i <= 4)
{
/* Let first non-option be host ip, to support inet/inet6
@@ -1044,6 +1070,17 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc,
FAR char **argv)
}
#endif
+#ifdef CONFIG_NET_ARP
+ if (arpflag == ARP_ENABLE)
+ {
+ netlib_ifarp(ifname);
+ }
+ else if (arpflag == ARP_DISABLE)
+ {
+ netlib_ifnoarp(ifname);
+ }
+#endif
+
#if !defined(CONFIG_NET_IPv4) && !defined(CONFIG_NET_IPv6)
UNUSED(hostip);
UNUSED(mask);