summaryrefslogtreecommitdiff
path: root/components/net/netdev/src/netdev.c
diff options
context:
space:
mode:
authortangyuxin <[email protected]>2019-08-09 14:23:31 +0800
committertyx <[email protected]>2019-08-11 11:53:28 +0800
commit16304f14a804d6862b3bc69063428a40e119ff7d (patch)
tree63823d404cb9d355dc87fc922f4babc6bf55d9eb /components/net/netdev/src/netdev.c
parent532ad16b7bd5ba5201f42d26da80121a6ccd0d89 (diff)
[components][net] 1.网卡可卸载 2.dhcpd 服务可停止
Diffstat (limited to 'components/net/netdev/src/netdev.c')
-rw-r--r--components/net/netdev/src/netdev.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c
index f0fe3034fa..451cc81025 100644
--- a/components/net/netdev/src/netdev.c
+++ b/components/net/netdev/src/netdev.c
@@ -99,7 +99,7 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data)
rt_hw_interrupt_enable(level);
- return RT_EOK;
+ return RT_EOK;
}
/**
@@ -118,7 +118,7 @@ int netdev_unregister(struct netdev *netdev)
struct netdev *cur_netdev = RT_NULL;
RT_ASSERT(netdev);
-
+
if (netdev_list == RT_NULL)
{
return -RT_ERROR;
@@ -129,18 +129,35 @@ int netdev_unregister(struct netdev *netdev)
for (node = &(netdev_list->list); node; node = rt_slist_next(node))
{
cur_netdev = rt_slist_entry(node, struct netdev, list);
- if (cur_netdev && (rt_memcmp(cur_netdev, netdev, sizeof(struct netdev)) == 0))
+ if (cur_netdev == netdev)
{
- rt_slist_remove(&(netdev_list->list), &(cur_netdev->list));
- rt_hw_interrupt_enable(level);
-
- return RT_EOK;
+ /* find this network interface device in network interface device list */
+ if (netdev_list == netdev && rt_slist_next(&netdev_list->list) == RT_NULL)
+ {
+ netdev_list = RT_NULL;
+ }
+ else
+ {
+ rt_slist_remove(&(netdev_list->list), &(cur_netdev->list));
+ }
+ if (netdev_default == netdev)
+ {
+ netdev_default = netdev_list;
+ }
+ break;
}
}
-
rt_hw_interrupt_enable(level);
- /* not find this network interface device in network interface device list */
+ if (cur_netdev == netdev)
+ {
+#ifdef RT_USING_SAL
+ extern int sal_netdev_cleanup(struct netdev *netdev);
+ sal_netdev_cleanup(netdev);
+#endif
+ rt_memset(netdev, 0, sizeof(*netdev));
+ }
+
return -RT_ERROR;
}
@@ -678,6 +695,10 @@ void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, con
RT_ASSERT(dns_server);
+ if (netdev == RT_NULL)
+ {
+ return;
+ }
/* check DNS servers is exist */
for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++)
{
@@ -687,7 +708,7 @@ void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, con
}
}
- if (netdev && dns_num < NETDEV_DNS_SERVERS_NUM)
+ if (dns_num < NETDEV_DNS_SERVERS_NUM)
{
ip_addr_copy(netdev->dns_servers[dns_num], *dns_server);