diff --git a/configs/clicker2-stm32/src/stm32_mrf24j40.c b/configs/clicker2-stm32/src/stm32_mrf24j40.c index 17eb70ea96a..8f6868f59ea 100644 --- a/configs/clicker2-stm32/src/stm32_mrf24j40.c +++ b/configs/clicker2-stm32/src/stm32_mrf24j40.c @@ -264,20 +264,33 @@ static int stm32_mrf24j40_devsetup(FAR struct stm32_priv_s *priv) wlerr("ERROR: Failed to initialize IEEE802.15.4 MAC\n"); return -ENODEV; } -#endif -#if defined(CONFIG_IEEE802154_MAC_DEV) - /* If want to call these APIs from userspace, you have to wrap your mac - * in a character device via mac802154_device.c. +#if defined(CONFIG_IEEE802154_NETDEV) + /* Use the IEEE802.15.4 MAC interface instance to create a 6loWPAN + * network interface by wrapping the MAC intrface instance in a + * network device driver via mac802154dev_register(). + */ + + ret = mac802154netdev_register(mac); + if (ret < 0) + { + wlerr("ERROR: Failed to register the MAC network driver wpan%d: %d\n", + 0, ret); + return ret; + } +#elif defined(CONFIG_IEEE802154_MAC_DEV) + /* If want to call these APIs from userspace, you have to wrap the MAC + * interface in a character device viamac802154dev_register(). */ ret = mac802154dev_register(mac, 0); if (ret < 0) { - wlerr("ERROR: Failed to register the MAC character driver ieee%d: %d\n", + wlerr("ERROR: Failed to register the MAC character driver /dev/ieee%d: %d\n", 0, ret); return ret; } +#endif #elif defined(CONFIG_IEEE802154_DEV) /* Register a character driver to access the IEEE 802.15.4 radio from * user-space @@ -290,7 +303,7 @@ static int stm32_mrf24j40_devsetup(FAR struct stm32_priv_s *priv) RADIO_DEVNAME, ret); return ret; } -#endif +#endif /* CONFIG_IEEE802154_MAC */ return OK; } diff --git a/include/nuttx/wireless/ieee802154/ieee802154_mac.h b/include/nuttx/wireless/ieee802154/ieee802154_mac.h index 1299fe98569..55830d70fc5 100644 --- a/include/nuttx/wireless/ieee802154/ieee802154_mac.h +++ b/include/nuttx/wireless/ieee802154/ieee802154_mac.h @@ -918,11 +918,11 @@ struct ieee802154_maccb_s CODE void (*ind_syncloss)(FAR struct ieee802154_mac_s *mac, int reason); }; -struct ieee802154_radio_s; /* Forware reference */ +struct ieee802154_radio_s; /* Forward reference */ struct ieee802154_mac_s { - struct ieee802154_radio_s *radio; + FAR struct ieee802154_radio_s *radio; struct ieee802154_macops_s ops; struct ieee802154_maccb_s cbs; }; @@ -947,9 +947,9 @@ extern "C" * * The returned MAC structure should be passed to either the next highest * layer in the network stack, or registered with a mac802154dev character - * driver. In either of these scenarios, the next highest layer should - * register a set of callbacks with the MAC layer by setting the mac->cbs - * member. + * or network drivers. In any of these scenarios, the next highest layer + * should register a set of callbacks with the MAC layer by setting the + * mac->cbs member. * * NOTE: This API does not create any device accessible to userspace. If you * want to call these APIs from userspace, you have to wrap your mac in a @@ -975,7 +975,7 @@ FAR struct ieee802154_mac_s * * user-space * * Input Parameters: - * mac - Pointer to the mac layer struct to be registerd. + * mac - Pointer to the mac layer struct to be registered. * minor - The device minor number. The IEEE802.15.4 MAC character device * will be registered as /dev/ieeeN where N is the minor number * @@ -987,6 +987,24 @@ FAR struct ieee802154_mac_s * int mac802154dev_register(FAR struct ieee802154_mac_s *mac, int minor); +/**************************************************************************** + * Name: mac802154netdev_register + * + * Description: + * Register a network driver to access the IEEE 802.15.4 MAC layer from + * a socket using 6loWPAN + * + * Input Parameters: + * mac - Pointer to the mac layer struct to be registered. + * + * Returned Values: + * Zero (OK) is returned on success. Otherwise a negated errno value is + * returned to indicate the nature of the failure. + * + ****************************************************************************/ + +int mac802154netdev_register(FAR struct ieee802154_mac_s *mac); + #undef EXTERN #ifdef __cplusplus } diff --git a/wireless/ieee802154/mac802154.c b/wireless/ieee802154/mac802154.c index 8e4a3b80559..f291d76199c 100644 --- a/wireless/ieee802154/mac802154.c +++ b/wireless/ieee802154/mac802154.c @@ -518,9 +518,9 @@ static int mac802154_rsp_orphan(FAR struct ieee802154_mac_s *mac, * * The returned MAC structure should be passed to either the next highest * layer in the network stack, or registered with a mac802154dev character - * driver. In either of these scenarios, the next highest layer should - * register a set of callbacks with the MAC layer by setting the mac->cbs - * member. + * or network drivers. In any of these scenarios, the next highest layer + * should register a set of callbacks with the MAC layer by setting the + * mac->cbs member. * * NOTE: This API does not create any device accessible to userspace. If you * want to call these APIs from userspace, you have to wrap your mac in a diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c index 807320811ce..f3367b82a2b 100644 --- a/wireless/ieee802154/mac802154_netdev.c +++ b/wireless/ieee802154/mac802154_netdev.c @@ -117,8 +117,8 @@ struct mac802154_driver_s { /* This holds the information visible to the NuttX network */ - struct ieee802154_driver_s m8_dev; /* Interface understood by the network */ - struct ieee802154_mac_s m8_mac; /* Interface understood by the MAC */ + struct ieee802154_driver_s m8_dev; /* Interface understood by the network */ + FAR struct ieee802154_mac_s *m8_mac; /* Contained MAC interface */ /* For internal use by this driver */ @@ -129,19 +129,6 @@ struct mac802154_driver_s struct work_s m8_pollwork; /* For deferring poll work to the work queue */ }; -/**************************************************************************** - * Private Data - ****************************************************************************/ - -struct ieee802154_radio_s; /* Forware reference */ - - -{ - - struct ieee802154_macops_s ops; - struct ieee802154_maccb_s cbs; -}; - /**************************************************************************** * Private Data ****************************************************************************/ @@ -1282,26 +1269,25 @@ static void mac802154_ipv6multicast(FAR struct mac802154_driver_s *priv) ****************************************************************************/ /**************************************************************************** - * Name: mac802154_initialize + * Name: mac802154netdev_register * * Description: - * Initialize the Ethernet controller and driver + * Register a network driver to access the IEEE 802.15.4 MAC layer from + * a socket using 6loWPAN * - * Parameters: - * intf - In the case where there are multiple EMACs, this value - * identifies which EMAC is to be initialized. + * Input Parameters: + * mac - Pointer to the mac layer struct to be registered. * - * Returned Value: - * OK on success; Negated errno on failure. - * - * Assumptions: + * Returned Values: + * Zero (OK) is returned on success. Otherwise a negated errno value is + * returned to indicate the nature of the failure. * ****************************************************************************/ -int mac802154_initialize(FAR struct ieee802154_radio_s *radio) +int mac802154netdev_register(FAR struct ieee802154_mac_s *mac); { FAR struct mac802154_driver_s *priv; - FAR struct ieee802154_driver_s *ieee; + FAR truct ieee802154_maccb_s *macb; FAR struct net_driver_s *dev; FAR uint8_t *pktbuf; @@ -1332,9 +1318,7 @@ int mac802154_initialize(FAR struct ieee802154_radio_s *radio) /* Initialize the driver structure */ - ieee = &priv->m8_dev; - dev = &ieee->i_dev; - + dev = &ieee->m8_dev.i_dev; dev->d_buf = pktbuf; /* Single packet buffer */ dev->d_ifup = mac802154_ifup; /* I/F up (new IP address) callback */ dev->d_ifdown = mac802154_ifdown; /* I/F down callback */ @@ -1347,11 +1331,37 @@ int mac802154_initialize(FAR struct ieee802154_radio_s *radio) /* Create a watchdog for timing polling for and timing of transmisstions */ - priv->m8_txpoll = wd_create(); /* Create periodic poll timer */ + priv->m8_mac = mac; /* Save the MAC interface instance */ + priv->m8_txpoll = wd_create(); /* Create periodic poll timer */ priv->m8_txtimeout = wd_create(); /* Create TX timeout timer */ DEBUGASSERT(priv->m8_txpoll != NULL && priv->m8_txtimeout != NULL); + /* Initialize the MAC callbacks */ + + maccb = &mac->cbs; + maccb->cb_context = priv; + maccb->conf_data = mac802154_conf_data; + maccb->conf_purge = mac802154_conf_purge; + maccb->conf_associate = mac802154_conf_associate; + maccb->conf_disassociate = mac802154_conf_disassociate; + maccb->conf_get = mac802154_conf_get; + maccb->conf_gts = mac802154_conf_gts; + maccb->conf_reset = mac802154_conf_reset; + maccb->conf_rxenable = mac802154_conf_rxenable; + maccb->conf_scan = mac802154_conf_scan; + maccb->conf_set = mac802154_conf_set; + maccb->conf_start = mac802154_conf_start; + maccb->conf_poll = mac802154_conf_poll; + maccb->ind_data = mac802154_ind_data; + maccb->ind_associate = mac802154_ind_associate; + maccb->ind_disassociate = mac802154_ind_disassociate; + maccb->ind_beaconnotify = mac802154_ind_beaconnotify; + maccb->ind_gts = mac802154_ind_gts; + maccb->ind_orphan = mac802154_ind_orphan; + maccb->ind_commstatus = mac802154_ind_commstatus; + maccb->ind_syncloss = mac802154_ind_syncloss; + /* Put the interface in the down state. */ mac802154_ifdown(dev);