You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2026/01/01 09:04:10 UTC
(nuttx) 02/02: net_sockif.c: add ip level s|getsockopt support in SOCK_CTRL
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.git
commit ef875f335b9b462f681804acd44d6d9128ef4230
Author: zhanghongyu <zh...@xiaomi.com>
AuthorDate: Wed Aug 20 14:30:04 2025 +0800
net_sockif.c: add ip level s|getsockopt support in SOCK_CTRL
some services need to configure iptables without enable TCP/UDP/ICMP/ICMPV6
Signed-off-by: zhanghongyu <zh...@xiaomi.com>
---
net/socket/net_sockif.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/net/socket/net_sockif.c b/net/socket/net_sockif.c
index cb4d62493cb..9ad967b3882 100644
--- a/net/socket/net_sockif.c
+++ b/net/socket/net_sockif.c
@@ -49,6 +49,12 @@
static int ctrl_setup(FAR struct socket *psock);
static int ctrl_close(FAR struct socket *psock);
+#ifdef CONFIG_NET_SOCKOPTS
+static int ctrl_getsockopt(FAR struct socket *psock, int level, int option,
+ FAR void *value, FAR socklen_t *value_len);
+static int ctrl_setsockopt(FAR struct socket *psock, int level, int option,
+ FAR const void *value, socklen_t value_len);
+#endif
/****************************************************************************
* Private Data
@@ -68,7 +74,14 @@ static const struct sock_intf_s g_ctrl_sockif =
NULL, /* si_poll */
NULL, /* si_sendmsg */
NULL, /* si_recvmsg */
- ctrl_close /* si_close */
+ ctrl_close, /* si_close */
+ NULL, /* si_ioctl */
+ NULL, /* si_socketpair */
+ NULL /* si_shutdown */
+#ifdef CONFIG_NET_SOCKOPTS
+ , ctrl_getsockopt /* si_getsockopt */
+ , ctrl_setsockopt /* si_setsockopt */
+#endif
};
static struct socket_conn_s g_ctrl_conn =
@@ -112,6 +125,55 @@ static int ctrl_close(FAR struct socket *psock)
return 0;
}
+/****************************************************************************
+ * Name: ctrl_getsockopt / ctrl_setsockopt
+ *
+ * Description:
+ * Only support IPPROTO_IP and IPPROTO_IPV6.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_SOCKOPTS
+static int ctrl_getsockopt(FAR struct socket *psock, int level, int option,
+ FAR void *value, FAR socklen_t *value_len)
+{
+ switch (level)
+ {
+#ifdef CONFIG_NET_IPv4
+ case IPPROTO_IP:/* IPv4 protocol socket options (see include/netinet/in.h) */
+ return ipv4_getsockopt(psock, option, value, value_len);
+#endif
+
+#ifdef CONFIG_NET_IPv6
+ case IPPROTO_IPV6:/* IPv6 protocol socket options (see include/netinet/in.h) */
+ return ipv6_getsockopt(psock, option, value, value_len);
+#endif
+
+ default:
+ return -ENOPROTOOPT;
+ }
+}
+
+static int ctrl_setsockopt(FAR struct socket *psock, int level, int option,
+ FAR const void *value, socklen_t value_len)
+{
+ switch (level)
+ {
+#ifdef CONFIG_NET_IPv4
+ case IPPROTO_IP:/* IPv4 protocol socket options (see include/netinet/in.h) */
+ return ipv4_setsockopt(psock, option, value, value_len);
+#endif
+
+#ifdef CONFIG_NET_IPv6
+ case IPPROTO_IPV6:/* IPv6 protocol socket options (see include/netinet/in.h) */
+ return ipv6_setsockopt(psock, option, value, value_len);
+#endif
+ default:
+ return -ENOPROTOOPT;
+ }
+}
+#endif /* CONFIG_NET_SOCKOPTS */
+
/****************************************************************************
* Public Functions
****************************************************************************/