فهرست منبع

!291 添加在用户态使用ioctl获取/设置IP地址及子网掩码
Merge pull request !291 from songchao/rt-smart

bernard 4 سال پیش
والد
کامیت
93f1b2bec5
2فایلهای تغییر یافته به همراه78 افزوده شده و 2 حذف شده
  1. 34 0
      components/net/sal_socket/include/sal_socket.h
  2. 44 2
      components/net/sal_socket/src/sal_socket.c

+ 34 - 0
components/net/sal_socket/include/sal_socket.h

@@ -197,6 +197,40 @@ 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)&&(ifr != RT_NULL))
+    {
+        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);
 }