From 3bc29c76735487c1bfadedd409901fe0091164a9 Mon Sep 17 00:00:00 2001 From: geniusgogo <2041245+geniusgogo@users.noreply.github.com> Date: Tue, 5 Dec 2023 23:09:19 +0800 Subject: sync update net. (#8333) --- components/net/netdev/src/netdev.c | 50 ++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 5 deletions(-) (limited to 'components/net/netdev/src/netdev.c') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 50f2d4bc8d..0afcfc6a2f 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -27,6 +27,10 @@ #define DBG_LVL DBG_INFO #include +#if defined(SAL_USING_AF_NETLINK) +#include +#endif + /* The list of network interface device */ struct netdev *netdev_list = RT_NULL; /* The default network interface device */ @@ -124,6 +128,10 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data) g_netdev_register_callback(netdev, NETDEV_CB_REGISTER); } +#if defined(SAL_USING_AF_NETLINK) + rtnl_ip_notify(netdev, RTM_NEWLINK); +#endif + return RT_EOK; } @@ -174,6 +182,10 @@ int netdev_unregister(struct netdev *netdev) } rt_spin_unlock_irqrestore(&_spinlock, level); +#if defined(SAL_USING_AF_NETLINK) + rtnl_ip_notify(netdev, RTM_DELLINK); +#endif + if (netdev_default == RT_NULL) { netdev_set_default(netdev_list); @@ -301,7 +313,7 @@ struct netdev *netdev_get_by_name(const char *name) for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_slist_entry(node, struct netdev, list); - if (netdev && (rt_strncmp(netdev->name, name, rt_strlen(netdev->name) < RT_NAME_MAX ? rt_strlen(netdev->name) : RT_NAME_MAX) == 0)) + if (netdev && (rt_strncmp(netdev->name, name, rt_strlen(name) < RT_NAME_MAX ? rt_strlen(name) : RT_NAME_MAX) == 0)) { rt_spin_unlock_irqrestore(&_spinlock, level); return netdev; @@ -427,6 +439,8 @@ void netdev_set_default_change_callback(netdev_callback_fn register_callback) */ int netdev_set_up(struct netdev *netdev) { + int err = 0; + RT_ASSERT(netdev); if (!netdev->ops || !netdev->ops->set_up) @@ -442,7 +456,14 @@ int netdev_set_up(struct netdev *netdev) } /* execute enable network interface device operations by network interface device driver */ - return netdev->ops->set_up(netdev); + err = netdev->ops->set_up(netdev); + +#if defined(SAL_USING_AF_NETLINK) + if (err) + rtnl_ip_notify(netdev, RTM_NEWLINK); +#endif + + return err; } /** * This function will disable network interface device. @@ -454,6 +475,8 @@ int netdev_set_up(struct netdev *netdev) */ int netdev_set_down(struct netdev *netdev) { + int err; + RT_ASSERT(netdev); if (!netdev->ops || !netdev->ops->set_down) @@ -469,7 +492,13 @@ int netdev_set_down(struct netdev *netdev) } /* execute disable network interface device operations by network interface driver */ - return netdev->ops->set_down(netdev); + err = netdev->ops->set_down(netdev); +#if defined(SAL_USING_AF_NETLINK) + if (err) + rtnl_ip_notify(netdev, RTM_NEWLINK); +#endif + + return err; } /** @@ -512,6 +541,7 @@ int netdev_dhcp_enabled(struct netdev *netdev, rt_bool_t is_enabled) */ int netdev_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr) { + int err; RT_ASSERT(netdev); RT_ASSERT(ip_addr); @@ -528,7 +558,15 @@ int netdev_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr) } /* execute network interface device set IP address operations */ - return netdev->ops->set_addr_info(netdev, (ip_addr_t *)ip_addr, RT_NULL, RT_NULL); + err = netdev->ops->set_addr_info(netdev, (ip_addr_t *)ip_addr, RT_NULL, RT_NULL); + +#if defined(SAL_USING_AF_NETLINK) + if (err == 0) + rtnl_ip_notify(netdev, RTM_SETLINK); +#endif + + + return err; } /** @@ -1172,6 +1210,7 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ struct netdev_ping_resp ping_resp; rt_uint32_t index; int ret = 0; + rt_bool_t isbind = RT_FALSE; if (size == 0) { @@ -1181,6 +1220,7 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ if (netdev_name != RT_NULL) { netdev = netdev_get_by_name(netdev_name); + isbind = RT_TRUE; } if (netdev == RT_NULL) @@ -1217,7 +1257,7 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ rt_memset(&ping_resp, 0x00, sizeof(struct netdev_ping_resp)); start_tick = rt_tick_get(); - ret = netdev->ops->ping(netdev, (const char *)target_name, size, NETDEV_PING_RECV_TIMEO, &ping_resp); + ret = netdev->ops->ping(netdev, (const char *)target_name, size, NETDEV_PING_RECV_TIMEO, &ping_resp, isbind); if (ret == -RT_ETIMEOUT) { rt_kprintf("ping: from %s icmp_seq=%d timeout\n", -- cgit v1.3.1