diff --git a/components/net/sal_socket/include/sal_socket.h b/components/net/sal_socket/include/sal_socket.h index 19ac3e27787fb8545f5a950f5c57cee0c3f2b7cb..bc191d5354765ddea46f21fe9e67fb0e3acc9d23 100644 --- a/components/net/sal_socket/include/sal_socket.h +++ b/components/net/sal_socket/include/sal_socket.h @@ -197,6 +197,36 @@ struct sockaddr_storage #endif /* NETDEV_IPV6 */ }; +#define IFNAMSIZ 16 +struct sal_ifmap { + unsigned long int mem_start; + unsigned long int mem_end; + unsigned short int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct sal_ifreq { + union { + char ifrn_name[IFNAMSIZ]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct sal_ifmap ifru_map; + char ifru_slave[IFNAMSIZ]; + char ifru_newname[IFNAMSIZ]; + char *ifru_data; + } ifr_ifru; +}; + int sal_accept(int socket, struct sockaddr *addr, socklen_t *addrlen); int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen); int sal_shutdown(int socket, int how); diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index 431798442bae76e8210b7b7d8acd7bb1d9e2b938..d0695839460cb25057e805c964bb80be45bf6747 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -1005,13 +1005,55 @@ int sal_ioctlsocket(int socket, long cmd, void *arg) { struct sal_socket *sock; struct sal_proto_family *pf; - + struct sockaddr_in *addr_in = RT_NULL; + struct sockaddr *addr = RT_NULL; + ip_addr_t input_ipaddr; /* get the socket object by socket descriptor */ SAL_SOCKET_OBJ_GET(sock, socket); - /* check the network interface socket opreation */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, ioctlsocket); + struct sal_ifreq *ifr = (struct sal_ifreq *)arg; + + if((sock->domain == AF_INET)&&(sock->netdev)) + { + switch (cmd) + { + case SIOCGIFADDR: + addr_in = (struct sockaddr_in *)&(ifr->ifr_ifru.ifru_addr); + addr_in->sin_addr.s_addr = sock->netdev->ip_addr.u_addr.ip4.addr; + return 0; + + case SIOCSIFADDR: + addr = (struct sockaddr *)&(ifr->ifr_ifru.ifru_addr); + sal_sockaddr_to_ipaddr(addr,&input_ipaddr); + netdev_set_ipaddr(sock->netdev,&input_ipaddr); + return 0; + + case SIOCGIFNETMASK: + addr_in = (struct sockaddr_in *)&(ifr->ifr_ifru.ifru_netmask); + addr_in->sin_addr.s_addr = sock->netdev->netmask.u_addr.ip4.addr; + return 0; + + case SIOCSIFNETMASK: + addr = (struct sockaddr *)&(ifr->ifr_ifru.ifru_netmask); + sal_sockaddr_to_ipaddr(addr,&input_ipaddr); + netdev_set_netmask(sock->netdev,&input_ipaddr); + return 0; + + case SIOCGIFHWADDR: + addr = (struct sockaddr *)&(ifr->ifr_ifru.ifru_hwaddr); + rt_memcpy(addr->sa_data,sock->netdev->hwaddr,sock->netdev->hwaddr_len); + return 0; + + case SIOCGIFMTU: + ifr->ifr_ifru.ifru_mtu = sock->netdev->mtu; + return 0; + + default: + break; + } + } return pf->skt_ops->ioctlsocket((int)(size_t)sock->user_data, cmd, arg); }