You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/09/08 03:05:20 UTC

[incubator-nuttx] branch master updated: net/netdev: simplify handling of netdev ifr ioctl()

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new fd53db56b6 net/netdev: simplify handling of netdev ifr ioctl()
fd53db56b6 is described below

commit fd53db56b6a49311a807fbc8944fcb7b11f33b6f
Author: chao an <an...@xiaomi.com>
AuthorDate: Wed Sep 7 10:56:09 2022 +0800

    net/netdev: simplify handling of netdev ifr ioctl()
    
    1. call netdev_ifr_dev() only once
    2. unify the error code of ENODEV
    
    Signed-off-by: chao an <an...@xiaomi.com>
---
 net/netdev/netdev_ioctl.c | 650 +++++++++++++++++++---------------------------
 1 file changed, 263 insertions(+), 387 deletions(-)

diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c
index 12867726ba..b561c8f920 100644
--- a/net/netdev/netdev_ioctl.c
+++ b/net/netdev/netdev_ioctl.c
@@ -616,6 +616,72 @@ static FAR struct net_driver_s *netdev_ifr_dev(FAR struct ifreq *req)
   return NULL;
 }
 
+/****************************************************************************
+ * Name: net_ioctl_ifreq_arglen
+ *
+ * Description:
+ *   Calculate the ioctl argument buffer length of ifreq.
+ *
+ * Input Parameters:
+ *
+ *   cmd      The ioctl command
+ *
+ * Returned Value:
+ *   The argument buffer length, or error code.
+ *
+ ****************************************************************************/
+
+static ssize_t net_ioctl_ifreq_arglen(int cmd)
+{
+  switch (cmd)
+    {
+      case SIOCGIFADDR:
+      case SIOCSIFADDR:
+      case SIOCGIFDSTADDR:
+      case SIOCSIFDSTADDR:
+      case SIOCGIFBRDADDR:
+      case SIOCSIFBRDADDR:
+      case SIOCGIFNETMASK:
+      case SIOCSIFNETMASK:
+      case SIOCGIFMTU:
+      case SIOCGIFHWADDR:
+      case SIOCSIFHWADDR:
+      case SIOCDIFADDR:
+      case SIOCGIFCOUNT:
+      case SIOCSIFFLAGS:
+      case SIOCGIFFLAGS:
+      case SIOCMIINOTIFY:
+      case SIOCGMIIPHY:
+      case SIOCGMIIREG:
+      case SIOCSMIIREG:
+      case SIOCGCANBITRATE:
+      case SIOCSCANBITRATE:
+      case SIOCACANEXTFILTER:
+      case SIOCDCANEXTFILTER:
+      case SIOCACANSTDFILTER:
+      case SIOCDCANSTDFILTER:
+      case SIOCGIFNAME:
+      case SIOCGIFINDEX:
+        return sizeof(struct ifreq);
+
+      case SIOCGLIFADDR:
+      case SIOCSLIFADDR:
+      case SIOCGLIFDSTADDR:
+      case SIOCSLIFDSTADDR:
+      case SIOCGLIFBRDADDR:
+      case SIOCSLIFBRDADDR:
+      case SIOCGLIFNETMASK:
+      case SIOCSLIFNETMASK:
+      case SIOCGLIFMTU:
+      case SIOCIFAUTOCONF:
+        return sizeof(struct lifreq);
+      default:
+        break;
+    }
+
+  return -ENOTTY;
+}
+
 /****************************************************************************
  * Name: netdev_ifr_ioctl
  *
@@ -636,279 +702,192 @@ static FAR struct net_driver_s *netdev_ifr_dev(FAR struct ifreq *req)
 static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
                             FAR struct ifreq *req)
 {
-  FAR struct net_driver_s *dev;
-  int ret = -EINVAL;
+  FAR struct net_driver_s *dev = NULL;
+  int ret = OK;
 
   ninfo("cmd: %d\n", cmd);
 
   net_lock();
 
-  /* Execute the command */
+  /* Execute commands that do not need ifr_name or lifr_name */
 
   switch (cmd)
     {
+      case SIOCGIFCOUNT:  /* Get number of devices */
+        req->ifr_count = netdev_count();
+        break;
+
 #ifdef CONFIG_NET_IPv4
-      case SIOCGIFADDR:  /* Get IP address */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ioctl_get_ipv4addr(&req->ifr_addr, dev->d_ipaddr);
-              ret = OK;
-            }
-        }
+      case SIOCGIFCONF:  /* Return an interface list (IPv4) */
+        ret = netdev_ipv4_ifconf((FAR struct ifconf *)req);
         break;
 #endif
 
-#ifdef CONFIG_NET_IPv4
-      case SIOCSIFADDR:  /* Set IP address */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ioctl_set_ipv4addr(&dev->d_ipaddr, &req->ifr_addr);
-              ret = OK;
-            }
-        }
+#ifdef CONFIG_NET_IPv6
+      case SIOCGLIFCONF:  /* Return an interface list (IPv6) */
+        ret = netdev_ipv6_ifconf((FAR struct lifconf *)req);
         break;
 #endif
 
-#ifdef CONFIG_NET_IPv4
-      case SIOCGIFDSTADDR:  /* Get P-to-P address */
+#ifdef CONFIG_NETDEV_IFINDEX
+      case SIOCGIFNAME:  /* Get interface name */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
+          FAR struct net_driver_s *tmpdev;
+          tmpdev = netdev_findbyindex(req->ifr_ifindex);
+          if (tmpdev != NULL)
+            {
+              strlcpy(req->ifr_name, tmpdev->d_ifname, IFNAMSIZ);
+            }
+          else
             {
-              ioctl_get_ipv4addr(&req->ifr_dstaddr, dev->d_draddr);
-              ret = OK;
+              ret = -ENODEV;
             }
         }
         break;
 #endif
+      default:
+        if (net_ioctl_ifreq_arglen(cmd) > 0)
+          {
+            dev = netdev_ifr_dev(req);
+            if (dev == NULL)
+              {
+                ret = -ENODEV;
+              }
+          }
+        else
+          {
+            ret = -ENOTTY;
+          }
+        break;
+    }
+
+  if (dev == NULL)
+    {
+      return ret;
+    }
+
+  /* Execute commands that need ifr_name or lifr_name */
 
+  switch (cmd)
+    {
 #ifdef CONFIG_NET_IPv4
+      case SIOCGIFADDR:  /* Get IP address */
+        ioctl_get_ipv4addr(&req->ifr_addr, dev->d_ipaddr);
+        break;
+
+      case SIOCSIFADDR:  /* Set IP address */
+        ioctl_set_ipv4addr(&dev->d_ipaddr, &req->ifr_addr);
+        break;
+
+      case SIOCGIFDSTADDR:  /* Get P-to-P address */
+        ioctl_get_ipv4addr(&req->ifr_dstaddr, dev->d_draddr);
+        break;
+
       case SIOCSIFDSTADDR:  /* Set P-to-P address */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ioctl_set_ipv4addr(&dev->d_draddr, &req->ifr_dstaddr);
-              ret = OK;
-            }
-        }
+        ioctl_set_ipv4addr(&dev->d_draddr, &req->ifr_dstaddr);
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv4
       case SIOCGIFBRDADDR:  /* Get broadcast IP address */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ioctl_get_ipv4broadcast(&req->ifr_broadaddr, dev->d_ipaddr,
-                                      dev->d_netmask);
-              ret = OK;
-            }
-        }
+        ioctl_get_ipv4broadcast(&req->ifr_broadaddr, dev->d_ipaddr,
+                                dev->d_netmask);
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv4
       case SIOCSIFBRDADDR:  /* Set broadcast IP address */
-        {
-          ret = -ENOSYS;
-        }
+        ret = -ENOSYS;
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv4
       case SIOCGIFNETMASK:  /* Get network mask */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ioctl_get_ipv4addr(&req->ifr_addr, dev->d_netmask);
-              ret = OK;
-            }
-        }
+        ioctl_get_ipv4addr(&req->ifr_addr, dev->d_netmask);
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv4
       case SIOCSIFNETMASK:  /* Set network mask */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ioctl_set_ipv4addr(&dev->d_netmask, &req->ifr_addr);
-              ret = OK;
-            }
-        }
+        ioctl_set_ipv4addr(&dev->d_netmask, &req->ifr_addr);
         break;
 #endif
 
 #ifdef CONFIG_NET_IPv6
       case SIOCGLIFADDR:  /* Get IP address */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              FAR struct lifreq *lreq = (FAR struct lifreq *)req;
-
-              ioctl_get_ipv6addr(&lreq->lifr_addr, dev->d_ipv6addr);
-              ret = OK;
-            }
+          FAR struct lifreq *lreq = (FAR struct lifreq *)req;
+          ioctl_get_ipv6addr(&lreq->lifr_addr, dev->d_ipv6addr);
         }
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv6
       case SIOCSLIFADDR:  /* Set IP address */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              FAR struct lifreq *lreq = (FAR struct lifreq *)req;
-
-              ioctl_set_ipv6addr(dev->d_ipv6addr, &lreq->lifr_addr);
-              ret = OK;
-            }
+          FAR struct lifreq *lreq = (FAR struct lifreq *)req;
+          ioctl_set_ipv6addr(dev->d_ipv6addr, &lreq->lifr_addr);
         }
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv6
       case SIOCGLIFDSTADDR:  /* Get P-to-P address */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              FAR struct lifreq *lreq = (FAR struct lifreq *)req;
-
-              ioctl_get_ipv6addr(&lreq->lifr_dstaddr, dev->d_ipv6draddr);
-              ret = OK;
-            }
+          FAR struct lifreq *lreq = (FAR struct lifreq *)req;
+          ioctl_get_ipv6addr(&lreq->lifr_dstaddr, dev->d_ipv6draddr);
         }
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv6
       case SIOCSLIFDSTADDR:  /* Set P-to-P address */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              FAR struct lifreq *lreq = (FAR struct lifreq *)req;
-
-              ioctl_set_ipv6addr(dev->d_ipv6draddr, &lreq->lifr_dstaddr);
-              ret = OK;
-            }
+          FAR struct lifreq *lreq = (FAR struct lifreq *)req;
+          ioctl_set_ipv6addr(dev->d_ipv6draddr, &lreq->lifr_dstaddr);
         }
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv6
       case SIOCGLIFBRDADDR:  /* Get broadcast IP address */
       case SIOCSLIFBRDADDR:  /* Set broadcast IP address */
-        {
-          ret = -ENOSYS;
-        }
+        ret = -ENOSYS;
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv6
       case SIOCGLIFNETMASK:  /* Get network mask */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              FAR struct lifreq *lreq = (FAR struct lifreq *)req;
-
-              ioctl_get_ipv6addr(&lreq->lifr_addr, dev->d_ipv6netmask);
-              ret = OK;
-            }
+          FAR struct lifreq *lreq = (FAR struct lifreq *)req;
+          ioctl_get_ipv6addr(&lreq->lifr_addr, dev->d_ipv6netmask);
         }
         break;
-#endif
 
-#ifdef CONFIG_NET_IPv6
       case SIOCSLIFNETMASK:  /* Set network mask */
         {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              FAR struct lifreq *lreq = (FAR struct lifreq *)req;
-              ioctl_set_ipv6addr(dev->d_ipv6netmask, &lreq->lifr_addr);
-              ret = OK;
-            }
+          FAR struct lifreq *lreq = (FAR struct lifreq *)req;
+          ioctl_set_ipv6addr(dev->d_ipv6netmask, &lreq->lifr_addr);
         }
         break;
 #endif
 
       case SIOCGLIFMTU:  /* Get MTU size */
       case SIOCGIFMTU:   /* Get MTU size */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              req->ifr_mtu = NETDEV_PKTSIZE(dev);
-              ret = OK;
-            }
-        }
+        req->ifr_mtu = NETDEV_PKTSIZE(dev);
         break;
 
 #ifdef CONFIG_NET_ICMPv6_AUTOCONF
       case SIOCIFAUTOCONF:  /* Perform ICMPv6 auto-configuration */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              ret = icmpv6_autoconfig(dev);
-            }
-        }
+        ret = icmpv6_autoconfig(dev);
         break;
 #endif
 
       case SIOCSIFFLAGS:  /* Sets the interface flags */
-        {
-          /* Is this a request to bring the interface up? */
 
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              if ((req->ifr_flags & IFF_UP) != 0)
-                {
-                  /* Yes.. bring the interface up */
+        /* Is this a request to bring the interface up? */
 
-                  ret = netdev_ifup(dev);
-                }
+        if ((req->ifr_flags & IFF_UP) != 0)
+          {
+            /* Yes.. bring the interface up */
 
-              /* Is this a request to take the interface down? */
+            ret = netdev_ifup(dev);
+          }
 
-              else if ((req->ifr_flags & IFF_DOWN) != 0)
-                {
-                  /* Yes.. take the interface down */
+        /* Is this a request to take the interface down? */
 
-                  ret = netdev_ifdown(dev);
-                }
-            }
-          else
-            {
-              ret = -ENODEV;
-            }
-        }
+        else if ((req->ifr_flags & IFF_DOWN) != 0)
+          {
+            /* Yes.. take the interface down */
+
+            ret = netdev_ifdown(dev);
+          }
         break;
 
       case SIOCGIFFLAGS:  /* Gets the interface flags */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
-              req->ifr_flags = dev->d_flags;
-            }
-
-          ret = OK;
-        }
+        req->ifr_flags = dev->d_flags;
         break;
 
       /* MAC address operations only make sense if Ethernet or 6LoWPAN are
@@ -917,170 +896,128 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
 
 #if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN)
       case SIOCGIFHWADDR:  /* Get hardware address */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
 #ifdef CONFIG_NET_ETHERNET
-              if (dev->d_lltype == NET_LL_ETHERNET ||
-                  dev->d_lltype == NET_LL_IEEE80211)
-                {
-                  req->ifr_hwaddr.sa_family = NET_SOCK_FAMILY;
-                  memcpy(req->ifr_hwaddr.sa_data,
-                         dev->d_mac.ether.ether_addr_octet, IFHWADDRLEN);
-                  ret = OK;
-                }
-              else
+        if (dev->d_lltype == NET_LL_ETHERNET ||
+            dev->d_lltype == NET_LL_IEEE80211)
+          {
+            req->ifr_hwaddr.sa_family = NET_SOCK_FAMILY;
+            memcpy(req->ifr_hwaddr.sa_data,
+                   dev->d_mac.ether.ether_addr_octet, IFHWADDRLEN);
+          }
+        else
 #endif
-
 #ifdef CONFIG_NET_6LOWPAN
-              if (dev->d_lltype == NET_LL_IEEE802154 ||
-                  dev->d_lltype == NET_LL_PKTRADIO)
-                {
-                  req->ifr_hwaddr.sa_family = NET_SOCK_FAMILY;
-                  memcpy(req->ifr_hwaddr.sa_data,
-                         dev->d_mac.radio.nv_addr,
-                         dev->d_mac.radio.nv_addrlen);
-                  ret = OK;
-                }
-               else
+        if (dev->d_lltype == NET_LL_IEEE802154 ||
+            dev->d_lltype == NET_LL_PKTRADIO)
+          {
+            req->ifr_hwaddr.sa_family = NET_SOCK_FAMILY;
+            memcpy(req->ifr_hwaddr.sa_data,
+                   dev->d_mac.radio.nv_addr,
+                   dev->d_mac.radio.nv_addrlen);
+          }
+        else
 #endif
-                {
-                  nerr("Unsupported link layer\n");
-                }
-            }
-        }
+          {
+            nerr("Unsupported link layer\n");
+            ret = -EAFNOSUPPORT;
+          }
         break;
 
       case SIOCSIFHWADDR:  /* Set hardware address -- will not take effect until ifup */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
 #ifdef CONFIG_NET_ETHERNET
-              if (dev->d_lltype == NET_LL_ETHERNET ||
-                  dev->d_lltype == NET_LL_IEEE80211)
-                {
-                  memcpy(dev->d_mac.ether.ether_addr_octet,
-                         req->ifr_hwaddr.sa_data, IFHWADDRLEN);
-                  ret = OK;
-                }
-              else
+        if (dev->d_lltype == NET_LL_ETHERNET ||
+            dev->d_lltype == NET_LL_IEEE80211)
+          {
+            memcpy(dev->d_mac.ether.ether_addr_octet,
+                   req->ifr_hwaddr.sa_data, IFHWADDRLEN);
+          }
+        else
 #endif
-
 #ifdef CONFIG_NET_6LOWPAN
-              if (dev->d_lltype == NET_LL_IEEE802154 ||
-                  dev->d_lltype == NET_LL_PKTRADIO)
-                {
-                  FAR struct radio_driver_s *radio;
-                  struct radiodev_properties_s properties;
+        if (dev->d_lltype == NET_LL_IEEE802154 ||
+            dev->d_lltype == NET_LL_PKTRADIO)
+          {
+            FAR struct radio_driver_s *radio;
+            struct radiodev_properties_s properties;
 
-                  /* Get the radio properties */
+            /* Get the radio properties */
 
-                  radio = (FAR struct radio_driver_s *)dev;
-                  DEBUGASSERT(radio->r_properties != NULL);
+            radio = (FAR struct radio_driver_s *)dev;
+            DEBUGASSERT(radio->r_properties != NULL);
 
-                  ret = radio->r_properties(radio, &properties);
-                  if (ret >= 0)
-                    {
-                      dev->d_mac.radio.nv_addrlen = properties.sp_addrlen;
-                      memcpy(dev->d_mac.radio.nv_addr,
-                             req->ifr_hwaddr.sa_data, NET_6LOWPAN_ADDRSIZE);
-                    }
-                }
-              else
+            ret = radio->r_properties(radio, &properties);
+            if (ret >= 0)
+              {
+                dev->d_mac.radio.nv_addrlen = properties.sp_addrlen;
+                memcpy(dev->d_mac.radio.nv_addr,
+                       req->ifr_hwaddr.sa_data, NET_6LOWPAN_ADDRSIZE);
+              }
+          }
+        else
 #endif
-                {
-                  nerr("Unsupported link layer\n");
-                }
-            }
-        }
+          {
+            nerr("Unsupported link layer\n");
+            ret = -EAFNOSUPPORT;
+          }
         break;
 #endif
 
       case SIOCDIFADDR:  /* Delete IP address */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev)
-            {
 #ifdef CONFIG_NET_IPv4
-              dev->d_ipaddr = 0;
+        dev->d_ipaddr = 0;
 #endif
 #ifdef CONFIG_NET_IPv6
-              memset(&dev->d_ipv6addr, 0, sizeof(net_ipv6addr_t));
-#endif
-              ret = OK;
-            }
-        }
-        break;
-
-      case SIOCGIFCOUNT:  /* Get number of devices */
-        {
-          req->ifr_count = netdev_count();
-          ret = -ENOSYS;
-        }
-        break;
-
-#ifdef CONFIG_NET_IPv4
-      case SIOCGIFCONF:  /* Return an interface list (IPv4) */
-        {
-          ret = netdev_ipv4_ifconf((FAR struct ifconf *)req);
-        }
-        break;
+        memset(&dev->d_ipv6addr, 0, sizeof(net_ipv6addr_t));
 #endif
-
-#ifdef CONFIG_NET_IPv6
-      case SIOCGLIFCONF:  /* Return an interface list (IPv6) */
-        {
-          ret = netdev_ipv6_ifconf((FAR struct lifconf *)req);
-        }
         break;
-#endif
 
 #if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_PHY_IOCTL)
 #ifdef CONFIG_ARCH_PHY_INTERRUPT
       case SIOCMIINOTIFY: /* Set up for PHY event notifications */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev && dev->d_ioctl)
-            {
-              struct mii_ioctl_notify_s *notify =
-                &req->ifr_ifru.ifru_mii_notify;
-              ret = dev->d_ioctl(dev, cmd, (unsigned long)(uintptr_t)notify);
-            }
-        }
+        if (dev->d_ioctl)
+          {
+            struct mii_ioctl_notify_s *notify =
+              &req->ifr_ifru.ifru_mii_notify;
+            ret = dev->d_ioctl(dev, cmd, (unsigned long)(uintptr_t)notify);
+          }
+        else
+          {
+            ret = -ENOSYS;
+          }
         break;
 #endif
 
       case SIOCGMIIPHY: /* Get address of MII PHY in use */
       case SIOCGMIIREG: /* Get MII register via MDIO */
       case SIOCSMIIREG: /* Set MII register via MDIO */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev && dev->d_ioctl)
-            {
-              struct mii_ioctl_data_s *mii_data =
-                &req->ifr_ifru.ifru_mii_data;
-              ret = dev->d_ioctl(dev, cmd,
-                                 (unsigned long)(uintptr_t)mii_data);
-            }
-        }
+        if (dev->d_ioctl)
+          {
+            struct mii_ioctl_data_s *mii_data =
+              &req->ifr_ifru.ifru_mii_data;
+            ret = dev->d_ioctl(dev, cmd,
+                               (unsigned long)(uintptr_t)mii_data);
+          }
+        else
+          {
+            ret = -ENOSYS;
+          }
         break;
 #endif
 
 #if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_CAN_BITRATE_IOCTL)
       case SIOCGCANBITRATE:  /* Get bitrate from a CAN controller */
       case SIOCSCANBITRATE:  /* Set bitrate of a CAN controller */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev && dev->d_ioctl)
-            {
-              struct can_ioctl_data_s *can_bitrate_data =
-                &req->ifr_ifru.ifru_can_data;
-              ret = dev->d_ioctl(dev, cmd,
-                            (unsigned long)(uintptr_t)can_bitrate_data);
-            }
-        }
+        if (dev->d_ioctl)
+          {
+            struct can_ioctl_data_s *can_bitrate_data =
+              &req->ifr_ifru.ifru_can_data;
+            ret = dev->d_ioctl(dev, cmd,
+                          (unsigned long)(uintptr_t)can_bitrate_data);
+          }
+        else
+          {
+            ret = -ENOSYS;
+          }
         break;
 #endif
 
@@ -1089,60 +1026,32 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
       case SIOCDCANEXTFILTER:  /* Delete an extended-ID filter */
       case SIOCACANSTDFILTER:  /* Add a standard-ID filter */
       case SIOCDCANSTDFILTER:  /* Delete a standard-ID filter */
-        {
-          dev = netdev_ifr_dev(req);
-          if (dev && dev->d_ioctl)
-            {
-              struct can_ioctl_filter_s *can_filter =
-                &req->ifr_ifru.ifru_can_filter;
-              ret = dev->d_ioctl(dev, cmd,
-                            (unsigned long)(uintptr_t)can_filter);
-            }
-        }
+        if (dev->d_ioctl)
+          {
+            struct can_ioctl_filter_s *can_filter =
+              &req->ifr_ifru.ifru_can_filter;
+            ret = dev->d_ioctl(dev, cmd,
+                          (unsigned long)(uintptr_t)can_filter);
+          }
+        else
+          {
+            ret = -ENOSYS;
+          }
         break;
 #endif
 
 #ifdef CONFIG_NETDEV_IFINDEX
-      case SIOCGIFNAME:  /* Get interface name */
-        {
-          dev = netdev_findbyindex(req->ifr_ifindex);
-          if (dev != NULL)
-            {
-              strlcpy(req->ifr_name, dev->d_ifname, IFNAMSIZ);
-              ret = OK;
-            }
-          else
-            {
-              ret = -ENODEV;
-            }
-        }
-        break;
-
       case SIOCGIFINDEX:  /* Index to name mapping */
-        {
-          dev = netdev_findbyname(req->ifr_name);
-          if (dev != NULL)
-            {
-              req->ifr_ifindex = dev->d_ifindex;
-              ret = OK;
-            }
-          else
-            {
-              ret = -ENODEV;
-            }
-        }
+        req->ifr_ifindex = dev->d_ifindex;
         break;
 #endif
 
       default:
-        {
-          ret = -ENOTTY;
-        }
+        ret = -ENOTTY;
         break;
     }
 
   net_unlock();
-
   return ret;
 }
 
@@ -1613,6 +1522,14 @@ static int netdev_ioctl(FAR struct socket *psock, int cmd,
 
 ssize_t net_ioctl_arglen(int cmd)
 {
+  ssize_t arglen;
+
+  arglen = net_ioctl_ifreq_arglen(cmd);
+  if (arglen > 0)
+    {
+      return arglen;
+    }
+
   switch (cmd)
     {
       case FIONBIO:
@@ -1620,47 +1537,6 @@ ssize_t net_ioctl_arglen(int cmd)
       case FIONREAD:
         return sizeof(int);
 
-      case SIOCGIFADDR:
-      case SIOCSIFADDR:
-      case SIOCGIFDSTADDR:
-      case SIOCSIFDSTADDR:
-      case SIOCGIFBRDADDR:
-      case SIOCSIFBRDADDR:
-      case SIOCGIFNETMASK:
-      case SIOCSIFNETMASK:
-      case SIOCGIFMTU:
-      case SIOCGIFHWADDR:
-      case SIOCSIFHWADDR:
-      case SIOCDIFADDR:
-      case SIOCGIFCOUNT:
-      case SIOCSIFFLAGS:
-      case SIOCGIFFLAGS:
-      case SIOCMIINOTIFY:
-      case SIOCGMIIPHY:
-      case SIOCGMIIREG:
-      case SIOCSMIIREG:
-      case SIOCGCANBITRATE:
-      case SIOCSCANBITRATE:
-      case SIOCACANEXTFILTER:
-      case SIOCDCANEXTFILTER:
-      case SIOCACANSTDFILTER:
-      case SIOCDCANSTDFILTER:
-      case SIOCGIFNAME:
-      case SIOCGIFINDEX:
-        return sizeof(struct ifreq);
-
-      case SIOCGLIFADDR:
-      case SIOCSLIFADDR:
-      case SIOCGLIFDSTADDR:
-      case SIOCSLIFDSTADDR:
-      case SIOCGLIFBRDADDR:
-      case SIOCSLIFBRDADDR:
-      case SIOCGLIFNETMASK:
-      case SIOCSLIFNETMASK:
-      case SIOCGLIFMTU:
-      case SIOCIFAUTOCONF:
-        return sizeof(struct lifreq);
-
       case SIOCGIFCONF:
         return sizeof(struct ifconf);