From 3d6e0ea3746215e4391dd56e373ad78c9689be5c Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 16 Apr 2019 18:24:55 +0800 Subject: [net][netdev]add network interface device components, SAL component adaptation netdev change --- components/net/netdev/src/netdev.c | 1115 +++++++++++++++++++++++++++++ components/net/netdev/src/netdev_ipaddr.c | 257 +++++++ 2 files changed, 1372 insertions(+) create mode 100644 components/net/netdev/src/netdev.c create mode 100644 components/net/netdev/src/netdev_ipaddr.c (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c new file mode 100644 index 0000000000..4dde5f2f9c --- /dev/null +++ b/components/net/netdev/src/netdev.c @@ -0,0 +1,1115 @@ +/* + * Copyright (c) 2006-2019, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-03-18 ChenYong First version + */ + +#include + +#include +#include + +#include +#include + +#ifdef RT_USING_SAL +#include +#include +#endif /* RT_USING_SAL */ + +#define DBG_TAG "netdev" +#define DBG_LVL DBG_INFO +#include + +/* The list of network interface device */ +struct netdev *netdev_list; +/* The default network interface device */ +struct netdev *netdev_default; + +/** + * This function will register network interface device and + * add it to network interface device list. + * + * @param netdev the network interface device object + * @param name the network interface device name + * @param user_data user-specific data + * + * @return 0: registered successfully + * -1: registered failed + */ +int netdev_register(struct netdev *netdev, const char *name, void *user_data) +{ + rt_base_t level; + uint16_t flags_mask; + int index; + + RT_ASSERT(netdev); + RT_ASSERT(name); + + /* clean network interface device */ + flags_mask = NETDEV_FLAG_UP | NETDEV_FLAG_LINK_UP | NETDEV_FLAG_INTERNET_UP | NETDEV_FLAG_DHCP; + netdev->flags &= ~flags_mask; + + ip_addr_set_zero(&(netdev->ip_addr)); + ip_addr_set_zero(&(netdev->netmask)); + ip_addr_set_zero(&(netdev->gw)); + for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) + { + ip_addr_set_zero(&(netdev->dns_servers[index])); + } + netdev->status_callback = RT_NULL; + netdev->addr_callback = RT_NULL; + + /* fill network interface device */ + rt_strncpy(netdev->name, name, rt_strlen(name)); + netdev->user_data = user_data; + + /* initialize current network interface device single list */ + rt_slist_init(&(netdev->list)); + + level = rt_hw_interrupt_disable(); + + if (netdev_list == RT_NULL) + { + netdev_list = netdev; + netdev_default = netdev; + } + else + { + /* tail insertion */ + rt_slist_append(&(netdev_list->list), &(netdev->list)); + } + + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +/** + * This function will unregister network interface device and + * delete it from network interface device list. + * + * @param netdev the network interface device object + * + * @return 0: unregistered successfully + * -1: unregistered failed + */ +int netdev_unregister(struct netdev *netdev) +{ + rt_base_t level; + rt_slist_t *node = RT_NULL; + struct netdev *cur_netdev = RT_NULL; + + RT_ASSERT(netdev); + + if (netdev_list == RT_NULL) + { + return -RT_ERROR; + } + + level = rt_hw_interrupt_disable(); + + 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)) + { + rt_slist_remove(&(netdev_list->list), &(cur_netdev->list)); + rt_hw_interrupt_enable(level); + + return RT_EOK; + } + } + + rt_hw_interrupt_enable(level); + + /* not find this network interface device in network interface device list */ + return -RT_ERROR; +} + +/** + * This function will get the first network interface device + * with the link_up status in network interface device list. + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev *netdev_get_first_link_up(void) +{ + rt_base_t level; + rt_slist_t *node = RT_NULL; + struct netdev *netdev = RT_NULL; + + if (netdev_list == RT_NULL) + { + return RT_NULL; + } + + level = rt_hw_interrupt_disable(); + + for (node = &(netdev_list->list); node; node = rt_slist_next(node)) + { + netdev = rt_slist_entry(node, struct netdev, list); + if (netdev && netdev_is_up(netdev) && netdev_is_link_up(netdev)) + { + rt_hw_interrupt_enable(level); + return netdev; + } + } + + rt_hw_interrupt_enable(level); + + return RT_NULL; +} + +/** + * This function will get the first network interface device + * in network interface device list by IP address. + * + * @param addr the network interface device IP address + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr) +{ + rt_base_t level; + rt_slist_t *node = RT_NULL; + struct netdev *netdev = RT_NULL; + + if (netdev_list == RT_NULL) + { + return RT_NULL; + } + + level = rt_hw_interrupt_disable(); + + for (node = &(netdev_list->list); node; node = rt_slist_next(node)) + { + netdev = rt_slist_entry(node, struct netdev, list); + if (netdev && ip_addr_cmp(&(netdev->ip_addr), ip_addr)) + { + rt_hw_interrupt_enable(level); + return netdev; + } + } + + rt_hw_interrupt_enable(level); + + return RT_NULL; +} + +/** + * This function will get network interface device + * in network interface device list by netdev name. + * + * @param name the network interface device name + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev *netdev_get_by_name(const char *name) +{ + rt_base_t level; + rt_slist_t *node = RT_NULL; + struct netdev *netdev = RT_NULL; + + if (netdev_list == RT_NULL) + { + return RT_NULL; + } + + level = rt_hw_interrupt_disable(); + + 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)) == 0)) + { + rt_hw_interrupt_enable(level); + return netdev; + } + } + + rt_hw_interrupt_enable(level); + + return RT_NULL; +} + +#ifdef RT_USING_SAL +/** + * This function will get the first network interface device + * in network interface device list by protocol family type. + * + * @param family the network interface device protocol family type + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev *netdev_get_by_family(int family) +{ + rt_base_t level; + rt_slist_t *node = RT_NULL; + struct netdev *netdev = RT_NULL; + struct sal_proto_family *pf = RT_NULL; + + if (netdev_list == RT_NULL) + { + return RT_NULL; + } + + level = rt_hw_interrupt_disable(); + + for (node = &(netdev_list->list); node; node = rt_slist_next(node)) + { + netdev = rt_slist_entry(node, struct netdev, list); + pf = (struct sal_proto_family *) netdev->sal_user_data; + if (pf && pf->skt_ops && pf->family == family && + netdev_is_up(netdev) && netdev_is_link_up(netdev)) + { + rt_hw_interrupt_enable(level); + return netdev; + } + } + + for (node = &(netdev_list->list); node; node = rt_slist_next(node)) + { + netdev = rt_slist_entry(node, struct netdev, list); + pf = (struct sal_proto_family *) netdev->sal_user_data; + if (pf && pf->skt_ops && pf->sec_family == family && + netdev_is_up(netdev) && netdev_is_link_up(netdev)) + { + rt_hw_interrupt_enable(level); + return netdev; + } + } + + rt_hw_interrupt_enable(level); + + return RT_NULL; +} + +#endif /* RT_USING_SAL */ + +/** + * This function will set default network interface device. + * + * @param netdev the network interface device to change + */ +void netdev_set_default(struct netdev *netdev) +{ + if (netdev) + { + netdev_default = netdev; + LOG_D("Setting default network interface device name(%s) successfully.", netdev->name); + } +} + +/** + * This function will enable network interface device . + * + * @param netdev the network interface device to change + * + * @return 0: set status successfully + * -1: set status failed + */ +int netdev_set_up(struct netdev *netdev) +{ + RT_ASSERT(netdev); + + if (!netdev->ops || !netdev->ops->set_up) + { + LOG_E("The network interface device(%s) not support to set status.", netdev->name); + return -RT_ERROR; + } + + /* network interface device status flags check */ + if (netdev_is_up(netdev)) + { + return RT_EOK; + } + + /* execute enable network interface device operations by network interface device driver */ + return netdev->ops->set_up(netdev); +} +/** + * This function will disable network interface device. + * + * @param netdev the network interface device to change + * + * @return 0: set status successfully + * -1: set sttaus failed + */ +int netdev_set_down(struct netdev *netdev) +{ + RT_ASSERT(netdev); + + if (!netdev->ops || !netdev->ops->set_down) + { + LOG_E("The network interface device(%s) not support to set status.", netdev->name); + return -RT_ERROR; + } + + /* network interface device status flags check */ + if (!netdev_is_up(netdev)) + { + return RT_EOK; + } + + /* execute disable network interface device operations by network interface driver */ + return netdev->ops->set_down(netdev); +} + +/** + * This function will control network interface device DHCP capability enable or disable. + * + * @param netdev the network interface device device to change + * @param is_enable the new DHCP status + * + * @return 0: set DHCP status successfully + * -1: set DHCP status failed + */ +int netdev_dhcp_enabled(struct netdev *netdev, rt_bool_t is_enabled) +{ + RT_ASSERT(netdev); + + if (!netdev->ops || !netdev->ops->set_dhcp) + { + LOG_E("The network interface device(%s) not support to set DHCP status.", netdev->name); + return -RT_ERROR; + } + + /* network interface device DHCP flags check */ + if (netdev_is_dhcp_enabled(netdev) == is_enabled) + { + return RT_EOK; + } + + /* execute network interface device DHCP capability control operations */ + return netdev->ops->set_dhcp(netdev, is_enabled); +} + +/** + * This function will set network interface device IP address. + * + * @param netdev the network interface device to change + * @param ipaddr the new IP address + * + * @return 0: set IP address successfully + * -1: set IP address failed + */ +int netdev_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr) +{ + RT_ASSERT(netdev); + RT_ASSERT(ip_addr); + + if (!netdev->ops || !netdev->ops->set_addr_info) + { + LOG_E("The network interface device(%s) not support to set IP address.", netdev->name); + return -RT_ERROR; + } + + if (netdev_is_dhcp_enabled(netdev)) + { + LOG_E("The network interface device(%s) DHCP capability is enable, not support set IP address.", netdev->name); + return -RT_ERROR; + } + + /* execute network interface device set IP address operations */ + return netdev->ops->set_addr_info(netdev, (ip_addr_t *)ip_addr, RT_NULL, RT_NULL); +} + +/** + * This function will set network interface device netmask address. + * + * @param netdev the network interface device to change + * @param netmask the new netmask address + * + * @return 0: set netmask address successfully + * -1: set netmask address failed + */ +int netdev_set_netmask(struct netdev *netdev, const ip_addr_t *netmask) +{ + RT_ASSERT(netdev); + RT_ASSERT(netmask); + + if (!netdev->ops || !netdev->ops->set_addr_info) + { + LOG_E("The network interface device(%s) not support to set netmask address.", netdev->name); + return -RT_ERROR; + } + + if (netdev_is_dhcp_enabled(netdev)) + { + LOG_E("The network interface device(%s) DHCP capability is enable, not support set netmask address.", netdev->name); + return -RT_ERROR; + } + + /* execute network interface device set netmask address operations */ + return netdev->ops->set_addr_info(netdev, RT_NULL, (ip_addr_t *)netmask, RT_NULL); +} + +/** + * This function will set network interface device gateway address. + * + * @param netdev the network interface device to change + * @param gateway the new gateway address + * + * @return 0: set gateway address successfully + * -1: set gateway address failed + */ +int netdev_set_gw(struct netdev *netdev, const ip_addr_t *gw) +{ + RT_ASSERT(netdev); + RT_ASSERT(gw); + + if (!netdev->ops || !netdev->ops->set_addr_info) + { + LOG_E("The network interface device(%s) not support to set gateway address.", netdev->name); + return -RT_ERROR; + } + + if (netdev_is_dhcp_enabled(netdev)) + { + LOG_E("The network interface device(%s) DHCP capability is enable, not support set gateway address.", netdev->name); + return -RT_ERROR; + } + + /* execute network interface device set gateway address operations */ + return netdev->ops->set_addr_info(netdev, RT_NULL, RT_NULL, (ip_addr_t *)gw); +} + +/** + * This function will set network interface device DNS server address. + * + * @param netdev the network interface device to change + * @param dns_server the new DNS server address + * + * @return 0: set netmask address successfully + * -1: set netmask address failed + */ +int netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server) +{ + RT_ASSERT(netdev); + RT_ASSERT(dns_server); + + if (dns_num >= NETDEV_DNS_SERVERS_NUM) + { + LOG_E("The number of DNS servers(%d) set exceeds the maximum number(%d).", dns_num + 1, NETDEV_DNS_SERVERS_NUM); + return -RT_ERROR; + } + + if (!netdev->ops || !netdev->ops->set_dns_server) + { + LOG_E("The network interface device(%s) not support to set DNS server address.", netdev->name); + return -RT_ERROR; + } + + /* execute network interface device set DNS server address operations */ + return netdev->ops->set_dns_server(netdev, (ip_addr_t *)dns_server); +} + +/** + * This function will set callback to be called when the network interface device status has been changed. + * + * @param netdev the network interface device to change + * @param status_callback the callback be called when the status has been changed. + */ +void netdev_set_status_callback(struct netdev *netdev, netdev_callback_fn status_callback) +{ + RT_ASSERT(netdev); + RT_ASSERT(status_callback); + + netdev->status_callback = status_callback; +} + +/** + * This function will set callback to be called when the network interface device address has been changed. + * + * @param netdev the network interface device to change + * @param addr_callback the callback be called when the address has been changed. + */ +void netdev_set_addr_callback(struct netdev *netdev, netdev_callback_fn addr_callback) +{ + RT_ASSERT(netdev); + RT_ASSERT(addr_callback); + + netdev->addr_callback = addr_callback; +} + + +/** + * This function will set network interface device IP address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param ipaddr the new IP address + */ +void netdev_low_level_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr) +{ + RT_ASSERT(ip_addr); + + if (netdev && ip_addr_cmp(&(netdev->ip_addr), ip_addr) == 0) + { + ip_addr_copy(netdev->ip_addr, *ip_addr); + +#ifdef RT_USING_SAL + /* set network interface device flags to internet up */ + if (netdev_is_up(netdev) && netdev_is_link_up(netdev)) + { + sal_check_netdev_internet_up(netdev); + } +#endif /* RT_USING_SAL */ + + /* execute IP address change callback function */ + if (netdev->addr_callback) + { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_IP); + } + } +} + +/** + * This function will set network interface device netmask address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param netmask the new netmask address + */ +void netdev_low_level_set_netmask(struct netdev *netdev, const ip_addr_t *netmask) +{ + RT_ASSERT(netmask); + + if (netdev && ip_addr_cmp(&(netdev->netmask), netmask) == 0) + { + ip_addr_copy(netdev->netmask, *netmask); + +#ifdef RT_USING_SAL + /* set network interface device flags to internet up */ + if (netdev_is_up(netdev) && netdev_is_link_up(netdev) && + !ip_addr_isany(&(netdev->ip_addr))) + { + sal_check_netdev_internet_up(netdev); + } +#endif /* RT_USING_SAL */ + + /* execute netmask address change callback function */ + if (netdev->addr_callback) + { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_NETMASK); + } + } +} + +/** + * This function will set network interface device gateway address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param gateway the new gateway address + */ +void netdev_low_level_set_gw(struct netdev *netdev, const ip_addr_t *gw) +{ + RT_ASSERT(gw); + + if (netdev && ip_addr_cmp(&(netdev->gw), gw) == 0) + { + ip_addr_copy(netdev->gw, *gw); + +#ifdef RT_USING_SAL + /* set network interface device flags to internet up */ + if (netdev_is_up(netdev) && netdev_is_link_up(netdev) && + !ip_addr_isany(&(netdev->ip_addr))) + { + sal_check_netdev_internet_up(netdev); + } +#endif /* RT_USING_SAL */ + + /* execute gateway address change callback function */ + if (netdev->addr_callback) + { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_GATEWAY); + } + } +} + +/** + * This function will set network interface device DNS server address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param dns_server the new DNS server address + * + */ +void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server) +{ + int index; + + RT_ASSERT(dns_server); + + /* check DNS servers is exist */ + for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) + { + if (ip_addr_cmp(&(netdev->dns_servers[index]), dns_server)) + { + return; + } + } + + if (netdev && dns_num < NETDEV_DNS_SERVERS_NUM) + { + ip_addr_copy(netdev->dns_servers[dns_num], *dns_server); + + /* execute DNS servers address change callback function */ + if (netdev->addr_callback) + { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_DNS_SERVER); + } + } +} + +/** + * This function will set network interface device status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new status + */ +void netdev_low_level_set_status(struct netdev *netdev, rt_bool_t is_up) +{ + if (netdev && netdev_is_up(netdev) != is_up) + { + if (is_up) + { + netdev->flags |= NETDEV_FLAG_UP; + } + else + { + netdev->flags &= ~NETDEV_FLAG_UP; + } + + /* execute network interface device status change callback function */ + if (netdev->status_callback) + { + netdev->status_callback(netdev, is_up ? NETDEV_CB_STATUS_UP : NETDEV_CB_STATUS_DOWN); + } + } +} + +/** + * This function will set network interface device active link status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new link status + */ +void netdev_low_level_set_link_status(struct netdev *netdev, rt_bool_t is_up) +{ + if (netdev && netdev_is_link_up(netdev) != is_up) + { + if (is_up) + { + netdev->flags |= NETDEV_FLAG_LINK_UP; + +#ifdef RT_USING_SAL + /* set network interface device flags to internet up */ + if (netdev_is_up(netdev) && !ip_addr_isany(&(netdev->ip_addr))) + { + sal_check_netdev_internet_up(netdev); + } +#endif /* RT_USING_SAL */ + } + else + { + netdev->flags &= ~NETDEV_FLAG_LINK_UP; + + /* set network interface device flags to internet down */ + netdev->flags &= ~NETDEV_FLAG_INTERNET_UP; + } + + /* execute link status change callback function */ + if (netdev->status_callback) + { + netdev->status_callback(netdev, is_up ? NETDEV_CB_STATUS_LINK_UP : NETDEV_CB_STATUS_LINK_DOWN); + } + } +} + +/** + * This function will set network interface device DHCP status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new DHCP status + */ +void netdev_low_level_set_dhcp_status(struct netdev *netdev, rt_bool_t is_enable) +{ + if (netdev && netdev_is_dhcp_enabled(netdev) != is_enable) + { + if (is_enable) + { + netdev->flags |= NETDEV_FLAG_DHCP; + } + else + { + netdev->flags &= ~NETDEV_FLAG_DHCP; + } + + /* execute DHCP status change callback function */ + if (netdev->status_callback) + { + netdev->status_callback(netdev, is_enable ? NETDEV_CB_STATUS_DHCP_ENABLE : NETDEV_CB_STATUS_DHCP_DISABLE); + } + } +} + +#ifdef FINSH_USING_MSH + +#include + +#ifdef NETDEV_USING_IFCONFIG +static void netdev_list_if(void) +{ +#define NETDEV_IFCONFIG_MAC_MAX_LEN 6 +#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; + + if (cur_netdev_list == RT_NULL) + { + rt_kprintf("ifconfig: network interface device list error.\n"); + 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, + (netdev == netdev_default)?" (Default)":""); + rt_kprintf("MTU: %d\n", netdev->mtu); + + /* 6 - MAC address, 8 - IEMI */ + if (netdev->hwaddr_len == NETDEV_IFCONFIG_MAC_MAX_LEN) + { + rt_kprintf("MAC: "); + for (index = 0; index < netdev->hwaddr_len; index++) + { + rt_kprintf("%02x ", netdev->hwaddr[index]); + } + } + else if (netdev->hwaddr_len == NETDEV_IFCONFIG_IEMI_MAX_LEN) + { + rt_kprintf("IEMI: "); + for (index = 0; index < netdev->hwaddr_len; index++) + { + /* two numbers are displayed at one time*/ + if (netdev->hwaddr[index] < 10 && index != netdev->hwaddr_len - 1) + rt_kprintf("0"); + + rt_kprintf("%d", netdev->hwaddr[index]); + } + } + + rt_kprintf("\nFLAGS:"); + if (netdev->flags & NETDEV_FLAG_UP) rt_kprintf(" UP"); + else rt_kprintf(" DOWN"); + if (netdev->flags & NETDEV_FLAG_LINK_UP) rt_kprintf(" LINK_UP"); + else rt_kprintf(" LINK_DOWN"); + if (netdev->flags & NETDEV_FLAG_INTERNET_UP) rt_kprintf(" INTERNET_UP"); + else rt_kprintf(" INTERNET_DOWN"); + if (netdev->flags & NETDEV_FLAG_DHCP) rt_kprintf(" DHCP_ENABLE"); + else rt_kprintf(" DHCP_DISABLE"); + if (netdev->flags & NETDEV_FLAG_ETHARP) rt_kprintf(" ETHARP"); + if (netdev->flags & NETDEV_FLAG_BROADCAST) rt_kprintf(" BROADCAST"); + if (netdev->flags & NETDEV_FLAG_IGMP) rt_kprintf(" IGMP"); + rt_kprintf("\n"); + rt_kprintf("ip address: %s\n", inet_ntoa(netdev->ip_addr)); + rt_kprintf("gw address: %s\n", inet_ntoa(netdev->gw)); + rt_kprintf("net mask : %s\n", inet_ntoa(netdev->netmask)); + + for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) + { + rt_kprintf("dns server #%d: %s\n", index, inet_ntoa(netdev->dns_servers[index])); + } + + if (rt_slist_next(node)) + { + 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) +{ + struct netdev *netdev = RT_NULL; + ip_addr_t addr; + + netdev = netdev_get_by_name(netdev_name); + if (netdev == RT_NULL) + { + rt_kprintf("bad network interface device name(%s).\n", netdev_name); + return; + } + + /* set IP address */ + if ((ip_addr != RT_NULL) && inet_aton(ip_addr, &addr)) + { + netdev_set_ipaddr(netdev, &addr); + } + + /* set gateway address */ + if ((gw_addr != RT_NULL) && inet_aton(gw_addr, &addr)) + { + netdev_set_gw(netdev, &addr); + } + + /* set netmask address */ + if ((nm_addr != RT_NULL) && inet_aton(nm_addr, &addr)) + { + netdev_set_netmask(netdev, &addr); + } +} + +int netdev_ifconfig(int argc, char **argv) +{ + if (argc == 1) + { + netdev_list_if(); + } + else if (argc == 5) + { + rt_kprintf("config : %s\n", argv[1]); + rt_kprintf("IP addr: %s\n", argv[2]); + rt_kprintf("Gateway: %s\n", argv[3]); + rt_kprintf("netmask: %s\n", argv[4]); + netdev_set_if(argv[1], argv[2], argv[3], argv[4]); + } + else + { + rt_kprintf("bad parameter! e.g: ifconfig e0 192.168.1.30 192.168.1.1 255.255.255.0\n"); + } + + return 0; +} +FINSH_FUNCTION_EXPORT_ALIAS(netdev_ifconfig, __cmd_ifconfig, list the information of all network interfaces); +#endif /* NETDEV_USING_IFCONFIG */ + +#ifdef NETDEV_USING_PING +static 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 */ +#define NETDEV_PING_RECV_TIMEO (2 * RT_TICK_PER_SECOND) +/** ping delay - in milliseconds */ +#define NETDEV_PING_DELAY (1 * RT_TICK_PER_SECOND) +/* check netdev ping options */ +#define NETDEV_PING_IS_COMMONICABLE(netdev) \ + ((netdev) && (netdev)->ops && (netdev)->ops->ping && \ + netdev_is_up(netdev) && netdev_is_link_up(netdev)) \ + + struct netdev *netdev = RT_NULL; + struct netdev_ping_resp ping_resp; + int index, ret = 0; + + if (size == 0) + { + size = NETDEV_PING_DATA_SIZE; + } + + if (NETDEV_PING_IS_COMMONICABLE(netdev_default)) + { + /* using default network interface device for ping */ + netdev = netdev_default; + } + else + { + /* using first internet up status network interface device */ + netdev = netdev_get_first_link_up(); + if (netdev == RT_NULL || NETDEV_PING_IS_COMMONICABLE(netdev) == 0) + { + rt_kprintf("ping: network interface device get error.\n"); + return -RT_ERROR; + } + } + + for (index = 0; index < times; index++) + { + rt_memset(&ping_resp, 0x00, sizeof(struct netdev_ping_resp)); + ret = netdev->ops->ping(netdev, (const char *)target_name, size, NETDEV_PING_RECV_TIMEO, &ping_resp); + if (ret == -RT_ETIMEOUT) + { + rt_kprintf("ping: from %s icmp_seq=%d timeout\n", + (ip_addr_isany(&(ping_resp.ip_addr))) ? target_name : inet_ntoa(ping_resp.ip_addr), index); + } + else if (ret == -RT_ERROR) + { + rt_kprintf("ping: unknown %s %s\n", + (ip_addr_isany(&(ping_resp.ip_addr))) ? "host" : "address", + (ip_addr_isany(&(ping_resp.ip_addr))) ? target_name : inet_ntoa(ping_resp.ip_addr)); + } + else + { + if (ping_resp.ttl == 0) + { + rt_kprintf("%d bytes from %s icmp_seq=%d time=%d ms\n", + ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index, ping_resp.ticks); + } + else + { + rt_kprintf("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", + ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index, ping_resp.ttl, ping_resp.ticks); + } + } + + rt_thread_mdelay(NETDEV_PING_DELAY); + } + + return RT_EOK; +} + +int netdev_ping(int argc, char **argv) +{ + if (argc == 1) + { + rt_kprintf("Please input: ping \n"); + } + else + { + netdev_cmd_ping(argv[1], 4, 0); + } + + return 0; +} +FINSH_FUNCTION_EXPORT_ALIAS(netdev_ping, __cmd_ping, ping network host); +#endif /* NETDEV_USING_IFCONFIG */ + +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, + (netdev == netdev_default)?" (Default)":""); + + for(index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) + { + rt_kprintf("dns server #%d: %s\n", index, inet_ntoa(netdev->dns_servers[index])); + } + + if (rt_slist_next(node)) + { + rt_kprintf("\n"); + } + } + + rt_hw_interrupt_enable(level); +} + +static void netdev_set_dns(char *netdev_name, char *dns_server) +{ + struct netdev *netdev = RT_NULL; + ip_addr_t dns_addr; + + netdev = netdev_get_by_name(netdev_name); + if (netdev == RT_NULL) + { + rt_kprintf("bad network interface device name(%s).\n", netdev_name); + return; + } + + inet_aton(dns_server, &dns_addr); + netdev_set_dns_server(netdev, 0, &dns_addr); + + rt_kprintf("set network interface device(%s) dns server #0: %s\n", netdev_name, dns_server); +} + +int netdev_dns(int argc, char **argv) +{ + if (argc == 1) + { + netdev_list_dns(); + } + else if (argc == 3) + { + netdev_set_dns(argv[1], argv[2]); + } + else + { + rt_kprintf("bad parameter! e.g: dns name 114.114.114.114\n"); + } + + return 0; +} +FINSH_FUNCTION_EXPORT_ALIAS(netdev_dns, __cmd_dns, list and set the information of dns); + +#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; + + if (cur_netdev_list == RT_NULL) + { + rt_kprintf("netstat: network interface device list error.\n"); + 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); + + if (netdev && netdev->ops && netdev->ops->netstat) + { + break; + } + } + + rt_hw_interrupt_enable(level); + + netdev->ops->netstat(netdev); +} + +int netdev_netstat(int argc, char **argv) +{ + if (argc != 1) + { + rt_kprintf("Please input: netstat \n"); + } + else + { + netdev_cmd_netstat(); + } + + return 0; +} +FINSH_FUNCTION_EXPORT_ALIAS(netdev_netstat, __cmd_netstat, list the information of TCP / IP); +#endif /* NETDEV_USING_NETSTAT */ + +#endif /* FINSH_USING_MSH */ diff --git a/components/net/netdev/src/netdev_ipaddr.c b/components/net/netdev/src/netdev_ipaddr.c new file mode 100644 index 0000000000..988bd50eb7 --- /dev/null +++ b/components/net/netdev/src/netdev_ipaddr.c @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-05-18 ChenYong First version + */ + +#include +#include + +/* Here for now until needed in other places in lwIP */ +#ifndef isprint +#define in_range(c, lo, up) ((uint8_t)c >= lo && (uint8_t)c <= up) +#define isprint(c) in_range(c, 0x20, 0x7f) +#define isdigit(c) in_range(c, '0', '9') +#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) +#define islower(c) in_range(c, 'a', 'z') +#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') +#endif + + +/** + * Check whether "cp" is a valid ascii representation + * of an Internet address and convert to a binary address. + * Returns 1 if the address is valid, 0 if not. + * This replaces inet_addr, the return value from which + * cannot distinguish between failure and a local broadcast address. + * + * @param cp IP address in ascii representation (e.g. "127.0.0.1") + * @param addr pointer to which to save the ip address in network order + * @return 1 if cp could be converted to addr, 0 on failure + */ +int netdev_ip4addr_aton(const char *cp, ip4_addr_t *addr) +{ + uint32_t val; + uint8_t base; + char c; + uint32_t parts[4]; + uint32_t *pp = parts; + + c = *cp; + for (;;) + { + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, 1-9=decimal. + */ + if (!isdigit(c)) + { + return 0; + } + val = 0; + base = 10; + if (c == '0') + { + c = *++cp; + if (c == 'x' || c == 'X') + { + base = 16; + c = *++cp; + } + else + { + base = 8; + } + } + for (;;) + { + if (isdigit(c)) + { + val = (val * base) + (uint32_t) (c - '0'); + c = *++cp; + } + else if (base == 16 && isxdigit(c)) + { + val = (val << 4) | (uint32_t) (c + 10 - (islower(c) ? 'a' : 'A')); + c = *++cp; + } + else + { + break; + } + } + if (c == '.') + { + /* + * Internet format: + * a.b.c.d + * a.b.c (with c treated as 16 bits) + * a.b (with b treated as 24 bits) + */ + if (pp >= parts + 3) + { + return 0; + } + *pp++ = val; + c = *++cp; + } + else + { + break; + } + } + /* + * Check for trailing characters. + */ + if (c != '\0' && !isspace(c)) + { + return 0; + } + /* + * Concoct the address according to + * the number of parts specified. + */ + switch (pp - parts + 1) + { + + case 0: + return 0; /* initial nondigit */ + + case 1: /* a -- 32 bits */ + break; + + case 2: /* a.b -- 8.24 bits */ + if (val > 0xffffffUL) + { + return 0; + } + if (parts[0] > 0xff) + { + return 0; + } + val |= parts[0] << 24; + break; + + case 3: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff) + { + return 0; + } + if ((parts[0] > 0xff) || (parts[1] > 0xff)) + { + return 0; + } + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 4: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff) + { + return 0; + } + if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) + { + return 0; + } + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + default: + RT_ASSERT(0); + break; + } + if (addr) + { + ip4_addr_set_u32(addr, htonl(val)); + } + return 1; +} + +/** + * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. + * + * @param addr ip address in network order to convert + * @param buf target buffer where the string is stored + * @param buflen length of buf + * @return either pointer to buf which now holds the ASCII + * representation of addr or NULL if buf was too small + */ +char *netdev_ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen) +{ + uint32_t s_addr; + char inv[3]; + char *rp; + uint8_t *ap; + uint8_t rem; + uint8_t n; + uint8_t i; + int len = 0; + + s_addr = ip4_addr_get_u32(addr); + + rp = buf; + ap = (uint8_t *) &s_addr; + for (n = 0; n < 4; n++) + { + i = 0; + do + { + rem = *ap % (uint8_t) 10; + *ap /= (uint8_t) 10; + inv[i++] = (char) ('0' + rem); + } while (*ap); + while (i--) + { + if (len++ >= buflen) + { + return NULL; + } + *rp++ = inv[i]; + } + if (len++ >= buflen) + { + return NULL; + } + *rp++ = '.'; + ap++; + } + *--rp = 0; + return buf; +} + + +/** + * Convert numeric IP address into decimal dotted ASCII representation. + * returns ptr to static buffer; not reentrant! + * + * @param addr ip address in network order to convert + * @return pointer to a global static (!) buffer that holds the ASCII + * representation of addr + */ +char *netdev_ip4addr_ntoa(const ip4_addr_t *addr) +{ + static char str[IP4ADDR_STRLEN_MAX]; + return netdev_ip4addr_ntoa_r(addr, str, IP4ADDR_STRLEN_MAX); +} + + +/** + * Ascii internet address interpretation routine. + * The value returned is in network order. + * + * @param cp IP address in ascii representation (e.g. "127.0.0.1") + * @return ip address in network order + */ +in_addr_t netdev_ipaddr_addr(const char *cp) +{ + ip4_addr_t val; + + if (netdev_ip4addr_aton(cp, &val)) { + return ip4_addr_get_u32(&val); + } + return (IPADDR_NONE); +} -- cgit v1.3.1 From 126fa9b561e9313a70cad58ea2fbb278aa2fe65e Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 23 Apr 2019 15:08:10 +0800 Subject: [net][netdev] Improve netdev DNS setting function --- components/net/lwip-1.4.1/src/netif/ethernetif.c | 10 +++++----- components/net/lwip-2.0.2/src/netif/ethernetif.c | 10 +++++----- components/net/lwip-2.1.0/src/netif/ethernetif.c | 10 +++++----- components/net/netdev/include/netdev.h | 2 +- components/net/netdev/src/netdev.c | 16 +++++++++++----- 5 files changed, 27 insertions(+), 21 deletions(-) (limited to 'components/net/netdev/src') 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 7508ea0b87..10bcaa0c95 100644 --- a/components/net/lwip-1.4.1/src/netif/ethernetif.c +++ b/components/net/lwip-1.4.1/src/netif/ethernetif.c @@ -144,10 +144,10 @@ 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, ip_addr_t *dns_server) +static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server) { - extern void set_dns(char* dns_server); - set_dns(ipaddr_ntoa(dns_server)); + extern void set_dns(uint8_t dns_num, char* dns_server); + set_dns(dns_num, ipaddr_ntoa(dns_server)); return ERR_OK; } #endif /* RT_LWIP_DNS */ @@ -729,13 +729,13 @@ FINSH_FUNCTION_EXPORT(set_if, set network interface address); #if LWIP_DNS #include -void set_dns(char* dns_server) +void set_dns(uint8_t dns_num, char* dns_server) { struct ip_addr addr; if ((dns_server != RT_NULL) && ipaddr_aton(dns_server, &addr)) { - dns_setserver(0, &addr); + dns_setserver(dns_num, &addr); } } FINSH_FUNCTION_EXPORT(set_dns, set DNS server address); 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 38e46de046..f19ec094fa 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -152,10 +152,10 @@ 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, ip_addr_t *dns_server) +static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server) { - extern void set_dns(char* dns_server); - set_dns(ipaddr_ntoa(dns_server)); + extern void set_dns(uint8_t dns_num, char* dns_server); + set_dns(dns_num, ipaddr_ntoa(dns_server)); return ERR_OK; } #endif /* RT_LWIP_DNS */ @@ -758,13 +758,13 @@ FINSH_FUNCTION_EXPORT(set_if, set network interface address); #if LWIP_DNS #include -void set_dns(char* dns_server) +void set_dns(uint8_t dns_num, char* dns_server) { ip_addr_t addr; if ((dns_server != RT_NULL) && ipaddr_aton(dns_server, &addr)) { - dns_setserver(0, &addr); + dns_setserver(dns_num, &addr); } } FINSH_FUNCTION_EXPORT(set_dns, set DNS server address); 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 fd9db058e0..db28a4a55b 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -153,10 +153,10 @@ 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, ip_addr_t *dns_server) +static int lwip_netdev_set_dns_server(struct netdev *netif, uint8_t dns_num, ip_addr_t *dns_server) { - extern void set_dns(char* dns_server); - set_dns(ipaddr_ntoa(dns_server)); + extern void set_dns(uint8_t dns_num, char* dns_server); + set_dns(dns_num, ipaddr_ntoa(dns_server)); return ERR_OK; } #endif /* RT_LWIP_DNS */ @@ -762,13 +762,13 @@ FINSH_FUNCTION_EXPORT(set_if, set network interface address); #if LWIP_DNS #include -void set_dns(char* dns_server) +void set_dns(uint8_t dns_num, char* dns_server) { ip_addr_t addr; if ((dns_server != RT_NULL) && ipaddr_aton(dns_server, &addr)) { - dns_setserver(0, &addr); + dns_setserver(dns_num, &addr); } } FINSH_FUNCTION_EXPORT(set_dns, set DNS server address); diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index e194003653..5ea8e96080 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -119,7 +119,7 @@ struct netdev_ops /* set network interface device address information operations */ int (*set_addr_info)(struct netdev *netdev, ip_addr_t *ip_addr, ip_addr_t *netmask, ip_addr_t *gw); - int (*set_dns_server)(struct netdev *netdev, ip_addr_t *dns_server); + 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); /* set network interface device common network interface device operations */ diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 4dde5f2f9c..c5b4d0e321 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -9,6 +9,7 @@ */ #include +#include #include #include @@ -510,7 +511,7 @@ int netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_ } /* execute network interface device set DNS server address operations */ - return netdev->ops->set_dns_server(netdev, (ip_addr_t *)dns_server); + return netdev->ops->set_dns_server(netdev, dns_num, (ip_addr_t *)dns_server); } /** @@ -1028,7 +1029,7 @@ static void netdev_list_dns(void) rt_hw_interrupt_enable(level); } -static void netdev_set_dns(char *netdev_name, char *dns_server) +static void netdev_set_dns(char *netdev_name, uint8_t dns_num, char *dns_server) { struct netdev *netdev = RT_NULL; ip_addr_t dns_addr; @@ -1041,7 +1042,7 @@ static void netdev_set_dns(char *netdev_name, char *dns_server) } inet_aton(dns_server, &dns_addr); - netdev_set_dns_server(netdev, 0, &dns_addr); + netdev_set_dns_server(netdev, dns_num, &dns_addr); rt_kprintf("set network interface device(%s) dns server #0: %s\n", netdev_name, dns_server); } @@ -1054,11 +1055,16 @@ int netdev_dns(int argc, char **argv) } else if (argc == 3) { - netdev_set_dns(argv[1], argv[2]); + netdev_set_dns(argv[1], 0, argv[2]); + } + else if (argc == 4) + { + netdev_set_dns(argv[1], atoi(argv[2]), argv[3]); } else { - rt_kprintf("bad parameter! e.g: dns name 114.114.114.114\n"); + rt_kprintf("bad parameter! input: dns [dns_num] \n"); + return -1; } return 0; -- cgit v1.3.1 From 2721e7189a0a07c7ac576c7015dfc2146246380e Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Sat, 27 Apr 2019 17:24:58 +0800 Subject: [net][netdev] Fix netdev link_down status, socket create failed issue Signed-off-by: chenyong <1521761801@qq.com> --- components/net/netdev/src/netdev.c | 6 ++---- components/net/sal_socket/src/sal_socket.c | 17 ++++++----------- 2 files changed, 8 insertions(+), 15 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index c5b4d0e321..e4a88ca022 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -269,8 +269,7 @@ struct netdev *netdev_get_by_family(int family) { netdev = rt_slist_entry(node, struct netdev, list); pf = (struct sal_proto_family *) netdev->sal_user_data; - if (pf && pf->skt_ops && pf->family == family && - netdev_is_up(netdev) && netdev_is_link_up(netdev)) + if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev)) { rt_hw_interrupt_enable(level); return netdev; @@ -281,8 +280,7 @@ struct netdev *netdev_get_by_family(int family) { netdev = rt_slist_entry(node, struct netdev, list); pf = (struct sal_proto_family *) netdev->sal_user_data; - if (pf && pf->skt_ops && pf->sec_family == family && - netdev_is_up(netdev) && netdev_is_link_up(netdev)) + if (pf && pf->skt_ops && pf->sec_family == family && netdev_is_up(netdev)) { rt_hw_interrupt_enable(level); return netdev; diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index f4d5549aad..4117ab51e7 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -388,17 +388,14 @@ static int socket_init(int family, int type, int protocol, struct sal_socket **r sock->protocol = protocol; /* get socket operations from network interface device */ - if (netdv_def) + if (netdv_def && netdev_is_up(netdv_def)) { - if (netdev_is_up(netdv_def) && netdev_is_link_up(netdv_def)) + /* check default network interface device protocol family */ + pf = (struct sal_proto_family *) netdv_def->sal_user_data; + if (pf != RT_NULL && pf->skt_ops && (pf->family == family || pf->sec_family == family)) { - /* check default network interface device protocol family */ - pf = (struct sal_proto_family *) netdv_def->sal_user_data; - if (pf != RT_NULL && pf->skt_ops && (pf->family == family || pf->sec_family == family)) - { - sock->netdev = netdv_def; - falgs = RT_TRUE; - } + sock->netdev = netdv_def; + falgs = RT_TRUE; } } else @@ -516,8 +513,6 @@ int sal_accept(int socket, struct sockaddr *addr, socklen_t *addrlen) /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* check the network interface is commonicable */ - SAL_NETDEV_IS_COMMONICABLE(sock->netdev); /* check the network interface socket operations */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, accept); -- cgit v1.3.1 From 2d82b621118773fe3d21177adeba0f6e6d41acb6 Mon Sep 17 00:00:00 2001 From: HubretXie Date: Sun, 28 Apr 2019 15:24:23 +0800 Subject: Update netdev.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据family查找netdev时,优先查找family匹配并且已经联网的网卡 再查找family匹配但是未联网的网卡 --- components/net/netdev/src/netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index e4a88ca022..bfefc2d1de 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -269,7 +269,7 @@ struct netdev *netdev_get_by_family(int family) { netdev = rt_slist_entry(node, struct netdev, list); pf = (struct sal_proto_family *) netdev->sal_user_data; - if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev)) + if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev) && netdev_is_link_up(netdev)) { rt_hw_interrupt_enable(level); return netdev; -- cgit v1.3.1 From 7424e44e205a929cdae84769528f2b7ba4145c7a Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Sun, 5 May 2019 20:30:24 +0800 Subject: [net][netdev] Add default netdev automatic change features configuration Signed-off-by: chenyong <1521761801@qq.com> --- components/net/Kconfig | 3 +++ components/net/netdev/src/netdev.c | 29 ++++++++++++++++++++++++++++- components/net/sal_socket/src/sal_socket.c | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/Kconfig b/components/net/Kconfig index a719f7be6f..30472e57b1 100644 --- a/components/net/Kconfig +++ b/components/net/Kconfig @@ -73,6 +73,9 @@ config RT_USING_NETDEV bool "Enable netstat features" default y + config NETDEV_USING_AUTO_DEFAULT + bool "Enable default netdev automatic change features" + default y endif endmenu diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index bfefc2d1de..fbc08325b4 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -269,7 +269,7 @@ struct netdev *netdev_get_by_family(int family) { netdev = rt_slist_entry(node, struct netdev, list); pf = (struct sal_proto_family *) netdev->sal_user_data; - if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev) && netdev_is_link_up(netdev)) + if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev)) { rt_hw_interrupt_enable(level); return netdev; @@ -671,6 +671,23 @@ void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, con } } +#ifdef NETDEV_USING_AUTO_DEFAULT +/* Change to the first link_up network interface device automatically */ +static void netdev_auto_change_default(struct netdev *netdev) +{ + struct netdev *new_netdev = RT_NULL; + + if (rt_memcmp(netdev, netdev_default, sizeof(struct netdev)) == 0) + { + new_netdev = netdev_get_first_link_up(); + if (new_netdev) + { + netdev_set_default(new_netdev); + } + } +} +#endif /* NETDEV_USING_AUTO_DEFAULT */ + /** * This function will set network interface device status. * @NOTE it can only be called in the network interface device driver. @@ -689,6 +706,11 @@ void netdev_low_level_set_status(struct netdev *netdev, rt_bool_t is_up) else { netdev->flags &= ~NETDEV_FLAG_UP; + +#ifdef NETDEV_USING_AUTO_DEFAULT + /* change to the first link_up network interface device automatically */ + netdev_auto_change_default(netdev); +#endif /* NETDEV_USING_AUTO_DEFAULT */ } /* execute network interface device status change callback function */ @@ -728,6 +750,11 @@ void netdev_low_level_set_link_status(struct netdev *netdev, rt_bool_t is_up) /* set network interface device flags to internet down */ netdev->flags &= ~NETDEV_FLAG_INTERNET_UP; + +#ifdef NETDEV_USING_AUTO_DEFAULT + /* change to the first link_up network interface device automatically */ + netdev_auto_change_default(netdev); +#endif /* NETDEV_USING_AUTO_DEFAULT */ } /* execute link status change callback function */ diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index f6fdeb61f7..a63f5cafc5 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -387,7 +387,7 @@ static int socket_init(int family, int type, int protocol, struct sal_socket **r sock->type = type; sock->protocol = protocol; - if (netdv_def && netdev_is_up(netdv_def) && netdev_is_link_up(netdv_def)) + if (netdv_def && netdev_is_up(netdv_def)) { /* check default network interface device protocol family */ pf = (struct sal_proto_family *) netdv_def->sal_user_data; -- cgit v1.3.1 From 4de0533a5114fcc03f560d48868d13dab7553fba Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Fri, 10 May 2019 15:57:58 +0800 Subject: [net][sal][netdev] Delete the link_up status judgment in the send/recv interface Signed-off-by: chenyong <1521761801@qq.com> --- components/net/netdev/include/netdev.h | 2 +- components/net/netdev/src/netdev.c | 12 +++++---- components/net/sal_socket/src/sal_socket.c | 40 +++++++++++++++--------------- 3 files changed, 28 insertions(+), 26 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index 5ea8e96080..e9d8e38658 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -133,7 +133,7 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data); int netdev_unregister(struct netdev *netdev); /* Get network interface device object */ -struct netdev *netdev_get_first_link_up(void); +struct netdev *netdev_get_first_by_flags(uint16_t flags); struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr); struct netdev *netdev_get_by_name(const char *name); #ifdef RT_USING_SAL diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index fbc08325b4..71b1ec7ccd 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -134,12 +134,14 @@ int netdev_unregister(struct netdev *netdev) /** * This function will get the first network interface device - * with the link_up status in network interface device list. + * with the flags in network interface device list. + * + * @param flags the network interface device flags * * @return != NULL: network interface device object * NULL: get failed */ -struct netdev *netdev_get_first_link_up(void) +struct netdev *netdev_get_first_by_flags(uint16_t flags) { rt_base_t level; rt_slist_t *node = RT_NULL; @@ -155,7 +157,7 @@ struct netdev *netdev_get_first_link_up(void) for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_slist_entry(node, struct netdev, list); - if (netdev && netdev_is_up(netdev) && netdev_is_link_up(netdev)) + if (netdev && (netdev->flags & flags) != 0) { rt_hw_interrupt_enable(level); return netdev; @@ -679,7 +681,7 @@ static void netdev_auto_change_default(struct netdev *netdev) if (rt_memcmp(netdev, netdev_default, sizeof(struct netdev)) == 0) { - new_netdev = netdev_get_first_link_up(); + new_netdev = netdev_get_first_by_flags(NETDEV_FLAG_LINK_UP); if (new_netdev) { netdev_set_default(new_netdev); @@ -964,7 +966,7 @@ static int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) else { /* using first internet up status network interface device */ - netdev = netdev_get_first_link_up(); + netdev = netdev_get_first_by_flags(NETDEV_FLAG_LINK_UP); if (netdev == RT_NULL || NETDEV_PING_IS_COMMONICABLE(netdev) == 0) { rt_kprintf("ping: network interface device get error.\n"); diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index a63f5cafc5..8f3149abd5 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -70,9 +70,9 @@ do { } \ }while(0) \ -#define SAL_NETDEV_IS_COMMONICABLE(netdev) \ +#define SAL_NETDEV_IS_UP(netdev) \ do { \ - if (!netdev_is_up(netdev) || !netdev_is_link_up(netdev)){ \ + if (!netdev_is_up(netdev)) { \ return -1; \ } \ }while(0) \ @@ -86,9 +86,9 @@ do { }while(0) \ #define SAL_NETDEV_NETDBOPS_VALID(netdev, pf, ops) \ -((netdev) && netdev_is_up(netdev) && netdev_is_link_up(netdev) && \ + ((netdev) && netdev_is_up(netdev) && \ ((pf) = (struct sal_proto_family *) (netdev)->sal_user_data) != RT_NULL && \ - (pf)->netdb_ops->ops) \ + (pf)->netdb_ops->ops) \ /** * SAL (Socket Abstraction Layer) initialize. @@ -748,8 +748,8 @@ int sal_connect(int socket, const struct sockaddr *name, socklen_t namelen) /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* check the network interface is commonicable */ - SAL_NETDEV_IS_COMMONICABLE(sock->netdev); + /* check the network interface is up status */ + SAL_NETDEV_IS_UP(sock->netdev); /* check the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, connect); @@ -792,8 +792,8 @@ int sal_recvfrom(int socket, void *mem, size_t len, int flags, /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* check the network interface is commonicable */ - SAL_NETDEV_IS_COMMONICABLE(sock->netdev); + /* check the network interface is up status */ + SAL_NETDEV_IS_UP(sock->netdev); /* check the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, recvfrom); @@ -826,8 +826,8 @@ int sal_sendto(int socket, const void *dataptr, size_t size, int flags, /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* check the network interface is commonicable */ - SAL_NETDEV_IS_COMMONICABLE(sock->netdev); + /* check the network interface is up status */ + SAL_NETDEV_IS_UP(sock->netdev); /* check the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, sendto); @@ -965,8 +965,8 @@ int sal_poll(struct dfs_fd *file, struct rt_pollreq *req) /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* check the network interface is commonicable */ - SAL_NETDEV_IS_COMMONICABLE(sock->netdev); + /* check the network interface is up status */ + SAL_NETDEV_IS_UP(sock->netdev); /* check the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, poll); @@ -985,8 +985,8 @@ struct hostent *sal_gethostbyname(const char *name) } else { - /* get the first network interface device with the link up status */ - netdev = netdev_get_first_link_up(); + /* get the first network interface device with up status */ + netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP); if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, gethostbyname)) { return pf->netdb_ops->gethostbyname(name); @@ -1008,8 +1008,8 @@ int sal_gethostbyname_r(const char *name, struct hostent *ret, char *buf, } else { - /* get the first network interface device with the link up status */ - netdev = netdev_get_first_link_up(); + /* get the first network interface device with up status */ + netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP); if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, gethostbyname_r)) { return pf->netdb_ops->gethostbyname_r(name, ret, buf, buflen, result, h_errnop); @@ -1033,8 +1033,8 @@ int sal_getaddrinfo(const char *nodename, } else { - /* get the first network interface device with the link up status */ - netdev = netdev_get_first_link_up(); + /* get the first network interface device with up status */ + netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP); if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, getaddrinfo)) { return pf->netdb_ops->getaddrinfo(nodename, servname, hints, res); @@ -1055,8 +1055,8 @@ void sal_freeaddrinfo(struct addrinfo *ai) } else { - /* get the first network interface device with the link up status */ - netdev = netdev_get_first_link_up(); + /* get the first network interface device with up status */ + netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP); if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, freeaddrinfo)) { pf->netdb_ops->freeaddrinfo(ai); -- cgit v1.3.1 From 1f9a668607be01db25695bdfa34f90905de3e4c3 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 28 May 2019 11:03:36 +0800 Subject: [net][at] Fix socket create failed issue when default netdev mismatch. Signed-off-by: chenyong <1521761801@qq.com> --- components/net/at/at_socket/at_socket.c | 11 ++++++----- components/net/netdev/include/netdev.h | 1 + components/net/netdev/src/netdev.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index a3b36a06ae..993ec33506 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -359,20 +359,21 @@ __err: return RT_NULL; } -static struct at_socket *alloc_socket(int domain) +static struct at_socket *alloc_socket(void) { extern struct netdev *netdev_default; struct netdev *netdev = RT_NULL; struct at_device *device = RT_NULL; - if (netdev_default && netdev_is_up(netdev_default)) + if (netdev_default && netdev_is_up(netdev_default) && + netdev_family_get(netdev_default) == AF_AT) { netdev = netdev_default; } else { - /* get network interface device by protocol family */ - netdev = netdev_get_by_family(domain); + /* get network interface device by protocol family AF_AT */ + netdev = netdev_get_by_family(AF_AT); if (netdev == RT_NULL) { return RT_NULL; @@ -414,7 +415,7 @@ int at_socket(int domain, int type, int protocol) } /* allocate and initialize a new AT socket */ - sock = alloc_socket(domain); + sock = alloc_socket(); if (sock == RT_NULL) { return -1; diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index e9d8e38658..0be2a2bda3 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -138,6 +138,7 @@ struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr); struct netdev *netdev_get_by_name(const char *name); #ifdef RT_USING_SAL struct netdev *netdev_get_by_family(int family); +int netdev_family_get(struct netdev *netdev); #endif /* RT_USING_SAL */ /* Set default network interface device in list */ diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 71b1ec7ccd..5f49a46f17 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -294,6 +294,20 @@ struct netdev *netdev_get_by_family(int family) return RT_NULL; } +/** + * This function will get the family type from network interface device + * + * @param netdev network interface device object + * + * @return the network interface device family type + */ +int netdev_family_get(struct netdev *netdev) +{ + RT_ASSERT(netdev); + + return ((struct sal_proto_family *)netdev->sal_user_data)->family; +} + #endif /* RT_USING_SAL */ /** -- cgit v1.3.1 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/Kconfig | 29 +- components/net/at/at_socket/at_socket.c | 17 +- components/net/lwip-2.0.2/src/core/netif.c | 15 +- components/net/lwip-2.0.2/src/netif/ethernetif.c | 8 +- components/net/lwip-2.1.0/src/core/netif.c | 15 +- components/net/lwip-2.1.0/src/netif/ethernetif.c | 8 +- components/net/lwip-2.1.0/src/netif/lowpan6.c | 2 +- components/net/netdev/include/netdev.h | 11 + components/net/netdev/include/netdev_ipaddr.h | 253 ++++++++++++---- components/net/netdev/src/netdev.c | 36 ++- components/net/netdev/src/netdev_ipaddr.c | 357 +++++++++++++++++++++++ components/net/sal_socket/impl/af_inet_lwip.c | 10 + components/net/sal_socket/include/sal_socket.h | 20 +- components/net/sal_socket/src/sal_socket.c | 11 +- 14 files changed, 703 insertions(+), 89 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/Kconfig b/components/net/Kconfig index 68737176ed..3db8201d8a 100644 --- a/components/net/Kconfig +++ b/components/net/Kconfig @@ -76,6 +76,25 @@ config RT_USING_NETDEV config NETDEV_USING_AUTO_DEFAULT bool "Enable default netdev automatic change features" default y + + config NETDEV_USING_IPV6 + bool "Enable IPV6 protocol support" + default n + + config NETDEV_IPV4 + int + default 1 + + config NETDEV_IPV6 + int + default 1 if NETDEV_USING_IPV6 + default 0 if !NETDEV_USING_IPV6 + + config NETDEV_IPV6_SCOPES + bool + help + Defined to synchronize the ip6_addr structure state + default n endif endmenu @@ -104,11 +123,11 @@ config RT_USING_LWIP endchoice if (RT_USING_LWIP210 || RT_USING_LWIP202) - if (!RT_USING_NETDEV || (RT_USING_NETDEV && NETDEV_IPV6)) - config RT_USING_LWIP_IPV6 - bool "IPV6 protocol" - default n - endif + config RT_USING_LWIP_IPV6 + bool "IPV6 protocol" + default n + select NETDEV_USING_IPV6 + select NETDEV_IPV6_SCOPES if RT_USING_LWIP210 endif config RT_LWIP_IGMP diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index 993ec33506..804443fe32 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -540,11 +540,12 @@ static int socketaddr_to_ipaddr_port(const struct sockaddr *sockaddr, ip_addr_t const struct sockaddr_in* sin = (const struct sockaddr_in*) (const void *) sockaddr; #if NETDEV_IPV4 && NETDEV_IPV6 - (*addr).u_addr.ip4.addr = sin->sin_addr.s_addr; + addr->u_addr.ip4.addr = sin->sin_addr.s_addr; + addr->type = IPADDR_TYPE_V4; #elif NETDEV_IPV4 - (*addr).addr = sin->sin_addr.s_addr; + addr->addr = sin->sin_addr.s_addr; #elif NETDEV_IPV6 - LOG_E("not support IPV6."); +#error "not support IPV6." #endif /* NETDEV_IPV4 && NETDEV_IPV6 */ *port = (uint16_t) HTONS_PORT(sin->sin_port); @@ -1126,10 +1127,11 @@ struct hostent *at_gethostbyname(const char *name) #if NETDEV_IPV4 && NETDEV_IPV6 addr.u_addr.ip4.addr = ipstr_to_u32(ipstr); + addr.type = IPADDR_TYPE_V4; #elif NETDEV_IPV4 addr.addr = ipstr_to_u32(ipstr); #elif NETDEV_IPV6 - LOG_E("not support IPV6."); +#error "not support IPV6." #endif /* NETDEV_IPV4 && NETDEV_IPV6 */ /* fill hostent structure */ @@ -1202,7 +1204,7 @@ int at_getaddrinfo(const char *nodename, const char *servname, if ((hints != RT_NULL) && (hints->ai_flags & AI_NUMERICHOST)) { /* no DNS lookup, just parse for an address string */ - if (!inet_aton(nodename, (ip4_addr_t * )&addr)) + if (!inet_aton(nodename, &addr)) { return EAI_NONAME; } @@ -1240,7 +1242,7 @@ int at_getaddrinfo(const char *nodename, const char *servname, #elif NETDEV_IPV4 addr.addr = ipstr_to_u32(ip_str); #elif NETDEV_IPV6 - LOG_E("not support IPV6."); + #error "not support IPV6." #endif /* NETDEV_IPV4 && NETDEV_IPV6 */ } } @@ -1275,10 +1277,11 @@ int at_getaddrinfo(const char *nodename, const char *servname, /* set up sockaddr */ #if NETDEV_IPV4 && NETDEV_IPV6 sa4->sin_addr.s_addr = addr.u_addr.ip4.addr; + sa4->type = IPADDR_TYPE_V4; #elif NETDEV_IPV4 sa4->sin_addr.s_addr = addr.addr; #elif NETDEV_IPV6 - LOG_E("not support IPV6."); +#error "not support IPV6." #endif /* NETDEV_IPV4 && NETDEV_IPV6 */ sa4->sin_family = AF_INET; sa4->sin_len = sizeof(struct sockaddr_in); diff --git a/components/net/lwip-2.0.2/src/core/netif.c b/components/net/lwip-2.0.2/src/core/netif.c index 01e83676da..ee57bb9a9d 100644 --- a/components/net/lwip-2.0.2/src/core/netif.c +++ b/components/net/lwip-2.0.2/src/core/netif.c @@ -544,7 +544,7 @@ netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr) #ifdef RT_USING_NETDEV /* rt-thread sal network interface device set IP address operations */ - netdev_low_level_set_ipaddr(netdev_get_by_name(netif->name), (ip_addr_t *)ipaddr); + netdev_low_level_set_ipaddr(netdev_get_by_name(netif->name), &netif->ip_addr); #endif /* RT_USING_NETDEV */ } @@ -579,7 +579,7 @@ netif_set_gw(struct netif *netif, const ip4_addr_t *gw) #ifdef RT_USING_NETDEV /* rt_thread network interface device set gateway address */ - netdev_low_level_set_gw(netdev_get_by_name(netif->name), (ip_addr_t *)gw); + netdev_low_level_set_gw(netdev_get_by_name(netif->name), &netif->gw); #endif /* RT_USING_NETDEV */ } @@ -610,7 +610,7 @@ netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask) #ifdef RT_USING_NETDEV /* rt-thread network interface device set netmask address */ - netdev_low_level_set_netmask(netdev_get_by_name(netif->name), (ip_addr_t *)netmask); + netdev_low_level_set_netmask(netdev_get_by_name(netif->name), &netif->netmask); #endif /* RT_USING_NETDEV */ } #endif /* LWIP_IPV4 */ @@ -1241,6 +1241,11 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit) } } +#ifdef RT_USING_NETDEV + /* rt-thread network interface device set ipv6 address */ + ip_addr_copy(netdev_get_by_name(netif->name)->ip6_addr[0], netif->ip6_addr[0]); +#endif /* RT_USING_NETDEV */ + /* Set address state. */ #if LWIP_IPV6_DUP_DETECT_ATTEMPTS /* Will perform duplicate address detection (DAD). */ @@ -1279,6 +1284,10 @@ netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chos for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) { ip_addr_copy_from_ip6(netif->ip6_addr[i], *ip6addr); +#ifdef RT_USING_NETDEV + /* rt-thread network interface device set ipv6 address */ + ip_addr_copy(netdev_get_by_name(netif->name)->ip6_addr[i], netif->ip6_addr[i]); +#endif /* RT_USING_NETDEV */ netif_ip6_addr_set_state(netif, i, IP6_ADDR_TENTATIVE); if (chosen_idx != NULL) { *chosen_idx = i; 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 a5a1f94c0b..51e1ba511d 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -128,23 +128,23 @@ static int lwip_netdev_set_addr_info(struct netdev *netif, ip_addr_t *ip_addr, i { if (ip_addr && netmask && gw) { - netif_set_addr((struct netif *)netif->user_data, ip_addr, netmask, gw); + netif_set_addr((struct netif *)netif->user_data, ip_2_ip4(ip_addr), ip_2_ip4(netmask), ip_2_ip4(gw)); } else { if (ip_addr) { - netif_set_ipaddr((struct netif *)netif->user_data, ip_addr); + netif_set_ipaddr((struct netif *)netif->user_data, ip_2_ip4(ip_addr)); } if (netmask) { - netif_set_netmask((struct netif *)netif->user_data, netmask); + netif_set_netmask((struct netif *)netif->user_data, ip_2_ip4(netmask)); } if (gw) { - netif_set_gw((struct netif *)netif->user_data, gw); + netif_set_gw((struct netif *)netif->user_data, ip_2_ip4(gw)); } } diff --git a/components/net/lwip-2.1.0/src/core/netif.c b/components/net/lwip-2.1.0/src/core/netif.c index 5b31c627e9..b2b4adf85b 100644 --- a/components/net/lwip-2.1.0/src/core/netif.c +++ b/components/net/lwip-2.1.0/src/core/netif.c @@ -491,7 +491,7 @@ netif_do_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr, ip_addr_t *ol #ifdef RT_USING_NETDEV /* rt-thread sal network interface device set IP address operations */ - netdev_low_level_set_ipaddr(netdev_get_by_name(netif->name), (ip_addr_t *)ipaddr); + netdev_low_level_set_ipaddr(netdev_get_by_name(netif->name), &netif->ip_addr); #endif /* RT_USING_NETDEV */ return 1; /* address changed */ @@ -557,7 +557,7 @@ netif_do_set_netmask(struct netif *netif, const ip4_addr_t *netmask, ip_addr_t * #ifdef RT_USING_NETDEV /* rt-thread network interface device set netmask address */ - netdev_low_level_set_netmask(netdev_get_by_name(netif->name), (ip_addr_t *)netmask); + netdev_low_level_set_netmask(netdev_get_by_name(netif->name), &netif->netmask); #endif /* RT_USING_NETDEV */ return 1; /* netmask changed */ @@ -625,7 +625,7 @@ netif_do_set_gw(struct netif *netif, const ip4_addr_t *gw, ip_addr_t *old_gw) #ifdef RT_USING_NETDEV /* rt_thread network interface device set gateway address */ - netdev_low_level_set_gw(netdev_get_by_name(netif->name), (ip_addr_t *)gw); + netdev_low_level_set_gw(netdev_get_by_name(netif->name), &netif->gw); #endif /* RT_USING_NETDEV */ return 1; /* gateway changed */ @@ -1586,6 +1586,11 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit) * zone field, so this should not create any compatibility problems. */ ip6_addr_assign_zone(ip_2_ip6(&netif->ip6_addr[0]), IP6_UNICAST, netif); +#ifdef RT_USING_NETDEV + /* rt-thread network interface device set ipv6 address */ + ip_addr_copy(netdev_get_by_name(netif->name)->ip6_addr[0], netif->ip6_addr[0]); +#endif /* RT_USING_NETDEV */ + /* Set address state. */ #if LWIP_IPV6_DUP_DETECT_ATTEMPTS /* Will perform duplicate address detection (DAD). */ @@ -1629,6 +1634,10 @@ netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chos for (i = ip6_addr_islinklocal(ip6addr) ? 0 : 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) { ip_addr_copy_from_ip6(netif->ip6_addr[i], *ip6addr); +#ifdef RT_USING_NETDEV + /* rt-thread network interface device set ipv6 address */ + ip_addr_copy(netdev_get_by_name(netif->name)->ip6_addr[i], netif->ip6_addr[i]); +#endif /* RT_USING_NETDEV */ ip6_addr_assign_zone(ip_2_ip6(&netif->ip6_addr[i]), IP6_UNICAST, netif); netif_ip6_addr_set_state(netif, i, IP6_ADDR_TENTATIVE); if (chosen_idx != NULL) { 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 5ea03a9ae8..0c9e5dec5f 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -129,23 +129,23 @@ static int lwip_netdev_set_addr_info(struct netdev *netif, ip_addr_t *ip_addr, i { if (ip_addr && netmask && gw) { - netif_set_addr((struct netif *)netif->user_data, ip_addr, netmask, gw); + netif_set_addr((struct netif *)netif->user_data, ip_2_ip4(ip_addr), ip_2_ip4(netmask), ip_2_ip4(gw)); } else { if (ip_addr) { - netif_set_ipaddr((struct netif *)netif->user_data, ip_addr); + netif_set_ipaddr((struct netif *)netif->user_data, ip_2_ip4(ip_addr)); } if (netmask) { - netif_set_netmask((struct netif *)netif->user_data, netmask); + netif_set_netmask((struct netif *)netif->user_data, ip_2_ip4(netmask)); } if (gw) { - netif_set_gw((struct netif *)netif->user_data, gw); + netif_set_gw((struct netif *)netif->user_data, ip_2_ip4(gw)); } } diff --git a/components/net/lwip-2.1.0/src/netif/lowpan6.c b/components/net/lwip-2.1.0/src/netif/lowpan6.c index 5769522d5e..6397b0cb5d 100644 --- a/components/net/lwip-2.1.0/src/netif/lowpan6.c +++ b/components/net/lwip-2.1.0/src/netif/lowpan6.c @@ -50,7 +50,7 @@ #include "netif/lowpan6.h" -#if LWIP_IPV6 +#if LWIP_IPV6 && LWIP_6LOWPAN #include "lwip/ip.h" #include "lwip/pbuf.h" diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index 0be2a2bda3..71a61be3c0 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -27,6 +27,13 @@ extern "C" { #define NETDEV_DNS_SERVERS_NUM 2U #endif +#if NETDEV_IPV6 +/* the maximum of dns server number supported */ +#ifndef NETDEV_IPV6_NUM_ADDRESSES +#define NETDEV_IPV6_NUM_ADDRESSES 3U +#endif +#endif /* NETDEV_IPV6 */ + /* whether the network interface device is 'up' (set by the network interface driver or application) */ #define NETDEV_FLAG_UP 0x01U /* if set, the network interface device has broadcast capability, only supported in the 'lwIP' stack */ @@ -78,6 +85,9 @@ struct netdev ip_addr_t ip_addr; /* IP address */ ip_addr_t netmask; /* subnet mask */ ip_addr_t gw; /* gateway */ +#if NETDEV_IPV6 + ip_addr_t ip6_addr[NETDEV_IPV6_NUM_ADDRESSES]; /* array of IPv6 addresses */ +#endif /* NETDEV_IPV6 */ ip_addr_t dns_servers[NETDEV_DNS_SERVERS_NUM]; /* DNS server */ uint8_t hwaddr_len; /* hardware address length */ uint8_t hwaddr[NETDEV_HWADDR_MAX_LEN]; /* hardware address */ @@ -163,6 +173,7 @@ int netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_ /* Set network interface device callback, it can be called when the status or address changed */ void netdev_set_status_callback(struct netdev *netdev, netdev_callback_fn status_callback); +void netdev_set_addr_callback(struct netdev *netdev, netdev_callback_fn addr_callback); /* Set network interface device status and address, this function can only be called in the network interface device driver */ void netdev_low_level_set_ipaddr(struct netdev *netdev, const ip_addr_t *ipaddr); diff --git a/components/net/netdev/include/netdev_ipaddr.h b/components/net/netdev/include/netdev_ipaddr.h index c2e13cd118..65970ec5b7 100644 --- a/components/net/netdev/include/netdev_ipaddr.h +++ b/components/net/netdev/include/netdev_ipaddr.h @@ -12,21 +12,53 @@ #define __NETDEV_IPADDR_H__ #include +#include #ifdef __cplusplus extern "C" { #endif -/* Only supports the IPV4 protocol */ -#ifndef NETDEV_IPV4 -#define NETDEV_IPV4 1 -#endif +/* + * Definitions of bits in internet address integers. + * On subnets, the decomposition of addresses to host and net parts + * is done according to subnet mask, not the masks here. + */ +#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 -#ifndef NETDEV_IPV6 -#define NETDEV_IPV6 0 -#endif +#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0x000000ff + +#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) +#define IN_MULTICAST(i) IN_CLASSD(i) -#ifdef NETDEV_IPV4 +#define IN_EXPERIMENTAL(i) (((long)(i) & 0xe0000000) == 0xe0000000) +#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000) + +#define IN_LOOPBACKNET 127 /* official! */ + +/* IP address types for use in ip_addr_t.type member */ +enum netdev_ip_addr_type { + /** IPv4 */ + IPADDR_TYPE_V4 = 0U, + /** IPv6 */ + IPADDR_TYPE_V6 = 6U, + /** IPv4+IPv6 ("dual-stack") */ + IPADDR_TYPE_ANY = 46U +}; + +#if NETDEV_IPV4 /** IPv4 only: set the IP address given as an u32_t */ #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) /** IPv4 only: get the IP address as an u32_t */ @@ -68,7 +100,42 @@ typedef struct ip4_addr uint32_t addr; } ip4_addr_t; -typedef ip4_addr_t ip_addr_t; +/** 255.255.255.255 */ +#define IPADDR_NONE ((uint32_t)0xffffffffUL) +/** 127.0.0.1 */ +#define IPADDR_LOOPBACK ((uint32_t)0x7f000001UL) +/** 0.0.0.0 */ +#define IPADDR_ANY ((uint32_t)0x00000000UL) +/** 255.255.255.255 */ +#define IPADDR_BROADCAST ((uint32_t)0xffffffffUL) + +/** 255.255.255.255 */ +#define INADDR_NONE IPADDR_NONE +/** 127.0.0.1 */ +#define INADDR_LOOPBACK IPADDR_LOOPBACK +/** 0.0.0.0 */ +#define INADDR_ANY IPADDR_ANY +/** 255.255.255.255 */ +#define INADDR_BROADCAST IPADDR_BROADCAST + +#define IPADDR_BROADCAST_STRING "255.255.255.255" + +/** Copy IP address - faster than ip4_addr_set: no NULL check */ +#define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) +#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) +/** Safely copy one IP address to another (src may be NULL) */ +#define ip4_addr_set(dest, src) ((dest)->addr = ((src) == NULL ? 0 : (src)->addr)) +/** Set complete address to zero */ +#define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) +/** Set address to IPADDR_ANY (no need for htonl()) */ +#define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY) +#define ip4_addr_isany_val(ipaddr) ((ipaddr).addr == IPADDR_ANY) +#define ip4_addr_isany(ipaddr) ((ipaddr) == NULL || ip4_addr_isany_val(*(ipaddr))) + +in_addr_t netdev_ipaddr_addr(const char *cp); +int netdev_ip4addr_aton(const char *cp, ip4_addr_t *addr); +char *netdev_ip4addr_ntoa(const ip4_addr_t *addr); +char *netdev_ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); #endif /* NETIF_IPV4 */ #if NETDEV_IPV6 @@ -85,23 +152,55 @@ struct in6_addr typedef struct ip6_addr { uint32_t addr[4]; +#ifdef NETDEV_IPV6_SCOPES + uint8_t zone; +#endif /* NETDEV_IPV6_SCOPES */ } ip6_addr_t; -typedef ip6_addr ip_addr_t +/** This macro can be used to initialize a variable of type struct in6_addr + to the IPv6 wildcard address. */ +#define IN6ADDR_ANY_INIT {{{0,0,0,0}}} +/** This macro can be used to initialize a variable of type struct in6_addr + to the IPv6 loopback address. */ +#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}} + +/** This variable is initialized by the system to contain the wildcard IPv6 address. + */ +extern const struct in6_addr in6addr_any; + +#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ + ((addr1)->addr[1] == (addr2)->addr[1]) && \ + ((addr1)->addr[2] == (addr2)->addr[2]) && \ + ((addr1)->addr[3] == (addr2)->addr[3])) +/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */ +#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \ + (dest).addr[1] = (src).addr[1]; \ + (dest).addr[2] = (src).addr[2]; \ + (dest).addr[3] = (src).addr[3];}while(0) +/** Safely copy one IPv6 address to another (src may be NULL) */ +#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \ + (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \ + (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \ + (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0) +/** Set complete address to zero */ +#define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[2] = 0; \ + (ip6addr)->addr[3] = 0;}while(0) +/** Set address to ipv6 'any' (no need for lwip_htonl()) */ +#define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr) +#define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \ + ((ip6addr).addr[1] == 0) && \ + ((ip6addr).addr[2] == 0) && \ + ((ip6addr).addr[3] == 0)) +#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr))) + +int netdev_ip6addr_aton(const char *cp, ip6_addr_t *addr); +char *netdev_ip6addr_ntoa(const ip6_addr_t *addr); +char *netdev_ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen); #endif /* NETIF_IPV6 */ #if NETDEV_IPV4 && NETDEV_IPV6 -/* IP address types for use in ip_addr_t.type member */ -enum netdev_ip_addr_type -{ - /** IPv4 */ - IPADDR_TYPE_V4 = 0U, - /** IPv6 */ - IPADDR_TYPE_V6 = 6U, - /** IPv4+IPv6 ("dual-stack") */ - IPADDR_TYPE_ANY = 46U -}; - /* A union struct for both IP version's addresses */ typedef struct _ip_addr { @@ -113,54 +212,102 @@ typedef struct _ip_addr /** @ref netdev_ip_addr_type */ uint8_t type; } ip_addr_t; -#endif /* NETIF_IPV4 && NETIF_IPV6 */ -/** 255.255.255.255 */ -#define IPADDR_NONE ((uint32_t)0xffffffffUL) -/** 127.0.0.1 */ -#define IPADDR_LOOPBACK ((uint32_t)0x7f000001UL) -/** 0.0.0.0 */ -#define IPADDR_ANY ((uint32_t)0x00000000UL) -/** 255.255.255.255 */ -#define IPADDR_BROADCAST ((uint32_t)0xffffffffUL) +#define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0) +#define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0) +#define IP_GET_TYPE(ipaddr) ((ipaddr)->type) -/** 255.255.255.255 */ -#define INADDR_NONE IPADDR_NONE -/** 127.0.0.1 */ -#define INADDR_LOOPBACK IPADDR_LOOPBACK -/** 0.0.0.0 */ -#define INADDR_ANY IPADDR_ANY -/** 255.255.255.255 */ -#define INADDR_BROADCAST IPADDR_BROADCAST +#define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4) +#define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6) +#define IP_IS_V4(ipaddr) (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr))) +#define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr))) -#define IPADDR_BROADCAST_STRING "255.255.255.255" +/** Convert generic ip address to specific protocol version */ +#define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6)) +/** Convert generic ip address to specific protocol version */ +#define ip_2_ip4(ipaddr) (&((ipaddr)->u_addr.ip4)) -#ifdef NETDEV_IPV4 +#define ip_addr_copy(dest, src) do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \ + ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \ + ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0) +#define ip_addr_cmp(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \ + ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \ + ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2)))) +#define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \ + ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \ + ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0) +#define ip_addr_set_zero(ipaddr) do{ ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0) +#define ip_addr_set_any(is_ipv6, ipaddr) do{ if(is_ipv6){ \ + ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) -/** Copy IP address - faster than ip4_addr_set: no NULL check */ -#define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) -#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) -/** Set complete address to zero */ -#define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) -#define ip4_addr_isany_val(ipaddr) ((ipaddr).addr == IPADDR_ANY) -#define ip4_addr_isany(ipaddr) ((ipaddr) == NULL || ip4_addr_isany_val(*(ipaddr))) +#define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \ + ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \ + ip4_addr_isany_val(*ip_2_ip4(&(ipaddr)))) +#define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \ + ip6_addr_isany(ip_2_ip6(ipaddr)) : \ + ip4_addr_isany(ip_2_ip4(ipaddr))) + +/* directly map this to the lwip internal functions */ +#define inet_addr(cp) netdev_ipaddr_addr(cp) +#define inet_aton(cp, addr) ((IP_IS_V6_VAL(*addr)) ? \ + netdev_ip6addr_aton(cp, ip_2_ip6(addr)) : \ + netdev_ip4addr_aton(cp, ip_2_ip4(addr))) +#define inet_ntoa(addr) ((IP_IS_V6_VAL(addr)) ? \ + netdev_ip6addr_ntoa(ip_2_ip6(&addr)) : \ + netdev_ip4addr_ntoa(ip_2_ip4(&addr))) +#define inet_ntoa_r(addr, buf, buflen) ((IP_IS_V6_VAL(addr)) ? \ + netdev_ip6addr_ntoa_r(ip_2_ip6(&addr), buf, buflen) : \ + netdev_ip4addr_ntoa_r(ip_2_ip4(&addr), buf, buflen)) +#elif NETDEV_IPV4 /* NETDEV_IPV4 */ + +typedef ip4_addr_t ip_addr_t; + +#define IP_SET_TYPE_VAL(ipaddr, iptype) +#define IP_SET_TYPE(ipaddr, iptype) +#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4 #define ip_addr_copy(dest, src) ip4_addr_copy(dest, src) #define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2) +#define ip_addr_set(dest, src) ip4_addr_set(dest, src) #define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr) +#define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr) +#define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr) #define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr) -in_addr_t netdev_ipaddr_addr(const char *cp); -int netdev_ip4addr_aton(const char *cp, ip4_addr_t *addr); -char *netdev_ip4addr_ntoa(const ip4_addr_t *addr); -char *netdev_ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); - +/* directly map this to the lwip internal functions */ #define inet_addr(cp) netdev_ipaddr_addr(cp) #define inet_aton(cp, addr) netdev_ip4addr_aton(cp,(ip4_addr_t*)addr) #define inet_ntoa(addr) netdev_ip4addr_ntoa((const ip4_addr_t*)&(addr)) #define inet_ntoa_r(addr, buf, buflen) netdev_ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen) +#else /* NETDEV_IPV6 */ + +typedef ip6_addr_t ip_addr_t; + +#define IP_SET_TYPE_VAL(ipaddr, iptype) +#define IP_SET_TYPE(ipaddr, iptype) +#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6 + +#define ip_addr_copy(dest, src) ip6_addr_copy(dest, src) +#define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2) +#define ip_addr_set(dest, src) ip6_addr_set(dest, src) +#define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr) +#define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr) +#define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr) +#define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr) + +/* directly map this to the lwip internal functions */ +#define inet_aton(cp, addr) netdev_ip6addr_aton(cp, (ip6_addr_t*)addr) +#define inet_ntoa(addr) netdev_ip6addr_ntoa((const ip6_addr_t*)&(addr)) +#define inet_ntoa_r(addr, buf, buflen) netdev_ip6addr_ntoa_r((const ip6_addr_t*)&(addr), buf, buflen) +#endif /* NTDEV_IPV4 && NTDEV_IPV6 */ + + +const char *netdev_inet_ntop(int af, const void *src, char *dst, int32_t size); +int netdev_inet_pton(int af, const char *src, void *dst); -#endif /* NETDEV_IPV4 */ +#define inet_ntop(af, src, dst, size) netdev_inet_ntop(af, src, dst, size) +#define inet_pton(af, src, dst) netdev_inet_pton(af, src, dst) #ifdef __cplusplus } 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])); diff --git a/components/net/netdev/src/netdev_ipaddr.c b/components/net/netdev/src/netdev_ipaddr.c index 988bd50eb7..8d83937da9 100644 --- a/components/net/netdev/src/netdev_ipaddr.c +++ b/components/net/netdev/src/netdev_ipaddr.c @@ -19,8 +19,10 @@ #define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) #define islower(c) in_range(c, 'a', 'z') #define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') +#define xchar(i) ((i) < 10 ? '0' + (i) : 'A' + (i) - 10) #endif +#if NETDEV_IPV4 /** * Check whether "cp" is a valid ascii representation @@ -255,3 +257,358 @@ in_addr_t netdev_ipaddr_addr(const char *cp) } return (IPADDR_NONE); } + +#endif /* NETDEV_IPV4 */ + + +#if NETDEV_IPV6 + +RT_WEAK const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; + +/** + * Check whether "cp" is a valid ascii representation + * of an IPv6 address and convert to a binary address. + * Returns 1 if the address is valid, 0 if not. + * + * @param cp IPv6 address in ascii representation (e.g. "FF01::1") + * @param addr pointer to which to save the ip address in network order + * @return 1 if cp could be converted to addr, 0 on failure + */ +int +netdev_ip6addr_aton(const char *cp, ip6_addr_t *addr) +{ + uint32_t addr_index, zero_blocks, current_block_index, current_block_value; + const char *s; + + /* Count the number of colons, to count the number of blocks in a "::" sequence + zero_blocks may be 1 even if there are no :: sequences */ + zero_blocks = 8; + for (s = cp; *s != 0; s++) + { + if (*s == ':') + { + zero_blocks--; + } + else if (!isxdigit(*s)) + { + break; + } + } + + /* parse each block */ + addr_index = 0; + current_block_index = 0; + current_block_value = 0; + for (s = cp; *s != 0; s++) + { + if (*s == ':') + { + if (addr) + { + if (current_block_index & 0x1) + { + addr->addr[addr_index++] |= current_block_value; + } + else + { + addr->addr[addr_index] = current_block_value << 16; + } + } + current_block_index++; + current_block_value = 0; + if (current_block_index > 7) + { + /* address too long! */ + return 0; + } + if (s[1] == ':') + { + if (s[2] == ':') + { + /* invalid format: three successive colons */ + return 0; + } + s++; + /* "::" found, set zeros */ + while (zero_blocks > 0) + { + zero_blocks--; + if (current_block_index & 0x1) + { + addr_index++; + } + else + { + if (addr) + { + addr->addr[addr_index] = 0; + } + } + current_block_index++; + if (current_block_index > 7) + { + /* address too long! */ + return 0; + } + } + } + } + else if (isxdigit(*s)) + { + /* add current digit */ + current_block_value = (current_block_value << 4) + + (isdigit(*s) ? (uint32_t)(*s - '0') : (uint32_t)(10 + (islower(*s) ? *s - 'a' : *s - 'A'))); + } + else + { + /* unexpected digit, space? CRLF? */ + break; + } + } + + if (addr) + { + if (current_block_index & 0x1) + { + addr->addr[addr_index++] |= current_block_value; + } + else + { + addr->addr[addr_index] = current_block_value << 16; + } + } + + /* convert to network byte order. */ + if (addr) + { + for (addr_index = 0; addr_index < 4; addr_index++) + { + addr->addr[addr_index] = htonl(addr->addr[addr_index]); + } + } + + if (current_block_index != 7) + { + return 0; + } + + return 1; +} + +/** + * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. + * + * @param addr ip6 address in network order to convert + * @param buf target buffer where the string is stored + * @param buflen length of buf + * @return either pointer to buf which now holds the ASCII + * representation of addr or NULL if buf was too small + */ +char * +netdev_ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen) +{ + uint32_t current_block_index, current_block_value, next_block_value; + int32_t i; + uint8_t zero_flag, empty_block_flag; + + i = 0; + empty_block_flag = 0; /* used to indicate a zero chain for "::' */ + + for (current_block_index = 0; current_block_index < 8; current_block_index++) + { + /* get the current 16-bit block */ + current_block_value = htonl(addr->addr[current_block_index >> 1]); + if ((current_block_index & 0x1) == 0) + { + current_block_value = current_block_value >> 16; + } + current_block_value &= 0xffff; + + /* Check for empty block. */ + if (current_block_value == 0) + { + if (current_block_index == 7 && empty_block_flag == 1) + { + /* special case, we must render a ':' for the last block. */ + buf[i++] = ':'; + if (i >= buflen) + { + return NULL; + } + break; + } + if (empty_block_flag == 0) + { + /* generate empty block "::", but only if more than one contiguous zero block, + * according to current formatting suggestions RFC 5952. */ + next_block_value = htonl(addr->addr[(current_block_index + 1) >> 1]); + if ((current_block_index & 0x1) == 0x01) + { + next_block_value = next_block_value >> 16; + } + next_block_value &= 0xffff; + if (next_block_value == 0) + { + empty_block_flag = 1; + buf[i++] = ':'; + if (i >= buflen) + { + return NULL; + } + continue; /* move on to next block. */ + } + } + else if (empty_block_flag == 1) + { + /* move on to next block. */ + continue; + } + } + else if (empty_block_flag == 1) + { + /* Set this flag value so we don't produce multiple empty blocks. */ + empty_block_flag = 2; + } + + if (current_block_index > 0) + { + buf[i++] = ':'; + if (i >= buflen) + { + return NULL; + } + } + + if ((current_block_value & 0xf000) == 0) + { + zero_flag = 1; + } + else + { + buf[i++] = xchar(((current_block_value & 0xf000) >> 12)); + zero_flag = 0; + if (i >= buflen) + { + return NULL; + } + } + + if (((current_block_value & 0xf00) == 0) && (zero_flag)) + { + /* do nothing */ + } + else + { + buf[i++] = xchar(((current_block_value & 0xf00) >> 8)); + zero_flag = 0; + if (i >= buflen) + { + return NULL; + } + } + + if (((current_block_value & 0xf0) == 0) && (zero_flag)) + { + /* do nothing */ + } + else + { + buf[i++] = xchar(((current_block_value & 0xf0) >> 4)); + zero_flag = 0; + if (i >= buflen) + { + return NULL; + } + } + + buf[i++] = xchar((current_block_value & 0xf)); + if (i >= buflen) + { + return NULL; + } + } + + buf[i] = 0; + + return buf; +} + +/** + * Convert numeric IPv6 address into ASCII representation. + * returns ptr to static buffer; not reentrant! + * + * @param addr ip6 address in network order to convert + * @return pointer to a global static (!) buffer that holds the ASCII + * representation of addr + */ +char * +netdev_ip6addr_ntoa(const ip6_addr_t *addr) +{ + static char str[40]; + return netdev_ip6addr_ntoa_r(addr, str, 40); +} + +#endif /* NETDEV_IPV6 */ + +const char * +netdev_inet_ntop(int af, const void *src, char *dst, int32_t size) +{ +#define AF_INET 2 +#define AF_INET6 10 + + const char *ret = NULL; + int size_int = (int)size; + if (size_int < 0) + { + return NULL; + } + switch (af) + { +#if NTEDEV_IPV4 + case AF_INET: + return netdev_ip4addr_ntoa_r((const ip4_addr_t *)src, dst, size_int); +#endif +#if NETDEV_IPV6 + case AF_INET6: + return netdev_ip6addr_ntoa_r((const ip6_addr_t *)src, dst, size_int); +#endif + default: + break; + } + return ret; +} + +int +netdev_inet_pton(int af, const char *src, void *dst) +{ +#define AF_INET 2 +#define AF_INET6 10 + + int err; + switch (af) + { +#if NETDEV_IPV4 + case AF_INET: + err = netdev_ip4addr_aton(src, (ip4_addr_t *)dst); + break; +#endif +#if NETDEV_IPV6 + case AF_INET6: + { + /* convert into temporary variable since ip6_addr_t might be larger + than in6_addr when scopes are enabled */ + ip6_addr_t addr; + err = netdev_ip6addr_aton(src, &addr); + if (err) + { + rt_memcpy(dst, &addr.addr, sizeof(addr.addr)); + } + break; + } +#endif + default: + err = -1; + break; + } + return err; +} diff --git a/components/net/sal_socket/impl/af_inet_lwip.c b/components/net/sal_socket/impl/af_inet_lwip.c index 95e7633635..e53aa845cc 100644 --- a/components/net/sal_socket/impl/af_inet_lwip.c +++ b/components/net/sal_socket/impl/af_inet_lwip.c @@ -25,6 +25,12 @@ #include +#if (LWIP_VERSION < 0x2000000) && NETDEV_IPV6 +#error "The lwIP version is not support IPV6, please disable netdev IPV6 configuration " +#elif (LWIP_VERSION > 0x2000000) && (NETDEV_IPV6 != LWIP_IPV6) +#error "IPV6 configuration error, Please check and synchronize netdev and lwip IPV6 configuration." +#endif + #if LWIP_VERSION < 0x2000000 #define SELWAIT_T int #else @@ -308,7 +314,11 @@ static const struct sal_netdb_ops lwip_netdb_ops = static const struct sal_proto_family lwip_inet_family = { AF_INET, +#if LWIP_VERSION > 0x2000000 + AF_INET6, +#else AF_INET, +#endif &lwip_socket_ops, &lwip_netdb_ops, }; diff --git a/components/net/sal_socket/include/sal_socket.h b/components/net/sal_socket/include/sal_socket.h index d72f1e4c3c..b620bbe23c 100644 --- a/components/net/sal_socket/include/sal_socket.h +++ b/components/net/sal_socket/include/sal_socket.h @@ -157,6 +157,7 @@ struct sockaddr char sa_data[14]; }; +#if NETDEV_IPV4 /* members are in network byte order */ struct sockaddr_in { @@ -167,6 +168,19 @@ struct sockaddr_in #define SIN_ZERO_LEN 8 char sin_zero[SIN_ZERO_LEN]; }; +#endif /* NETDEV_IPV4 */ + +#if NETDEV_IPV6 +struct sockaddr_in6 +{ + uint8_t sin6_len; /* length of this structure */ + sa_family_t sin6_family; /* AF_INET6 */ + in_port_t sin6_port; /* Transport layer port # */ + uint32_t sin6_flowinfo; /* IPv6 flow information */ + struct in6_addr sin6_addr; /* IPv6 address */ + uint32_t sin6_scope_id; /* Set of interfaces for scope */ +}; +#endif /* NETDEV_IPV6 */ struct sockaddr_storage { @@ -174,9 +188,9 @@ struct sockaddr_storage sa_family_t ss_family; char s2_data1[2]; uint32_t s2_data2[3]; -#if SAL_IPV6 - u32_t s2_data3[3]; -#endif /* SAL_IPV6 */ +#if NETDEV_IPV6 + uint32_t s2_data3[3]; +#endif /* NETDEV_IPV6 */ }; int sal_accept(int socket, struct sockaddr *addr, socklen_t *addrlen); diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index e09b2b7119..be7c1984a1 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -549,12 +549,13 @@ static void sal_sockaddr_to_ipaddr(const struct sockaddr *name, ip_addr_t *local const struct sockaddr_in *svr_addr = (const struct sockaddr_in *) name; #if NETDEV_IPV4 && NETDEV_IPV6 - (*local_ipaddr).u_addr.ip4.addr = svr_addr->sin_addr.s_addr; + local_ipaddr->u_addr.ip4.addr = svr_addr->sin_addr.s_addr; + local_ipaddr->type = IPADDR_TYPE_V4; #elif NETDEV_IPV4 - (*local_ipaddr).addr = svr_addr->sin_addr.s_addr; + local_ipaddr->addr = svr_addr->sin_addr.s_addr; #elif NETDEV_IPV6 - LOG_E("not support IPV6"); -#endif /* SAL_IPV4 && SAL_IPV6*/ +#error "not only support IPV6" +#endif /* NETDEV_IPV4 && NETDEV_IPV6*/ } int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen) @@ -572,7 +573,7 @@ int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen) sal_sockaddr_to_ipaddr(name, &input_ipaddr); /* check input ipaddr is default netdev ipaddr */ - if (input_ipaddr.addr != INADDR_ANY) + if (!ip_addr_isany_val(input_ipaddr)) { struct sal_proto_family *input_pf = RT_NULL, *local_pf = RT_NULL; struct netdev *new_netdev = RT_NULL; -- 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') 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') 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') 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') 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') 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 From 0d8a2162603865c89f6e0d644a8c1121dde72987 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Thu, 22 Aug 2019 18:32:32 +0800 Subject: [network][netdev] Improve the default netdev operation and format code 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 | 3 + components/net/netdev/src/netdev.c | 149 ++++++++++++----------- 5 files changed, 105 insertions(+), 71 deletions(-) (limited to 'components/net/netdev/src') 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 e240413c59..9d8fa650a4 100644 --- a/components/net/lwip-1.4.1/src/netif/ethernetif.c +++ b/components/net/lwip-1.4.1/src/netif/ethernetif.c @@ -253,6 +253,12 @@ void lwip_netdev_netstat(struct netdev *netif) #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ #endif /* RT_USING_FINSH */ +static int lwip_netdev_set_default(struct netdev *netif) +{ + netif_set_default((struct netif *)netif->user_data); + return ERR_OK; +} + const struct netdev_ops lwip_netdev_ops = { lwip_netdev_set_up, @@ -282,6 +288,8 @@ const struct netdev_ops lwip_netdev_ops = lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ #endif /* RT_USING_FINSH */ + + lwip_netdev_set_default, }; 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 6a1d71886c..a7bed3065f 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -261,6 +261,12 @@ void lwip_netdev_netstat(struct netdev *netif) #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ #endif /* RT_USING_FINSH */ +static int lwip_netdev_set_default(struct netdev *netif) +{ + netif_set_default((struct netif *)netif->user_data); + return ERR_OK; +} + const struct netdev_ops lwip_netdev_ops = { lwip_netdev_set_up, @@ -290,6 +296,8 @@ const struct netdev_ops lwip_netdev_ops = lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ #endif /* RT_USING_FINSH */ + + lwip_netdev_set_default, }; 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 1725ce00bb..66ea1d2376 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -262,6 +262,12 @@ void lwip_netdev_netstat(struct netdev *netif) #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ #endif /* RT_USING_FINSH */ +static int lwip_netdev_set_default(struct netdev *netif) +{ + netif_set_default((struct netif *)netif->user_data); + return ERR_OK; +} + const struct netdev_ops lwip_netdev_ops = { lwip_netdev_set_up, @@ -291,6 +297,8 @@ const struct netdev_ops lwip_netdev_ops = lwip_netdev_netstat, #endif /* RT_LWIP_TCP || RT_LWIP_UDP */ #endif /* RT_USING_FINSH */ + + lwip_netdev_set_default, }; 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 1a61cba1c2..e11a8929b0 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -137,6 +137,9 @@ struct netdev_ops 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 + + /* set default network interface device in current network stack*/ + int (*set_default)(struct netdev *netdev); }; /* The network interface device registered and unregistered*/ diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 451cc81025..bc2c55f727 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -34,11 +34,11 @@ struct netdev *netdev_default; /** * This function will register network interface device and * add it to network interface device list. - * + * * @param netdev the network interface device object * @param name the network interface device name * @param user_data user-specific data - * + * * @return 0: registered successfully * -1: registered failed */ @@ -105,9 +105,9 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data) /** * This function will unregister network interface device and * delete it from network interface device list. - * + * * @param netdev the network interface device object - * + * * @return 0: unregistered successfully * -1: unregistered failed */ @@ -164,11 +164,11 @@ int netdev_unregister(struct netdev *netdev) /** * This function will get the first network interface device * with the flags in network interface device list. - * + * * @param flags the network interface device flags - * + * * @return != NULL: network interface device object - * NULL: get failed + * NULL: get failed */ struct netdev *netdev_get_first_by_flags(uint16_t flags) { @@ -201,11 +201,11 @@ struct netdev *netdev_get_first_by_flags(uint16_t flags) /** * This function will get the first network interface device * in network interface device list by IP address. - * + * * @param addr the network interface device IP address - * + * * @return != NULL: network interface device object - * NULL: get failed + * NULL: get failed */ struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr) { @@ -238,11 +238,11 @@ struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr) /** * This function will get network interface device * in network interface device list by netdev name. - * + * * @param name the network interface device name - * + * * @return != NULL: network interface device object - * NULL: get failed + * NULL: get failed */ struct netdev *netdev_get_by_name(const char *name) { @@ -276,11 +276,11 @@ struct netdev *netdev_get_by_name(const char *name) /** * This function will get the first network interface device * in network interface device list by protocol family type. - * + * * @param family the network interface device protocol family type - * + * * @return != NULL: network interface device object - * NULL: get failed + * NULL: get failed */ struct netdev *netdev_get_by_family(int family) { @@ -325,15 +325,15 @@ struct netdev *netdev_get_by_family(int family) /** * This function will get the family type from network interface device - * + * * @param netdev network interface device object - * + * * @return the network interface device family type */ int netdev_family_get(struct netdev *netdev) { - RT_ASSERT(netdev); - + RT_ASSERT(netdev); + return ((struct sal_proto_family *)netdev->sal_user_data)->family; } @@ -341,7 +341,7 @@ int netdev_family_get(struct netdev *netdev) /** * This function will set default network interface device. - * + * * @param netdev the network interface device to change */ void netdev_set_default(struct netdev *netdev) @@ -349,15 +349,21 @@ void netdev_set_default(struct netdev *netdev) if (netdev) { netdev_default = netdev; + + if (netdev->ops->set_default) + { + /* set default network interface device in the current network stack */ + netdev->ops->set_default(netdev); + } LOG_D("Setting default network interface device name(%s) successfully.", netdev->name); } } /** * This function will enable network interface device . - * + * * @param netdev the network interface device to change - * + * * @return 0: set status successfully * -1: set status failed */ @@ -370,7 +376,7 @@ int netdev_set_up(struct netdev *netdev) LOG_E("The network interface device(%s) not support to set status.", netdev->name); return -RT_ERROR; } - + /* network interface device status flags check */ if (netdev_is_up(netdev)) { @@ -382,9 +388,9 @@ int netdev_set_up(struct netdev *netdev) } /** * This function will disable network interface device. - * + * * @param netdev the network interface device to change - * + * * @return 0: set status successfully * -1: set sttaus failed */ @@ -397,7 +403,7 @@ int netdev_set_down(struct netdev *netdev) LOG_E("The network interface device(%s) not support to set status.", netdev->name); return -RT_ERROR; } - + /* network interface device status flags check */ if (!netdev_is_up(netdev)) { @@ -410,10 +416,10 @@ int netdev_set_down(struct netdev *netdev) /** * This function will control network interface device DHCP capability enable or disable. - * + * * @param netdev the network interface device device to change * @param is_enable the new DHCP status - * + * * @return 0: set DHCP status successfully * -1: set DHCP status failed */ @@ -432,17 +438,17 @@ int netdev_dhcp_enabled(struct netdev *netdev, rt_bool_t is_enabled) { return RT_EOK; } - + /* execute network interface device DHCP capability control operations */ return netdev->ops->set_dhcp(netdev, is_enabled); } /** * This function will set network interface device IP address. - * + * * @param netdev the network interface device to change * @param ipaddr the new IP address - * + * * @return 0: set IP address successfully * -1: set IP address failed */ @@ -456,7 +462,7 @@ int netdev_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr) LOG_E("The network interface device(%s) not support to set IP address.", netdev->name); return -RT_ERROR; } - + if (netdev_is_dhcp_enabled(netdev)) { LOG_E("The network interface device(%s) DHCP capability is enable, not support set IP address.", netdev->name); @@ -469,10 +475,10 @@ int netdev_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr) /** * This function will set network interface device netmask address. - * + * * @param netdev the network interface device to change * @param netmask the new netmask address - * + * * @return 0: set netmask address successfully * -1: set netmask address failed */ @@ -486,7 +492,7 @@ int netdev_set_netmask(struct netdev *netdev, const ip_addr_t *netmask) LOG_E("The network interface device(%s) not support to set netmask address.", netdev->name); return -RT_ERROR; } - + if (netdev_is_dhcp_enabled(netdev)) { LOG_E("The network interface device(%s) DHCP capability is enable, not support set netmask address.", netdev->name); @@ -499,10 +505,10 @@ int netdev_set_netmask(struct netdev *netdev, const ip_addr_t *netmask) /** * This function will set network interface device gateway address. - * + * * @param netdev the network interface device to change - * @param gateway the new gateway address - * + * @param gateway the new gateway address + * * @return 0: set gateway address successfully * -1: set gateway address failed */ @@ -516,7 +522,7 @@ int netdev_set_gw(struct netdev *netdev, const ip_addr_t *gw) LOG_E("The network interface device(%s) not support to set gateway address.", netdev->name); return -RT_ERROR; } - + if (netdev_is_dhcp_enabled(netdev)) { LOG_E("The network interface device(%s) DHCP capability is enable, not support set gateway address.", netdev->name); @@ -529,10 +535,10 @@ int netdev_set_gw(struct netdev *netdev, const ip_addr_t *gw) /** * This function will set network interface device DNS server address. - * + * * @param netdev the network interface device to change * @param dns_server the new DNS server address - * + * * @return 0: set netmask address successfully * -1: set netmask address failed */ @@ -559,7 +565,7 @@ int netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_ /** * This function will set callback to be called when the network interface device status has been changed. - * + * * @param netdev the network interface device to change * @param status_callback the callback be called when the status has been changed. */ @@ -573,7 +579,7 @@ void netdev_set_status_callback(struct netdev *netdev, netdev_callback_fn status /** * This function will set callback to be called when the network interface device address has been changed. - * + * * @param netdev the network interface device to change * @param addr_callback the callback be called when the address has been changed. */ @@ -589,7 +595,7 @@ void netdev_set_addr_callback(struct netdev *netdev, netdev_callback_fn addr_cal /** * This function will set network interface device IP address. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param ipaddr the new IP address */ @@ -620,7 +626,7 @@ void netdev_low_level_set_ipaddr(struct netdev *netdev, const ip_addr_t *ip_addr /** * This function will set network interface device netmask address. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param netmask the new netmask address */ @@ -634,7 +640,7 @@ void netdev_low_level_set_netmask(struct netdev *netdev, const ip_addr_t *netmas #ifdef RT_USING_SAL /* set network interface device flags to internet up */ - if (netdev_is_up(netdev) && netdev_is_link_up(netdev) && + if (netdev_is_up(netdev) && netdev_is_link_up(netdev) && !ip_addr_isany(&(netdev->ip_addr))) { sal_check_netdev_internet_up(netdev); @@ -652,7 +658,7 @@ void netdev_low_level_set_netmask(struct netdev *netdev, const ip_addr_t *netmas /** * This function will set network interface device gateway address. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param gateway the new gateway address */ @@ -666,7 +672,7 @@ void netdev_low_level_set_gw(struct netdev *netdev, const ip_addr_t *gw) #ifdef RT_USING_SAL /* set network interface device flags to internet up */ - if (netdev_is_up(netdev) && netdev_is_link_up(netdev) && + if (netdev_is_up(netdev) && netdev_is_link_up(netdev) && !ip_addr_isany(&(netdev->ip_addr))) { sal_check_netdev_internet_up(netdev); @@ -684,10 +690,10 @@ void netdev_low_level_set_gw(struct netdev *netdev, const ip_addr_t *gw) /** * This function will set network interface device DNS server address. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param dns_server the new DNS server address - * + * */ void netdev_low_level_set_dns_server(struct netdev *netdev, uint8_t dns_num, const ip_addr_t *dns_server) { @@ -740,7 +746,7 @@ static void netdev_auto_change_default(struct netdev *netdev) /** * This function will set network interface device status. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param is_up the new status */ @@ -773,14 +779,14 @@ void netdev_low_level_set_status(struct netdev *netdev, rt_bool_t is_up) /** * This function will set network interface device active link status. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param is_up the new link status */ void netdev_low_level_set_link_status(struct netdev *netdev, rt_bool_t is_up) { if (netdev && netdev_is_link_up(netdev) != is_up) - { + { if (is_up) { netdev->flags |= NETDEV_FLAG_LINK_UP; @@ -796,7 +802,7 @@ void netdev_low_level_set_link_status(struct netdev *netdev, rt_bool_t is_up) else { netdev->flags &= ~NETDEV_FLAG_LINK_UP; - + /* set network interface device flags to internet down */ netdev->flags &= ~NETDEV_FLAG_INTERNET_UP; @@ -817,7 +823,7 @@ void netdev_low_level_set_link_status(struct netdev *netdev, rt_bool_t is_up) /** * This function will set network interface device DHCP status. * @NOTE it can only be called in the network interface device driver. - * + * * @param netdev the network interface device to change * @param is_up the new DHCP status */ @@ -889,7 +895,7 @@ static void netdev_list_if(void) /* two numbers are displayed at one time*/ if (netdev->hwaddr[index] < 10 && index != netdev->hwaddr_len - 1) rt_kprintf("0"); - + rt_kprintf("%d", netdev->hwaddr[index]); } } @@ -915,9 +921,9 @@ static void netdev_list_if(void) { 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), @@ -929,7 +935,7 @@ static void netdev_list_if(void) rt_kprintf("ipv6[%d] address: %s %s\n", i, inet_ntoa(*addr), !ip_addr_isany(addr) ? "VALID" : "INVALID"); } - } + } } #endif /* NETDEV_IPV6 */ @@ -937,7 +943,7 @@ static void netdev_list_if(void) { rt_kprintf("dns server #%d: %s\n", index, inet_ntoa(netdev->dns_servers[index])); } - + if (rt_slist_next(node)) { rt_kprintf("\n"); @@ -1016,7 +1022,7 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) struct netdev *netdev = RT_NULL; struct netdev_ping_resp ping_resp; int index, ret = 0; - + if (size == 0) { size = NETDEV_PING_DATA_SIZE; @@ -1044,7 +1050,7 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) ret = netdev->ops->ping(netdev, (const char *)target_name, size, NETDEV_PING_RECV_TIMEO, &ping_resp); if (ret == -RT_ETIMEOUT) { - rt_kprintf("ping: from %s icmp_seq=%d timeout\n", + rt_kprintf("ping: from %s icmp_seq=%d timeout\n", (ip_addr_isany(&(ping_resp.ip_addr))) ? target_name : inet_ntoa(ping_resp.ip_addr), index); } else if (ret == -RT_ERROR) @@ -1057,16 +1063,16 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) { if (ping_resp.ttl == 0) { - rt_kprintf("%d bytes from %s icmp_seq=%d time=%d ms\n", + rt_kprintf("%d bytes from %s icmp_seq=%d time=%d ms\n", ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index, ping_resp.ticks); } else { - rt_kprintf("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", + rt_kprintf("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index, ping_resp.ttl, ping_resp.ticks); } } - + rt_thread_mdelay(NETDEV_PING_DELAY); } @@ -1107,7 +1113,7 @@ static void netdev_list_dns(void) { rt_kprintf("dns server #%d: %s\n", index, inet_ntoa(netdev->dns_servers[index])); } - + if (rt_slist_next(node)) { rt_kprintf("\n"); @@ -1128,9 +1134,10 @@ static void netdev_set_dns(char *netdev_name, uint8_t dns_num, char *dns_server) } inet_aton(dns_server, &dns_addr); - netdev_set_dns_server(netdev, dns_num, &dns_addr); - - rt_kprintf("set network interface device(%s) dns server #0: %s\n", netdev_name, dns_server); + if (netdev_set_dns_server(netdev, dns_num, &dns_addr) == RT_EOK) + { + rt_kprintf("set network interface device(%s) dns server #%d: %s\n", netdev_name, dns_num, dns_server); + } } int netdev_dns(int argc, char **argv) @@ -1196,7 +1203,7 @@ int netdev_netstat(int argc, char **argv) { rt_kprintf("Please input: netstat \n"); } - else + else { netdev_cmd_netstat(); } -- cgit v1.3.1 From f39b44ce80a59f31c3abd7bed312768af0797000 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Sat, 24 Aug 2019 16:37:26 +0800 Subject: [network][netdev] Improve the ping command error log prompt Signed-off-by: chenyong <1521761801@qq.com> --- components/net/netdev/src/netdev.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index bc2c55f727..ebdcbed36f 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -355,7 +355,7 @@ void netdev_set_default(struct netdev *netdev) /* set default network interface device in the current network stack */ netdev->ops->set_default(netdev); } - LOG_D("Setting default network interface device name(%s) successfully.", netdev->name); + LOG_D("Setting default network interface device name(%s) successfully.", netdev->name); } } @@ -1037,16 +1037,30 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) { /* using first internet up status network interface device */ netdev = netdev_get_first_by_flags(NETDEV_FLAG_LINK_UP); - if (netdev == RT_NULL || NETDEV_PING_IS_COMMONICABLE(netdev) == 0) + if (netdev == RT_NULL) { - rt_kprintf("ping: network interface device get error.\n"); + rt_kprintf("ping: not found available network interface device.\n"); + return -RT_ERROR; + } + else if (netdev->ops == RT_NULL || netdev->ops->ping == RT_NULL) + { + rt_kprintf("ping: network interface device(%s) not support ping feature.\n", netdev->name); + return -RT_ERROR; + } + else if (!netdev_is_up(netdev) || !netdev_is_link_up(netdev)) + { + rt_kprintf("ping: network interface device(%s) status error.\n", netdev->name); return -RT_ERROR; } } for (index = 0; index < times; index++) { + int delay_tick = 0; + rt_tick_t start_tick = 0; + 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); if (ret == -RT_ETIMEOUT) { @@ -1073,7 +1087,9 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) } } - rt_thread_mdelay(NETDEV_PING_DELAY); + /* if the response time is more than NETDEV_PING_DELAY, no nead to delay */ + delay_tick = ((rt_tick_get() - start_tick) > NETDEV_PING_DELAY) || (index == times) ? 0 : NETDEV_PING_DELAY; + rt_thread_delay(delay_tick); } return RT_EOK; -- cgit v1.3.1 From 438d17e27b785a8bb79d94fb2394b11e9f64f7b6 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Thu, 12 Sep 2019 14:34:54 +0800 Subject: [net][netdev] fix IMEI spell mistake in ifconfig command Signed-off-by: chenyong <1521761801@qq.com> --- components/net/netdev/src/netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index ebdcbed36f..68e5364a9e 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -889,7 +889,7 @@ static void netdev_list_if(void) } else if (netdev->hwaddr_len == NETDEV_IFCONFIG_IEMI_MAX_LEN) { - rt_kprintf("IEMI: "); + rt_kprintf("IMEI: "); for (index = 0; index < netdev->hwaddr_len; index++) { /* two numbers are displayed at one time*/ -- cgit v1.3.1 From a1dc525859076f97b4dd39a459056ad0010e93ee Mon Sep 17 00:00:00 2001 From: luanxueguang <1600577905@qq.com> Date: Thu, 2 Apr 2020 13:50:09 +0800 Subject: [update] 修复拼写错误 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/netdev/src/netdev_ipaddr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/net/netdev/src') diff --git a/components/net/netdev/src/netdev_ipaddr.c b/components/net/netdev/src/netdev_ipaddr.c index 8d83937da9..a70a90bb75 100644 --- a/components/net/netdev/src/netdev_ipaddr.c +++ b/components/net/netdev/src/netdev_ipaddr.c @@ -564,7 +564,7 @@ netdev_inet_ntop(int af, const void *src, char *dst, int32_t size) } switch (af) { -#if NTEDEV_IPV4 +#if NETDEV_IPV4 case AF_INET: return netdev_ip4addr_ntoa_r((const ip4_addr_t *)src, dst, size_int); #endif -- cgit v1.3.1 From 88a02d7bd8fc32a81b5a60e1e27853a70bb9f62a Mon Sep 17 00:00:00 2001 From: luhuadong Date: Sat, 9 May 2020 10:33:36 +0800 Subject: fixed some typos --- components/net/at/at_socket/at_socket.c | 2 +- components/net/netdev/src/netdev.c | 2 +- components/net/sal_socket/src/sal_socket.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'components/net/netdev/src') diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index 11be4e23c0..220bf9d620 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -744,7 +744,7 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f goto __exit; } - /* if the socket type is UDP, nead to connect socket first */ + /* if the socket type is UDP, need to connect socket first */ if (from && sock->type == AT_SOCKET_UDP && sock->state == AT_SOCKET_OPEN) { ip_addr_t remote_addr; diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 68e5364a9e..aa43d8d3db 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -1087,7 +1087,7 @@ int netdev_cmd_ping(char* target_name, rt_uint32_t times, rt_size_t size) } } - /* if the response time is more than NETDEV_PING_DELAY, no nead to delay */ + /* if the response time is more than NETDEV_PING_DELAY, no need to delay */ delay_tick = ((rt_tick_get() - start_tick) > NETDEV_PING_DELAY) || (index == times) ? 0 : NETDEV_PING_DELAY; rt_thread_delay(delay_tick); } diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index bd51c829c6..e3bea5a28e 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -679,7 +679,7 @@ int sal_shutdown(int socket, int how) /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* shutdown operation not nead to check network interface status */ + /* shutdown operation not need to check network interface status */ /* check the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, shutdown); @@ -970,7 +970,7 @@ int sal_closesocket(int socket) /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* clsoesocket operation not nead to vaild network interface status */ + /* clsoesocket operation not need to vaild network interface status */ /* valid the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, socket); -- cgit v1.3.1