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/10/15 10:34:14 UTC

[incubator-nuttx] 01/02: Add Cellular link layer support

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

commit ec4af0053877a500fc2a913b02e0c7bb26ba320f
Author: luojun1 <lu...@xiaomi.com>
AuthorDate: Thu Jul 28 15:46:49 2022 +0800

    Add Cellular link layer support
    
    1.Add cellular link layer enum definition and register flow
    2.Add ioctl flow to set cellular NICs parameters
    
    Signed-off-by: luojun1 <lu...@xiaomi.com>
    Signed-off-by: chao an <an...@xiaomi.com>
---
 include/net/if.h             | 11 +++++++++++
 include/nuttx/net/ioctl.h    |  4 ++++
 include/nuttx/net/net.h      |  3 ++-
 net/Kconfig                  |  7 +++++++
 net/netdev/netdev_ioctl.c    | 23 +++++++++++++++++++----
 net/netdev/netdev_register.c | 10 ++++++++++
 6 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/include/net/if.h b/include/net/if.h
index 05b4ab3269..aa6adcf3a6 100644
--- a/include/net/if.h
+++ b/include/net/if.h
@@ -172,6 +172,15 @@ struct can_ioctl_filter_s
   uint8_t  fprio; /* See CAN_MSGPRIO_* definitions */
 };
 
+/* Structure passed to get or set the cellular network device features */
+
+struct cell_ioctl_data_s
+{
+  uint8_t mdp_chnidx;  /* MDP(Multi Data Path) channel idx bound to this network device */
+  uint8_t sim_id;      /* Sim ID in dual sim system */
+  uint8_t cell_id;     /* Cell Identification in mobile phone networks */
+};
+
 /* There are two forms of the I/F request structure.
  * One for IPv6 and one for IPv4.
  * Notice that they are (and must be) cast compatible and really different
@@ -198,6 +207,7 @@ struct lifreq
     struct mii_ioctl_data_s    lifru_mii_data;       /* MII request data */
     struct can_ioctl_data_s    lifru_can_data;       /* CAN bitrate request data */
     struct can_ioctl_filter_s  lifru_can_filter;     /* CAN filter request data */
+    struct cell_ioctl_data_s   lifru_cell_data;      /* Cellular network data */
   } lifr_ifru;
 };
 
@@ -251,6 +261,7 @@ struct ifreq
     struct mii_ioctl_data_s    ifru_mii_data;       /* MII request data */
     struct can_ioctl_data_s    ifru_can_data;       /* CAN bitrate request data */
     struct can_ioctl_filter_s  ifru_can_filter;     /* CAN filter request data */
+    struct cell_ioctl_data_s   ifru_cell_data;      /* Cellular network data */
   } ifr_ifru;
 };
 
diff --git a/include/nuttx/net/ioctl.h b/include/nuttx/net/ioctl.h
index 6dcec0f283..6d68dae029 100644
--- a/include/nuttx/net/ioctl.h
+++ b/include/nuttx/net/ioctl.h
@@ -119,6 +119,10 @@
 #define SIOCACANSTDFILTER  _SIOC(0x0030)  /* Add hardware-level standard ID filter */
 #define SIOCDCANSTDFILTER  _SIOC(0x0031)  /* Delete hardware-level standard ID filter */
 
+/* Cellular net driver ******************************************************/
+
+#define SIOCSCELLNETDEV    _SIOC(0x0032)  /* Set cellular Netowrk Interface */
+
 /****************************************************************************
  * Public Type Definitions
  ****************************************************************************/
diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h
index 425af53ddc..6051019141 100644
--- a/include/nuttx/net/net.h
+++ b/include/nuttx/net/net.h
@@ -144,7 +144,8 @@ enum net_lltype_e
   NET_LL_IEEE802154,   /* IEEE 802.15.4 MAC */
   NET_LL_PKTRADIO,     /* Non-standard packet radio */
   NET_LL_MBIM,         /* CDC-MBIM USB host driver */
-  NET_LL_CAN           /* CAN bus */
+  NET_LL_CAN,          /* CAN bus */
+  NET_LL_CELL          /* Cellular Virtual Network Device */
 };
 
 /* This defines a bitmap big enough for one bit for each socket option */
diff --git a/net/Kconfig b/net/Kconfig
index 1982f818ab..8dcd20d18a 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -142,6 +142,13 @@ config NET_ETHERNET
 		no need to define anything special in the configuration file to use
 		Ethernet -- it is the default).
 
+config NET_CELLULAR
+	bool "Cellular Link support"
+	default n
+	---help---
+		Add support for the cellular network device. Unlike Ethernet, cellular
+		network transmit pure IP packets.
+
 config NET_LOOPBACK
 	bool "Local loopback"
 	select ARCH_HAVE_NETDEV_STATISTICS
diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c
index 6c52242f05..9896d9eb50 100644
--- a/net/netdev/netdev_ioctl.c
+++ b/net/netdev/netdev_ioctl.c
@@ -983,7 +983,7 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
       case SIOCMIINOTIFY: /* Set up for PHY event notifications */
         if (dev->d_ioctl)
           {
-            struct mii_ioctl_notify_s *notify =
+            FAR struct mii_ioctl_notify_s *notify =
               &req->ifr_ifru.ifru_mii_notify;
             ret = dev->d_ioctl(dev, cmd, (unsigned long)(uintptr_t)notify);
           }
@@ -999,7 +999,7 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
       case SIOCSMIIREG: /* Set MII register via MDIO */
         if (dev->d_ioctl)
           {
-            struct mii_ioctl_data_s *mii_data =
+            FAR 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);
@@ -1016,7 +1016,7 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
       case SIOCSCANBITRATE:  /* Set bitrate of a CAN controller */
         if (dev->d_ioctl)
           {
-            struct can_ioctl_data_s *can_bitrate_data =
+            FAR 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);
@@ -1035,7 +1035,7 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
       case SIOCDCANSTDFILTER:  /* Delete a standard-ID filter */
         if (dev->d_ioctl)
           {
-            struct can_ioctl_filter_s *can_filter =
+            FAR 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);
@@ -1053,6 +1053,21 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
         break;
 #endif
 
+#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NET_CELLULAR)
+      case SIOCSCELLNETDEV:  /* set params for cellular network devices */
+        {
+          dev = netdev_findbyname(req->ifr_name);
+          if (dev && dev->d_ioctl)
+            {
+              FAR struct cell_ioctl_data_s *cell_netdev_data =
+                              &req->ifr_ifru.ifru_cell_data;
+              ret = dev->d_ioctl(dev, cmd,
+                              (unsigned long)(uintptr_t)cell_netdev_data);
+            }
+        }
+        break;
+#endif
+
       default:
         ret = -ENOTTY;
         break;
diff --git a/net/netdev/netdev_register.c b/net/netdev/netdev_register.c
index be95534895..2f3c77b033 100644
--- a/net/netdev/netdev_register.c
+++ b/net/netdev/netdev_register.c
@@ -58,6 +58,7 @@
 #define NETDEV_WPAN_FORMAT  "wpan%d"
 #define NETDEV_WWAN_FORMAT  "wwan%d"
 #define NETDEV_CAN_FORMAT   "can%d"
+#define NETDEV_CELL_FORMAT  "cell%d"
 
 #if defined(CONFIG_DRIVERS_IEEE80211) /* Usually also has CONFIG_NET_ETHERNET */
 #  define NETDEV_DEFAULT_FORMAT NETDEV_WLAN_FORMAT
@@ -346,6 +347,15 @@ int netdev_register(FAR struct net_driver_s *dev, enum net_lltype_e lltype)
             break;
 #endif
 
+#ifdef CONFIG_NET_CELLULAR
+          case NET_LL_CELL:
+            llhdrlen = 0;
+            pktsize  = CONFIG_NET_ETH_PKTSIZE;
+            devfmt   = NETDEV_CELL_FORMAT;
+            flags    = IFF_NOARP;
+            break;
+#endif
+
           default:
             nerr("ERROR: Unrecognized link type: %d\n", lltype);
             return -EINVAL;