diff --git a/components/net/sal/src/sal_socket.c b/components/net/sal/src/sal_socket.c index d8a68fa0ee..51aa8ce0f4 100644 --- a/components/net/sal/src/sal_socket.c +++ b/components/net/sal/src/sal_socket.c @@ -1314,9 +1314,9 @@ int sal_ioctlsocket(int socket, long cmd, void *arg) if (!strcmp(ifr->ifr_ifrn.ifrn_name, netdev->name)) { uint16_t flags_tmp = 0; - if (sock->netdev->flags & NETDEV_FLAG_UP) + if (netdev->flags & NETDEV_FLAG_UP) flags_tmp = flags_tmp | IFF_UP; - if (!(sock->netdev->flags & NETDEV_FLAG_ETHARP)) + if (!(netdev->flags & NETDEV_FLAG_ETHARP)) flags_tmp = flags_tmp | IFF_NOARP; ifr->ifr_ifru.ifru_flags = flags_tmp; return 0; @@ -1327,8 +1327,24 @@ int sal_ioctlsocket(int socket, long cmd, void *arg) case SIOCSIFFLAGS: - sock->netdev->flags = ifr->ifr_ifru.ifru_flags; - return 0; + for (node = &(cur_netdev_list->list); node; node = rt_slist_next(node)) + { + netdev = rt_list_entry(node, struct netdev, list); + if (!strcmp(ifr->ifr_ifrn.ifrn_name, netdev->name)) + { + if ((ifr->ifr_ifru.ifru_flags & IFF_UP) == 0) + { + netdev_set_down(netdev); + } + else + { + netdev_set_up(netdev); + } + return 0; + } + } + return -1; + case SIOCGIFCONF: { struct ifconf *ifconf_tmp;