Update ieee802.15.4 network driver so that it compiles cleanly.
This commit is contained in:
parent
c318072084
commit
47793aa8f8
@ -1405,13 +1405,13 @@ enum ieee802154_macnotify_e
|
|||||||
|
|
||||||
struct ieee802154_maccb_s
|
struct ieee802154_maccb_s
|
||||||
{
|
{
|
||||||
CODE void (*mlme_notify) (FAR const struct ieee802154_maccb_s *maccb,
|
CODE void (*mlme_notify)(FAR const struct ieee802154_maccb_s *maccb,
|
||||||
enum ieee802154_macnotify_e notif,
|
enum ieee802154_macnotify_e notif,
|
||||||
FAR const union ieee802154_mlme_notify_u *arg);
|
FAR const union ieee802154_mlme_notify_u *arg);
|
||||||
|
|
||||||
CODE void (*mcps_notify) (FAR const struct ieee802154_maccb_s *maccb,
|
CODE void (*mcps_notify)(FAR const struct ieee802154_maccb_s *maccb,
|
||||||
enum ieee802154_macnotify_e notif,
|
enum ieee802154_macnotify_e notif,
|
||||||
FAR const union ieee802154_mcps_notify_u *arg);
|
FAR const union ieee802154_mcps_notify_u *arg);
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -51,14 +51,14 @@
|
|||||||
|
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/irq.h>
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/wdog.h>
|
#include <nuttx/wdog.h>
|
||||||
#include <nuttx/wqueue.h>
|
#include <nuttx/wqueue.h>
|
||||||
#include <nuttx/net/iob.h>
|
#include <nuttx/drivers/iob.h>
|
||||||
#include <nuttx/net/arp.h>
|
#include <nuttx/net/arp.h>
|
||||||
#include <nuttx/net/netdev.h>
|
#include <nuttx/net/netdev.h>
|
||||||
#include <nuttx/net/sixlowpan.h>
|
#include <nuttx/net/sixlowpan.h>
|
||||||
#include <nuttx/wireless/ieee80154_device.h>
|
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
|
||||||
#include <nuttx/wireless/ieee80154_mac.h>
|
|
||||||
|
|
||||||
#include "mac802154.h"
|
#include "mac802154.h"
|
||||||
|
|
||||||
@ -79,11 +79,11 @@
|
|||||||
/* Use the selected work queue */
|
/* Use the selected work queue */
|
||||||
|
|
||||||
# if defined(CONFIG_IEEE802154_NETDEV_HPWORK)
|
# if defined(CONFIG_IEEE802154_NETDEV_HPWORK)
|
||||||
# define ETHWORK HPWORK
|
# define WPANWORK HPWORK
|
||||||
# elif defined(CONFIG_IEEE802154_NETDEV_LPWORK)
|
# elif defined(CONFIG_IEEE802154_NETDEV_LPWORK)
|
||||||
# define ETHWORK LPWORK
|
# define WPANWORK LPWORK
|
||||||
# else
|
# else
|
||||||
# error Neither CONFIG_IEEE802154_NETDEV_HPWORK nor CONFIG_IEEE802154_NETDEV_LPWORK defined
|
# error Neither CONFIG_IEEE802154_NETDEV_HPWORK nor CONFIG_IEEE802154_NETDEV_LPWORK defined
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -97,15 +97,7 @@
|
|||||||
|
|
||||||
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per second */
|
/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per second */
|
||||||
|
|
||||||
#define skeleton_WDDELAY (1*CLK_TCK)
|
#define TXPOLL_WDDELAY (1*CLK_TCK)
|
||||||
|
|
||||||
/* TX timeout = 1 minute */
|
|
||||||
|
|
||||||
#define skeleton_TXTIMEOUT (60*CLK_TCK)
|
|
||||||
|
|
||||||
/* This is a helper pointer for accessing the contents of the Ethernet header */
|
|
||||||
|
|
||||||
#define BUF ((struct eth_hdr_s *)priv->md_dev.d_buf)
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Types
|
* Private Types
|
||||||
@ -137,8 +129,6 @@ struct macnet_driver_s
|
|||||||
MACHANDLE md_mac; /* Contained MAC interface */
|
MACHANDLE md_mac; /* Contained MAC interface */
|
||||||
bool md_bifup; /* true:ifup false:ifdown */
|
bool md_bifup; /* true:ifup false:ifdown */
|
||||||
WDOG_ID md_txpoll; /* TX poll timer */
|
WDOG_ID md_txpoll; /* TX poll timer */
|
||||||
WDOG_ID md_txtimeout; /* TX timeout timer */
|
|
||||||
struct work_s md_irqwork; /* Defer interupt work to the work queue */
|
|
||||||
struct work_s md_pollwork; /* Defer poll work to the work queue */
|
struct work_s md_pollwork; /* Defer poll work to the work queue */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -148,36 +138,27 @@ struct macnet_driver_s
|
|||||||
|
|
||||||
/* IEE802.15.4 MAC callback functions ***************************************/
|
/* IEE802.15.4 MAC callback functions ***************************************/
|
||||||
|
|
||||||
static void macnet_mlme_notify(FAR struct ieee802154_maccb_s *maccb,
|
static void macnet_mlme_notify(FAR const struct ieee802154_maccb_s *maccb,
|
||||||
enum ieee802154_macnotify_e notif,
|
enum ieee802154_macnotify_e notif,
|
||||||
FAR union ieee802154_mlme_notify_u *arg);
|
FAR const union ieee802154_mlme_notify_u *arg);
|
||||||
|
static void macnet_mcps_notify(FAR const struct ieee802154_maccb_s *maccb,
|
||||||
static void macnet_mcps_notify(FAR struct ieee802154_maccb_s *maccb,
|
|
||||||
enum ieee802154_macnotify_e notif,
|
enum ieee802154_macnotify_e notif,
|
||||||
FAR union ieee802154_mcps_notify_u *arg);
|
FAR const union ieee802154_mcps_notify_u *arg);
|
||||||
|
|
||||||
/* Asynchronous confirmations to requests */
|
/* Asynchronous confirmations to requests */
|
||||||
|
|
||||||
static void macnet_conf_data(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_data(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_data_conf_s *conf);
|
FAR const struct ieee802154_data_conf_s *conf);
|
||||||
static void macnet_conf_purge(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_purge_conf_s *conf);
|
|
||||||
static void macnet_conf_associate(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_associate(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_assoc_conf_s *conf);
|
FAR struct ieee802154_assoc_conf_s *conf);
|
||||||
static void macnet_conf_disassociate(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_disassociate(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_disassoc_conf_s *conf);
|
FAR struct ieee802154_disassoc_conf_s *conf);
|
||||||
static void macnet_conf_get(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_get_conf_s *conf);
|
|
||||||
static void macnet_conf_gts(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_gts(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_gts_conf_s *conf);
|
FAR struct ieee802154_gts_conf_s *conf);
|
||||||
static void macnet_conf_reset(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_reset_conf_s *conf);
|
|
||||||
static void macnet_conf_rxenable(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_rxenable(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_rxenable_conf_s *conf);
|
FAR struct ieee802154_rxenable_conf_s *conf);
|
||||||
static void macnet_conf_scan(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_scan(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_scan_conf_s *conf);
|
FAR struct ieee802154_scan_conf_s *conf);
|
||||||
static void macnet_conf_set(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_set_conf_s *conf);
|
|
||||||
static void macnet_conf_start(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_start(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_start_conf_s *conf);
|
FAR struct ieee802154_start_conf_s *conf);
|
||||||
static void macnet_conf_poll(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_poll(FAR struct macnet_driver_s *priv,
|
||||||
@ -205,24 +186,9 @@ static void macnet_ind_syncloss(FAR struct macnet_driver_s *priv,
|
|||||||
/* Network interface support ************************************************/
|
/* Network interface support ************************************************/
|
||||||
/* Common TX logic */
|
/* Common TX logic */
|
||||||
|
|
||||||
static int macnet_transmit(FAR struct macnet_driver_s *priv);
|
static int macnet_txpoll_callback(FAR struct net_driver_s *dev);
|
||||||
static int macnet_txpoll(FAR struct net_driver_s *dev);
|
static void macnet_txpoll_work(FAR void *arg);
|
||||||
|
static void macnet_txpoll_expiry(int argc, wdparm_t arg, ...);
|
||||||
/* Frame transfer */
|
|
||||||
|
|
||||||
static void macnet_receive(FAR struct macnet_driver_s *priv);
|
|
||||||
static void macnet_txdone(FAR struct macnet_driver_s *priv);
|
|
||||||
|
|
||||||
static void macnet_transfer_work(FAR void *arg);
|
|
||||||
static int macnet_transfer(int irq, FAR void *context, FAR void *arg);
|
|
||||||
|
|
||||||
/* Watchdog timer expirations */
|
|
||||||
|
|
||||||
static void macnet_txtimeout_work(FAR void *arg);
|
|
||||||
static void macnet_txtimeout_expiry(int argc, wdparm_t arg, ...);
|
|
||||||
|
|
||||||
static void macnet_poll_work(FAR void *arg);
|
|
||||||
static void macnet_poll_expiry(int argc, wdparm_t arg, ...);
|
|
||||||
|
|
||||||
/* NuttX callback functions */
|
/* NuttX callback functions */
|
||||||
|
|
||||||
@ -264,12 +230,12 @@ static int macnet_req_data(FAR struct ieee802154_driver_s *netdev,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void macnet_mlme_notify(FAR struct ieee802154_maccb_s *maccb,
|
static void macnet_mlme_notify(FAR const struct ieee802154_maccb_s *maccb,
|
||||||
enum ieee802154_macnotify_e notif,
|
enum ieee802154_macnotify_e notif,
|
||||||
FAR union ieee802154_mlme_notify_u *arg)
|
FAR const union ieee802154_mlme_notify_u *arg)
|
||||||
{
|
{
|
||||||
FAR struct macdev_callback_s *cb =
|
FAR struct macnet_callback_s *cb =
|
||||||
(FAR struct macdev_callback_s *)maccb;
|
(FAR struct macnet_callback_s *)maccb;
|
||||||
FAR struct macnet_driver_s *priv;
|
FAR struct macnet_driver_s *priv;
|
||||||
|
|
||||||
DEBUGASSERT(cb != NULL && cb->mc_priv != NULL);
|
DEBUGASSERT(cb != NULL && cb->mc_priv != NULL);
|
||||||
@ -290,13 +256,13 @@ static void macnet_mlme_notify(FAR struct ieee802154_maccb_s *maccb,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void macnet_mcps_notify(FAR struct ieee802154_maccb_s *maccb,
|
static void macnet_mcps_notify(FAR const struct ieee802154_maccb_s *maccb,
|
||||||
enum ieee802154_macnotify_e notif,
|
enum ieee802154_macnotify_e notif,
|
||||||
FAR union ieee802154_mcps_notify_u *arg)
|
FAR const union ieee802154_mcps_notify_u *arg)
|
||||||
{
|
{
|
||||||
FAR struct macdev_callback_s *cb =
|
FAR struct macnet_callback_s *cb =
|
||||||
(FAR struct macdev_callback_s *)maccb;
|
(FAR struct macnet_callback_s *)maccb;
|
||||||
FAR struct macdev_driver_s *priv;
|
FAR struct macnet_driver_s *priv;
|
||||||
|
|
||||||
DEBUGASSERT(cb != NULL && cb->mc_priv != NULL);
|
DEBUGASSERT(cb != NULL && cb->mc_priv != NULL);
|
||||||
priv = cb->mc_priv;
|
priv = cb->mc_priv;
|
||||||
@ -309,15 +275,9 @@ static void macnet_mcps_notify(FAR struct ieee802154_maccb_s *maccb,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IEEE802154_NOTIFY_CONF_PURGE:
|
|
||||||
{
|
|
||||||
macnet_conf_purge(priv, &arg->purgeconf);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IEEE802154_NOTIFY_IND_DATA:
|
case IEEE802154_NOTIFY_IND_DATA:
|
||||||
{
|
{
|
||||||
macnet_ind_data(priv, &arg->dataind);
|
macnet_ind_data(priv, arg->dataind);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -335,21 +295,7 @@ static void macnet_mcps_notify(FAR struct ieee802154_maccb_s *maccb,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void macnet_conf_data(FAR struct macnet_driver_s *priv,
|
static void macnet_conf_data(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_data_conf_s *conf)
|
FAR const struct ieee802154_data_conf_s *conf)
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_conf_purge
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Data frame was purged
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_conf_purge(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_purge_conf_s *conf)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -382,20 +328,6 @@ static void macnet_conf_disassociate(FAR struct macnet_driver_s *priv,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_conf_get
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* PIB data returned
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_conf_get(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_get_conf_s *conf)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_conf_gts
|
* Name: macnet_conf_gts
|
||||||
*
|
*
|
||||||
@ -410,20 +342,6 @@ static void macnet_conf_gts(FAR struct macnet_driver_s *priv,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_conf_reset
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* MAC reset completed
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_conf_reset(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_reset_conf_s *conf)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_conf_rxenable
|
* Name: macnet_conf_rxenable
|
||||||
*
|
*
|
||||||
@ -450,19 +368,6 @@ static void macnet_conf_scan(FAR struct macnet_driver_s *priv,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_conf_set
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_conf_set(FAR struct macnet_driver_s *priv,
|
|
||||||
FAR struct ieee802154_set_conf_s *conf)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_conf_start
|
* Name: macnet_conf_start
|
||||||
*
|
*
|
||||||
@ -500,7 +405,23 @@ static void macnet_conf_poll(FAR struct macnet_driver_s *priv,
|
|||||||
static void macnet_ind_data(FAR struct macnet_driver_s *priv,
|
static void macnet_ind_data(FAR struct macnet_driver_s *priv,
|
||||||
FAR struct ieee802154_data_ind_s *ind)
|
FAR struct ieee802154_data_ind_s *ind)
|
||||||
{
|
{
|
||||||
|
FAR struct iob_s *iob;
|
||||||
|
|
||||||
|
/* Extract the IOB containing the frame from the struct ieee802154_data_ind_s */
|
||||||
|
|
||||||
|
DEBUGASSERT(priv != NULL && ind != NULL && ind->frame != NULL);
|
||||||
|
iob = ind->frame;
|
||||||
|
ind->frame = NULL;
|
||||||
|
|
||||||
|
/* Transfer the frame to the network logic */
|
||||||
|
|
||||||
|
sixlowpan_input(&priv->md_dev, iob, ind);
|
||||||
|
|
||||||
|
/* sixlowpan_input() will free the IOB, but we must free the struct
|
||||||
|
* ieee802154_data_ind_s container here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ieee802154_ind_free(ind);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -600,52 +521,7 @@ static void macnet_ind_syncloss(FAR struct macnet_driver_s *priv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_transmit
|
* Name: macnet_txpoll_callback
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* This function is called from the lower MAC layer when thre radio device
|
|
||||||
* is ready to accept another outgoing frame. It removes one of the
|
|
||||||
* previously queued fram IOBs and provides that to the MAC layer.
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* priv - Reference to the driver state structure
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* OK on success; a negated errno on failure
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
* May or may not be called from an interrupt handler.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static int macnet_transmit(FAR struct macnet_driver_s *priv)
|
|
||||||
{
|
|
||||||
/* Cancel the TX timeout watchdog
|
|
||||||
*
|
|
||||||
* REVISIT: Is there not a race condition here? Might the TX timeout
|
|
||||||
* already be queued?.
|
|
||||||
*/
|
|
||||||
|
|
||||||
wd_cancel(priv->md_txtimeout);
|
|
||||||
|
|
||||||
/* Increment statistics */
|
|
||||||
|
|
||||||
NETDEV_TXPACKETS(priv->md_dev);
|
|
||||||
|
|
||||||
/* Provide the pre-formatted packet to the radio device (via the lower MAC
|
|
||||||
* layer).
|
|
||||||
*/
|
|
||||||
#warning Missing logic
|
|
||||||
|
|
||||||
/* Setup the TX timeout watchdog (perhaps restarting the timer) */
|
|
||||||
|
|
||||||
(void)wd_start(priv->md_txtimeout, skeleton_TXTIMEOUT,
|
|
||||||
macnet_txtimeout_expiry, 1, (wdparm_t)priv);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_txpoll
|
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* The transmitter is available, check if the network has any outgoing
|
* The transmitter is available, check if the network has any outgoing
|
||||||
@ -667,7 +543,7 @@ static int macnet_transmit(FAR struct macnet_driver_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int macnet_txpoll(FAR struct net_driver_s *dev)
|
static int macnet_txpoll_callback(FAR struct net_driver_s *dev)
|
||||||
{
|
{
|
||||||
/* If zero is returned, the polling will continue until all connections have
|
/* If zero is returned, the polling will continue until all connections have
|
||||||
* been examined.
|
* been examined.
|
||||||
@ -677,265 +553,7 @@ static int macnet_txpoll(FAR struct net_driver_s *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_receive
|
* Name: macnet_txpoll_process
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* An interrupt was received indicating the availability of a new RX packet
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* priv - Reference to the driver state structure
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
* The network is locked.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_receive(FAR struct macnet_driver_s *priv)
|
|
||||||
{
|
|
||||||
FAR struct iob_s *iob;
|
|
||||||
FAR struct iob_s *fptr;
|
|
||||||
|
|
||||||
/* Allocate an IOB to hold the frame */
|
|
||||||
|
|
||||||
net_lock();
|
|
||||||
iob = iob_alloc(false);
|
|
||||||
#warning Allocated by radio layer, right?
|
|
||||||
if (iob == NULL)
|
|
||||||
{
|
|
||||||
nerr("ERROR: Failed to allocate an IOB\n")
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the frame data into the IOB.
|
|
||||||
* REVISIT: Can a copy be avoided?
|
|
||||||
*/
|
|
||||||
|
|
||||||
fptr = iob->io_data;
|
|
||||||
#warning Missing logic
|
|
||||||
|
|
||||||
/* Transfer the frame to the network logic */
|
|
||||||
|
|
||||||
sixlowpan_input(&priv->md_dev, iob, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_txdone
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* An interrupt was received indicating that the last TX packet(s) is done
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* priv - Reference to the driver state structure
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
* The network is locked.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_txdone(FAR struct macnet_driver_s *priv)
|
|
||||||
{
|
|
||||||
int delay;
|
|
||||||
|
|
||||||
/* Check for errors and update statistics */
|
|
||||||
|
|
||||||
NETDEV_TXDONE(priv->md_dev);
|
|
||||||
|
|
||||||
/* Check if there are pending transmissions */
|
|
||||||
|
|
||||||
/* If no further transmissions are pending, then cancel the TX timeout and
|
|
||||||
* disable further Tx interrupts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
wd_cancel(priv->md_txtimeout);
|
|
||||||
|
|
||||||
/* And disable further TX interrupts. */
|
|
||||||
|
|
||||||
/* In any event, poll the network for new TX data */
|
|
||||||
|
|
||||||
(void)devif_poll(&priv->md_dev, macnet_txpoll);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_transfer_work
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Perform interrupt related work from the worker thread
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* arg - The argument passed when work_queue() was called.
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* OK on success
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
* The network is locked.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_transfer_work(FAR void *arg)
|
|
||||||
{
|
|
||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
|
||||||
|
|
||||||
/* Lock the network and serialize driver operations if necessary.
|
|
||||||
* NOTE: Serialization is only required in the case where the driver work
|
|
||||||
* is performed on an LP worker thread and where more than one LP worker
|
|
||||||
* thread has been configured.
|
|
||||||
*/
|
|
||||||
|
|
||||||
net_lock();
|
|
||||||
|
|
||||||
/* Process pending Ethernet interrupts */
|
|
||||||
|
|
||||||
/* Get and clear interrupt status bits */
|
|
||||||
|
|
||||||
/* Handle interrupts according to status bit settings */
|
|
||||||
|
|
||||||
/* Check if we received an incoming packet, if so, call macnet_receive() */
|
|
||||||
|
|
||||||
macnet_receive(priv);
|
|
||||||
|
|
||||||
/* Check if a packet transmission just completed. If so, call macnet_txdone.
|
|
||||||
* This may disable further Tx interrupts if there are no pending
|
|
||||||
* transmissions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
macnet_txdone(priv);
|
|
||||||
net_unlock();
|
|
||||||
|
|
||||||
/* Re-enable Ethernet interrupts */
|
|
||||||
|
|
||||||
up_enable_irq(CONFIG_IEEE802154_NETDEV_IRQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_transfer
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Hardware interrupt handler
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* irq - Number of the IRQ that generated the interrupt
|
|
||||||
* context - Interrupt register state save info (architecture-specific)
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* OK on success
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static int macnet_transfer(int irq, FAR void *context, FAR void *arg)
|
|
||||||
{
|
|
||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
|
||||||
|
|
||||||
/* Disable further Ethernet interrupts. Because Ethernet interrupts are
|
|
||||||
* also disabled if the TX timeout event occurs, there can be no race
|
|
||||||
* condition here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
up_disable_irq(CONFIG_IEEE802154_NETDEV_IRQ);
|
|
||||||
|
|
||||||
/* TODO: Determine if a TX transfer just completed */
|
|
||||||
|
|
||||||
{
|
|
||||||
/* If a TX transfer just completed, then cancel the TX timeout so
|
|
||||||
* there will be no race condition between any subsequent timeout
|
|
||||||
* expiration and the deferred interrupt processing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
wd_cancel(priv->md_txtimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Schedule to perform the interrupt processing on the worker thread. */
|
|
||||||
|
|
||||||
work_queue(ETHWORK, &priv->md_irqwork, macnet_transfer_work, priv, 0);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_txtimeout_work
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Perform TX timeout related work from the worker thread
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* arg - The argument passed when work_queue() as called.
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* OK on success
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
* The network is locked.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_txtimeout_work(FAR void *arg)
|
|
||||||
{
|
|
||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
|
||||||
|
|
||||||
/* Lock the network and serialize driver operations if necessary.
|
|
||||||
* NOTE: Serialization is only required in the case where the driver work
|
|
||||||
* is performed on an LP worker thread and where more than one LP worker
|
|
||||||
* thread has been configured.
|
|
||||||
*/
|
|
||||||
|
|
||||||
net_lock();
|
|
||||||
|
|
||||||
/* Increment statistics and dump debug info */
|
|
||||||
|
|
||||||
NETDEV_TXTIMEOUTS(priv->md_dev);
|
|
||||||
|
|
||||||
/* Then reset the hardware */
|
|
||||||
|
|
||||||
/* Then poll the network for new XMIT data */
|
|
||||||
|
|
||||||
(void)devif_poll(&priv->md_dev, macnet_txpoll);
|
|
||||||
net_unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_txtimeout_expiry
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Our TX watchdog timed out. Called from the timer interrupt handler.
|
|
||||||
* The last TX never completed. Reset the hardware and start again.
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* argc - The number of available arguments
|
|
||||||
* arg - The first argument
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Assumptions:
|
|
||||||
* Global interrupts are disabled by the watchdog logic.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void macnet_txtimeout_expiry(int argc, wdparm_t arg, ...)
|
|
||||||
{
|
|
||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
|
||||||
|
|
||||||
/* Disable further Ethernet interrupts. This will prevent some race
|
|
||||||
* conditions with interrupt work. There is still a potential race
|
|
||||||
* condition with interrupt work that is already queued and in progress.
|
|
||||||
*/
|
|
||||||
|
|
||||||
up_disable_irq(CONFIG_IEEE802154_NETDEV_IRQ);
|
|
||||||
|
|
||||||
/* Schedule to perform the TX timeout processing on the worker thread. */
|
|
||||||
|
|
||||||
work_queue(ETHWORK, &priv->md_irqwork, macnet_txtimeout_work, priv, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: macnet_poll_process
|
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Perform the periodic poll. This may be called either from watchdog
|
* Perform the periodic poll. This may be called either from watchdog
|
||||||
@ -951,12 +569,12 @@ static void macnet_txtimeout_expiry(int argc, wdparm_t arg, ...)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void macnet_poll_process(FAR struct macnet_driver_s *priv)
|
static inline void macnet_txpoll_process(FAR struct macnet_driver_s *priv)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_poll_work
|
* Name: macnet_txpoll_work
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Perform periodic polling from the worker thread
|
* Perform periodic polling from the worker thread
|
||||||
@ -972,7 +590,7 @@ static inline void macnet_poll_process(FAR struct macnet_driver_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void macnet_poll_work(FAR void *arg)
|
static void macnet_txpoll_work(FAR void *arg)
|
||||||
{
|
{
|
||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
||||||
|
|
||||||
@ -995,17 +613,17 @@ static void macnet_poll_work(FAR void *arg)
|
|||||||
* progress, we will missing TCP time state updates?
|
* progress, we will missing TCP time state updates?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(void)devif_timer(&priv->md_dev, macnet_txpoll);
|
(void)devif_timer(&priv->md_dev.i_dev, macnet_txpoll_callback);
|
||||||
|
|
||||||
/* Setup the watchdog poll timer again */
|
/* Setup the watchdog poll timer again */
|
||||||
|
|
||||||
(void)wd_start(priv->md_txpoll, skeleton_WDDELAY, macnet_poll_expiry, 1,
|
(void)wd_start(priv->md_txpoll, TXPOLL_WDDELAY, macnet_txpoll_expiry, 1,
|
||||||
(wdparm_t)priv);
|
(wdparm_t)priv);
|
||||||
net_unlock();
|
net_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_poll_expiry
|
* Name: macnet_txpoll_expiry
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Periodic timer handler. Called from the timer interrupt handler.
|
* Periodic timer handler. Called from the timer interrupt handler.
|
||||||
@ -1022,21 +640,21 @@ static void macnet_poll_work(FAR void *arg)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void macnet_poll_expiry(int argc, wdparm_t arg, ...)
|
static void macnet_txpoll_expiry(int argc, wdparm_t arg, ...)
|
||||||
{
|
{
|
||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)arg;
|
||||||
|
|
||||||
/* Schedule to perform the interrupt processing on the worker thread. */
|
/* Schedule to perform the interrupt processing on the worker thread. */
|
||||||
|
|
||||||
work_queue(ETHWORK, &priv->md_pollwork, macnet_poll_work, priv, 0);
|
work_queue(WPANWORK, &priv->md_pollwork, macnet_txpoll_work, priv, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: macnet_ifup
|
* Name: macnet_ifup
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* NuttX Callback: Bring up the Ethernet interface when an IP address is
|
* NuttX Callback: Bring up the IEEE 802.15.4 interface when an IP address
|
||||||
* provided
|
* is provided
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* dev - Reference to the NuttX driver state structure
|
* dev - Reference to the NuttX driver state structure
|
||||||
@ -1064,9 +682,10 @@ static int macnet_ifup(FAR struct net_driver_s *dev)
|
|||||||
dev->d_ipv6addr[6], dev->d_ipv6addr[7]);
|
dev->d_ipv6addr[6], dev->d_ipv6addr[7]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Initialize PHYs, the Ethernet interface, and setup up Ethernet interrupts */
|
/* Initialize PHYs, the IEEE 802.15.4 interface, and setup up IEEE 802.15.4 interrupts */
|
||||||
|
#warning Missing logic
|
||||||
|
|
||||||
/* Instantiate the MAC address from priv->md_dev.d_mac.ether_addr_octet */
|
/* Instantiate the MAC address from priv->md_dev.i_dev.d_mac.ether_addr_octet */
|
||||||
|
|
||||||
#ifdef CONFIG_NET_ICMPv6
|
#ifdef CONFIG_NET_ICMPv6
|
||||||
/* Set up IPv6 multicast address filtering */
|
/* Set up IPv6 multicast address filtering */
|
||||||
@ -1076,13 +695,12 @@ static int macnet_ifup(FAR struct net_driver_s *dev)
|
|||||||
|
|
||||||
/* Set and activate a timer process */
|
/* Set and activate a timer process */
|
||||||
|
|
||||||
(void)wd_start(priv->md_txpoll, skeleton_WDDELAY, macnet_poll_expiry, 1,
|
(void)wd_start(priv->md_txpoll, TXPOLL_WDDELAY, macnet_txpoll_expiry, 1,
|
||||||
(wdparm_t)priv);
|
(wdparm_t)priv);
|
||||||
|
|
||||||
/* Enable the Ethernet interrupt */
|
/* Enable the IEEE 802.15.4 radio */
|
||||||
|
|
||||||
priv->md_bifup = true;
|
priv->md_bifup = true;
|
||||||
up_enable_irq(CONFIG_IEEE802154_NETDEV_IRQ);
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1107,15 +725,13 @@ static int macnet_ifdown(FAR struct net_driver_s *dev)
|
|||||||
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)dev->d_private;
|
FAR struct macnet_driver_s *priv = (FAR struct macnet_driver_s *)dev->d_private;
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
|
|
||||||
/* Disable the Ethernet interrupt */
|
/* Disable interruption */
|
||||||
|
|
||||||
flags = enter_critical_section();
|
flags = enter_critical_section();
|
||||||
up_disable_irq(CONFIG_IEEE802154_NETDEV_IRQ);
|
|
||||||
|
|
||||||
/* Cancel the TX poll timer and TX timeout timers */
|
/* Cancel the TX poll timer and TX timeout timers */
|
||||||
|
|
||||||
wd_cancel(priv->md_txpoll);
|
wd_cancel(priv->md_txpoll);
|
||||||
wd_cancel(priv->md_txtimeout);
|
|
||||||
|
|
||||||
/* Put the EMAC in its reset, non-operational state. This should be
|
/* Put the EMAC in its reset, non-operational state. This should be
|
||||||
* a known configuration that will guarantee the macnet_ifup() always
|
* a known configuration that will guarantee the macnet_ifup() always
|
||||||
@ -1166,7 +782,7 @@ static void macnet_txavail_work(FAR void *arg)
|
|||||||
|
|
||||||
/* If so, then poll the network for new XMIT data */
|
/* If so, then poll the network for new XMIT data */
|
||||||
|
|
||||||
(void)devif_poll(&priv->md_dev, macnet_txpoll);
|
(void)devif_poll(&priv->md_dev.i_dev, macnet_txpoll_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
net_unlock();
|
net_unlock();
|
||||||
@ -1204,7 +820,7 @@ static int macnet_txavail(FAR struct net_driver_s *dev)
|
|||||||
{
|
{
|
||||||
/* Schedule to serialize the poll on the worker thread. */
|
/* Schedule to serialize the poll on the worker thread. */
|
||||||
|
|
||||||
work_queue(ETHWORK, &priv->md_pollwork, macnet_txavail_work, priv, 0);
|
work_queue(WPANWORK, &priv->md_pollwork, macnet_txavail_work, priv, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@ -1293,10 +909,10 @@ static void macnet_ipv6multicast(FAR struct macnet_driver_s *priv)
|
|||||||
|
|
||||||
/* For ICMPv6, we need to add the IPv6 multicast address
|
/* For ICMPv6, we need to add the IPv6 multicast address
|
||||||
*
|
*
|
||||||
* For IPv6 multicast addresses, the Ethernet MAC is derived by
|
* For IPv6 multicast addresses, the IEEE 802.15.4 MAC is derived by
|
||||||
* the four low-order octets OR'ed with the MAC 33:33:00:00:00:00,
|
* the four low-order octets OR'ed with the MAC 33:33:00:00:00:00,
|
||||||
* so for example the IPv6 address FF02:DEAD:BEEF::1:3 would map
|
* so for example the IPv6 address FF02:DEAD:BEEF::1:3 would map
|
||||||
* to the Ethernet MAC address 33:33:00:01:00:03.
|
* to the IEEE 802.15.4 MAC address 33:33:00:01:00:03.
|
||||||
*
|
*
|
||||||
* NOTES: This appears correct for the ICMPv6 Router Solicitation
|
* NOTES: This appears correct for the ICMPv6 Router Solicitation
|
||||||
* Message, but the ICMPv6 Neighbor Solicitation message seems to
|
* Message, but the ICMPv6 Neighbor Solicitation message seems to
|
||||||
@ -1321,7 +937,7 @@ static void macnet_ipv6multicast(FAR struct macnet_driver_s *priv)
|
|||||||
(void)macnet_addmac(dev, mac);
|
(void)macnet_addmac(dev, mac);
|
||||||
|
|
||||||
#ifdef CONFIG_NET_ICMPv6_AUTOCONF
|
#ifdef CONFIG_NET_ICMPv6_AUTOCONF
|
||||||
/* Add the IPv6 all link-local nodes Ethernet address. This is the
|
/* Add the IPv6 all link-local nodes IEEE 802.15.4 address. This is the
|
||||||
* address that we expect to receive ICMPv6 Router Advertisement
|
* address that we expect to receive ICMPv6 Router Advertisement
|
||||||
* packets.
|
* packets.
|
||||||
*/
|
*/
|
||||||
@ -1331,7 +947,7 @@ static void macnet_ipv6multicast(FAR struct macnet_driver_s *priv)
|
|||||||
#endif /* CONFIG_NET_ICMPv6_AUTOCONF */
|
#endif /* CONFIG_NET_ICMPv6_AUTOCONF */
|
||||||
|
|
||||||
#ifdef CONFIG_NET_ICMPv6_ROUTER
|
#ifdef CONFIG_NET_ICMPv6_ROUTER
|
||||||
/* Add the IPv6 all link-local routers Ethernet address. This is the
|
/* Add the IPv6 all link-local routers IEEE 802.15.4 address. This is the
|
||||||
* address that we expect to receive ICMPv6 Router Solicitation
|
* address that we expect to receive ICMPv6 Router Solicitation
|
||||||
* packets.
|
* packets.
|
||||||
*/
|
*/
|
||||||
@ -1377,7 +993,8 @@ static int macnet_ioctl(FAR struct net_driver_s *dev, int cmd,
|
|||||||
if (netmac != NULL)
|
if (netmac != NULL)
|
||||||
{
|
{
|
||||||
unsigned long macarg = (unsigned int)((uintptr_t)&netmac->u);
|
unsigned long macarg = (unsigned int)((uintptr_t)&netmac->u);
|
||||||
ret = priv->md_mac.macops.ioctl(priv->md_mac, cmd, macarg);
|
ret = mac802154_ioctl(priv->md_mac, cmd, macarg);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1387,8 +1004,10 @@ static int macnet_ioctl(FAR struct net_driver_s *dev, int cmd,
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = priv->md_mac.macops.ioctl(priv->md_mac, cmd, arg);
|
ret = mac802154_ioctl(priv->md_mac, cmd, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1413,7 +1032,7 @@ static int macnet_get_mhrlen(FAR struct ieee802154_driver_s *netdev,
|
|||||||
{
|
{
|
||||||
FAR struct macnet_driver_s *priv;
|
FAR struct macnet_driver_s *priv;
|
||||||
|
|
||||||
DEBUGASSERT(netdev != NULL && netdev->i_dev.d_private != NULL && iob != NULL);
|
DEBUGASSERT(netdev != NULL && netdev->i_dev.d_private != NULL && meta != NULL);
|
||||||
priv = (FAR struct macnet_driver_s *)netdev->i_dev.d_private;
|
priv = (FAR struct macnet_driver_s *)netdev->i_dev.d_private;
|
||||||
|
|
||||||
return mac802154_get_mhrlen(priv->md_mac, meta);
|
return mac802154_get_mhrlen(priv->md_mac, meta);
|
||||||
@ -1441,20 +1060,21 @@ static int macnet_req_data(FAR struct ieee802154_driver_s *netdev,
|
|||||||
FAR struct iob_s *framelist)
|
FAR struct iob_s *framelist)
|
||||||
{
|
{
|
||||||
FAR struct macnet_driver_s *priv;
|
FAR struct macnet_driver_s *priv;
|
||||||
struct ieee802154_data_req_s req;
|
|
||||||
FAR struct iob_s *iob;
|
FAR struct iob_s *iob;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(netdev != NULL && netdev->i_dev.d_private != NULL && iob != NULL);
|
DEBUGASSERT(netdev != NULL && netdev->i_dev.d_private != NULL);
|
||||||
priv = (FAR struct macnet_driver_s *)netdev->i_dev.d_private;
|
priv = (FAR struct macnet_driver_s *)netdev->i_dev.d_private;
|
||||||
|
|
||||||
|
DEBUGASSERT(meta != NULL && framelist != NULL);
|
||||||
|
|
||||||
/* Add the incoming list of frames to the MAC's outgoing queue */
|
/* Add the incoming list of frames to the MAC's outgoing queue */
|
||||||
|
|
||||||
for (iob = framelist; iob != NULL; iob = framelist)
|
for (iob = framelist; iob != NULL; iob = framelist)
|
||||||
{
|
{
|
||||||
/* Increment statistics */
|
/* Increment statistics */
|
||||||
|
|
||||||
NETDEV_RXPACKETS(&priv->lo_ieee.i_dev);
|
NETDEV_TXPACKETS(&priv->md_dev.i_dev);
|
||||||
|
|
||||||
/* Remove the IOB from the queue */
|
/* Remove the IOB from the queue */
|
||||||
|
|
||||||
@ -1463,15 +1083,13 @@ static int macnet_req_data(FAR struct ieee802154_driver_s *netdev,
|
|||||||
|
|
||||||
/* Transfer the frame to the MAC */
|
/* Transfer the frame to the MAC */
|
||||||
|
|
||||||
req.meta = mets;
|
ret = mac802154_req_data(priv->md_mac, meta, iob);
|
||||||
req.frame = iob;
|
|
||||||
ret = mac802154_req_data(priv->md_mac, req);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
wlerr("ERROR: mac802154_req_data failed: %d\n", ret);
|
wlerr("ERROR: mac802154_req_data failed: %d\n", ret);
|
||||||
|
|
||||||
iob_free(iob);
|
iob_free(iob);
|
||||||
for (iob = framelist; ; iob != NULL; iob = framelist)
|
for (iob = framelist; iob != NULL; iob = framelist)
|
||||||
{
|
{
|
||||||
/* Remove the IOB from the queue and free */
|
/* Remove the IOB from the queue and free */
|
||||||
|
|
||||||
@ -1533,7 +1151,7 @@ int mac802154netdev_register(MACHANDLE mac)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
pktbuf = (FAR uint8_t *)kmm_malloc(CONFIG_NET_6LOWPAN_MTU + CONFIG_NET_GUARDSIZE);
|
pktbuf = (FAR uint8_t *)kmm_malloc(CONFIG_NET_6LOWPAN_MTU + CONFIG_NET_GUARDSIZE);
|
||||||
if (pktbuf == NULL
|
if (pktbuf == NULL)
|
||||||
{
|
{
|
||||||
nerr("ERROR: Failed to allocate the packet buffer\n");
|
nerr("ERROR: Failed to allocate the packet buffer\n");
|
||||||
kmm_free(priv);
|
kmm_free(priv);
|
||||||
@ -1542,7 +1160,7 @@ int mac802154netdev_register(MACHANDLE mac)
|
|||||||
|
|
||||||
/* Initialize the driver structure */
|
/* Initialize the driver structure */
|
||||||
|
|
||||||
ieee = &priv->lo_ieee;
|
ieee = &priv->md_dev;
|
||||||
dev = &ieee->i_dev;
|
dev = &ieee->i_dev;
|
||||||
dev->d_buf = pktbuf; /* Single packet buffer */
|
dev->d_buf = pktbuf; /* Single packet buffer */
|
||||||
dev->d_ifup = macnet_ifup; /* I/F up (new IP address) callback */
|
dev->d_ifup = macnet_ifup; /* I/F up (new IP address) callback */
|
||||||
@ -1561,9 +1179,8 @@ int mac802154netdev_register(MACHANDLE mac)
|
|||||||
|
|
||||||
priv->md_mac = mac; /* Save the MAC interface instance */
|
priv->md_mac = mac; /* Save the MAC interface instance */
|
||||||
priv->md_txpoll = wd_create(); /* Create periodic poll timer */
|
priv->md_txpoll = wd_create(); /* Create periodic poll timer */
|
||||||
priv->md_txtimeout = wd_create(); /* Create TX timeout timer */
|
|
||||||
|
|
||||||
DEBUGASSERT(priv->md_txpoll != NULL && priv->md_txtimeout != NULL);
|
DEBUGASSERT(priv->md_txpoll != NULL);
|
||||||
|
|
||||||
/* Initialize the Network frame-related callbacks */
|
/* Initialize the Network frame-related callbacks */
|
||||||
|
|
||||||
@ -1575,22 +1192,22 @@ int mac802154netdev_register(MACHANDLE mac)
|
|||||||
priv->md_cb.mc_priv = priv;
|
priv->md_cb.mc_priv = priv;
|
||||||
|
|
||||||
maccb = &priv->md_cb.mc_cb;
|
maccb = &priv->md_cb.mc_cb;
|
||||||
maccb->mlme_notify = macdev_mlme_notify;
|
maccb->mlme_notify = macnet_mlme_notify;
|
||||||
maccb->mcps_notify = macdev_mcps_notify;
|
maccb->mcps_notify = macnet_mcps_notify;
|
||||||
|
|
||||||
/* Bind the callback structure */
|
/* Bind the callback structure */
|
||||||
|
|
||||||
ret = mac802154_bind(mac, maccb);
|
ret = mac802154_bind(mac, maccb);
|
||||||
if (ret < 0
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
nerr("ERROR: Failed to bind the MAC callbacks: %d\n", ret);
|
nerr("ERROR: Failed to bind the MAC callbacks: %d\n", ret);
|
||||||
|
|
||||||
/* Release wdog timers */
|
/* Release wdog timers */
|
||||||
|
|
||||||
wd_delete(priv->md_txpoll);
|
wd_delete(priv->md_txpoll);
|
||||||
wd_delete(priv->md_txtimeout);
|
|
||||||
|
|
||||||
/* Free memory and return the error */
|
/* Free memory and return the error */
|
||||||
|
|
||||||
kmm_free(pktbuf);
|
kmm_free(pktbuf);
|
||||||
kmm_free(priv);
|
kmm_free(priv);
|
||||||
return ret;
|
return ret;
|
||||||
@ -1602,7 +1219,7 @@ int mac802154netdev_register(MACHANDLE mac)
|
|||||||
|
|
||||||
/* Register the device with the OS so that socket IOCTLs can be performed */
|
/* Register the device with the OS so that socket IOCTLs can be performed */
|
||||||
|
|
||||||
(void)netdev_register(&priv->md_dev, NET_LL_IEEE802154);
|
(void)netdev_register(&priv->md_dev.i_dev, NET_LL_IEEE802154);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user