33#include <lwip/priv/tcpip_priv.h>
37#if LWIP_ENABLE_NET_CAPABILITY
40#define BIND_SERVICE_CAP_MIN_PORT 1024
43#define IOCTL_CMD_CASE_HANDLER() \
46 struct lwip_ioctl_apimsg msg; \
51 err = tcpip_api_call(lwip_do_ioctl_impl, &msg.call); \
52 if (err != ENOSYS) { \
53 sock_set_errno(sock, err); \
55 return -(err != ERR_OK); \
60 struct tcpip_api_call_data
call;
76static int lwip_setsockopt_wrap(
int s,
int level,
int optname,
const void *optval, socklen_t optlen);
77int lwip_setsockopt(
int s,
int level,
int optname,
const void *optval, socklen_t optlen)
82static int lwip_bind_wrap(
int s,
const struct sockaddr *name, socklen_t namelen);
83int lwip_bind(
int s,
const struct sockaddr *name, socklen_t namelen)
89 const struct sockaddr *to, socklen_t tolen);
90ssize_t lwip_sendto(
int s,
const void *dataptr,
size_t size,
int flags,
const struct sockaddr *to, socklen_t tolen)
98#define lwip_socket static lwip_socket2
101#ifdef lwip_setsockopt
102#undef lwip_setsockopt
104#define lwip_setsockopt static lwip_setsockopt2
105static int lwip_setsockopt2(
int s,
int level,
int optname,
const void *optval, socklen_t optlen);
110#define lwip_bind static lwip_bind2
111static int lwip_bind2(
int s,
const struct sockaddr *name, socklen_t namelen);
116#define lwip_sendto lwip_sendto2
117ssize_t lwip_sendto2(
int s,
const void *dataptr,
size_t size,
int flags,
const struct sockaddr *to, socklen_t tolen);
119#include "../api/sockets.c"
122#undef lwip_setsockopt
128 if (domain != AF_INET && domain != AF_INET6) {
129 set_errno(EAFNOSUPPORT);
132#if LWIP_ENABLE_NET_CAPABILITY
133 if (type == SOCK_RAW && !
IsCapPermit(CAP_NET_RAW)) {
143#if LWIP_ENABLE_NET_CAPABILITY
144 if (level == SOL_SOCKET) {
146#if LWIP_ENABLE_CAP_NET_BROADCAST
172#if LWIP_ENABLE_NET_CAPABILITY && LWIP_ENABLE_CAP_NET_BROADCAST
176 socklen_t salen =
sizeof(sa);
178 if (ipaddr == NULL) {
182 if (lwip_getsockname(s, &sa, &salen) == -1) {
189 SOCKADDR_TO_IPADDR_PORT(&sa, &addr, port);
191 struct netif *netif = NULL;
192 NETIF_FOREACH(netif) {
193 if (ip_addr_cmp(&netif->ip_addr, &addr)) {
194 return ip_addr_isbroadcast(ipaddr, netif);
196 for (
int i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
197 if (ip_addr_cmp(&netif->ip6_addr[i], &addr)) {
198 return ip_addr_isbroadcast(ipaddr, netif);
209#if LWIP_ENABLE_NET_CAPABILITY
210 if ((name->sa_family == AF_INET && namelen >=
sizeof(
struct sockaddr_in)) ||
211 (name->sa_family == AF_INET6 && namelen >=
sizeof(
struct sockaddr_in6))) {
215 SOCKADDR_TO_IPADDR_PORT(name, &ipaddr, port);
217 if (port != 0 && port < BIND_SERVICE_CAP_MIN_PORT) {
218 LWIP_ERROR(
"permission deny: NET_BIND_SERVICE\n",
IsCapPermit(CAP_NET_BIND_SERVICE),
219 set_errno(EPERM);
return -1);
221#if LWIP_ENABLE_CAP_NET_BROADCAST
223 LWIP_ERROR(
"permission deny: NET_BROADCAST\n",
IsCapPermit(CAP_NET_BROADCAST),
224 set_errno(EPERM);
return -1);
234 const struct sockaddr *to, socklen_t tolen)
236#if LWIP_ENABLE_NET_CAPABILITY
238 ((to->sa_family == AF_INET && tolen >=
sizeof(
struct sockaddr_in)) ||
239 (to->sa_family == AF_INET6 && tolen >=
sizeof(
struct sockaddr_in6)))) {
243 SOCKADDR_TO_IPADDR_PORT(to, &ipaddr, port);
244#if LWIP_ENABLE_CAP_NET_BROADCAST
246 LWIP_ERROR(
"permission deny: NET_BROADCAST\n",
IsCapPermit(CAP_NET_BROADCAST),
247 set_errno(EPERM);
return -1);
253 return lwip_sendto2(s, dataptr, size, flags, to, tolen);
256#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
259extern void poll_wait(
struct file *filp, wait_queue_head_t *wait_address, poll_table *p);
264 unsigned long int_save, wq_empty;
265 pollevent_t mask = 0;
266 struct lwip_sock *sock;
267 SYS_ARCH_DECL_PROTECT(lev);
269 if (!check_waiters) {
273 sock = get_socket(s);
278 SYS_ARCH_PROTECT(lev);
280 mask |= (sock->rcvevent > 0) ? (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND) : 0;
281 mask |= (sock->sendevent != 0) ? (POLLOUT | POLLWRNORM | POLLWRBAND) : 0;
282 mask |= (sock->errevent != 0) ? (POLLERR) : 0;
284 SYS_ARCH_UNPROTECT(lev);
286 spin_lock_irqsave(&sock->wq.lock, int_save);
288 spin_unlock_irqrestore(&sock->wq.lock, int_save);
290 if (mask && !wq_empty) {
300 pollevent_t mask = 0;
301 struct lwip_sock *sock;
302 SYS_ARCH_DECL_PROTECT(lev);
304 LWIP_ERROR(
"sock_poll: invalid poll_table", (wait != NULL),
return -EINVAL;);
306 sock = get_socket(s);
308 LWIP_DEBUGF(SOCKETS_DEBUG, (
"sock_poll: Invalid socket"));
313 SYS_ARCH_PROTECT(lev);
315 mask |= (sock->rcvevent > 0 || sock->lastdata.pbuf) ? (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND) : 0;
316 mask |= (sock->sendevent != 0) ? (POLLOUT | POLLWRNORM | POLLWRBAND) : 0;
317 mask |= (sock->errevent != 0) ? (POLLERR) : 0;
319 SYS_ARCH_UNPROTECT(lev);
321 ret = wait->key & mask;
332#if !LWIP_COMPAT_SOCKETS
334#define API_ALIAS(old, new) \
335 extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
341#if LWIP_ENABLE_LOS_SHELL_CMD
346 SYS_ARCH_DECL_PROTECT(lev);
348 SYS_ARCH_PROTECT(lev);
350 for (
int i = 0; i < NUM_SOCKETS; i++) {
351 if (sockets[i].conn == NULL) {
352#if LWIP_NETCONN_FULLDUPLEX
353 if (sockets[i].fd_used) {
361 SYS_ARCH_UNPROTECT(lev);
372#define LWIP_IOCTL_ROUTE 1
373#define LWIP_IOCTL_IF 1
374#define LWIP_NETIF_ETHTOOL 0
375#define LWIP_IOCTL_IPV6DPCTD 0
376#undef LWIP_IPV6_DUP_DETECT_ATTEMPTS
377#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 0
380#define SIOCSIPV6DAD _IOW('z', 0, unsigned long)
384#define SIOCGIPV6DAD _IOR('z', 1, unsigned long)
387#ifndef SIOCSIPV6DPCTD
388#define SIOCSIPV6DPCTD _IOW('z', 2, unsigned long)
391#ifndef SIOCGIPV6DPCTD
392#define SIOCGIPV6DPCTD _IOR('z', 3, unsigned long)
396#define SIOCETHTOOL 0x8946
399#if LWIP_NETIF_PROMISC
400#define NETIF_FLAG_PROMISC 0x80U
406#include <net/route.h>
410 struct netif *netif = NULL;
414#if LWIP_ENABLE_NET_CAPABILITY
420 SOCKADDR_TO_IPADDR_PORT(&rmten->rt_gateway, &rtgw_addr, rtgw_port);
422 if (!IP_IS_V4_VAL(rtgw_addr)) {
427 if (ip_addr_ismulticast(&rtgw_addr) || ip_addr_isany(&rtgw_addr) ||
428 ip_addr_isloopback(&rtgw_addr)) {
433 for (netif = netif_list; netif != NULL; netif = netif->next) {
434 if (ip_addr_netcmp(&rtgw_addr, &netif->ip_addr, ip_2_ip4(&netif->netmask))) {
444 if (ip_addr_isbroadcast(&rtgw_addr, netif) != 0) {
449 if ((rmten->rt_flags & RTF_GATEWAY) == 0) {
454 if ((netif_default != NULL) && (netif_default != netif)) {
455 ip_addr_set_zero(&netif_default->gw);
456 (
void)netif_set_default(netif);
458 netif_set_gw(netif, ip_2_ip4(&rtgw_addr));
469 struct ifconf *ifc = NULL;
470 struct netif *netif = NULL;
472 struct sockaddr_in *sock_in = NULL;
478 ifc = (
struct ifconf *)ifr;
483 for (netif = netif_list; netif != NULL; netif = netif->next) {
484 if (ifc->ifc_buf == NULL) {
485 pos = (pos + (
int)
sizeof(
struct ifreq));
489 if (len < (
int)
sizeof(ifreq)) {
492 (
void)memset_s(&ifreq,
sizeof(
struct ifreq), 0,
sizeof(
struct ifreq));
493 if (netif->link_layer_type == LOOPBACK_IF) {
494 ret = snprintf_s(ifreq.ifr_name, IFNAMSIZ, (IFNAMSIZ - 1),
"%.2s", netif->name);
495 if ((ret <= 0) || (ret >= IFNAMSIZ)) {
496 LWIP_DEBUGF(NETIF_DEBUG, (
"lwip_ioctl: snprintf_s ifr_name failed."));
500 ret = snprintf_s(ifreq.ifr_name, IFNAMSIZ, (IFNAMSIZ - 1),
"%s", netif_get_name(netif));
501 if ((ret <= 0) || (ret >= IFNAMSIZ)) {
502 LWIP_DEBUGF(NETIF_DEBUG, (
"lwip_ioctl: snprintf_s ifr_name failed."));
507 sock_in = (
struct sockaddr_in *)&ifreq.ifr_addr;
508 sock_in->sin_family = AF_INET;
509 sock_in->sin_addr.s_addr = ip_2_ip4(&netif->ip_addr)->addr;
510 if (memcpy_s(ifc->ifc_buf + pos,
sizeof(
struct ifreq), &ifreq,
sizeof(
struct ifreq)) != EOK) {
513 pos = pos + (
int)
sizeof(
struct ifreq);
514 len = len - (
int)
sizeof(
struct ifreq);
524 struct netif *netif = NULL;
525 struct sockaddr_in *sock_in = NULL;
528 netif = netif_find(ifr->ifr_name);
532 sock_in = (
struct sockaddr_in *)&ifr->ifr_addr;
533 sock_in->sin_family = AF_INET;
534 sock_in->sin_addr.s_addr = ip_2_ip4(&netif->ip_addr)->addr;
539#ifndef LWIP_IPV6_PREFIX_LEN
540#define LWIP_IPV6_PREFIX_LEN 64
543#ifndef LWIP_NETIF_IFINDEX_MAX_EX
544#define LWIP_NETIF_IFINDEX_MAX_EX 255
548#include "lwip/dhcp6.h"
549#include "lwip/prot/dhcp.h"
550#include "lwip/prot/dhcp6.h"
560 struct netif *netif = NULL;
562 struct netif *loc_netif = NULL;
563 ip_addr_t taget_addr;
565 SOCKADDR_TO_IPADDR_PORT(&ifr->ifr_addr, &taget_addr, taget_port);
567#if LWIP_ENABLE_NET_CAPABILITY
574 netif = netif_find(ifr->ifr_name);
579 else if (netif->link_layer_type == LOOPBACK_IF) {
585 if (!IP_IS_V4(&taget_addr) || ip_addr_ismulticast(&taget_addr) ||
586 ip_addr_isbroadcast(&taget_addr, netif) ||
587 ip_addr_isany(&taget_addr) ||
588 ip_addr_isloopback(&taget_addr)) {
593 if (ip_addr_netcmp(&taget_addr, &netif->ip_addr, ip_2_ip4(&netif->netmask)) == 0) {
594 ip_addr_set_zero(&netif->gw);
595 if (netif == netif_default) {
596 (
void)netif_set_default(NULL);
601 loc_netif = netif_list;
602 while (loc_netif != NULL) {
603 if (loc_netif == netif) {
604 loc_netif = loc_netif->next;
607 if (ip_addr_cmp(&netif->netmask, &loc_netif->netmask) &&
608 ip_addr_netcmp(&loc_netif->ip_addr, &taget_addr,
609 ip_2_ip4(&netif->netmask))) {
612 loc_netif = loc_netif->next;
616 if ((netif_dhcp_data(netif) != NULL) &&
617 (netif_dhcp_data(netif)->state != DHCP_STATE_OFF)) {
624 if ((netif->flags & NETIF_FLAG_ETHARP) != 0) {
625 etharp_cleanup_netif(netif);
629 netif_set_ipaddr(netif, ip_2_ip4(&taget_addr));
643 struct netif *netif = NULL;
645 ip_addr_t target_addr;
648 SOCKADDR_TO_IPADDR_PORT(&ifr->ifr_addr, &target_addr, target_port);
650#if LWIP_ENABLE_NET_CAPABILITY
657 netif = netif_find(ifr->ifr_name);
662 else if (netif->link_layer_type == LOOPBACK_IF) {
668 if (!IP_IS_V4(&target_addr) || ip_addr_isloopback(&target_addr)) {
673 if ((netif_dhcp_data(netif) != NULL) &&
674 (netif_dhcp_data(netif)->state != DHCP_STATE_OFF)) {
679 ip_addr_set_zero(&netif->gw);
680 ip_addr_set_zero(&netif->ip_addr);
681 ip_addr_set_zero(&netif->netmask);
682 if (netif == netif_default) {
683 (
void)netif_set_default(NULL);
686#if LWIP_IPV4 && LWIP_ARP
687 if ((netif->flags & NETIF_FLAG_ETHARP) != 0) {
688 etharp_cleanup_netif(netif);
697 struct netif *netif = NULL;
698 struct sockaddr_in *sock_in = NULL;
701 netif = netif_find(ifr->ifr_name);
705 sock_in = (
struct sockaddr_in *)&ifr->ifr_netmask;
706 sock_in->sin_family = AF_INET;
707 sock_in->sin_addr.s_addr = ip_2_ip4(&netif->netmask)->addr;
714 struct netif *netif = NULL;
716 struct netif *loc_netif = NULL;
717 ip_addr_t taget_addr;
719 SOCKADDR_TO_IPADDR_PORT(&ifr->ifr_addr, &taget_addr, taget_port);
721#if LWIP_ENABLE_NET_CAPABILITY
727 if (!IP_IS_V4(&taget_addr)) {
732 netif = netif_find(ifr->ifr_name);
737 else if (netif->link_layer_type == LOOPBACK_IF) {
742 if (ip_addr_cmp(&netif->netmask, &taget_addr)) {
746 if (ip_addr_netmask_valid(ip_2_ip4(&taget_addr)) != 0) {
751 loc_netif = netif_list;
752 while (loc_netif != NULL) {
753 if (loc_netif == netif) {
754 loc_netif = loc_netif->next;
757 if (ip_addr_cmp(&loc_netif->netmask, &taget_addr) &&
758 ip_addr_netcmp(&loc_netif->ip_addr,
759 &netif->ip_addr, ip_2_ip4(&loc_netif->netmask))) {
762 loc_netif = loc_netif->next;
766 if ((netif_dhcp_data(netif) != NULL) &&
767 (netif_dhcp_data(netif)->state != DHCP_STATE_OFF)) {
772 netif_set_netmask(netif, ip_2_ip4(&taget_addr));
775 if (!ip_addr_netcmp(&netif->gw, &netif->ip_addr, ip_2_ip4(&taget_addr))) {
776 ip_addr_set_zero(&(netif->gw));
777 if (netif == netif_default) {
778 (
void)netif_set_default(NULL);
787 struct netif *netif = NULL;
790#if LWIP_ENABLE_NET_CAPABILITY
797 netif = netif_find(ifr->ifr_name);
802 else if (netif->link_layer_type == LOOPBACK_IF) {
809 (
void)netif_set_down(netif);
811 ret =
netif_set_hwaddr(netif, (
const unsigned char *)ifr->ifr_hwaddr.sa_data, netif->hwaddr_len);
814 (
void)netif_set_up(netif);
815 return err_to_errno(ret);
822 (
void)netif_set_up(netif);
829 struct netif *netif = NULL;
832 netif = netif_find(ifr->ifr_name);
837 else if (netif->link_layer_type == LOOPBACK_IF) {
842 if (memcpy_s((
void *)ifr->ifr_hwaddr.sa_data,
sizeof(ifr->ifr_hwaddr.sa_data),
843 (
void *)netif->hwaddr, netif->hwaddr_len) != EOK) {
852 struct netif *netif = NULL;
854#if LWIP_ENABLE_NET_CAPABILITY
861 netif = netif_find(ifr->ifr_name);
866 else if (netif->link_layer_type == LOOPBACK_IF) {
871 if (((
unsigned short)ifr->ifr_flags & IFF_UP) && !(netif->flags & NETIF_FLAG_UP)) {
872 (
void)netif_set_up(netif);
873 }
else if (!((
unsigned short)ifr->ifr_flags & IFF_UP) && (netif->flags & NETIF_FLAG_UP)) {
874 (
void)netif_set_down(netif);
876 if (((
unsigned short)ifr->ifr_flags & IFF_RUNNING) && !(netif->flags & NETIF_FLAG_LINK_UP)) {
877 (
void)netif_set_link_up(netif);
878 }
else if (!((
unsigned short)ifr->ifr_flags & IFF_RUNNING) && (netif->flags & NETIF_FLAG_LINK_UP)) {
879 (
void)netif_set_link_down(netif);
882 if ((
unsigned short)ifr->ifr_flags & IFF_BROADCAST) {
883 netif->flags |= NETIF_FLAG_BROADCAST;
885 netif->flags = netif->flags & (~NETIF_FLAG_BROADCAST);
887 if ((
unsigned short)ifr->ifr_flags & IFF_NOARP) {
888 netif->flags = (netif->flags & (~NETIF_FLAG_ETHARP));
890 netif->flags |= NETIF_FLAG_ETHARP;
893 if ((
unsigned short)ifr->ifr_flags & IFF_MULTICAST) {
895 netif->flags |= NETIF_FLAG_IGMP;
897#if LWIP_IPV6 && LWIP_IPV6_MLD
898 netif->flags |= NETIF_FLAG_MLD6;
902 netif->flags = (netif->flags & ~NETIF_FLAG_IGMP);
904#if LWIP_IPV6 && LWIP_IPV6_MLD
905 netif->flags = (netif->flags & ~NETIF_FLAG_MLD6);
910 if ((
unsigned short)ifr->ifr_flags & IFF_DYNAMIC) {
911 (
void)dhcp_start(netif);
914#if !LWIP_DHCP_SUBSTITUTE
920#if LWIP_NETIF_PROMISC
921 if (((
unsigned short)ifr->ifr_flags & IFF_PROMISC)) {
922 netif->flags |= NETIF_FLAG_PROMISC;
924 netif->flags &= ~NETIF_FLAG_PROMISC;
926 if (netif->drv_config) {
927 netif->drv_config(netif, IFF_PROMISC, !!((
unsigned short)ifr->ifr_flags & IFF_PROMISC));
936 struct netif *netif = NULL;
939 netif = netif_find(ifr->ifr_name);
943 if (netif->flags & NETIF_FLAG_UP) {
944 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) | IFF_UP;
946 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) & ~IFF_UP;
948 if (netif->flags & NETIF_FLAG_LINK_UP) {
949 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) | IFF_RUNNING;
951 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) & ~IFF_RUNNING;
953 if (netif->flags & NETIF_FLAG_BROADCAST) {
954 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) | IFF_BROADCAST;
956 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) & ~IFF_BROADCAST;
958 if (netif->flags & NETIF_FLAG_ETHARP) {
959 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) & ~IFF_NOARP;
961 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) | IFF_NOARP;
964#if LWIP_IGMP || LWIP_IPV6_MLD
967 (netif->flags & NETIF_FLAG_IGMP)
969#if LWIP_IGMP && LWIP_IPV6_MLD
973 (netif->flags & NETIF_FLAG_MLD6)
976 ifr->ifr_flags = (short)((
unsigned short)ifr->ifr_flags | IFF_MULTICAST);
978 ifr->ifr_flags = (short)((
unsigned short)ifr->ifr_flags & (~IFF_MULTICAST));
984 if (dhcp_supplied_address(netif)) {
985 ifr->ifr_flags = (short)((
unsigned short)ifr->ifr_flags | IFF_DYNAMIC);
987 ifr->ifr_flags = (short)((
unsigned short)ifr->ifr_flags & (~IFF_DYNAMIC));
992 if (netif->link_layer_type == LOOPBACK_IF) {
993 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) | IFF_LOOPBACK;
997#if LWIP_NETIF_PROMISC
998 if (netif->flags & NETIF_FLAG_PROMISC) {
999 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) | IFF_PROMISC;
1001 ifr->ifr_flags = ((
unsigned short)(ifr->ifr_flags)) & ~IFF_PROMISC;
1011 struct netif *netif = NULL;
1014 for (netif = netif_list; netif != NULL; netif = netif->next) {
1015 if (ifr->ifr_ifindex == netif_get_index(netif)) {
1020 if (netif == NULL) {
1023 if (netif->link_layer_type == LOOPBACK_IF) {
1024 ret = snprintf_s(ifr->ifr_name, IFNAMSIZ, (IFNAMSIZ - 1),
"%.2s", netif->name);
1025 if ((ret <= 0) || (ret >= IFNAMSIZ)) {
1029 ret = snprintf_s(ifr->ifr_name, IFNAMSIZ, (IFNAMSIZ - 1),
"%s", netif_get_name(netif));
1030 if ((ret <= 0) || (ret >= IFNAMSIZ)) {
1040 unsigned short num_pos = 0;
1041 unsigned short letter_pos = 0;
1042 unsigned short pos = 0;
1046 if (((*name >=
'a') && (*name <=
'z')) || ((*name >=
'A') && (*name <=
'Z'))) {
1051 while (*name !=
'\0') {
1052 if ((*name >=
'0') && (*name <=
'9')) {
1055 }
else if (((*name >=
'a') && (*name <=
'z')) || ((*name >=
'A') && (*name <=
'Z'))) {
1057 if (have_num != 0) {
1073 if (atoi(name - (pos - letter_pos - 1)) > 255) {
1077 *let_pos = (u8_t)letter_pos;
1084 struct netif *netif = NULL;
1085 u8_t letter_pos = 0;
1087#if LWIP_ENABLE_NET_CAPABILITY
1093 netif = netif_find(ifr->ifr_name);
1095 if (netif == NULL) {
1097 }
else if (netif->link_layer_type == LOOPBACK_IF) {
1099 }
else if ((netif->flags & IFF_UP) != 0) {
1102 if (strncmp(ifr->ifr_name, ifr->ifr_newname, IFNAMSIZ) == 0) {
1107 ifr->ifr_newname[IFNAMSIZ - 1] =
'\0';
1108 if ((
lwip_validate_ifname(ifr->ifr_newname, &letter_pos) == 0) || (strlen(ifr->ifr_newname) > (IFNAMSIZ - 1))) {
1112 if (strncpy_s(netif->full_name,
sizeof(netif->full_name), ifr->ifr_newname, strlen(ifr->ifr_newname)) != EOK) {
1122 struct netif *netif = NULL;
1124 netif = netif_find(ifr->ifr_name);
1125 if (netif == NULL) {
1128 ifr->ifr_ifindex = netif_get_index(netif);
1135 struct netif *netif = NULL;
1137#if LWIP_ENABLE_NET_CAPABILITY
1144 netif = netif_find(ifr->ifr_name);
1145 if (netif == NULL) {
1150 else if (netif->link_layer_type == LOOPBACK_IF) {
1165 struct netif *netif = NULL;
1168 netif = netif_find(ifr->ifr_name);
1170 if (netif == NULL) {
1173 ifr->ifr_mtu = netif->mtu;
1180 struct netif *netif = NULL;
1181 struct sockaddr_in *sock_in = NULL;
1184 netif = netif_find(ifr->ifr_name);
1185 if (netif == NULL) {
1188 if (ip4_addr_isany_val(*(ip_2_ip4(&netif->netmask)))) {
1191 sock_in = (
struct sockaddr_in *)&ifr->ifr_addr;
1192 sock_in->sin_family = AF_INET;
1193 sock_in->sin_addr.s_addr = (ip_2_ip4(&((netif)->ip_addr))->addr | ~(ip_2_ip4(&netif->netmask)->addr));
1199#if LWIP_NETIF_ETHTOOL
1203 struct netif *netif;
1205#if LWIP_ENABLE_NET_CAPABILITY
1211 netif = netif_find(ifr->ifr_name);
1212 if (netif == NULL) {
1215 return dev_ethtool(netif, ifr);
1222#if LWIP_IPV6_DUP_DETECT_ATTEMPTS
1226#if LWIP_ENABLE_NET_CAPABILITY
1232 struct netif *tmpnetif = netif_find(ifr->ifr_name);
1233 if (tmpnetif == NULL) {
1234 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Interface not found.\n"));
1238 if ((ifr->ifr_ifru.ifru_ivalue != 0) && (ifr->ifr_ifru.ifru_ivalue != 1)) {
1239 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Invalid ioctl argument(ifru_ivalue 0/1).\n"));
1243 if (ifr->ifr_ifru.ifru_ivalue == 1) {
1244 tmpnetif->ipv6_flags = (tmpnetif->ipv6_flags | LWIP_IPV6_ND6_FLAG_DAD);
1246 LWIP_DEBUGF(SOCKETS_DEBUG, (
"DAD turned on through ioctl for %s iface index %u \n",
1247 tmpnetif->name, tmpnetif->num));
1249 tmpnetif->ipv6_flags = (tmpnetif->ipv6_flags & ((~LWIP_IPV6_ND6_FLAG_DAD) & 0xffU));
1251 LWIP_DEBUGF(SOCKETS_DEBUG, (
"DAD turned off through ioctl for %s iface index %u \n",
1252 tmpnetif->name, tmpnetif->num));
1259 struct netif *tmpnetif = netif_find(ifr->ifr_name);
1260 if (tmpnetif == NULL) {
1261 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Interface not found.\n"));
1264 ifr->ifr_ifru.ifru_ivalue = (tmpnetif->ipv6_flags & LWIP_IPV6_ND6_FLAG_DAD) ? 1 : 0;
1270#if LWIP_IOCTL_IPV6DPCTD
1274#if LWIP_ENABLE_NET_CAPABILITY
1280 struct netif *tmpnetif = netif_find(ifr->ifr_name);
1281 if (tmpnetif == NULL) {
1282 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Interface not found.\n"));
1285 if ((ifr->ifr_ifru.ifru_ivalue != 0) && (ifr->ifr_ifru.ifru_ivalue != 1)) {
1286 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Invalid ioctl argument(ifru_ivalue 0/1).\n"));
1289 if (ifr->ifr_ifru.ifru_ivalue == 1) {
1290 tmpnetif->ipv6_flags = (tmpnetif->ipv6_flags | LWIP_IPV6_ND6_FLAG_DEPRECATED);
1291 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Deprecation turned on through ioctl for %s iface index %u \n",
1292 tmpnetif->name, tmpnetif->num));
1294 tmpnetif->ipv6_flags = (tmpnetif->ipv6_flags & ((~LWIP_IPV6_ND6_FLAG_DEPRECATED) & 0xffU));
1295 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Deprecation turned off through ioctl for %s iface index %u \n",
1296 tmpnetif->name, tmpnetif->num));
1303 struct netif *tmpnetif = netif_find(ifr->ifr_name);
1304 if (tmpnetif == NULL) {
1305 LWIP_DEBUGF(SOCKETS_DEBUG, (
"Interface not found.\n"));
1309 ifr->ifr_ifru.ifru_ivalue = (tmpnetif->ipv6_flags & LWIP_IPV6_ND6_FLAG_DEPRECATED) ? 1 : 0;
1319#if LWIP_NETIF_ETHTOOL
1322#if LWIP_IPV6_DUP_DETECT_ATTEMPTS || LWIP_IOCTL_IPV6DPCTD || LWIP_IOCTL_IF || LWIP_NETIF_ETHTOOL
1323 struct ifreq *ifr = (
struct ifreq *)argp;
1326 struct rtentry *rmten = (
struct rtentry *)argp;
1328#if LWIP_IPV6_DUP_DETECT_ATTEMPTS || LWIP_IOCTL_IPV6DPCTD || LWIP_IOCTL_ROUTE || LWIP_IOCTL_IF
1332 is_ipv6 = NETCONNTYPE_ISIPV6((
unsigned int)(sock->conn->type));
1335 switch ((u32_t)cmd) {
1337#if LWIP_IPV6_DUP_DETECT_ATTEMPTS
1355#if LWIP_IOCTL_IPV6DPCTD
1356 case SIOCSIPV6DPCTD:
1364 case SIOCGIPV6DPCTD:
1415 case SIOCGIFNETMASK:
1422 case SIOCSIFNETMASK:
1459 case SIOCGIFBRDADDR:
1467#if LWIP_NETIF_ETHTOOL
1479 LWIP_DEBUGF(SOCKETS_DEBUG, (
"lwip_ioctl_impl(INVALID: 0x%lx)\n", cmd));
1483 LWIP_DEBUGF(SOCKETS_DEBUG, (
"lwip_ioctl(UNIMPL: 0x%lx)\n", cmd));
1502 char *buf_bak = NULL;
1509 nbytes = ifc.ifc_len;
1514 buf_bak = ifc.ifc_buf;
1519 ifc.ifc_buf =
malloc(nbytes);
1520 if (ifc.ifc_buf == NULL) {
1524 (
void)memset_s(ifc.ifc_buf, nbytes, 0, nbytes);
1526 ret = lwip_ioctl(sockfd, cmd, &ifc);
1535 ifc.ifc_buf = buf_bak;
1545 void *argpbak = argp;
1553 nbytes =
sizeof(
int);
1556 nbytes =
sizeof(
struct rtentry);
1562 case SIOCSIPV6DPCTD:
1563 case SIOCGIPV6DPCTD:
1567 case SIOCGIFNETMASK:
1568 case SIOCSIFNETMASK:
1579 case SIOCGIFBRDADDR:
1580 nbytes =
sizeof(
struct ifreq);
1585 if (argp != NULL && nbytes > 0) {
1598 ret = lwip_ioctl(sockfd, cmd, argp);
1599 if (ret == 0 && argp != argpbak) {
1606 if (argp != argpbak) {
1614 struct lwip_sock *sock = NULL;
1615 SYS_ARCH_DECL_PROTECT(lev);
1617 sock = get_socket(sockfd);
1622 SYS_ARCH_PROTECT(lev);
1626 SYS_ARCH_UNPROTECT(lev);
1633 struct lwip_sock *sock = NULL;
1634 SYS_ARCH_DECL_PROTECT(lev);
1636 sock = get_socket(sockfd);
1641 SYS_ARCH_PROTECT(lev);
1643 if (sock->s_refcount == 0) {
1644 SYS_ARCH_UNPROTECT(lev);
1646 return lwip_close(sockfd);
1651 SYS_ARCH_UNPROTECT(lev);
BOOL IsCapPermit(UINT32 capIndex)
err_t netif_set_hwaddr(struct netif *netif, const unsigned char *hw_addr, int hw_len)
err_t netif_dhcp_off(struct netif *netif)
err_t netif_set_mtu(struct netif *netif, u16_t netif_mtu)
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
void * malloc(size_t size)
动态分配内存块大小
void free(void *ptr)
释放ptr所指向的内存空间
static u8_t lwip_ioctl_internal_SIOCGIPV6DAD(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCSIFNETMASK(struct ifreq *ifr)
static int lwip_socket_wrap(int domain, int type, int protocol)
static u8_t lwip_ioctl_internal_SIOCGIFFLAGS(struct ifreq *ifr)
static int lwip_bind2(int s, const struct sockaddr *name, socklen_t namelen)
ssize_t lwip_sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen)
static u8_t lwip_ioctl_internal_SIOCGIFCONF(struct ifreq *ifr)
int get_unused_socket_num(void)
int socks_ioctl(int sockfd, long cmd, void *argp)
static u8_t lwip_ioctl_internal_SIOCADDRT(struct rtentry *rmten)
static int lwip_setsockopt2(int s, int level, int optname, const void *optval, socklen_t optlen)
ssize_t lwip_sendto2(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen)
int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
static int ip_addr_isbroadcast_bysock(const ip_addr_t *ipaddr, int s)
static u8_t lwip_ioctl_internal_SIOCDIFADDR_6(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCGIFMTU(struct ifreq *ifr)
static ssize_t lwip_sendto_wrap(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen)
static u8_t lwip_ioctl_internal_SIOCGIFNETMASK(struct ifreq *ifr)
static err_t lwip_do_ioctl_impl(struct tcpip_api_call_data *call)
static void poll_check_waiters(int s, int check_waiters)
static u8_t lwip_ioctl_impl(const struct lwip_sock *sock, long cmd, void *argp)
static u8_t lwip_ioctl_internal_SIOCSIFADDR_6(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCGIFNAME(struct ifreq *ifr)
static s32_t lwip_ioctl_internal_SIOCETHTOOL(struct ifreq *ifr)
int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)
int socks_close(int sockfd)
static u8_t lwip_ioctl_internal_SIOCSIFMTU(struct ifreq *ifr)
API_ALIAS(lwip_ioctl, ioctlsocket)
static u8_t lwip_ioctl_internal_SIOCSIFHWADDR(struct ifreq *ifr)
void socks_refer(int sockfd)
static u8_t lwip_ioctl_internal_SIOCSIFADDR(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCGIFINDEX(struct ifreq *ifr)
void __wake_up_interruptible_poll(wait_queue_head_t *wait, pollevent_t key)
static u8_t lwip_ioctl_internal_SIOCDIFADDR(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCGIPV6DPCTD(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCGIFADDR(struct ifreq *ifr)
static int lwip_setsockopt_wrap(int s, int level, int optname, const void *optval, socklen_t optlen)
static u8_t lwip_ioctl_internal_SIOCSIFNAME(struct ifreq *ifr)
int lwip_socket(int domain, int type, int protocol)
static u8_t lwip_ioctl_internal_SIOCGIFBRDADDR(struct ifreq *ifr)
static int lwip_socket2(int domain, int type, int protocol)
static int lwip_bind_wrap(int s, const struct sockaddr *name, socklen_t namelen)
static u8_t lwip_ioctl_internal_SIOCSIPV6DPCTD(struct ifreq *ifr)
static u8_t lwip_ioctl_internal_SIOCSIPV6DAD(struct ifreq *ifr)
int socks_poll(int s, poll_table *wait)
static u8_t lwip_ioctl_internal_SIOCSIFFLAGS(struct ifreq *ifr)
static bool lwip_validate_ifname(const char *name, u8_t *let_pos)
static int do_ioctl_SIOCGIFCONF(int sockfd, long cmd, void *argp)
static u8_t lwip_ioctl_internal_SIOCGIFHWADDR(struct ifreq *ifr)
void poll_wait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p)
struct tcpip_api_call_data call
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
size_t LOS_ArchCopyToUser(void *dst, const void *src, size_t len)
从内核空间拷贝到用户空间
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)