6loWPAN network driver: Still only a skeleton but has some added though experimentation.
This commit is contained in:
parent
8786770d7d
commit
bbeadc2274
@ -130,16 +130,26 @@ struct macnet_driver_s
|
|||||||
/* This holds the information visible to the NuttX network */
|
/* This holds the information visible to the NuttX network */
|
||||||
|
|
||||||
struct ieee802154_driver_s md_dev; /* Interface understood by the network */
|
struct ieee802154_driver_s md_dev; /* Interface understood by the network */
|
||||||
struct macnet_callback_s md_cb; /* Callback information */
|
|
||||||
MACHANDLE md_mac; /* Contained MAC interface */
|
|
||||||
|
|
||||||
/* For internal use by this driver */
|
/* For internal use by this driver */
|
||||||
|
|
||||||
|
struct macnet_callback_s md_cb; /* Callback information */
|
||||||
|
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 */
|
WDOG_ID md_txtimeout; /* TX timeout timer */
|
||||||
struct work_s md_irqwork; /* For deferring interupt work to the work queue */
|
struct work_s md_irqwork; /* Defer interupt work to the work queue */
|
||||||
struct work_s md_pollwork; /* For deferring poll work to the work queue */
|
struct work_s md_pollwork; /* Defer poll work to the work queue */
|
||||||
|
|
||||||
|
/* This is queue of outgoing, ready-to-send frames that will be sent
|
||||||
|
* indirectly. This list should only be used by a MAC acting as a
|
||||||
|
* coordinator. These transactions will stay here until the data is
|
||||||
|
* extracted by the destination device sending a Data Request MAC
|
||||||
|
* command or if too much time passes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FAR volatile struct iob_s *md_head;
|
||||||
|
FAR volatile struct iob_s *md_tail;
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -583,8 +593,9 @@ static void macnet_ind_syncloss(MACHANDLE mac, int reason)
|
|||||||
* Name: macnet_transmit
|
* Name: macnet_transmit
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Start hardware transmission. Called either from the txdone interrupt
|
* This function is called from the lower MAC layer when thre radio device
|
||||||
* handling or from watchdog based polling.
|
* is ready to accept another outgoing frame. It removes one of the
|
||||||
|
* previously queued fram IOBs and provides that to the MAC layer.
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* priv - Reference to the driver state structure
|
* priv - Reference to the driver state structure
|
||||||
@ -593,31 +604,85 @@ static void macnet_ind_syncloss(MACHANDLE mac, int reason)
|
|||||||
* OK on success; a negated errno on failure
|
* OK on success; a negated errno on failure
|
||||||
*
|
*
|
||||||
* Assumptions:
|
* 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_txqueue
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Add new frames from the network to the list of outgoing frames.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* dev - Reference to the NuttX driver state structure
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* OK on success; a negated errno on failure
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
* May or may not be called from an interrupt handler. In either case,
|
* May or may not be called from an interrupt handler. In either case,
|
||||||
* the network is locked.
|
* the network is locked.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int macnet_transmit(FAR struct macnet_driver_s *priv)
|
static void macnet_txqueue(FAR struct net_driver_s *dev)
|
||||||
{
|
{
|
||||||
/* Verify that the hardware is ready to send another packet. If we get
|
/* Check if there is a new list of outgoing frames from the network. */
|
||||||
* here, then we are committed to sending a packet; Higher level logic
|
|
||||||
* must have assured that there is no transmission in progress.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Increment statistics */
|
if (priv->lo_ieee.i_framelist != NULL)
|
||||||
|
{
|
||||||
|
/* Yes.. Remove the frame list from the driver structure */
|
||||||
|
|
||||||
NETDEV_TXPACKETS(priv->md_dev);
|
iob = priv->lo_ieee.i_framelist;
|
||||||
|
priv->lo_ieee.i_framelist = NULL;
|
||||||
|
|
||||||
/* Send the packet: address=priv->md_dev.d_buf, length=priv->md_dev.d_len */
|
/* Append the new list to the tail of the queue of outgoing frames. */
|
||||||
|
|
||||||
/* Enable Tx interrupts */
|
if (priv->md_tail == NULL)
|
||||||
|
{
|
||||||
|
priv->md_head = iob;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
priv->md_tail->io_flink = iob;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup the TX timeout watchdog (perhaps restarting the timer) */
|
/* Find the new tail of the outgoing frame queue */
|
||||||
|
|
||||||
(void)wd_start(priv->md_txtimeout, skeleton_TXTIMEOUT,
|
for (priv->md_tail = iob, iob = iob->io_flink;
|
||||||
macnet_txtimeout_expiry, 1, (wdparm_t)priv);
|
iob != NULL;
|
||||||
return OK;
|
priv->md_tail = iob, iob = iob->io_flink);
|
||||||
|
|
||||||
|
/* Notify the radio driver that there is data available */
|
||||||
|
#warning Missing logic
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -646,17 +711,21 @@ static int macnet_transmit(FAR struct macnet_driver_s *priv)
|
|||||||
|
|
||||||
static int macnet_txpoll(FAR struct net_driver_s *dev)
|
static int macnet_txpoll(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;
|
||||||
|
FAR struct iob_s *iob;
|
||||||
|
|
||||||
/* If the polling resulted in data that should be sent out, the field
|
/* If the polling resulted in data that should be sent out, the field
|
||||||
* i_framelist will set to a new, outgoing list of frames.
|
* i_framelist will set to a new, outgoing list of frames.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (priv->md_dev.i_framelist != NULL)
|
if (priv->lo_ieee.i_framelist != NULL)
|
||||||
{
|
{
|
||||||
/* And send the packet */
|
/* Remove the frame list from the driver structure and append it to
|
||||||
|
* the tail of the ist of outgoing frames.
|
||||||
|
*/
|
||||||
|
|
||||||
macnet_transmit(priv);
|
macnet_txqueue(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If zero is returned, the polling will continue until all connections have
|
/* If zero is returned, the polling will continue until all connections have
|
||||||
@ -711,14 +780,17 @@ static void macnet_receive(FAR struct macnet_driver_s *priv)
|
|||||||
sixlowpan_input(&priv->md_dev);
|
sixlowpan_input(&priv->md_dev);
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that should be sent
|
/* If the above function invocation resulted in data that should be sent
|
||||||
* out, the field i_framelist will set to a new, outgoing list of frames.
|
* out, the field i_framelist will have been set to a new, outgoing list
|
||||||
|
* of frames.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (priv->md_dev.i_framelist != NULL)
|
if (priv->md_dev.i_framelist != NULL)
|
||||||
{
|
{
|
||||||
/* And send the packet */
|
/* Remove the frame list from the driver structure and append it to
|
||||||
|
* the tail of the ist of outgoing frames.
|
||||||
|
*/
|
||||||
|
|
||||||
macnet_transmit(priv);
|
macnet_txqueue(priv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user