summaryrefslogtreecommitdiff
path: root/components/net/netdev/src/netdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'components/net/netdev/src/netdev.c')
-rw-r--r--components/net/netdev/src/netdev.c50
1 files changed, 45 insertions, 5 deletions
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 <rtdbg.h>
+#if defined(SAL_USING_AF_NETLINK)
+#include <route_netlink.h>
+#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",