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;