ieee802154: Finishes transmission of beacon frames, and performing a passive scan

This commit is contained in:
Anthony Merlino
2017-06-25 18:07:50 -04:00
parent bdf4836ac7
commit da8afe9d9e
18 changed files with 1163 additions and 373 deletions
@@ -984,8 +984,9 @@ CONFIG_WIRELESS=y
CONFIG_WIRELESS_IEEE802154=y CONFIG_WIRELESS_IEEE802154=y
CONFIG_IEEE802154_DEFAULT_EADDR=0x00fade00deadbeef CONFIG_IEEE802154_DEFAULT_EADDR=0x00fade00deadbeef
CONFIG_MAC802154_HPWORK=y CONFIG_MAC802154_HPWORK=y
CONFIG_MAC802154_NNOTIF=6
CONFIG_MAC802154_NTXDESC=3 CONFIG_MAC802154_NTXDESC=3
CONFIG_MAC802154_NNOTIF=6
CONFIG_MAC802154_NPANDESC=5
CONFIG_IEEE802154_IND_PREALLOC=20 CONFIG_IEEE802154_IND_PREALLOC=20
CONFIG_IEEE802154_IND_IRQRESERVE=10 CONFIG_IEEE802154_IND_IRQRESERVE=10
CONFIG_IEEE802154_MACDEV=y CONFIG_IEEE802154_MACDEV=y
@@ -1167,10 +1168,10 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024
CONFIG_EXAMPLES_NSH=y CONFIG_EXAMPLES_NSH=y
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
# CONFIG_EXAMPLES_NULL is not set # CONFIG_EXAMPLES_NULL is not set
# CONFIG_EXAMPLES_NX is not set
# CONFIG_EXAMPLES_NXFFS is not set # CONFIG_EXAMPLES_NXFFS is not set
# CONFIG_EXAMPLES_NXHELLO is not set # CONFIG_EXAMPLES_NXHELLO is not set
# CONFIG_EXAMPLES_NXIMAGE is not set # CONFIG_EXAMPLES_NXIMAGE is not set
# CONFIG_EXAMPLES_NX is not set
# CONFIG_EXAMPLES_NXLINES is not set # CONFIG_EXAMPLES_NXLINES is not set
# CONFIG_EXAMPLES_NXTERM is not set # CONFIG_EXAMPLES_NXTERM is not set
# CONFIG_EXAMPLES_NXTEXT is not set # CONFIG_EXAMPLES_NXTEXT is not set
+154 -20
View File
@@ -164,7 +164,7 @@ struct mrf24j40_radio_s
struct ieee802154_addr_s addr; struct ieee802154_addr_s addr;
uint8_t channel; /* 11 to 26 for the 2.4 GHz band */ uint8_t chan; /* 11 to 26 for the 2.4 GHz band */
uint8_t devmode; /* device mode: device, coord, pancoord */ uint8_t devmode; /* device mode: device, coord, pancoord */
uint8_t paenabled; /* enable usage of PA */ uint8_t paenabled; /* enable usage of PA */
uint8_t rxmode; /* Reception mode: Main, no CRC, promiscuous */ uint8_t rxmode; /* Reception mode: Main, no CRC, promiscuous */
@@ -181,6 +181,8 @@ struct mrf24j40_radio_s
bool csma_busy : 1; bool csma_busy : 1;
bool reschedule_csma : 1; bool reschedule_csma : 1;
bool rxenabled : 1;
struct ieee802154_txdesc_s *gts_desc[MRF24J40_GTS_SLOTS]; struct ieee802154_txdesc_s *gts_desc[MRF24J40_GTS_SLOTS];
bool gts_busy[MRF24J40_GTS_SLOTS]; bool gts_busy[MRF24J40_GTS_SLOTS];
}; };
@@ -232,6 +234,10 @@ static int mrf24j40_setsaddr(FAR struct mrf24j40_radio_s *dev,
FAR const uint8_t *saddr); FAR const uint8_t *saddr);
static int mrf24j40_seteaddr(FAR struct mrf24j40_radio_s *dev, static int mrf24j40_seteaddr(FAR struct mrf24j40_radio_s *dev,
FAR const uint8_t *eaddr); FAR const uint8_t *eaddr);
static int mrf24j40_setcoordsaddr(FAR struct mrf24j40_radio_s *dev,
FAR const uint8_t *saddr);
static int mrf24j40_setcoordeaddr(FAR struct mrf24j40_radio_s *dev,
FAR const uint8_t *eaddr);
static int mrf24j40_setdevmode(FAR struct mrf24j40_radio_s *dev, static int mrf24j40_setdevmode(FAR struct mrf24j40_radio_s *dev,
uint8_t mode); uint8_t mode);
static int mrf24j40_settxpower(FAR struct mrf24j40_radio_s *dev, static int mrf24j40_settxpower(FAR struct mrf24j40_radio_s *dev,
@@ -261,11 +267,13 @@ static int mrf24j40_rxenable(FAR struct ieee802154_radio_s *dev, bool enable);
static int mrf24j40_req_rxenable(FAR struct ieee802154_radio_s *radio, static int mrf24j40_req_rxenable(FAR struct ieee802154_radio_s *radio,
FAR struct ieee802154_rxenable_req_s *req); FAR struct ieee802154_rxenable_req_s *req);
static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio, static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio,
FAR const struct ieee802154_superframespec_s *sf_spec, FAR const struct ieee802154_superframespec_s *sfspec,
FAR struct ieee802154_beaconframe_s *beacon); FAR struct ieee802154_beaconframe_s *beacon);
static int mrf24j40_beaconupdate(FAR struct ieee802154_radio_s *radio, static int mrf24j40_beaconupdate(FAR struct ieee802154_radio_s *radio,
FAR struct ieee802154_beaconframe_s *beacon); FAR struct ieee802154_beaconframe_s *beacon);
static int mrf24j40_beaconstop(FAR struct ieee802154_radio_s *radio); static int mrf24j40_beaconstop(FAR struct ieee802154_radio_s *radio);
static int mrf24j40_sfupdate(FAR struct ieee802154_radio_s *radio,
FAR const struct ieee802154_superframespec_s *sfspec);
/**************************************************************************** /****************************************************************************
* Private Data * Private Data
@@ -447,7 +455,7 @@ static int mrf24j40_get_attr(FAR struct ieee802154_radio_s *radio,
switch (attr) switch (attr)
{ {
case IEEE802154_ATTR_MAC_EXTENDED_ADDR: case IEEE802154_ATTR_MAC_EADDR:
{ {
memcpy(&attrval->mac.eaddr[0], &dev->addr.eaddr[0], 8); memcpy(&attrval->mac.eaddr[0], &dev->addr.eaddr[0], 8);
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
@@ -468,6 +476,12 @@ static int mrf24j40_get_attr(FAR struct ieee802154_radio_s *radio,
} }
break; break;
case IEEE802154_ATTR_PHY_CHAN:
{
attrval->phy.chan = dev->chan;
ret = IEEE802154_STATUS_SUCCESS;
}
default: default:
ret = IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE; ret = IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE;
} }
@@ -491,16 +505,30 @@ static int mrf24j40_set_attr(FAR struct ieee802154_radio_s *radio,
} }
break; break;
case IEEE802154_ATTR_MAC_SHORT_ADDRESS: case IEEE802154_ATTR_MAC_SADDR:
{ {
mrf24j40_setsaddr(dev, attrval->mac.saddr); mrf24j40_setsaddr(dev, attrval->mac.saddr);
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
} }
break; break;
case IEEE802154_ATTR_MAC_EXTENDED_ADDR: case IEEE802154_ATTR_MAC_EADDR:
{ {
mrf24j40_seteaddr(dev, &attrval->mac.eaddr[0]); mrf24j40_seteaddr(dev, attrval->mac.eaddr);
ret = IEEE802154_STATUS_SUCCESS;
}
break;
case IEEE802154_ATTR_MAC_COORD_SADDR:
{
mrf24j40_setcoordsaddr(dev, attrval->mac.coordsaddr);
ret = IEEE802154_STATUS_SUCCESS;
}
break;
case IEEE802154_ATTR_MAC_COORD_EADDR:
{
mrf24j40_setcoordeaddr(dev, attrval->mac.coordeaddr);
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
} }
break; break;
@@ -528,6 +556,13 @@ static int mrf24j40_set_attr(FAR struct ieee802154_radio_s *radio,
} }
break; break;
case IEEE802154_ATTR_PHY_CHAN:
{
mrf24j40_setchannel(dev, attrval->phy.chan);
ret = IEEE802154_STATUS_SUCCESS;
}
break;
default: default:
ret = IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE; ret = IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE;
break; break;
@@ -543,7 +578,7 @@ static int mrf24j40_req_rxenable(FAR struct ieee802154_radio_s *radio,
} }
static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio, static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio,
FAR const struct ieee802154_superframespec_s *sf_spec, FAR const struct ieee802154_superframespec_s *sfspec,
FAR struct ieee802154_beaconframe_s *beacon) FAR struct ieee802154_beaconframe_s *beacon)
{ {
FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)radio; FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)radio;
@@ -551,7 +586,7 @@ static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio,
uint32_t slpcal = 0; uint32_t slpcal = 0;
int reg; int reg;
if (sf_spec->pancoord) if (sfspec->pancoord)
{ {
/* Set the PANCOORD (RXMCR 0x00<3>) bit = 1to configure as PAN coordinator */ /* Set the PANCOORD (RXMCR 0x00<3>) bit = 1to configure as PAN coordinator */
@@ -588,7 +623,7 @@ static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio,
reg = mrf24j40_getreg(dev->spi, MRF24J40_ESLOTG1); reg = mrf24j40_getreg(dev->spi, MRF24J40_ESLOTG1);
reg &= ~MRF24J40_ESLOTG1_CAP; reg &= ~MRF24J40_ESLOTG1_CAP;
reg |= sf_spec->final_capslot & MRF24J40_ESLOTG1_CAP; reg |= sfspec->final_capslot & MRF24J40_ESLOTG1_CAP;
mrf24j40_setreg(dev->spi, MRF24J40_ESLOTG1, reg); mrf24j40_setreg(dev->spi, MRF24J40_ESLOTG1, reg);
/* TODO: Add GTS related code. See pg 100 of datasheet */ /* TODO: Add GTS related code. See pg 100 of datasheet */
@@ -643,7 +678,7 @@ static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio,
mrf24j40_setreg(dev->spi, MRF24J40_REMCNTL, (MRF24J40_REMCNT & 0xFF)); mrf24j40_setreg(dev->spi, MRF24J40_REMCNTL, (MRF24J40_REMCNT & 0xFF));
mrf24j40_setreg(dev->spi, MRF24J40_REMCNTH, ((MRF24J40_REMCNT >> 8) & 0xFF)); mrf24j40_setreg(dev->spi, MRF24J40_REMCNTH, ((MRF24J40_REMCNT >> 8) & 0xFF));
maincnt = MRF24J40_MAINCNT(sf_spec->beaconorder, (slpcal * 50 / 16)); maincnt = MRF24J40_MAINCNT(sfspec->beaconorder, (slpcal * 50 / 16));
mrf24j40_setreg(dev->spi, MRF24J40_MAINCNT0, (maincnt & 0xFF)); mrf24j40_setreg(dev->spi, MRF24J40_MAINCNT0, (maincnt & 0xFF));
mrf24j40_setreg(dev->spi, MRF24J40_MAINCNT1, ((maincnt >> 8) & 0xFF)); mrf24j40_setreg(dev->spi, MRF24J40_MAINCNT1, ((maincnt >> 8) & 0xFF));
@@ -661,7 +696,7 @@ static int mrf24j40_beaconstart(FAR struct ieee802154_radio_s *radio,
*/ */
mrf24j40_setreg(dev->spi, MRF24J40_ORDER, mrf24j40_setreg(dev->spi, MRF24J40_ORDER,
((sf_spec->beaconorder << 4) & 0xF0) | (sf_spec->sforder & 0x0F)); ((sfspec->beaconorder << 4) & 0xF0) | (sfspec->sforder & 0x0F));
} }
else else
{ {
@@ -686,6 +721,41 @@ static int mrf24j40_beaconstop(FAR struct ieee802154_radio_s *radio)
return -ENOTTY; return -ENOTTY;
} }
static int mrf24j40_sfupdate(FAR struct ieee802154_radio_s *radio,
FAR const struct ieee802154_superframespec_s *sfspec)
{
FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)radio;
int reg;
reg = mrf24j40_getreg(dev->spi, MRF24J40_RXMCR);
if (sfspec->pancoord)
{
reg |= MRF24J40_RXMCR_PANCOORD;
}
else
{
reg &= ~MRF24J40_RXMCR_PANCOORD;
}
mrf24j40_setreg(dev->spi, MRF24J40_RXMCR, reg);
/* Program the CAP end slot (ESLOTG1 0x13<3:0>) value. */
reg = mrf24j40_getreg(dev->spi, MRF24J40_ESLOTG1);
reg &= ~MRF24J40_ESLOTG1_CAP;
reg |= sfspec->final_capslot & MRF24J40_ESLOTG1_CAP;
mrf24j40_setreg(dev->spi, MRF24J40_ESLOTG1, reg);
/* Configure the BO (ORDER 0x10<7:4>) and SO (ORDER 0x10<3:0>) values.
* After configuring BO and SO, the beacon frame will be sent immediately.
*/
mrf24j40_setreg(dev->spi, MRF24J40_ORDER,
((sfspec->beaconorder << 4) & 0xF0) | (sfspec->sforder & 0x0F));
return OK;
}
/**************************************************************************** /****************************************************************************
* Internal Functions * Internal Functions
****************************************************************************/ ****************************************************************************/
@@ -899,7 +969,7 @@ static void mrf24j40_setreg(FAR struct spi_dev_s *spi, uint32_t addr,
* Name: mrf24j40_getreg * Name: mrf24j40_getreg
* *
* Description: * Description:
* Return the value of an MRF24J40 device register * Return the value of an MRF24J40 device register*
* *
****************************************************************************/ ****************************************************************************/
@@ -1117,8 +1187,8 @@ static int mrf24j40_setchannel(FAR struct mrf24j40_radio_s *dev, uint8_t chan)
mrf24j40_resetrfsm(dev); mrf24j40_resetrfsm(dev);
dev->channel = chan; dev->chan = chan;
//wlinfo("%u\n", (unsigned)chan); wlinfo("%u\n", (unsigned)chan);
return OK; return OK;
} }
@@ -1188,6 +1258,51 @@ static int mrf24j40_seteaddr(FAR struct mrf24j40_radio_s *dev,
return OK; return OK;
} }
/****************************************************************************
* Name: mrf24j40_setcoordsaddr
*
* Description:
* Define the coordinator short address. The following addresses are special:
* FFFEh : Broadcast
* FFFFh : Unspecified
*
****************************************************************************/
static int mrf24j40_setcoordsaddr(FAR struct mrf24j40_radio_s *dev,
FAR const uint8_t *saddr)
{
mrf24j40_setreg(dev->spi, MRF24J40_ASSOSADR0, saddr[0]);
mrf24j40_setreg(dev->spi, MRF24J40_ASSOSADR1, saddr[1]);
IEEE802154_SADDRCOPY(dev->addr.saddr, saddr);
wlinfo("%02X:%02X\n", saddr[1], saddr[0]);
return OK;
}
/****************************************************************************
* Name: mrf24j40_setcoordeaddr
*
* Description:
* Define the coordinator extended address. The following addresses are special:
* FFFFFFFFFFFFFFFFh : Unspecified
*
****************************************************************************/
static int mrf24j40_setcoordeaddr(FAR struct mrf24j40_radio_s *dev,
FAR const uint8_t *eaddr)
{
int i;
for (i = 0; i < 8; i++)
{
mrf24j40_setreg(dev->spi, MRF24J40_ASSOEADR0 + i, eaddr[i]);
dev->addr.eaddr[i] = eaddr[i];
}
return OK;
}
/**************************************************************************** /****************************************************************************
* Name: mrf24j40_setdevmode * Name: mrf24j40_setdevmode
* *
@@ -1763,13 +1878,30 @@ static int mrf24j40_rxenable(FAR struct ieee802154_radio_s *radio, bool enable)
FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)radio; FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)radio;
uint8_t reg; uint8_t reg;
dev->rxenabled = enable;
if (enable) if (enable)
{ {
/* Disable packet reception. See pg. 109 of datasheet */
mrf24j40_setreg(dev->spi, MRF24J40_BBREG1, MRF24J40_BBREG1_RXDECINV);
/* Enable rx int */ /* Enable rx int */
reg = mrf24j40_getreg(dev->spi, MRF24J40_INTCON); reg = mrf24j40_getreg(dev->spi, MRF24J40_INTCON);
reg &= ~MRF24J40_INTCON_RXIE; reg &= ~MRF24J40_INTCON_RXIE;
mrf24j40_setreg(dev->spi, MRF24J40_INTCON, reg); mrf24j40_setreg(dev->spi, MRF24J40_INTCON, reg);
/* Purge the RX buffer */
reg = mrf24j40_getreg(dev->spi, MRF24J40_RXFLUSH);
reg |= MRF24J40_RXFLUSH_RXFLUSH;
mrf24j40_setreg(dev->spi, MRF24J40_RXFLUSH, reg);
/* Re-enable packet reception. See pg. 109 of datasheet */
mrf24j40_setreg(dev->spi, MRF24J40_BBREG1, 0);
} }
else else
{ {
@@ -1853,14 +1985,14 @@ done:
mrf24j40_setreg(dev->spi, MRF24J40_RXFLUSH, 1); mrf24j40_setreg(dev->spi, MRF24J40_RXFLUSH, 1);
/* Only enable RX interrupt if we are to be listening when IDLE */
if (dev->rxenabled)
{
/* Enable packet reception */ /* Enable packet reception */
mrf24j40_setreg(dev->spi, MRF24J40_BBREG1, 0); mrf24j40_setreg(dev->spi, MRF24J40_BBREG1, 0);
/* Only enable RX interrupt if we are to be listening when IDLE */
if (dev->rxonidle)
{
reg = mrf24j40_getreg(dev->spi, MRF24J40_INTCON); reg = mrf24j40_getreg(dev->spi, MRF24J40_INTCON);
reg &= ~MRF24J40_INTCON_RXIE; reg &= ~MRF24J40_INTCON_RXIE;
mrf24j40_setreg(dev->spi, MRF24J40_INTCON, reg); mrf24j40_setreg(dev->spi, MRF24J40_INTCON, reg);
@@ -1900,7 +2032,6 @@ static void mrf24j40_irqworker(FAR void *arg)
/* Read and store INTSTAT - this clears the register. */ /* Read and store INTSTAT - this clears the register. */
intstat = mrf24j40_getreg(dev->spi, MRF24J40_INTSTAT); intstat = mrf24j40_getreg(dev->spi, MRF24J40_INTSTAT);
wlinfo("INT%02X\n", intstat);
/* Do work according to the pending interrupts */ /* Do work according to the pending interrupts */
@@ -1919,7 +2050,7 @@ static void mrf24j40_irqworker(FAR void *arg)
mrf24j40_setreg(dev->spi, MRF24J40_INTCON, reg); mrf24j40_setreg(dev->spi, MRF24J40_INTCON, reg);
} }
if ((intstat & MRF24J40_INTSTAT_RXIF)) if ((intstat & MRF24J40_INTSTAT_RXIF) && dev->rxenabled)
{ {
/* A packet was received, retrieve it */ /* A packet was received, retrieve it */
@@ -2057,10 +2188,13 @@ FAR struct ieee802154_radio_s *mrf24j40_init(FAR struct spi_dev_s *spi,
dev->radio.beaconstart = mrf24j40_beaconstart; dev->radio.beaconstart = mrf24j40_beaconstart;
dev->radio.beaconupdate = mrf24j40_beaconupdate; dev->radio.beaconupdate = mrf24j40_beaconupdate;
dev->radio.beaconstop = mrf24j40_beaconstop; dev->radio.beaconstop = mrf24j40_beaconstop;
dev->radio.sfupdate = mrf24j40_sfupdate;
dev->lower = lower; dev->lower = lower;
dev->spi = spi; dev->spi = spi;
dev->rxenabled = false;
mrf24j40_initialize(dev); mrf24j40_initialize(dev);
mrf24j40_setchannel(dev, 11); mrf24j40_setchannel(dev, 11);
+51 -35
View File
@@ -118,41 +118,41 @@
#define MRF24J40_SLPCAL1 (MRF24J40_LONGREG_BASE + 0x0A) #define MRF24J40_SLPCAL1 (MRF24J40_LONGREG_BASE + 0x0A)
#define MRF24J40_SLPCAL2 (MRF24J40_LONGREG_BASE + 0x0B) #define MRF24J40_SLPCAL2 (MRF24J40_LONGREG_BASE + 0x0B)
#define MRF24J40_RFSTATE (MRF24J40_LONGREG_BASE + 0x0F) #define MRF24J40_RFSTATE (MRF24J40_LONGREG_BASE + 0x0F)
#define MRF24J40_RSSI 0x80000210 #define MRF24J40_RSSI (MRF24J40_LONGREG_BASE + 0x10)
#define MRF24J40_SLPCON0 0x80000211 #define MRF24J40_SLPCON0 (MRF24J40_LONGREG_BASE + 0x11)
#define MRF24J40_SLPCON1 0x80000220 #define MRF24J40_SLPCON1 (MRF24J40_LONGREG_BASE + 0x20)
#define MRF24J40_WAKETIMEL 0x80000222 #define MRF24J40_WAKETIMEL (MRF24J40_LONGREG_BASE + 0x22)
#define MRF24J40_WAKETIMEH 0x80000223 #define MRF24J40_WAKETIMEH (MRF24J40_LONGREG_BASE + 0x23)
#define MRF24J40_REMCNTL 0x80000224 #define MRF24J40_REMCNTL (MRF24J40_LONGREG_BASE + 0x24)
#define MRF24J40_REMCNTH 0x80000225 #define MRF24J40_REMCNTH (MRF24J40_LONGREG_BASE + 0x25)
#define MRF24J40_MAINCNT0 0x80000226 #define MRF24J40_MAINCNT0 (MRF24J40_LONGREG_BASE + 0x26)
#define MRF24J40_MAINCNT1 0x80000227 #define MRF24J40_MAINCNT1 (MRF24J40_LONGREG_BASE + 0x27)
#define MRF24J40_MAINCNT2 0x80000228 #define MRF24J40_MAINCNT2 (MRF24J40_LONGREG_BASE + 0x28)
#define MRF24J40_MAINCNT3 0x80000229 #define MRF24J40_MAINCNT3 (MRF24J40_LONGREG_BASE + 0x29)
#define MRF24J40_TESTMODE 0x8000022F #define MRF24J40_TESTMODE (MRF24J40_LONGREG_BASE + 0x2F)
#define MRF24J40_ASSOEADR0 0x80000230 #define MRF24J40_ASSOEADR0 (MRF24J40_LONGREG_BASE + 0x30)
#define MRF24J40_ASSOEADR1 0x80000231 #define MRF24J40_ASSOEADR1 (MRF24J40_LONGREG_BASE + 0x31)
#define MRF24J40_ASSOEADR2 0x80000232 #define MRF24J40_ASSOEADR2 (MRF24J40_LONGREG_BASE + 0x32)
#define MRF24J40_ASSOEADR3 0x80000233 #define MRF24J40_ASSOEADR3 (MRF24J40_LONGREG_BASE + 0x33)
#define MRF24J40_ASSOEADR4 0x80000234 #define MRF24J40_ASSOEADR4 (MRF24J40_LONGREG_BASE + 0x34)
#define MRF24J40_ASSOEADR5 0x80000235 #define MRF24J40_ASSOEADR5 (MRF24J40_LONGREG_BASE + 0x35)
#define MRF24J40_ASSOEADR6 0x80000236 #define MRF24J40_ASSOEADR6 (MRF24J40_LONGREG_BASE + 0x36)
#define MRF24J40_ASSOEADR7 0x80000237 #define MRF24J40_ASSOEADR7 (MRF24J40_LONGREG_BASE + 0x37)
#define MRF24J40_ASSOSADR0 0x80000238 #define MRF24J40_ASSOSADR0 (MRF24J40_LONGREG_BASE + 0x38)
#define MRF24J40_ASSOSADR1 0x80000239 #define MRF24J40_ASSOSADR1 (MRF24J40_LONGREG_BASE + 0x39)
#define MRF24J40_UPNONCE0 0x80000240 #define MRF24J40_UPNONCE0 (MRF24J40_LONGREG_BASE + 0x40)
#define MRF24J40_UPNONCE1 0x80000241 #define MRF24J40_UPNONCE1 (MRF24J40_LONGREG_BASE + 0x41)
#define MRF24J40_UPNONCE2 0x80000242 #define MRF24J40_UPNONCE2 (MRF24J40_LONGREG_BASE + 0x42)
#define MRF24J40_UPNONCE3 0x80000243 #define MRF24J40_UPNONCE3 (MRF24J40_LONGREG_BASE + 0x43)
#define MRF24J40_UPNONCE4 0x80000244 #define MRF24J40_UPNONCE4 (MRF24J40_LONGREG_BASE + 0x44)
#define MRF24J40_UPNONCE5 0x80000245 #define MRF24J40_UPNONCE5 (MRF24J40_LONGREG_BASE + 0x45)
#define MRF24J40_UPNONCE6 0x80000246 #define MRF24J40_UPNONCE6 (MRF24J40_LONGREG_BASE + 0x46)
#define MRF24J40_UPNONCE7 0x80000247 #define MRF24J40_UPNONCE7 (MRF24J40_LONGREG_BASE + 0x47)
#define MRF24J40_UPNONCE8 0x80000248 #define MRF24J40_UPNONCE8 (MRF24J40_LONGREG_BASE + 0x48)
#define MRF24J40_UPNONCE9 0x80000249 #define MRF24J40_UPNONCE9 (MRF24J40_LONGREG_BASE + 0x49)
#define MRF24J40_UPNONCE10 0x8000024A #define MRF24J40_UPNONCE10 (MRF24J40_LONGREG_BASE + 0x4A)
#define MRF24J40_UPNONCE11 0x8000024B #define MRF24J40_UPNONCE11 (MRF24J40_LONGREG_BASE + 0x4B)
#define MRF24J40_UPNONCE12 0x8000024C #define MRF24J40_UPNONCE12 (MRF24J40_LONGREG_BASE + 0x4C)
/* INTSTAT bits */ /* INTSTAT bits */
@@ -265,4 +265,20 @@
#define MRF24J40_SLPACK_WAKECNT0_6 0x7F #define MRF24J40_SLPACK_WAKECNT0_6 0x7F
#define MRF24J40_SLPACK_SLPACK 0x80 #define MRF24J40_SLPACK_SLPACK 0x80
/* RXFLUSH bits */
#define MRF24J40_RXFLUSH_RXFLUSH 0x01
#define MRF24J40_RXFLUSH_BCNONLY 0x02
#define MRF24J40_RXFLUSH_DATAONLY 0x04
#define MRF24J40_RXFLUSH_CMDONLY 0x08
#define MRF24J40_RXFLUSH_WAKEPAD 0x20
#define MRF24J40_RXFLUSH_WAKEPOL 0x40
#define MRF24J40_RXFLUSH_SHIFT_RXFLUSH 0
#define MRF24J40_RXFLUSH_SHIFT_BCNONLY 1
#define MRF24J40_RXFLUSH_SHIFT_DATAONLY 2
#define MRF24J40_RXFLUSH_SHIFT_CMDONLY 3
#define MRF24J40_RXFLUSH_SHIFT_WAKEPAD 5
#define MRF24J40_RXFLUSH_SHIFT_WAKEPOL 6
#endif /* __DRIVERS_WIRELESS_IEEE802154_MRF24J40_H */ #endif /* __DRIVERS_WIRELESS_IEEE802154_MRF24J40_H */
@@ -60,6 +60,14 @@
/**************************************************************************** /****************************************************************************
* Pre-Processor Definitions * Pre-Processor Definitions
****************************************************************************/ ****************************************************************************/
/* Configuration ************************************************************/
#if !defined(CONFIG_MAC802154_NPANDESC) || CONFIG_MAC802154_NPANDESC <= 0
# undef CONFIG_MAC802154_NPANDESC
# define CONFIG_MAC802154_NPANDESC 5
#endif
#define MAC802154_NPANDESC CONFIG_MAC802154_NPANDESC
/* IEEE 802.15.4 address macros */ /* IEEE 802.15.4 address macros */
/* Copy a an IEEE 802.15.4 address */ /* Copy a an IEEE 802.15.4 address */
@@ -97,8 +105,6 @@
#define IEEE802154_SADDR_BCAST ((uint8_t[]){0xFE,0xFF}) #define IEEE802154_SADDR_BCAST ((uint8_t[]){0xFE,0xFF})
#define IEEE802154_EADDR_UNSPEC ((uint8_t[]){0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}) #define IEEE802154_EADDR_UNSPEC ((uint8_t[]){0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF})
/* Configuration ************************************************************/
/* None at the moment */
/* IEEE 802.15.4 MAC Character Driver IOCTL Commands ************************/ /* IEEE 802.15.4 MAC Character Driver IOCTL Commands ************************/
@@ -111,9 +117,9 @@
* - Response * - Response
* - Confirm * - Confirm
* *
* Of these, Request and Response primitives are sent from the next highest layer * Of these, Request and Response primitives are sent from the next highest
* to the MLME. Indication and Confirm primitives are used to notify the next * layer to the MLME. Indication and Confirm primitives are used to notify the
* highest layer of changes or actions that have taken place. * next highest layer of changes or actions that have taken place.
* *
* The MAC802154 character driver exposed here provides IOCTL hooks for all * The MAC802154 character driver exposed here provides IOCTL hooks for all
* Request and Response primitives. * Request and Response primitives.
@@ -178,8 +184,35 @@
#define IEEE802154_SFSPEC_SHIFT_PANCOORD 14 /* PAN Coordinator, bit 14 */ #define IEEE802154_SFSPEC_SHIFT_PANCOORD 14 /* PAN Coordinator, bit 14 */
#define IEEE802154_SFSPEC_SHIFT_ASSOCPERMIT 15 /* Association Permit, bit 15 */ #define IEEE802154_SFSPEC_SHIFT_ASSOCPERMIT 15 /* Association Permit, bit 15 */
/* GTS Specification field masks, 1 byte
* Seee IEEE 802.15.4/2011 5.2.2.1.3 page 63
*/
#define IEEE802154_GTSSPEC_DESCCOUNT 0x07 /* GTS Desc. count, bits 0-2 */
#define IEEE802154_GTSSPEC_PERMIT 0x80 /* GTS Desc. count, bit 7 */
#define IEEE802154_GTSSPEC_SHIFT_DESCCOUNT 0 /* GTS Desc. count, bits 0-2 */
#define IEEE802154_GTSSPEC_SHIFT_PERMIT 7 /* GTS Desc. count, bit 7 */
/* GTS Directions field masks, 1 byte
* Seee IEEE 802.15.4/2011 5.2.2.1.3 page 63
*/
#define IEEE802154_GTSDIR_MASK 0x7F /* GTS Directions Mask, bits 0-6 */
#define IEEE802154_GTSDIR_SHIFT_MASK 0 /* GTS Directions Mask, bits 0-6 */
/* Pending address specifications field masks, 1 byte
* See IEEE 802.15.4/2011 5.2.2.1.6 page 64
*/
#define IEEE802154_PENDADDR_NSADDR 0x07 /* # of short addresses, bits 0-2 */
#define IEEE802154_PENDADDR_NEADDR 0x70 /* # of extended addresses, bits 4-6 */
#define IEEE802154_PENDADDR_SHIFT_NSADDR 0 /* # of short addresses, bits 0-2 */
#define IEEE802154_PENDADDR_SHIFT_NEADDR 4 /* # of extended addresses, bits 4-6 */
/* Capability Information Bitfield /* Capability Information Bitfield
*
*/ */
#define IEEE802154_CAPABILITY_DEVTYPE 0x02 #define IEEE802154_CAPABILITY_DEVTYPE 0x02
@@ -237,7 +270,6 @@
#define MAX_ORPHAN_ADDR 32 /* REVISIT */ #define MAX_ORPHAN_ADDR 32 /* REVISIT */
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/
@@ -282,6 +314,7 @@ enum ieee802154_status_e
IEEE802154_STATUS_TX_ACTIVE, IEEE802154_STATUS_TX_ACTIVE,
IEEE802154_STATUS_UNAVAILABLE_KEY, IEEE802154_STATUS_UNAVAILABLE_KEY,
IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE, IEEE802154_STATUS_UNSUPPORTED_ATTRIBUTE,
IEEE802154_STATUS_LIMITREACHED,
}; };
static const char *IEEE802154_STATUS_STRING[] = static const char *IEEE802154_STATUS_STRING[] =
@@ -309,6 +342,7 @@ static const char *IEEE802154_STATUS_STRING[] =
"Tx active", "Tx active",
"Unavailable key", "Unavailable key",
"Unsupported attribute", "Unsupported attribute",
"Limit reached",
}; };
/* IEEE 802.15.4 PHY/MAC PIB attributes IDs */ /* IEEE 802.15.4 PHY/MAC PIB attributes IDs */
@@ -317,7 +351,7 @@ enum ieee802154_attr_e
{ {
/* PHY PIB Attributes */ /* PHY PIB Attributes */
IEEE802154_ATTR_PHY_CURRENT_CHANNEL = 0x00, IEEE802154_ATTR_PHY_CHAN = 0x00,
IEEE802154_ATTR_PHY_CHANNELS_SUPPORTED, IEEE802154_ATTR_PHY_CHANNELS_SUPPORTED,
IEEE802154_ATTR_PHY_TX_POWER_TOLERANCE, IEEE802154_ATTR_PHY_TX_POWER_TOLERANCE,
IEEE802154_ATTR_PHY_TX_POWER, IEEE802154_ATTR_PHY_TX_POWER,
@@ -357,7 +391,7 @@ enum ieee802154_attr_e
/* MAC PIB Attributes */ /* MAC PIB Attributes */
IEEE802154_ATTR_MAC_EXTENDED_ADDR = 0x40, IEEE802154_ATTR_MAC_EADDR = 0x40,
IEEE802154_ATTR_MAC_ACK_WAIT_DUR, IEEE802154_ATTR_MAC_ACK_WAIT_DUR,
IEEE802154_ATTR_MAC_ASSOCIATED_PANCOORD, IEEE802154_ATTR_MAC_ASSOCIATED_PANCOORD,
IEEE802154_ATTR_MAC_ASSOCIATION_PERMIT, IEEE802154_ATTR_MAC_ASSOCIATION_PERMIT,
@@ -369,8 +403,8 @@ enum ieee802154_attr_e
IEEE802154_ATTR_MAC_BEACON_ORDER, IEEE802154_ATTR_MAC_BEACON_ORDER,
IEEE802154_ATTR_MAC_BEACON_TX_TIME, IEEE802154_ATTR_MAC_BEACON_TX_TIME,
IEEE802154_ATTR_MAC_BSN, IEEE802154_ATTR_MAC_BSN,
IEEE802154_ATTR_MAC_COORD_EXT_ADDR, IEEE802154_ATTR_MAC_COORD_EADDR,
IEEE802154_ATTR_MAC_COORD_SHORT_ADDR, IEEE802154_ATTR_MAC_COORD_SADDR,
IEEE802154_ATTR_MAC_DSN, IEEE802154_ATTR_MAC_DSN,
IEEE802154_ATTR_MAC_GTS_PERMIT, IEEE802154_ATTR_MAC_GTS_PERMIT,
IEEE802154_ATTR_MAC_MAX_BE, IEEE802154_ATTR_MAC_MAX_BE,
@@ -386,7 +420,7 @@ enum ieee802154_attr_e
IEEE802154_ATTR_MAC_RESPONSE_WAIT_TIME, IEEE802154_ATTR_MAC_RESPONSE_WAIT_TIME,
IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE, IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE,
IEEE802154_ATTR_MAC_SECURITY_ENABLED, IEEE802154_ATTR_MAC_SECURITY_ENABLED,
IEEE802154_ATTR_MAC_SHORT_ADDRESS, IEEE802154_ATTR_MAC_SADDR,
IEEE802154_ATTR_MAC_SUPERFRAME_ORDER, IEEE802154_ATTR_MAC_SUPERFRAME_ORDER,
IEEE802154_ATTR_MAC_SYNC_SYMBOL_OFFSET, IEEE802154_ATTR_MAC_SYNC_SYMBOL_OFFSET,
IEEE802154_PIB_MAC_TIMESTAMP_SUPPORT, IEEE802154_PIB_MAC_TIMESTAMP_SUPPORT,
@@ -539,20 +573,20 @@ struct ieee802154_superframespec_s
uint16_t assocpermit : 1; /* 1 if coordinator is accepting associaton */ uint16_t assocpermit : 1; /* 1 if coordinator is accepting associaton */
}; };
struct ieee802154_pan_desc_s struct ieee802154_pandesc_s
{ {
/* The coordinator address of the received beacon frame */ /* The coordinator address of the received beacon frame */
struct ieee802154_addr_s coord_addr; struct ieee802154_addr_s coordaddr;
uint8_t channel; /* current channel occupied by the network */ uint8_t chan; /* current channel occupied by the network */
uint8_t channel_page; /* current channel page occupied by the network */ uint8_t chpage; /* current channel page occupied by the network */
/* The superframe specifications received in the beacon frame */ /* The superframe specifications received in the beacon frame */
struct ieee802154_superframespec_s superframespec; struct ieee802154_superframespec_s sfspec;
uint8_t gts_permit; /* 0=No GTS requests allowed uint8_t gtspermit; /* 0=No GTS requests allowed
* 1=GTS request allowed */ * 1=GTS request allowed */
uint8_t lqi; /* Link Quality Indication of the beacon */ uint8_t lqi; /* Link Quality Indication of the beacon */
uint32_t timestamp; /* Time at which the beacon frame was received uint32_t timestamp; /* Time at which the beacon frame was received
@@ -591,8 +625,8 @@ union ieee802154_macattr_u
uint8_t saddr[IEEE802154_SADDRSIZE]; uint8_t saddr[IEEE802154_SADDRSIZE];
uint8_t panid[IEEE802154_PANIDSIZE]; uint8_t panid[IEEE802154_PANIDSIZE];
uint8_t coord_eaddr[IEEE802154_EADDRSIZE]; uint8_t coordeaddr[IEEE802154_EADDRSIZE];
uint8_t coord_saddr[IEEE802154_SADDRSIZE]; uint8_t coordsaddr[IEEE802154_SADDRSIZE];
enum ieee802154_devmode_e devmode; enum ieee802154_devmode_e devmode;
@@ -636,7 +670,7 @@ union ieee802154_macattr_u
union ieee802154_phyattr_u union ieee802154_phyattr_u
{ {
uint8_t channel; uint8_t chan;
int32_t txpwr; int32_t txpwr;
uint32_t symdur_picosec; uint32_t symdur_picosec;
/* TODO: Fill this out as we implement supported get/set commands */ /* TODO: Fill this out as we implement supported get/set commands */
@@ -862,9 +896,39 @@ struct ieee802154_purge_req_s
struct ieee802154_assoc_req_s struct ieee802154_assoc_req_s
{ {
uint8_t chnum; /* Channel number to attempt association */ uint8_t chan; /* Channel number to attempt association */
uint8_t chpage; /* Channel page to attempt association */ uint8_t chpage; /* Channel page to attempt association */
/* TODO:
* This is a non-standard field. I believe there is a catch 22 in the
* standard and until I can figure it out, I'm adding this boolean to let the
* application tell the MAC whether it is trying to assocaite with a beacon
* enabled PAN or non-beacon enabled PAN. If it is beacon-enabled, the MAC
* will track the beacon first before transmitting the association. This can
* take some time depending on the beacon interval. If the PAN is non-beacon
* enabled, the association request is sent immediately via CSMA.
*
* The catch 22: The standard outlines the procedure for associating: reset
* the MAC, scan to find PAN's and pass coordinator address info to
* application, application calls associate passing address info of
* coordinator. Which sounds good. The problem is that the primitive has no
* field for determining if the PAN we are trying to join is beacon enabled
* or not. Which means we don't know whether to tranmsit immediately or try
* to track the beacon. The standard does say that ALL command frames should
* be sent during the Contention Access Period (CAP), but how could you send
* it at the rigth tiem, if you are not tracking the beacon. What's worse is
* in the association section, it says if you are tracking the beacon, to
* send the association request during the CAP. But how can you track the
* beacon if you are not associated. Normally tracking the beacon would be
* triggered by the SYNC.request primitive. But from my understanding that
* primitive is intended to be used AFTER association since it requires the
* MAC to already have a coordinator address and PAN ID so that it can track
* the beacon frames properly. Which, of course, how could the MAC have that
* info if it is not associated.
*/
bool beacon;
/* Coordinator Address with which to associate */ /* Coordinator Address with which to associate */
struct ieee802154_addr_s coordaddr; struct ieee802154_addr_s coordaddr;
@@ -1054,7 +1118,7 @@ struct ieee802154_beaconnotify_ind_s
/* PAN descriptor for the received beacon */ /* PAN descriptor for the received beacon */
struct ieee802154_pan_desc_s pan_desc; struct ieee802154_pandesc_s pandesc;
/* Beacon pending addresses */ /* Beacon pending addresses */
@@ -1255,20 +1319,17 @@ struct ieee802154_scan_req_s
{ {
enum ieee802154_scantype_e type; enum ieee802154_scantype_e type;
uint8_t duration; uint8_t duration;
uint8_t ch_page; uint8_t chpage;
uint8_t channels[15];
uint8_t numchan;
#ifdef CONFIG_IEEE802154_SECURITY #ifdef CONFIG_IEEE802154_SECURITY
/* Security information if enabled */ /* Security information if enabled */
struct ieee802154_security_s security; struct ieee802154_security_s security;
#endif #endif
uint8_t channels[1];
}; };
#define SIZEOF_IEEE802154_SCAN_REQ_S(n) \
(sizeof(struct ieee802154_scan_req_s) + (n) - 1)
/***************************************************************************** /*****************************************************************************
* Primitive: MLME-SCAN.confirm * Primitive: MLME-SCAN.confirm
* *
@@ -1281,10 +1342,12 @@ struct ieee802154_scan_conf_s
{ {
enum ieee802154_status_e status; enum ieee802154_status_e status;
enum ieee802154_scantype_e type; enum ieee802154_scantype_e type;
uint8_t ch_page; uint8_t chpage;
uint8_t num_channels; uint8_t unscanned[15];
uint8_t numunscanned;
/* TODO: Figure out how to handle missing primitive semantics. See standard. */ uint8_t numdesc;
struct ieee802154_pandesc_s pandescs[MAC802154_NPANDESC];
uint8_t edlist[MAC802154_NPANDESC];
}; };
/***************************************************************************** /*****************************************************************************
@@ -1335,7 +1398,7 @@ struct ieee802154_set_req_s
struct ieee802154_start_req_s struct ieee802154_start_req_s
{ {
uint8_t panid[IEEE802154_PANIDSIZE]; uint8_t panid[IEEE802154_PANIDSIZE];
uint8_t chnum; uint8_t chan;
uint8_t chpage; uint8_t chpage;
uint32_t starttime : 24; uint32_t starttime : 24;
@@ -134,11 +134,13 @@ struct ieee802154_radio_s
CODE int (*req_rxenable)(FAR struct ieee802154_radio_s *radio, CODE int (*req_rxenable)(FAR struct ieee802154_radio_s *radio,
FAR struct ieee802154_rxenable_req_s *req); FAR struct ieee802154_rxenable_req_s *req);
CODE int (*beaconstart)(FAR struct ieee802154_radio_s *radio, CODE int (*beaconstart)(FAR struct ieee802154_radio_s *radio,
FAR const struct ieee802154_superframespec_s *sf_spec, FAR const struct ieee802154_superframespec_s *sfspec,
FAR struct ieee802154_beaconframe_s *beacon); FAR struct ieee802154_beaconframe_s *beacon);
CODE int (*beaconupdate)(FAR struct ieee802154_radio_s *radio, CODE int (*beaconupdate)(FAR struct ieee802154_radio_s *radio,
FAR struct ieee802154_beaconframe_s *beacon); FAR struct ieee802154_beaconframe_s *beacon);
CODE int (*beaconstop)(FAR struct ieee802154_radio_s *radio); CODE int (*beaconstop)(FAR struct ieee802154_radio_s *radio);
CODE int (*sfupdate)(FAR struct ieee802154_radio_s *radio,
FAR const struct ieee802154_superframespec_s *sfspec);
}; };
#ifdef __cplusplus #ifdef __cplusplus
+10
View File
@@ -73,6 +73,16 @@ config MAC802154_NNOTIF
receiver with an allocated notification structure indicating the event. The receiver with an allocated notification structure indicating the event. The
events are primitives such as Association Indication etc. events are primitives such as Association Indication etc.
config MAC802154_NPANDESC
int "Number of PAN descriptors"
default 5
---help---
Configured number of PAN descriptors Default: 5
When performing a scan to find a suitable PAN, the MAC must store
information for all unique beacons received. This is the number of unique
descriptors that can be held before the scan cancels with LIMIT_REACHED.
config IEEE802154_IND_PREALLOC config IEEE802154_IND_PREALLOC
int "Number of pre-allocated meta-data structures" int "Number of pre-allocated meta-data structures"
default 20 default 20
+8
View File
@@ -0,0 +1,8 @@
This will eventually hold some general documentation for the IEEE 802.15.4
MAC implementation.
NOTE: Throughout the code, excerpts from the standard are quoted as to make
the code thoroughly readable. I have tried, to always put a reference [1] and
page number. Below is the references that correspond with the reference number
[1]
+217 -27
View File
@@ -59,6 +59,7 @@
#include "mac802154_notif.h" #include "mac802154_notif.h"
#include "mac802154_internal.h" #include "mac802154_internal.h"
#include "mac802154_assoc.h" #include "mac802154_assoc.h"
#include "mac802154_scan.h"
#include "mac802154_data.h" #include "mac802154_data.h"
#include "mac802154_poll.h" #include "mac802154_poll.h"
@@ -98,9 +99,11 @@ static void mac802154_timeout_expiry(int argc, wdparm_t arg, ...);
static uint32_t mac802154_symtoticks(FAR struct ieee802154_privmac_s *priv, static uint32_t mac802154_symtoticks(FAR struct ieee802154_privmac_s *priv,
uint32_t symbols); uint32_t symbols);
static void mac802154_rx_datareq(FAR struct ieee802154_privmac_s *priv, static void mac802154_rxdatareq(FAR struct ieee802154_privmac_s *priv,
FAR struct ieee802154_data_ind_s *ind); FAR struct ieee802154_data_ind_s *ind);
static void mac802154_rx_dataframe(FAR struct ieee802154_privmac_s *priv, static void mac802154_rxdataframe(FAR struct ieee802154_privmac_s *priv,
FAR struct ieee802154_data_ind_s *ind);
static void mac802154_rxbeaconframe(FAR struct ieee802154_privmac_s *priv,
FAR struct ieee802154_data_ind_s *ind); FAR struct ieee802154_data_ind_s *ind);
/**************************************************************************** /****************************************************************************
@@ -438,20 +441,20 @@ void mac802154_updatebeacon(FAR struct ieee802154_privmac_s *priv)
beacon->bf_data[beacon->bf_len + 1] = 0; beacon->bf_data[beacon->bf_len + 1] = 0;
IEEE802154_SETBEACONORDER(beacon->bf_data, beacon->bf_len, IEEE802154_SETBEACONORDER(beacon->bf_data, beacon->bf_len,
priv->sf_spec.beaconorder); priv->sfspec.beaconorder);
IEEE802154_SETSFORDER(beacon->bf_data, beacon->bf_len, IEEE802154_SETSFORDER(beacon->bf_data, beacon->bf_len,
priv->sf_spec.sforder); priv->sfspec.sforder);
IEEE802154_SETFINCAPSLOT(beacon->bf_data, beacon->bf_len, IEEE802154_SETFINCAPSLOT(beacon->bf_data, beacon->bf_len,
priv->sf_spec.final_capslot); priv->sfspec.final_capslot);
if (priv->sf_spec.ble) if (priv->sfspec.ble)
{ {
IEEE802154_SETBLE(beacon->bf_data, beacon->bf_len); IEEE802154_SETBLE(beacon->bf_data, beacon->bf_len);
} }
if (priv->sf_spec.pancoord) if (priv->sfspec.pancoord)
{ {
IEEE802154_SETPANCOORD(beacon->bf_data, beacon->bf_len); IEEE802154_SETPANCOORD(beacon->bf_data, beacon->bf_len);
} }
if (priv->sf_spec.assocpermit) if (priv->sfspec.assocpermit)
{ {
IEEE802154_SETASSOCPERMIT(beacon->bf_data, beacon->bf_len); IEEE802154_SETASSOCPERMIT(beacon->bf_data, beacon->bf_len);
} }
@@ -546,10 +549,10 @@ void mac802154_setupindirect(FAR struct ieee802154_privmac_s *priv,
* aBaseSuperframeDuration. [1] pg. 129 * aBaseSuperframeDuration. [1] pg. 129
*/ */
if (priv->sf_spec.beaconorder < 15) if (priv->sfspec.beaconorder < 15)
{ {
symbols = priv->trans_persisttime * symbols = priv->trans_persisttime *
(IEEE802154_BASE_SUPERFRAME_DURATION * (1 << priv->sf_spec.beaconorder)); (IEEE802154_BASE_SUPERFRAME_DURATION * (1 << priv->sfspec.beaconorder));
} }
else else
{ {
@@ -562,7 +565,7 @@ void mac802154_setupindirect(FAR struct ieee802154_privmac_s *priv,
/* Make sure the beacon gets updated */ /* Make sure the beacon gets updated */
if (priv->sf_spec.beaconorder < 15) if (priv->sfspec.beaconorder < 15)
{ {
priv->beaconupdate = true; priv->beaconupdate = true;
} }
@@ -1056,7 +1059,7 @@ static void mac802154_rxframe_worker(FAR void *arg)
{ {
case IEEE802154_FRAME_DATA: case IEEE802154_FRAME_DATA:
{ {
mac802154_rx_dataframe(priv, ind); mac802154_rxdataframe(priv, ind);
} }
break; break;
@@ -1072,33 +1075,43 @@ static void mac802154_rxframe_worker(FAR void *arg)
switch (cmdtype) switch (cmdtype)
{ {
case IEEE802154_CMD_ASSOC_REQ: case IEEE802154_CMD_ASSOC_REQ:
wlinfo("Assoc request received\n");
mac802154_rx_assocreq(priv, ind); mac802154_rx_assocreq(priv, ind);
break; break;
case IEEE802154_CMD_ASSOC_RESP: case IEEE802154_CMD_ASSOC_RESP:
wlinfo("Assoc response received\n");
mac802154_rx_assocresp(priv, ind); mac802154_rx_assocresp(priv, ind);
break; break;
case IEEE802154_CMD_DISASSOC_NOT: case IEEE802154_CMD_DISASSOC_NOT:
wlinfo("Disassoc notif received\n");
break; break;
case IEEE802154_CMD_DATA_REQ: case IEEE802154_CMD_DATA_REQ:
mac802154_rx_datareq(priv, ind); wlinfo("Data request received\n");
mac802154_rxdatareq(priv, ind);
break; break;
case IEEE802154_CMD_PANID_CONF_NOT: case IEEE802154_CMD_PANID_CONF_NOT:
wlinfo("PAN ID Conflict notif received\n");
break; break;
case IEEE802154_CMD_ORPHAN_NOT: case IEEE802154_CMD_ORPHAN_NOT:
wlinfo("Orphan notif received\n");
break;
break; break;
case IEEE802154_CMD_BEACON_REQ: case IEEE802154_CMD_BEACON_REQ:
wlinfo("Beacon request received\n");
break; break;
case IEEE802154_CMD_COORD_REALIGN: case IEEE802154_CMD_COORD_REALIGN:
wlinfo("Coord realign received\n");
break; break;
case IEEE802154_CMD_GTS_REQ: case IEEE802154_CMD_GTS_REQ:
wlinfo("GTS request received\n");
break; break;
} }
@@ -1110,15 +1123,9 @@ static void mac802154_rxframe_worker(FAR void *arg)
case IEEE802154_FRAME_BEACON: case IEEE802154_FRAME_BEACON:
{ {
/* TODO: Add logic here to handle extracting association response from wlinfo("Beacon frame received\n");
* coordinator if beacon tracking was enabled during the Association mac802154_rxbeaconframe(priv, ind);
* operation. ieee802154_ind_free(ind);
*
* mac802154_txdesc_alloc(priv, &respdec, false);
* mac802154_createdatareq(priv, &req->coordaddr,
* IEEE802154_ADDRMODE_EXTENDED, respdesc);
* sq_addlast((FAR sq_entry_t *)respdesc, &priv->csma_queue);
*/
} }
break; break;
@@ -1137,7 +1144,7 @@ static void mac802154_rxframe_worker(FAR void *arg)
} }
/**************************************************************************** /****************************************************************************
* Name: mac802154_rx_dataframe * Name: mac802154_rxdataframe
* *
* Description: * Description:
* Function called from the generic RX Frame worker to parse and handle the * Function called from the generic RX Frame worker to parse and handle the
@@ -1145,7 +1152,7 @@ static void mac802154_rxframe_worker(FAR void *arg)
* *
****************************************************************************/ ****************************************************************************/
static void mac802154_rx_dataframe(FAR struct ieee802154_privmac_s *priv, static void mac802154_rxdataframe(FAR struct ieee802154_privmac_s *priv,
FAR struct ieee802154_data_ind_s *ind) FAR struct ieee802154_data_ind_s *ind)
{ {
FAR struct ieee802154_notif_s *notif; FAR struct ieee802154_notif_s *notif;
@@ -1326,7 +1333,7 @@ notify_without_lock:
} }
/**************************************************************************** /****************************************************************************
* Name: mac802154_rx_datareq * Name: mac802154_rxdatareq
* *
* Description: * Description:
* Function called from the generic RX Frame worker to parse and handle the * Function called from the generic RX Frame worker to parse and handle the
@@ -1334,7 +1341,7 @@ notify_without_lock:
* *
****************************************************************************/ ****************************************************************************/
static void mac802154_rx_datareq(FAR struct ieee802154_privmac_s *priv, static void mac802154_rxdatareq(FAR struct ieee802154_privmac_s *priv,
FAR struct ieee802154_data_ind_s *ind) FAR struct ieee802154_data_ind_s *ind)
{ {
FAR struct ieee802154_txdesc_s *txdesc; FAR struct ieee802154_txdesc_s *txdesc;
@@ -1529,6 +1536,189 @@ static void mac802154_sfevent(FAR const struct ieee802154_radiocb_s *radiocb,
mac802154_givesem(&priv->exclsem); mac802154_givesem(&priv->exclsem);
} }
/****************************************************************************
* Name: mac802154_rxbeaconframe
*
* Description:
* Function called from the generic RX Frame worker to parse and handle the
* reception of a beacon frame.
*
****************************************************************************/
static void mac802154_rxbeaconframe(FAR struct ieee802154_privmac_s *priv,
FAR struct ieee802154_data_ind_s *ind)
{
FAR struct iob_s *iob = ind->frame;
struct ieee802154_pandesc_s pandesc;
FAR struct ieee802154_txdesc_s *respdesc;
uint8_t numgtsdesc;
uint8_t gtsdirmask;
uint8_t npendsaddr;
uint8_t npendeaddr;
int i;
/* Copy the coordinator address and channel info into the pan descriptor */
memcpy(&pandesc.coordaddr, &ind->src, sizeof(struct ieee802154_addr_s));
pandesc.chan = priv->currscan.channels[priv->scanindex];
pandesc.chpage = priv->currscan.chpage;
pandesc.lqi = ind->lqi;
pandesc.timestamp = ind->timestamp;
/* Parse the superframe specification field */
pandesc.sfspec.beaconorder = IEEE802154_GETBEACONORDER(iob->io_data,
iob->io_offset);
pandesc.sfspec.sforder = IEEE802154_GETSFORDER(iob->io_data, iob->io_offset);
pandesc.sfspec.final_capslot = IEEE802154_GETFINCAPSLOT(iob->io_data,
iob->io_offset);
pandesc.sfspec.ble = IEEE802154_GETBLE(iob->io_data, iob->io_offset);
pandesc.sfspec.pancoord = IEEE802154_GETPANCOORD(iob->io_data, iob->io_offset);
pandesc.sfspec.assocpermit = IEEE802154_GETASSOCPERMIT(iob->io_data,
iob->io_offset);
iob->io_offset += 2;
/* Parse the GTS Specification field */
numgtsdesc = IEEE802154_GETGTSDESCCOUNT(iob->io_data, iob->io_offset);
pandesc.gtspermit = IEEE802154_GETGTSPERMIT(iob->io_data, iob->io_offset);
iob->io_offset++;
/* We only need to parse the rest of the frame if we are not performing a
* scan
*/
if (priv->curr_op == MAC802154_OP_SCAN)
{
/* Check to see if we already have a frame from this coordinator */
for (i = 0; i < priv->npandesc; i++)
{
if (priv->currscan.channels[priv->scanindex] != priv->pandescs[i].chan)
{
continue;
}
if (memcmp(&ind->src, &priv->pandescs[i].coordaddr,
sizeof(struct ieee802154_addr_s)))
{
continue;
}
/* The beacon is the same as another, so discard it */
return;
}
/* Copy the pan desc to the list of pan desc */
memcpy(&priv->pandescs[priv->npandesc], &pandesc,
sizeof(struct ieee802154_pandesc_s));
priv->npandesc++;
if (priv->npandesc == MAC802154_NPANDESC)
{
mac802154_scanfinish(priv, IEEE802154_STATUS_LIMITREACHED);
}
}
else
{
/* If there are any GTS descriptors, handle the GTS Directions and
* GTS List fields
*/
if (numgtsdesc > 0)
{
gtsdirmask = IEEE802154_GETGTSDIRMASK(iob->io_data, iob->io_offset);
iob->io_offset++;
for (i = 0; i < numgtsdesc; i++)
{
/* For now we just discard the data by skipping over it */
iob->io_offset += 3;
}
}
/* Pending address fields. Min 1 byte, the Pending Address Specification */
npendsaddr = IEEE802154_GETNPENDSADDR(iob->io_data, iob->io_offset);
npendeaddr = IEEE802154_GETNPENDEADDR(iob->io_data, iob->io_offset);
iob->io_offset++;
/* The pending address field tells us whether or not there is any data
* pending for us.
*/
for (i = 0; i < npendsaddr; i++)
{
/* If the short address matches our short address */
if (IEEE802154_SADDRCMP(&iob->io_data[iob->io_offset], priv->addr.saddr))
{
/* TODO: Handle data pending in coordinator for us */
}
iob->io_offset += IEEE802154_SADDRSIZE;
}
for (i = 0; i < npendeaddr; i++)
{
/* If the extended address matches our extended address */
if (IEEE802154_EADDRCMP(&iob->io_data[iob->io_offset], priv->addr.eaddr))
{
/* If we are associating, polling, or if macAutoRequest is TRUE,
* extract the data.
*/
if ((priv->autoreq) || (priv->curr_op == MAC802154_OP_ASSOC) ||
(priv->curr_op == MAC802154_OP_POLL))
{
mac802154_txdesc_alloc(priv, &respdesc, false);
mac802154_createdatareq(priv, &priv->pandesc.coordaddr,
IEEE802154_ADDRMODE_EXTENDED, respdesc);
if (priv->curr_op == MAC802154_OP_ASSOC ||
priv->curr_op == MAC802154_OP_POLL)
{
priv->curr_cmd = IEEE802154_CMD_DATA_REQ;
}
/* Link the transaction into the CSMA transaction list */
sq_addlast((FAR sq_entry_t *)respdesc, &priv->csma_queue);
/* Notify the radio driver that there is data available */
priv->radio->txnotify(priv->radio, false);
}
}
iob->io_offset += IEEE802154_EADDRSIZE;
}
/* TODO: Process incoming beacon payload
* If there is anything left in the frame, process it as the beacon payload
*/
/* Check the superframe structure and update the appropriate attributes. */
if (memcmp(&priv->sfspec, &pandesc.sfspec,
sizeof(struct ieee802154_superframespec_s)) != 0)
{
/* Copy in the new superframe spec */
memcpy(&priv->sfspec, &pandesc.sfspec,
sizeof(struct ieee802154_superframespec_s));
/* Tell the radio layer about the superframe spec update */
priv->radio->sfupdate(priv->radio, &pandesc.sfspec);
}
}
}
/**************************************************************************** /****************************************************************************
* Name: mac802154_symtoticks * Name: mac802154_symtoticks
* *
@@ -1737,7 +1927,7 @@ MACHANDLE mac802154_create(FAR struct ieee802154_radio_s *radiodev)
} }
IEEE802154_EADDRCOPY(mac->addr.eaddr, eaddr); IEEE802154_EADDRCOPY(mac->addr.eaddr, eaddr);
mac->radio->set_attr(mac->radio, IEEE802154_ATTR_MAC_EXTENDED_ADDR, mac->radio->set_attr(mac->radio, IEEE802154_ATTR_MAC_EADDR,
(union ieee802154_attr_u *)&eaddr[0]); (union ieee802154_attr_u *)&eaddr[0]);
return (MACHANDLE)mac; return (MACHANDLE)mac;
+23 -27
View File
@@ -58,7 +58,7 @@
* Private Function Prototypes * Private Function Prototypes
****************************************************************************/ ****************************************************************************/
static void mac802154_timeout_assoc(FAR struct ieee802154_privmac_s *priv); static void mac802154_assoctimeout(FAR struct ieee802154_privmac_s *priv);
/**************************************************************************** /****************************************************************************
* Public MAC Functions * Public MAC Functions
@@ -120,22 +120,18 @@ int mac802154_req_associate(MACHANDLE mac,
/* Set the channel and channel page of the PHY layer */ /* Set the channel and channel page of the PHY layer */
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_PHY_CURRENT_CHANNEL, mac802154_setchannel(priv, req->chan);
(FAR const union ieee802154_attr_u *)&req->chnum); mac802154_setchpage(priv, req->chpage);
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_PHY_CURRENT_PAGE,
(FAR const union ieee802154_attr_u *)&req->chpage);
/* Set the coordinator address attributes */ /* Set the coordinator address attributes */
memcpy(&priv->coordaddr, &req->coordaddr, sizeof(struct ieee802154_addr_s)); mac802154_setcoordaddr(priv, &req->coordaddr);
/* TODO: Need to send coordinator address to radio layer */
/* Copy the coordinator PAN ID to our PAN ID */ /* Copy the coordinator PAN ID to our PAN ID */
IEEE802154_PANIDCOPY(priv->addr.panid, req->coordaddr.panid); mac802154_setpanid(priv, req->coordaddr.panid);
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_MAC_PANID,
(FAR const union ieee802154_attr_u *)req->coordaddr.panid);
/* Copy in the capabilities information bitfield */ /* Copy in the capabilities information bitfield */
@@ -181,7 +177,7 @@ int mac802154_req_associate(MACHANDLE mac,
IEEE802154_SETACKREQ(iob->io_data, 0); IEEE802154_SETACKREQ(iob->io_data, 0);
IEEE802154_SETFTYPE(iob->io_data, 0, IEEE802154_FRAME_COMMAND); IEEE802154_SETFTYPE(iob->io_data, 0, IEEE802154_FRAME_COMMAND);
IEEE802154_SETDADDRMODE(iob->io_data, 0, priv->coordaddr.mode); IEEE802154_SETDADDRMODE(iob->io_data, 0, priv->pandesc.coordaddr.mode);
IEEE802154_SETSADDRMODE(iob->io_data, 0, IEEE802154_ADDRMODE_EXTENDED); IEEE802154_SETSADDRMODE(iob->io_data, 0, IEEE802154_ADDRMODE_EXTENDED);
iob->io_len = 2; iob->io_len = 2;
@@ -197,20 +193,20 @@ int mac802154_req_associate(MACHANDLE mac,
* PAN to which to associate. [1] pg. 68 * PAN to which to associate. [1] pg. 68
*/ */
mac802154_putpanid(iob, priv->coordaddr.panid); mac802154_putpanid(iob, priv->pandesc.coordaddr.panid);
/* The Destination Address field shall contain the address from the beacon /* The Destination Address field shall contain the address from the beacon
* frame that was transmitted by the coordinator to which the association * frame that was transmitted by the coordinator to which the association
* request command is being sent. [1] pg. 68 * request command is being sent. [1] pg. 68
*/ */
if (priv->coordaddr.mode == IEEE802154_ADDRMODE_SHORT) if (priv->pandesc.coordaddr.mode == IEEE802154_ADDRMODE_SHORT)
{ {
mac802154_putsaddr(iob, priv->coordaddr.saddr); mac802154_putsaddr(iob, priv->pandesc.coordaddr.saddr);
} }
else if (priv->coordaddr.mode == IEEE802154_ADDRMODE_EXTENDED) else if (priv->pandesc.coordaddr.mode == IEEE802154_ADDRMODE_EXTENDED)
{ {
mac802154_puteaddr(iob, priv->coordaddr.eaddr); mac802154_puteaddr(iob, priv->pandesc.coordaddr.eaddr);
} }
/* The Source PAN Identifier field shall contain the broadcast PAN identifier.*/ /* The Source PAN Identifier field shall contain the broadcast PAN identifier.*/
@@ -258,7 +254,7 @@ int mac802154_req_associate(MACHANDLE mac,
mac802154_givesem(&priv->exclsem); mac802154_givesem(&priv->exclsem);
/* Association Request commands get sent out immediately */ /* Association Request command gets sent out immediately */
priv->radio->txdelayed(priv->radio, txdesc, 0); priv->radio->txdelayed(priv->radio, txdesc, 0);
@@ -464,7 +460,7 @@ void mac802154_txdone_assocreq(FAR struct ieee802154_privmac_s *priv,
* the coordinator after macResponseWaitTime. [1] pg. 34 * the coordinator after macResponseWaitTime. [1] pg. 34
*/ */
if (priv->trackingbeacon) if (priv->sfspec.beaconorder < 15)
{ {
/* We are tracking the beacon, so we should see our address in the /* We are tracking the beacon, so we should see our address in the
* beacon frame within macResponseWaitTime if the coordinator is going * beacon frame within macResponseWaitTime if the coordinator is going
@@ -475,7 +471,7 @@ void mac802154_txdone_assocreq(FAR struct ieee802154_privmac_s *priv,
mac802154_timerstart(priv, (priv->resp_waittime * mac802154_timerstart(priv, (priv->resp_waittime *
IEEE802154_BASE_SUPERFRAME_DURATION), IEEE802154_BASE_SUPERFRAME_DURATION),
mac802154_timeout_assoc); mac802154_assoctimeout);
} }
else else
{ {
@@ -484,7 +480,7 @@ void mac802154_txdone_assocreq(FAR struct ieee802154_privmac_s *priv,
* extended * extended
*/ */
DEBUGASSERT(priv->coordaddr.mode != IEEE802154_ADDRMODE_NONE); DEBUGASSERT(priv->pandesc.coordaddr.mode != IEEE802154_ADDRMODE_NONE);
/* Send the Data Request MAC command after macResponseWaitTime to /* Send the Data Request MAC command after macResponseWaitTime to
* extract the data from the coordinator. * extract the data from the coordinator.
@@ -492,7 +488,7 @@ void mac802154_txdone_assocreq(FAR struct ieee802154_privmac_s *priv,
mac802154_txdesc_alloc(priv, &respdesc, false); mac802154_txdesc_alloc(priv, &respdesc, false);
mac802154_createdatareq(priv, &priv->coordaddr, mac802154_createdatareq(priv, &priv->pandesc.coordaddr,
IEEE802154_ADDRMODE_EXTENDED, respdesc); IEEE802154_ADDRMODE_EXTENDED, respdesc);
priv->curr_cmd = IEEE802154_CMD_DATA_REQ; priv->curr_cmd = IEEE802154_CMD_DATA_REQ;
@@ -589,7 +585,7 @@ void mac802154_txdone_datareq_assoc(FAR struct ieee802154_privmac_s *priv,
* the corresponding data frame from the coordinator. [1] pg.43 * the corresponding data frame from the coordinator. [1] pg.43
*/ */
priv->radio->rxenable(priv->radio, true); mac802154_rxenable(priv);
/* Start a timer, if we receive the data frame, we will cancel /* Start a timer, if we receive the data frame, we will cancel
* the timer, otherwise it will expire and we will notify the * the timer, otherwise it will expire and we will notify the
@@ -597,7 +593,7 @@ void mac802154_txdone_datareq_assoc(FAR struct ieee802154_privmac_s *priv,
*/ */
mac802154_timerstart(priv, priv->max_frame_waittime, mac802154_timerstart(priv, priv->max_frame_waittime,
mac802154_timeout_assoc); mac802154_assoctimeout);
/* We can deallocate the data conf notification as it is no longer /* We can deallocate the data conf notification as it is no longer
* needed. We can't use the public function here since we already * needed. We can't use the public function here since we already
@@ -724,7 +720,7 @@ void mac802154_rx_assocresp(FAR struct ieee802154_privmac_s *priv,
/* Inform the radio of the address change */ /* Inform the radio of the address change */
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_MAC_SHORT_ADDRESS, priv->radio->set_attr(priv->radio, IEEE802154_ATTR_MAC_SADDR,
(FAR union ieee802154_attr_u *)priv->addr.saddr); (FAR union ieee802154_attr_u *)priv->addr.saddr);
/* A Short Address field value equal to 0xfffe shall indicate that the device /* A Short Address field value equal to 0xfffe shall indicate that the device
@@ -775,7 +771,7 @@ void mac802154_rx_assocresp(FAR struct ieee802154_privmac_s *priv,
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: mac802154_timeout_assoc * Name: mac802154_assoctimeout
* *
* Description: * Description:
* Function registered with MAC timer that gets called via the work queue to * Function registered with MAC timer that gets called via the work queue to
@@ -783,7 +779,7 @@ void mac802154_rx_assocresp(FAR struct ieee802154_privmac_s *priv,
* *
****************************************************************************/ ****************************************************************************/
static void mac802154_timeout_assoc(FAR struct ieee802154_privmac_s *priv) static void mac802154_assoctimeout(FAR struct ieee802154_privmac_s *priv)
{ {
FAR struct ieee802154_notif_s *notif; FAR struct ieee802154_notif_s *notif;
+21 -26
View File
@@ -86,10 +86,10 @@ int mac802154_req_get(MACHANDLE mac, enum ieee802154_attr_e attr,
case IEEE802154_ATTR_MAC_PANID: case IEEE802154_ATTR_MAC_PANID:
IEEE802154_PANIDCOPY(attrval->mac.panid, priv->addr.panid); IEEE802154_PANIDCOPY(attrval->mac.panid, priv->addr.panid);
break; break;
case IEEE802154_ATTR_MAC_SHORT_ADDRESS: case IEEE802154_ATTR_MAC_SADDR:
IEEE802154_SADDRCOPY(attrval->mac.saddr, priv->addr.saddr); IEEE802154_SADDRCOPY(attrval->mac.saddr, priv->addr.saddr);
break; break;
case IEEE802154_ATTR_MAC_EXTENDED_ADDR: case IEEE802154_ATTR_MAC_EADDR:
IEEE802154_EADDRCOPY(attrval->mac.eaddr, priv->addr.eaddr); IEEE802154_EADDRCOPY(attrval->mac.eaddr, priv->addr.eaddr);
break; break;
case IEEE802154_ATTR_MAC_DEVMODE: case IEEE802154_ATTR_MAC_DEVMODE:
@@ -100,7 +100,7 @@ int mac802154_req_get(MACHANDLE mac, enum ieee802154_attr_e attr,
* it along. * it along.
*/ */
ret = priv->radio->set_attr(priv->radio, attr, attrval); ret = priv->radio->get_attr(priv->radio, attr, attrval);
break; break;
} }
@@ -133,42 +133,37 @@ int mac802154_req_set(MACHANDLE mac, enum ieee802154_attr_e attr,
{ {
case IEEE802154_ATTR_MAC_PANID: case IEEE802154_ATTR_MAC_PANID:
{ {
IEEE802154_PANIDCOPY(priv->addr.panid, attrval->mac.panid); mac802154_setpanid(priv, attrval->mac.panid);
/* Tell the radio about the attribute */
priv->radio->set_attr(priv->radio, attr, attrval);
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
} }
break; break;
case IEEE802154_ATTR_MAC_SHORT_ADDRESS: case IEEE802154_ATTR_MAC_SADDR:
{ {
IEEE802154_SADDRCOPY(priv->addr.saddr, attrval->mac.saddr); mac802154_setsaddr(priv, attrval->mac.saddr);
/* Tell the radio about the attribute */
priv->radio->set_attr(priv->radio, attr, attrval);
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
} }
break; break;
case IEEE802154_ATTR_MAC_EXTENDED_ADDR: case IEEE802154_ATTR_MAC_EADDR:
{ {
/* Set the MAC copy of the address in the table */ mac802154_seteaddr(priv, attrval->mac.eaddr);
ret = IEEE802154_STATUS_SUCCESS;
IEEE802154_EADDRCOPY(priv->addr.eaddr, attrval->mac.eaddr); }
break;
/* Tell the radio about the attribute */ case IEEE802154_ATTR_MAC_COORD_SADDR:
{
priv->radio->set_attr(priv->radio, attr, attrval); mac802154_setcoordsaddr(priv, attrval->mac.coordsaddr);
ret = IEEE802154_STATUS_SUCCESS;
}
break;
case IEEE802154_ATTR_MAC_COORD_EADDR:
{
mac802154_setcoordeaddr(priv, attrval->mac.coordeaddr);
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
} }
break; break;
case IEEE802154_ATTR_MAC_ASSOCIATION_PERMIT: case IEEE802154_ATTR_MAC_ASSOCIATION_PERMIT:
{ {
priv->sf_spec.assocpermit = attrval->mac.assocpermit; priv->sfspec.assocpermit = attrval->mac.assocpermit;
priv->beaconupdate = true; priv->beaconupdate = true;
ret = IEEE802154_STATUS_SUCCESS; ret = IEEE802154_STATUS_SUCCESS;
} }
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -735,14 +735,14 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd,
IEEE802154_PANIDCOPY(g_panid, setreq->attrval.mac.panid); IEEE802154_PANIDCOPY(g_panid, setreq->attrval.mac.panid);
break; break;
case IEEE802154_ATTR_MAC_EXTENDED_ADDR: case IEEE802154_ATTR_MAC_EADDR:
IEEE802154_EADDRCOPY(g_eaddr, setreq->attrval.mac.eaddr); IEEE802154_EADDRCOPY(g_eaddr, setreq->attrval.mac.eaddr);
#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR #ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR
lo_addr2ip(dev); lo_addr2ip(dev);
#endif #endif
break; break;
case IEEE802154_ATTR_MAC_SHORT_ADDRESS: case IEEE802154_ATTR_MAC_SADDR:
IEEE802154_SADDRCOPY(g_saddr, setreq->attrval.mac.saddr); IEEE802154_SADDRCOPY(g_saddr, setreq->attrval.mac.saddr);
#ifndef CONFIG_NET_6LOWPAN_EXTENDEDADDR #ifndef CONFIG_NET_6LOWPAN_EXTENDEDADDR
lo_addr2ip(dev); lo_addr2ip(dev);
@@ -765,11 +765,11 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd,
IEEE802154_PANIDCOPY(getreq->attrval.mac.panid, g_panid); IEEE802154_PANIDCOPY(getreq->attrval.mac.panid, g_panid);
break; break;
case IEEE802154_ATTR_MAC_EXTENDED_ADDR: case IEEE802154_ATTR_MAC_EADDR:
IEEE802154_EADDRCOPY(getreq->attrval.mac.eaddr, g_eaddr); IEEE802154_EADDRCOPY(getreq->attrval.mac.eaddr, g_eaddr);
break; break;
case IEEE802154_ATTR_MAC_SHORT_ADDRESS: case IEEE802154_ATTR_MAC_SADDR:
IEEE802154_SADDRCOPY(getreq->attrval.mac.saddr, g_saddr); IEEE802154_SADDRCOPY(getreq->attrval.mac.saddr, g_saddr);
break; break;
+2 -2
View File
@@ -248,7 +248,7 @@ static int macnet_advertise(FAR struct net_driver_s *dev)
/* Get the eaddr from the MAC */ /* Get the eaddr from the MAC */
memcpy(arg.ifr_name, dev->d_ifname, IFNAMSIZ); memcpy(arg.ifr_name, dev->d_ifname, IFNAMSIZ);
arg.u.getreq.attr = IEEE802154_ATTR_MAC_EXTENDED_ADDR; arg.u.getreq.attr = IEEE802154_ATTR_MAC_EADDR;
ret = dev->d_ioctl(dev, MAC802154IOC_MLME_GET_REQUEST, ret = dev->d_ioctl(dev, MAC802154IOC_MLME_GET_REQUEST,
(unsigned long)((uintptr_t)&arg)); (unsigned long)((uintptr_t)&arg));
if (ret < 0) if (ret < 0)
@@ -283,7 +283,7 @@ static int macnet_advertise(FAR struct net_driver_s *dev)
/* Get the saddr from the MAC */ /* Get the saddr from the MAC */
memcpy(arg.ifr_name, dev->d_ifname, IFNAMSIZ); memcpy(arg.ifr_name, dev->d_ifname, IFNAMSIZ);
arg.u.getreq.attr = IEEE802154_ATTR_MAC_SHORT_ADDRESS; arg.u.getreq.attr = IEEE802154_ATTR_MAC_SADDR;
ret = dev->d_ioctl(dev, MAC802154IOC_MLME_GET_REQUEST, ret = dev->d_ioctl(dev, MAC802154IOC_MLME_GET_REQUEST,
(unsigned long)((uintptr_t)&arg)); (unsigned long)((uintptr_t)&arg));
if (ret < 0) if (ret < 0)
+5 -5
View File
@@ -60,7 +60,7 @@
* Private Function Prototypes * Private Function Prototypes
****************************************************************************/ ****************************************************************************/
static void mac802154_timeout_poll(FAR struct ieee802154_privmac_s *priv); static void mac802154_polltimeout(FAR struct ieee802154_privmac_s *priv);
/**************************************************************************** /****************************************************************************
* Public MAC Functions * Public MAC Functions
@@ -235,7 +235,7 @@ void mac802154_txdone_datareq_poll(FAR struct ieee802154_privmac_s *priv,
* the corresponding data frame from the coordinator. [1] pg.43 * the corresponding data frame from the coordinator. [1] pg.43
*/ */
priv->radio->rxenable(priv->radio, true); mac802154_rxenable(priv);
/* Start a timer, if we receive the data frame, we will cancel /* Start a timer, if we receive the data frame, we will cancel
* the timer, otherwise it will expire and we will notify the * the timer, otherwise it will expire and we will notify the
@@ -243,7 +243,7 @@ void mac802154_txdone_datareq_poll(FAR struct ieee802154_privmac_s *priv,
*/ */
mac802154_timerstart(priv, priv->max_frame_waittime, mac802154_timerstart(priv, priv->max_frame_waittime,
mac802154_timeout_poll); mac802154_polltimeout);
/* We can deallocate the data conf notification as it is no longer /* We can deallocate the data conf notification as it is no longer
* needed. We can't use the public function here since we already * needed. We can't use the public function here since we already
@@ -256,7 +256,7 @@ void mac802154_txdone_datareq_poll(FAR struct ieee802154_privmac_s *priv,
} }
/**************************************************************************** /****************************************************************************
* Name: mac802154_timeout_poll * Name: mac802154_polltimeout
* *
* Description: * Description:
* Function registered with MAC timer that gets called via the work queue to * Function registered with MAC timer that gets called via the work queue to
@@ -264,7 +264,7 @@ void mac802154_txdone_datareq_poll(FAR struct ieee802154_privmac_s *priv,
* *
****************************************************************************/ ****************************************************************************/
void mac802154_timeout_poll(FAR struct ieee802154_privmac_s *priv) void mac802154_polltimeout(FAR struct ieee802154_privmac_s *priv)
{ {
FAR struct ieee802154_notif_s *notif; FAR struct ieee802154_notif_s *notif;
+8 -8
View File
@@ -88,12 +88,12 @@ int mac802154_req_reset(MACHANDLE mac, bool rst_pibattr)
{ {
priv->isassoc = false; /* Not associated with a PAN */ priv->isassoc = false; /* Not associated with a PAN */
priv->trackingbeacon = false; /* Not tracking beacon by default */ priv->trackingbeacon = false; /* Not tracking beacon by default */
priv->sf_spec.assocpermit = false; /* Device (if coord) not accepting ssociation */ priv->sfspec.assocpermit = false; /* Device (if coord) not accepting ssociation */
priv->autoreq = true; /* Auto send data req if addr. in beacon */ priv->autoreq = true; /* Auto send data req if addr. in beacon */
priv->sf_spec.ble = false; /* BLE disabled */ priv->sfspec.ble = false; /* BLE disabled */
priv->beaconpayloadlength = 0; /* Beacon payload NULL */ priv->beaconpayloadlength = 0; /* Beacon payload NULL */
priv->sf_spec.beaconorder = 15; /* Non-beacon enabled network */ priv->sfspec.beaconorder = 15; /* Non-beacon enabled network */
priv->sf_spec.sforder = 15; /* Length of active portion of outgoing SF */ priv->sfspec.sforder = 15; /* Length of active portion of outgoing SF */
priv->beacon_txtime = 0; /* Device never sent a beacon */ priv->beacon_txtime = 0; /* Device never sent a beacon */
#warning Set BSN and DSN to random values! #warning Set BSN and DSN to random values!
priv->bsn = 0; priv->bsn = 0;
@@ -113,10 +113,10 @@ int mac802154_req_reset(MACHANDLE mac, bool rst_pibattr)
/* Reset the Coordinator address */ /* Reset the Coordinator address */
priv->coordaddr.mode = IEEE802154_ADDRMODE_NONE; priv->pandesc.coordaddr.mode = IEEE802154_ADDRMODE_NONE;
IEEE802154_PANIDCOPY(priv->coordaddr.panid, &IEEE802154_PANID_UNSPEC); IEEE802154_PANIDCOPY(priv->pandesc.coordaddr.panid, &IEEE802154_PANID_UNSPEC);
IEEE802154_SADDRCOPY(priv->coordaddr.saddr, &IEEE802154_SADDR_UNSPEC); IEEE802154_SADDRCOPY(priv->pandesc.coordaddr.saddr, &IEEE802154_SADDR_UNSPEC);
IEEE802154_EADDRCOPY(priv->coordaddr.eaddr, &IEEE802154_EADDR_UNSPEC); IEEE802154_EADDRCOPY(priv->pandesc.coordaddr.eaddr, &IEEE802154_EADDR_UNSPEC);
/* Reset the device's address */ /* Reset the device's address */
+141 -4
View File
@@ -51,9 +51,17 @@
#include <string.h> #include <string.h>
#include "mac802154.h" #include "mac802154.h"
#include "mac802154_internal.h"
#include "mac802154_scan.h"
#include <nuttx/wireless/ieee802154/ieee802154_mac.h> #include <nuttx/wireless/ieee802154/ieee802154_mac.h>
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void mac802154_scantimeout(FAR struct ieee802154_privmac_s *priv);
/**************************************************************************** /****************************************************************************
* Public MAC Functions * Public MAC Functions
****************************************************************************/ ****************************************************************************/
@@ -79,7 +87,7 @@ int mac802154_req_scan(MACHANDLE mac, FAR struct ieee802154_scan_req_s *req)
(FAR struct ieee802154_privmac_s *)mac; (FAR struct ieee802154_privmac_s *)mac;
int ret; int ret;
if (req->duration > 15) if (req->duration > 15 || req->numchan < 0 || req->numchan > 15)
{ {
ret = -EINVAL; ret = -EINVAL;
goto errout; goto errout;
@@ -92,23 +100,60 @@ int mac802154_req_scan(MACHANDLE mac, FAR struct ieee802154_scan_req_s *req)
ret = mac802154_takesem(&priv->opsem, true); ret = mac802154_takesem(&priv->opsem, true);
if (ret < 0) if (ret < 0)
{ {
ret = -EINVAL; ret = -EINTR;
goto errout; goto errout;
} }
priv->curr_op = MAC802154_OP_SCAN;
/* Get exclusive access to the MAC */
ret = mac802154_takesem(&priv->exclsem, true); ret = mac802154_takesem(&priv->exclsem, true);
if (ret < 0) if (ret < 0)
{ {
ret = -EINVAL; mac802154_givesem(&priv->opsem);
ret = -EINTR;
goto errout; goto errout;
} }
/* Copy the request so we have a reference */
memcpy(&priv->currscan, req, sizeof(struct ieee802154_scan_req_s));
priv->scanindex = 0;
priv->npandesc = 0;
switch (req->type) switch (req->type)
{ {
case IEEE802154_SCANTYPE_PASSIVE: case IEEE802154_SCANTYPE_PASSIVE:
{ {
/* Set the channel to the first channel in the list */
mac802154_setchannel(priv, req->channels[priv->scanindex]);
mac802154_setchpage(priv, req->chpage);
/* Before commencing an active or passive scan, the MAC sublayer shall
* store the value of macPANId and then set it to 0xffff for the
* duration of the scan. This enables the receive filter to accept all
* beacons rather than just the beacons from its current PAN, as
* described in 5.1.6.2. On completion of the scan, the MAC sublayer
* shall restore the value of macPANId to the value stored before the
* scan began. [1] pg. 24
*/
IEEE802154_PANIDCOPY(priv->panidbeforescan, priv->addr.panid);
mac802154_setpanid(priv, (const uint8_t *)&IEEE802154_PANID_UNSPEC);
/* ...after switching to the channel for a passive scan, the device
* shall enable its receiver for at most
* [aBaseSuperframeDuration × (2 * n + 1)],
* where n is the value of the ScanDuration parameter. [1] pg. 25
*/
mac802154_rxenable(priv);
priv->scansymdur = IEEE802154_BASE_SUPERFRAME_DURATION *
((1 << req->duration) + 1);
mac802154_timerstart(priv, priv->scansymdur, mac802154_scantimeout);
} }
break; break;
case IEEE802154_SCANTYPE_ACTIVE: case IEEE802154_SCANTYPE_ACTIVE:
@@ -137,11 +182,103 @@ int mac802154_req_scan(MACHANDLE mac, FAR struct ieee802154_scan_req_s *req)
break; break;
} }
mac802154_givesem(&priv->exclsem);
return OK; return OK;
errout_with_sem; errout_with_sem:
mac802154_givesem(&priv->exclsem);
mac802154_givesem(&priv->opsem); mac802154_givesem(&priv->opsem);
errout: errout:
return ret; return ret;
} }
/****************************************************************************
* Internal MAC Functions
****************************************************************************/
void mac802154_scanfinish(FAR struct ieee802154_privmac_s *priv,
enum ieee802154_status_e status)
{
FAR struct ieee802154_notif_s * notif;
mac802154_takesem(&priv->exclsem, false);
mac802154_notif_alloc(priv, &notif, false);
priv->curr_op = MAC802154_OP_NONE;
mac802154_givesem(&priv->opsem);
notif->notiftype = IEEE802154_NOTIFY_CONF_SCAN;
notif->u.scanconf.type = priv->currscan.type;
notif->u.scanconf.chpage = priv->currscan.chpage;
/* Copy in the channels that did not get scanned */
if (priv->scanindex != priv->currscan.numchan)
{
notif->u.scanconf.numunscanned = priv->currscan.numchan - priv->scanindex;
memcpy(notif->u.scanconf.unscanned, &priv->currscan.channels[priv->scanindex],
notif->u.scanconf.numunscanned);
}
notif->u.scanconf.numdesc = priv->npandesc;
memcpy(notif->u.scanconf.pandescs, priv->pandescs,
sizeof(struct ieee802154_pandesc_s) * priv->npandesc);
notif->u.scanconf.status = status;
/* Reset the PAN ID to the setting before the scan started */
mac802154_setpanid(priv, priv->panidbeforescan);
mac802154_givesem(&priv->exclsem);
mac802154_notify(priv, notif);
}
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: mac802154_scantimeout
*
* Description:
* Function registered with MAC timer that gets called via the work queue to
* handle a timeout for performing a scan operation.
*
****************************************************************************/
static void mac802154_scantimeout(FAR struct ieee802154_privmac_s *priv)
{
DEBUGASSERT(priv->curr_op == MAC802154_OP_SCAN);
/* If we got here it means we are done scanning that channel */
mac802154_rxdisable(priv);
priv->scanindex++;
/* Check to see if this was the last channel to scan */
if (priv->scanindex == priv->currscan.numchan)
{
if (priv->npandesc > 0)
{
mac802154_scanfinish(priv, IEEE802154_STATUS_SUCCESS);
}
else
{
mac802154_scanfinish(priv, IEEE802154_STATUS_NO_BEACON);
}
return;
}
mac802154_setchannel(priv, priv->currscan.channels[priv->scanindex]);
/* ...after switching to the channel for a passive scan, the device
* shall enable its receiver for at most
* [aBaseSuperframeDuration × (2 * n + 1)],
* where n is the value of the ScanDuration parameter. [1] pg. 25
*/
mac802154_rxenable(priv);
mac802154_timerstart(priv, priv->scansymdur, mac802154_scantimeout);
}
+66
View File
@@ -0,0 +1,66 @@
/****************************************************************************
* wireless/ieee802154/mac802154_scan.h
*
* Copyright (C) 2017 Verge Inc. All rights reserved.
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
*
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* The naming and comments for various fields are taken directly
* from the IEEE 802.15.4 2011 standard.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __WIRELESS_IEEE802154__MAC802154_SCAN_H
#define __WIRELESS_IEEE802154__MAC802154_SCAN_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
/****************************************************************************
* Function Prototypes
****************************************************************************/
struct ieee802154_privmac_s; /* Forward Reference */
void mac802154_scanfinish(FAR struct ieee802154_privmac_s *priv,
enum ieee802154_status_e status);
#endif /* __WIRELESS_IEEE802154__MAC802154_SCAN_H */
+11 -13
View File
@@ -97,14 +97,12 @@ int mac802154_req_start(MACHANDLE mac, FAR struct ieee802154_start_req_s *req)
/* Set the PANID attribute */ /* Set the PANID attribute */
IEEE802154_PANIDCOPY(priv->addr.panid, req->panid); mac802154_setpanid(priv, req->panid);
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_MAC_PANID,
(FAR const union ieee802154_attr_u *)req->panid);
/* Tell the radio layer to set the channel number and channel page */ /* Tell the radio layer to set the channel number and channel page */
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_PHY_CURRENT_CHANNEL, priv->radio->set_attr(priv->radio, IEEE802154_ATTR_PHY_CHAN,
(FAR const union ieee802154_attr_u *)&req->chnum); (FAR const union ieee802154_attr_u *)&req->chan);
priv->radio->set_attr(priv->radio, IEEE802154_ATTR_PHY_CURRENT_PAGE, priv->radio->set_attr(priv->radio, IEEE802154_ATTR_PHY_CURRENT_PAGE,
(FAR const union ieee802154_attr_u *)&req->chpage); (FAR const union ieee802154_attr_u *)&req->chpage);
@@ -130,11 +128,11 @@ int mac802154_req_start(MACHANDLE mac, FAR struct ieee802154_start_req_s *req)
goto errout; goto errout;
} }
priv->sf_spec.beaconorder = req->beaconorder; priv->sfspec.beaconorder = req->beaconorder;
/* The value of macSuperframeOrder shall be ignored if macBeaconOrder = 15. pg. 19 */ /* The value of macSuperframeOrder shall be ignored if macBeaconOrder = 15. pg. 19 */
if (priv->sf_spec.beaconorder < 15) if (priv->sfspec.beaconorder < 15)
{ {
/* Set the superframe order */ /* Set the superframe order */
@@ -144,7 +142,7 @@ int mac802154_req_start(MACHANDLE mac, FAR struct ieee802154_start_req_s *req)
goto errout; goto errout;
} }
priv->sf_spec.sforder = req->superframeorder; priv->sfspec.sforder = req->superframeorder;
} }
if (req->pancoord) if (req->pancoord)
@@ -156,9 +154,9 @@ int mac802154_req_start(MACHANDLE mac, FAR struct ieee802154_start_req_s *req)
priv->devmode = IEEE802154_DEVMODE_COORD; priv->devmode = IEEE802154_DEVMODE_COORD;
} }
priv->sf_spec.pancoord = req->pancoord; priv->sfspec.pancoord = req->pancoord;
if (priv->sf_spec.beaconorder < 15) if (priv->sfspec.beaconorder < 15)
{ {
/* If the BeaconOrder parameter is less than 15, the MLME sets macBattLifeExt to /* If the BeaconOrder parameter is less than 15, the MLME sets macBattLifeExt to
* the value of the BatteryLifeExtension parameter. If the BeaconOrder parameter * the value of the BatteryLifeExtension parameter. If the BeaconOrder parameter
@@ -166,11 +164,11 @@ int mac802154_req_start(MACHANDLE mac, FAR struct ieee802154_start_req_s *req)
* [1] pg. 106 * [1] pg. 106
*/ */
priv->sf_spec.ble = req->battlifeext; priv->sfspec.ble = req->battlifeext;
/* For now we just set the CAP Slot to 15 */ /* For now we just set the CAP Slot to 15 */
priv->sf_spec.final_capslot = 15; priv->sfspec.final_capslot = 15;
/* If the PAN coordinator parameter is set to TRUE, the MLME ignores the /* If the PAN coordinator parameter is set to TRUE, the MLME ignores the
* StartTime parameter and begins beacon transmissions immediately. * StartTime parameter and begins beacon transmissions immediately.
@@ -184,7 +182,7 @@ int mac802154_req_start(MACHANDLE mac, FAR struct ieee802154_start_req_s *req)
/* Tell the radio to start transmitting beacon frames */ /* Tell the radio to start transmitting beacon frames */
priv->radio->beaconstart(priv->radio, &priv->sf_spec, priv->radio->beaconstart(priv->radio, &priv->sfspec,
&priv->beaconframe[priv->bf_ind]); &priv->beaconframe[priv->bf_ind]);
} }
else else