Browse Source

add cmd to get/set ip from user application

宋超 4 years ago
parent
commit
3614009d73

+ 30 - 0
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);

+ 44 - 2
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);
 }