From 7d2ffe63e91a46380d04d4245fec56d6ba0d25f8 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Mon, 24 Jun 2019 13:56:42 +0800 Subject: [net][sal][netdev] Add IPv6 option configuration and feature support in SAL and netdev Signed-off-by: chenyong <1521761801@qq.com> --- components/net/netdev/src/netdev.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (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 5f49a46f17..eb2835364a 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -58,9 +58,21 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data) ip_addr_set_zero(&(netdev->ip_addr)); ip_addr_set_zero(&(netdev->netmask)); ip_addr_set_zero(&(netdev->gw)); + + IP_SET_TYPE_VAL(netdev->ip_addr, IPADDR_TYPE_V4); + IP_SET_TYPE_VAL(netdev->netmask, IPADDR_TYPE_V4); + IP_SET_TYPE_VAL(netdev->gw, IPADDR_TYPE_V4); +#if NETDEV_IPV6 + for (index = 0; index < NETDEV_IPV6_NUM_ADDRESSES; index++) + { + ip_addr_set_zero(&(netdev->ip6_addr[index])); + IP_SET_TYPE_VAL(netdev->ip_addr, IPADDR_TYPE_V6); + } +#endif /* NETDEV_IPV6 */ for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) { ip_addr_set_zero(&(netdev->dns_servers[index])); + IP_SET_TYPE_VAL(netdev->ip_addr, IPADDR_TYPE_V4); } netdev->status_callback = RT_NULL; netdev->addr_callback = RT_NULL; @@ -839,7 +851,7 @@ static void netdev_list_if(void) rt_kprintf("network interface device: %s%s\n", netdev->name, - (netdev == netdev_default)?" (Default)":""); + (netdev == netdev_default) ? " (Default)" : ""); rt_kprintf("MTU: %d\n", netdev->mtu); /* 6 - MAC address, 8 - IEMI */ @@ -881,6 +893,28 @@ static void netdev_list_if(void) rt_kprintf("gw address: %s\n", inet_ntoa(netdev->gw)); rt_kprintf("net mask : %s\n", inet_ntoa(netdev->netmask)); +#if NETDEV_IPV6 + { + ip_addr_t *addr; + int i; + + addr = &netdev->ip6_addr[0]; + + if (!ip_addr_isany(addr)) + { + rt_kprintf("ipv6 link-local: %s %s\n", inet_ntoa(*addr), + !ip_addr_isany(addr) ? "VALID" : "INVALID"); + + for (i = 1; i < NETDEV_IPV6_NUM_ADDRESSES; i++) + { + addr = &netdev->ip6_addr[i]; + rt_kprintf("ipv6[%d] address: %s %s\n", i, inet_ntoa(*addr), + !ip_addr_isany(addr) ? "VALID" : "INVALID"); + } + } + } +#endif /* NETDEV_IPV6 */ + for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) { rt_kprintf("dns server #%d: %s\n", index, inet_ntoa(netdev->dns_servers[index])); -- cgit v1.3.1 From 48857d1e67848fa999ef6454756522fb06f42bcf Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 2 Jul 2019 20:11:41 +0800 Subject: [net][netdev] Add FINSH_USING_MSH control for netdev network commands --- components/net/lwip-1.4.1/src/netif/ethernetif.c | 8 ++++++-- components/net/lwip-2.0.2/src/netif/ethernetif.c | 8 ++++++-- components/net/lwip-2.1.0/src/netif/ethernetif.c | 8 ++++++-- components/net/netdev/include/netdev.h | 3 ++- components/net/netdev/src/netdev.c | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) (limited to 'components/net/netdev/src/netdev.c') diff --git a/components/net/lwip-1.4.1/src/netif/ethernetif.c b/components/net/lwip-1.4.1/src/netif/ethernetif.c index df960fcde0..c8f171459d 100644 --- a/components/net/lwip-1.4.1/src/netif/ethernetif.c +++ b/components/net/lwip-1.4.1/src/netif/ethernetif.c @@ -146,8 +146,8 @@ static int lwip_netdev_set_addr_info(struct netdev *netif, ip_addr_t *ip_addr, i #ifdef RT_LWIP_DNS static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server) { - extern void set_dns(uint8_t dns_num, char* dns_server); - set_dns(dns_num, ipaddr_ntoa(dns_server)); + extern void dns_setserver(uint8_t dns_num, ip_addr_t *dns_server); + dns_setserver(dns_num, dns_server); return ERR_OK; } #endif /* RT_LWIP_DNS */ @@ -160,6 +160,7 @@ static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled) } #endif /* RT_LWIP_DHCP */ +#ifdef FINSH_USING_MSH #ifdef RT_LWIP_USING_PING extern int lwip_ping_recv(int s, int *ttl); extern err_t lwip_ping_send(int s, ip_addr_t *addr, int size); @@ -250,6 +251,7 @@ void lwip_netdev_netstat(struct netdev *netif) #endif } #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ +#endif /* FINSH_USING_MSH */ const struct netdev_ops lwip_netdev_ops = { @@ -269,6 +271,7 @@ const struct netdev_ops lwip_netdev_ops = NULL, #endif /* RT_LWIP_DHCP */ +#ifdef FINSH_USING_MSH #ifdef RT_LWIP_USING_PING lwip_netdev_ping, #else @@ -278,6 +281,7 @@ const struct netdev_ops lwip_netdev_ops = #if defined (RT_LWIP_TCP) || defined (RT_LWIP_UDP) lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ +#endif /* FINSH_USING_MSH */ }; static int netdev_add(struct netif *lwip_netif) diff --git a/components/net/lwip-2.0.2/src/netif/ethernetif.c b/components/net/lwip-2.0.2/src/netif/ethernetif.c index 51e1ba511d..e471e1ea23 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -154,8 +154,8 @@ static int lwip_netdev_set_addr_info(struct netdev *netif, ip_addr_t *ip_addr, i #ifdef RT_LWIP_DNS static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server) { - extern void set_dns(uint8_t dns_num, char* dns_server); - set_dns(dns_num, ipaddr_ntoa(dns_server)); + extern void dns_setserver(uint8_t dns_num, const ip_addr_t *dns_server); + dns_setserver(dns_num, dns_server); return ERR_OK; } #endif /* RT_LWIP_DNS */ @@ -168,6 +168,7 @@ static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled) } #endif /* RT_LWIP_DHCP */ +#ifdef FINSH_USING_MSH #ifdef RT_LWIP_USING_PING extern int lwip_ping_recv(int s, int *ttl); extern err_t lwip_ping_send(int s, ip_addr_t *addr, int size); @@ -258,6 +259,7 @@ void lwip_netdev_netstat(struct netdev *netif) #endif } #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ +#endif /* FINSH_USING_MSH */ const struct netdev_ops lwip_netdev_ops = { @@ -277,6 +279,7 @@ const struct netdev_ops lwip_netdev_ops = NULL, #endif /* RT_LWIP_DHCP */ +#ifdef FINSH_USING_MSH #ifdef RT_LWIP_USING_PING lwip_netdev_ping, #else @@ -286,6 +289,7 @@ const struct netdev_ops lwip_netdev_ops = #if defined (RT_LWIP_TCP) || defined (RT_LWIP_UDP) lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ +#endif /* FINSH_USING_MSH */ }; static int netdev_add(struct netif *lwip_netif) diff --git a/components/net/lwip-2.1.0/src/netif/ethernetif.c b/components/net/lwip-2.1.0/src/netif/ethernetif.c index 0c9e5dec5f..d73c448cf9 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -155,8 +155,8 @@ static int lwip_netdev_set_addr_info(struct netdev *netif, ip_addr_t *ip_addr, i #ifdef RT_LWIP_DNS static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server) { - extern void set_dns(uint8_t dns_num, char* dns_server); - set_dns(dns_num, ipaddr_ntoa(dns_server)); + extern void dns_setserver(uint8_t dns_num, const ip_addr_t *dns_server); + dns_setserver(dns_num, dns_server); return ERR_OK; } #endif /* RT_LWIP_DNS */ @@ -169,6 +169,7 @@ static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled) } #endif /* RT_LWIP_DHCP */ +#ifdef FINSH_USING_MSH #ifdef RT_LWIP_USING_PING extern int lwip_ping_recv(int s, int *ttl); extern err_t lwip_ping_send(int s, ip_addr_t *addr, int size); @@ -259,6 +260,7 @@ void lwip_netdev_netstat(struct netdev *netif) #endif } #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ +#endif /* FINSH_USING_MSH */ const struct netdev_ops lwip_netdev_ops = { @@ -278,6 +280,7 @@ const struct netdev_ops lwip_netdev_ops = NULL, #endif /* RT_LWIP_DHCP */ +#ifdef FINSH_USING_MSH #ifdef RT_LWIP_USING_PING lwip_netdev_ping, #else @@ -287,6 +290,7 @@ const struct netdev_ops lwip_netdev_ops = #if defined (RT_LWIP_TCP) || defined (RT_LWIP_UDP) lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ +#endif /* FINSH_USING_MSH */ }; static int netdev_add(struct netif *lwip_netif) diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index 71a61be3c0..25a8493a8f 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -132,10 +132,11 @@ struct netdev_ops int (*set_dns_server)(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server); int (*set_dhcp)(struct netdev *netdev, rt_bool_t is_enabled); +#ifdef FINSH_USING_MSH /* set network interface device common network interface device operations */ int (*ping)(struct netdev *netdev, const char *host, size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp); void (*netstat)(struct netdev *netdev); - +#endif }; /* The network interface device registered and unregistered*/ diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index eb2835364a..2c484f520e 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -985,7 +985,7 @@ FINSH_FUNCTION_EXPORT_ALIAS(netdev_ifconfig, __cmd_ifconfig, list the informatio #endif /* NETDEV_USING_IFCONFIG */ #ifdef NETDEV_USING_PING -static int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) +int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) { #define NETDEV_PING_DATA_SIZE 32 /** ping receive timeout - in milliseconds */ -- cgit v1.3.1 From dcd8b8029b9ac34571e72a0b1c739981b3332fcb Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 2 Jul 2019 20:33:10 +0800 Subject: [net][netdev] Delete network commands interrupt disable processing Signed-off-by: chenyong <1521761801@qq.com> --- components/net/lwip-1.4.1/src/netif/ethernetif.c | 8 +++---- components/net/lwip-2.0.2/src/netif/ethernetif.c | 8 +++---- components/net/lwip-2.1.0/src/netif/ethernetif.c | 8 +++---- components/net/netdev/include/netdev.h | 2 +- components/net/netdev/src/netdev.c | 27 ++++++------------------ 5 files changed, 19 insertions(+), 34 deletions(-) (limited to 'components/net/netdev/src/netdev.c') diff --git a/components/net/lwip-1.4.1/src/netif/ethernetif.c b/components/net/lwip-1.4.1/src/netif/ethernetif.c index c8f171459d..ebf27b86e6 100644 --- a/components/net/lwip-1.4.1/src/netif/ethernetif.c +++ b/components/net/lwip-1.4.1/src/netif/ethernetif.c @@ -160,7 +160,7 @@ static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled) } #endif /* RT_LWIP_DHCP */ -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #ifdef RT_LWIP_USING_PING extern int lwip_ping_recv(int s, int *ttl); extern err_t lwip_ping_send(int s, ip_addr_t *addr, int size); @@ -251,7 +251,7 @@ void lwip_netdev_netstat(struct netdev *netif) #endif } #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ const struct netdev_ops lwip_netdev_ops = { @@ -271,7 +271,7 @@ const struct netdev_ops lwip_netdev_ops = NULL, #endif /* RT_LWIP_DHCP */ -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #ifdef RT_LWIP_USING_PING lwip_netdev_ping, #else @@ -281,7 +281,7 @@ const struct netdev_ops lwip_netdev_ops = #if defined (RT_LWIP_TCP) || defined (RT_LWIP_UDP) lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ }; static int netdev_add(struct netif *lwip_netif) diff --git a/components/net/lwip-2.0.2/src/netif/ethernetif.c b/components/net/lwip-2.0.2/src/netif/ethernetif.c index e471e1ea23..1bcc874f62 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -168,7 +168,7 @@ static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled) } #endif /* RT_LWIP_DHCP */ -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #ifdef RT_LWIP_USING_PING extern int lwip_ping_recv(int s, int *ttl); extern err_t lwip_ping_send(int s, ip_addr_t *addr, int size); @@ -259,7 +259,7 @@ void lwip_netdev_netstat(struct netdev *netif) #endif } #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ const struct netdev_ops lwip_netdev_ops = { @@ -279,7 +279,7 @@ const struct netdev_ops lwip_netdev_ops = NULL, #endif /* RT_LWIP_DHCP */ -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #ifdef RT_LWIP_USING_PING lwip_netdev_ping, #else @@ -289,7 +289,7 @@ const struct netdev_ops lwip_netdev_ops = #if defined (RT_LWIP_TCP) || defined (RT_LWIP_UDP) lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ }; static int netdev_add(struct netif *lwip_netif) diff --git a/components/net/lwip-2.1.0/src/netif/ethernetif.c b/components/net/lwip-2.1.0/src/netif/ethernetif.c index d73c448cf9..c79db6700d 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -169,7 +169,7 @@ static int lwip_netdev_set_dhcp(struct netdev *netif, rt_bool_t is_enabled) } #endif /* RT_LWIP_DHCP */ -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #ifdef RT_LWIP_USING_PING extern int lwip_ping_recv(int s, int *ttl); extern err_t lwip_ping_send(int s, ip_addr_t *addr, int size); @@ -260,7 +260,7 @@ void lwip_netdev_netstat(struct netdev *netif) #endif } #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ const struct netdev_ops lwip_netdev_ops = { @@ -280,7 +280,7 @@ const struct netdev_ops lwip_netdev_ops = NULL, #endif /* RT_LWIP_DHCP */ -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #ifdef RT_LWIP_USING_PING lwip_netdev_ping, #else @@ -290,7 +290,7 @@ const struct netdev_ops lwip_netdev_ops = #if defined (RT_LWIP_TCP) || defined (RT_LWIP_UDP) lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ }; static int netdev_add(struct netif *lwip_netif) diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index 25a8493a8f..1a61cba1c2 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -132,7 +132,7 @@ struct netdev_ops int (*set_dns_server)(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server); int (*set_dhcp)(struct netdev *netdev, rt_bool_t is_enabled); -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH /* set network interface device common network interface device operations */ int (*ping)(struct netdev *netdev, const char *host, size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp); void (*netstat)(struct netdev *netdev); diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 2c484f520e..bbaae26077 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -821,7 +821,7 @@ void netdev_low_level_set_dhcp_status(struct netdev *netdev, rt_bool_t is_enable } } -#ifdef FINSH_USING_MSH +#ifdef RT_USING_FINSH #include @@ -832,7 +832,6 @@ static void netdev_list_if(void) #define NETDEV_IFCONFIG_IEMI_MAX_LEN 8 rt_ubase_t index; - rt_base_t level; rt_slist_t *node = RT_NULL; struct netdev *netdev = RT_NULL; struct netdev *cur_netdev_list = netdev_list; @@ -843,14 +842,12 @@ static void netdev_list_if(void) return; } - level = rt_hw_interrupt_disable(); - for (node = &(cur_netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_list_entry(node, struct netdev, list); - rt_kprintf("network interface device: %s%s\n", - netdev->name, + rt_kprintf("network interface device: %.*s%s\n", + RT_NAME_MAX, netdev->name, (netdev == netdev_default) ? " (Default)" : ""); rt_kprintf("MTU: %d\n", netdev->mtu); @@ -925,8 +922,6 @@ static void netdev_list_if(void) rt_kprintf("\n"); } } - - rt_hw_interrupt_enable(level); } static void netdev_set_if(char* netdev_name, char* ip_addr, char* gw_addr, char* nm_addr) @@ -1075,19 +1070,16 @@ FINSH_FUNCTION_EXPORT_ALIAS(netdev_ping, __cmd_ping, ping network host); static void netdev_list_dns(void) { - rt_base_t level; int index = 0; struct netdev *netdev = RT_NULL; rt_slist_t *node = RT_NULL; - level = rt_hw_interrupt_disable(); - for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_list_entry(node, struct netdev, list); - rt_kprintf("network interface device: %s%s\n", - netdev->name, + rt_kprintf("network interface device: %.*s%s\n", + RT_NAME_MAX, netdev->name, (netdev == netdev_default)?" (Default)":""); for(index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) @@ -1100,8 +1092,6 @@ static void netdev_list_dns(void) rt_kprintf("\n"); } } - - rt_hw_interrupt_enable(level); } static void netdev_set_dns(char *netdev_name, uint8_t dns_num, char *dns_server) @@ -1149,7 +1139,6 @@ FINSH_FUNCTION_EXPORT_ALIAS(netdev_dns, __cmd_dns, list and set the information #ifdef NETDEV_USING_NETSTAT static void netdev_cmd_netstat(void) { - rt_base_t level; rt_slist_t *node = RT_NULL; struct netdev *netdev = RT_NULL; struct netdev *cur_netdev_list = netdev_list; @@ -1160,8 +1149,6 @@ static void netdev_cmd_netstat(void) return; } - level = rt_hw_interrupt_disable(); - for (node = &(cur_netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_list_entry(node, struct netdev, list); @@ -1172,8 +1159,6 @@ static void netdev_cmd_netstat(void) } } - rt_hw_interrupt_enable(level); - netdev->ops->netstat(netdev); } @@ -1193,4 +1178,4 @@ int netdev_netstat(int argc, char **argv) FINSH_FUNCTION_EXPORT_ALIAS(netdev_netstat, __cmd_netstat, list the information of TCP / IP); #endif /* NETDEV_USING_NETSTAT */ -#endif /* FINSH_USING_MSH */ +#endif /* RT_USING_FINSH */ -- cgit v1.3.1 From 04296e97b6d83f979e1c0c9dab4911de73badce5 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Wed, 3 Jul 2019 22:30:14 +0800 Subject: [netdev] Add a non-null judgment to the netstat command.|为 netstat 命令添加非空判断。 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/netdev/src/netdev.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (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 bbaae26077..b8b0504dd5 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -1159,7 +1159,14 @@ static void netdev_cmd_netstat(void) } } - netdev->ops->netstat(netdev); + if (netdev->ops->netstat != RT_NULL) + { + netdev->ops->netstat(netdev); + } + else + { + rt_kprintf("netstat: this command is not supported!\n"); + } } int netdev_netstat(int argc, char **argv) -- cgit v1.3.1 From afd0140e67465c52ec0e9f33d54362f4764bea2c Mon Sep 17 00:00:00 2001 From: tangyuxin <462747508@qq.com> Date: Sat, 27 Jul 2019 09:13:19 +0800 Subject: [components][net][netdev] 修复一处BUG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/netdev/src/netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (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 b8b0504dd5..f0fe3034fa 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -129,7 +129,7 @@ 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_memcpy(cur_netdev, netdev, sizeof(struct netdev)) == 0)) + if (cur_netdev && (rt_memcmp(cur_netdev, netdev, sizeof(struct netdev)) == 0)) { rt_slist_remove(&(netdev_list->list), &(cur_netdev->list)); rt_hw_interrupt_enable(level); -- cgit v1.3.1 From 16304f14a804d6862b3bc69063428a40e119ff7d Mon Sep 17 00:00:00 2001 From: tangyuxin <462747508@qq.com> Date: Fri, 9 Aug 2019 14:23:31 +0800 Subject: [components][net] 1.网卡可卸载 2.dhcpd 服务可停止 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/lwip-2.0.2/src/include/netif/ethernetif.h | 1 + components/net/lwip-2.0.2/src/netif/ethernetif.c | 32 +++++++++ .../net/lwip-2.1.0/src/include/netif/ethernetif.h | 1 + components/net/lwip-2.1.0/src/netif/ethernetif.c | 32 +++++++++ components/net/lwip_dhcpd/dhcp_server.c | 10 ++- components/net/lwip_dhcpd/dhcp_server.h | 1 + components/net/lwip_dhcpd/dhcp_server_raw.c | 82 +++++++++++++++++++++- components/net/netdev/src/netdev.c | 41 ++++++++--- components/net/sal_socket/src/sal_socket.c | 31 ++++++++ 9 files changed, 217 insertions(+), 14 deletions(-) (limited to 'components/net/netdev/src/netdev.c') diff --git a/components/net/lwip-2.0.2/src/include/netif/ethernetif.h b/components/net/lwip-2.0.2/src/include/netif/ethernetif.h index 1c969e6e25..244bafdd1b 100644 --- a/components/net/lwip-2.0.2/src/include/netif/ethernetif.h +++ b/components/net/lwip-2.0.2/src/include/netif/ethernetif.h @@ -41,6 +41,7 @@ extern "C" { rt_err_t eth_device_init(struct eth_device * dev, const char *name); rt_err_t eth_device_init_with_flag(struct eth_device *dev, const char *name, rt_uint16_t flag); rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up); + void eth_device_deinit(struct eth_device *dev); int eth_system_device_init(void); diff --git a/components/net/lwip-2.0.2/src/netif/ethernetif.c b/components/net/lwip-2.0.2/src/netif/ethernetif.c index f118ad0d64..6a1d71886c 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -333,6 +333,19 @@ static int netdev_add(struct netif *lwip_netif) return result; } +static void netdev_del(struct netif *lwip_netif) +{ + char name[LWIP_NETIF_NAME_LEN + 1]; + struct netdev *netdev; + + RT_ASSERT(lwip_netif); + + rt_strncpy(name, lwip_netif->name, LWIP_NETIF_NAME_LEN); + netdev = netdev_get_by_name(name); + netdev_unregister(netdev); + rt_free(netdev); +} + /* synchronize lwIP network interface device and network interface device flags */ static int netdev_flags_sync(struct netif *lwip_netif) { @@ -538,6 +551,25 @@ rt_err_t eth_device_init(struct eth_device * dev, const char *name) return eth_device_init_with_flag(dev, name, flags); } +void eth_device_deinit(struct eth_device *dev) +{ + struct netif* netif = dev->netif; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); +#endif + netif_set_down(netif); + netif_remove(netif); +#ifdef RT_USING_NETDEV + netdev_del(netif); +#endif + rt_device_close(&(dev->parent)); + rt_device_unregister(&(dev->parent)); + rt_sem_detach(&(dev->tx_ack)); + rt_free(netif); +} + #ifndef LWIP_NO_RX_THREAD rt_err_t eth_device_ready(struct eth_device* dev) { diff --git a/components/net/lwip-2.1.0/src/include/netif/ethernetif.h b/components/net/lwip-2.1.0/src/include/netif/ethernetif.h index 1c969e6e25..244bafdd1b 100644 --- a/components/net/lwip-2.1.0/src/include/netif/ethernetif.h +++ b/components/net/lwip-2.1.0/src/include/netif/ethernetif.h @@ -41,6 +41,7 @@ extern "C" { rt_err_t eth_device_init(struct eth_device * dev, const char *name); rt_err_t eth_device_init_with_flag(struct eth_device *dev, const char *name, rt_uint16_t flag); rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up); + void eth_device_deinit(struct eth_device *dev); int eth_system_device_init(void); diff --git a/components/net/lwip-2.1.0/src/netif/ethernetif.c b/components/net/lwip-2.1.0/src/netif/ethernetif.c index 4e623cbfd3..1725ce00bb 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -334,6 +334,19 @@ static int netdev_add(struct netif *lwip_netif) return result; } +static void netdev_del(struct netif *lwip_netif) +{ + char name[LWIP_NETIF_NAME_LEN + 1]; + struct netdev *netdev; + + RT_ASSERT(lwip_netif); + + rt_strncpy(name, lwip_netif->name, LWIP_NETIF_NAME_LEN); + netdev = netdev_get_by_name(name); + netdev_unregister(netdev); + rt_free(netdev); +} + /* synchronize lwIP network interface device and network interface device flags */ static int netdev_flags_sync(struct netif *lwip_netif) { @@ -543,6 +556,25 @@ rt_err_t eth_device_init(struct eth_device * dev, const char *name) return eth_device_init_with_flag(dev, name, flags); } +void eth_device_deinit(struct eth_device *dev) +{ + struct netif* netif = dev->netif; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); +#endif + netif_set_down(netif); + netif_remove(netif); +#ifdef RT_USING_NETDEV + netdev_del(netif); +#endif + rt_device_close(&(dev->parent)); + rt_device_unregister(&(dev->parent)); + rt_sem_detach(&(dev->tx_ack)); + rt_free(netif); +} + #ifndef LWIP_NO_RX_THREAD rt_err_t eth_device_ready(struct eth_device* dev) { diff --git a/components/net/lwip_dhcpd/dhcp_server.c b/components/net/lwip_dhcpd/dhcp_server.c index c548ecfa98..93b4ad16f0 100644 --- a/components/net/lwip_dhcpd/dhcp_server.c +++ b/components/net/lwip_dhcpd/dhcp_server.c @@ -279,6 +279,7 @@ static void dhcpd_thread_entry(void *parameter) { /* bind failed. */ DEBUG_PRINTF("bind server address failed, errno=%d\n", errno); + closesocket(sock); rt_free(recv_data); return; } @@ -290,7 +291,13 @@ static void dhcpd_thread_entry(void *parameter) { bytes_read = recvfrom(sock, recv_data, BUFSZ - 1, 0, (struct sockaddr *)&client_addr, &addr_len); - if (bytes_read < DHCP_MSG_LEN) + if (bytes_read <= 0) + { + closesocket(sock); + rt_free(recv_data); + return; + } + else if (bytes_read < DHCP_MSG_LEN) { DEBUG_PRINTF("packet too short, wait for next!\n"); continue; @@ -546,4 +553,3 @@ void dhcpd_start(const char *netif_name) rt_thread_startup(thread); } } - diff --git a/components/net/lwip_dhcpd/dhcp_server.h b/components/net/lwip_dhcpd/dhcp_server.h index a8056540ec..ea68d6b8ec 100644 --- a/components/net/lwip_dhcpd/dhcp_server.h +++ b/components/net/lwip_dhcpd/dhcp_server.h @@ -44,6 +44,7 @@ extern "C" { #endif void dhcpd_start(const char *netif_name); +void dhcpd_stop(const char *netif_name); #ifdef __cplusplus } diff --git a/components/net/lwip_dhcpd/dhcp_server_raw.c b/components/net/lwip_dhcpd/dhcp_server_raw.c index 5df61a0236..6c786301be 100644 --- a/components/net/lwip_dhcpd/dhcp_server_raw.c +++ b/components/net/lwip_dhcpd/dhcp_server_raw.c @@ -666,6 +666,7 @@ dhcp_server_start(struct netif *netif, ip4_addr_t *start, ip4_addr_t *end) return ERR_OK; } +extern void set_if(const char *netif_name, const char *ip_addr, const char *gw_addr, const char *nm_addr); void dhcpd_start(const char *netif_name) { @@ -701,8 +702,6 @@ void dhcpd_start(const char *netif_name) if (1) { - extern void set_if(const char *netif_name, const char *ip_addr, const char *gw_addr, const char *nm_addr); - dhcp_stop(netif); set_if(netif_name, DHCPD_SERVER_IP, "0.0.0.0", "255.255.255.0"); @@ -750,4 +749,83 @@ _exit: return; } +void dhcpd_stop(const char *netif_name) +{ + struct dhcp_server *dhcp_server, *server_node; + struct netif *netif = netif_list; + struct dhcp_client_node *node, *next; + + DEBUG_PRINTF("%s: %s\r\n", __FUNCTION__, netif_name); + + LWIP_NETIF_LOCK(); + if (strlen(netif_name) > sizeof(netif->name)) + { + DEBUG_PRINTF("network interface name too long!\r\n"); + goto _exit; + } + + while (netif != RT_NULL) + { + if (strncmp(netif_name, netif->name, sizeof(netif->name)) == 0) + break; + + netif = netif->next; + if (netif == RT_NULL) + { + DEBUG_PRINTF("network interface: %s not found!\r\n", netif_name); + break; + } + } + + if (netif == RT_NULL) + { + goto _exit; + } + /* If this netif alreday use the dhcp server. */ + for (dhcp_server = lw_dhcp_server; dhcp_server != NULL; dhcp_server = dhcp_server->next) + { + if (dhcp_server->netif == netif) + { + break; + } + } + if (dhcp_server == RT_NULL) + { + goto _exit; + } + + /* remove dhcp server */ + if (dhcp_server == lw_dhcp_server) + { + lw_dhcp_server = lw_dhcp_server->next; + } + else + { + server_node = lw_dhcp_server; + while (server_node->next && server_node->next != dhcp_server) + { + server_node = server_node->next; + } + if (server_node->next != RT_NULL) + { + server_node->next = server_node->next->next; + } + } + + udp_disconnect(dhcp_server->pcb); + udp_remove(dhcp_server->pcb); + + /* remove all client node */ + for (node = dhcp_server->node_list; node != NULL; node = next) + { + next = node->next; + mem_free(node); + } + + mem_free(dhcp_server); + set_if(netif_name, "0.0.0.0", "0.0.0.0", "0.0.0.0"); + +_exit: + LWIP_NETIF_UNLOCK(); +} 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); diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index be7c1984a1..44442d306f 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -350,6 +350,37 @@ static void sal_unlock(void) rt_mutex_release(&sal_core_lock); } +/** + * This function will clean the netdev. + * + * @note please don't invoke it on ISR. + */ +int sal_netdev_cleanup(struct netdev *netdev) +{ + int idx = 0, find_dev; + + do + { + find_dev = 0; + sal_lock(); + for (idx = 0; idx < socket_table.max_socket; idx++) + { + if (socket_table.sockets[idx] && socket_table.sockets[idx]->netdev == netdev) + { + find_dev = 1; + break; + } + } + sal_unlock(); + if (find_dev) + { + rt_thread_mdelay(rt_tick_from_millisecond(100)); + } + } while (find_dev); + + return 0; +} + /** * This function will initialize sal socket object and set socket options * -- cgit v1.3.1