summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzms123456 <[email protected]>2024-10-11 10:40:24 +0800
committerGitHub <[email protected]>2024-10-10 22:40:24 -0400
commit906d1caea6f82dcb45dc1925842e89b76c01bbfd (patch)
treed9cb2858b30f5448943ec1ac84c5fb9a7a9ef1c6
parentc9a1245977cada92477836fad2fc07171d5f301c (diff)
[component][sal]add netgetdev api
-rw-r--r--components/net/netdev/include/netdev.h3
-rw-r--r--components/net/netdev/src/netdev.c38
2 files changed, 41 insertions, 0 deletions
diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h
index cafa73d4c2..6b00bc2148 100644
--- a/components/net/netdev/include/netdev.h
+++ b/components/net/netdev/include/netdev.h
@@ -155,6 +155,9 @@ struct netdev *netdev_get_by_name(const char *name);
struct netdev *netdev_get_by_family(int family);
int netdev_family_get(struct netdev *netdev);
#endif /* RT_USING_SAL */
+#if defined(SAL_USING_AF_NETLINK)
+int netdev_getnetdev(struct msg_buf *msg, int (*cb)(struct msg_buf *m_buf, struct netdev *nd, int nd_num, int index, int ipvx));
+#endif
/* Set default network interface device in list */
void netdev_set_default(struct netdev *netdev);
diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c
index 2f4cea5120..22b6d3d74c 100644
--- a/components/net/netdev/src/netdev.c
+++ b/components/net/netdev/src/netdev.c
@@ -392,6 +392,44 @@ int netdev_family_get(struct netdev *netdev)
#endif /* RT_USING_SAL */
+#if defined(SAL_USING_AF_NETLINK)
+int netdev_getnetdev(struct msg_buf *msg, int (*cb)(struct msg_buf *m_buf, struct netdev *nd, int nd_num, int index, int ipvx))
+{
+ struct netdev *cur_nd_list = netdev_list;
+ struct netdev *nd_node;
+ int nd_num = 0;
+ int err = 0;
+
+ if (cur_nd_list == RT_NULL)
+ return 0;
+
+ rt_spin_lock(&_spinlock);
+ nd_num = rt_slist_len(&cur_nd_list->list) + 1;
+ rt_spin_unlock(&_spinlock);
+
+ err = cb(msg, cur_nd_list, nd_num, nd.ifindex, ROUTE_IPV4_TRUE);
+ if (err < 0)
+ return err;
+
+
+ rt_spin_lock(&_spinlock);
+ rt_slist_for_each_entry(nd_node, &(cur_nd_list->list), list)
+ {
+ rt_spin_unlock(&_spinlock);
+ err = cb(msg, nd_node, nd_num, nd.ifindex, ROUTE_IPV4_TRUE);
+ if (err < 0)
+ {
+ return err;
+ }
+
+ rt_spin_lock(&_spinlock);
+ }
+ rt_spin_unlock(&_spinlock);
+
+ return 0;
+}
+#endif
+
/**
* This function will set default network interface device.
*