1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/pkg/openwsn/patches/02a-MAClow_IEEE802154E.c.patch
2014-05-14 15:06:50 +02:00

2047 lines
66 KiB
Diff

*** stock_iot-lab_M3/openwsn/02a-MAClow/IEEE802154E.c Thu Apr 24 11:01:36 2014
--- riot-openwsn-wip/openwsn/02a-MAClow/IEEE802154E.c Thu Apr 24 16:55:54 2014
***************
*** 9,126 ****
#include "schedule.h"
#include "packetfunctions.h"
#include "scheduler.h"
! #include "leds.h"
#include "neighbors.h"
#include "debugpins.h"
#include "res.h"
//=========================== variables =======================================
! typedef struct {
! // misc
! asn_t asn; // current absolute slot number
! slotOffset_t slotOffset; // current slot offset
! slotOffset_t nextActiveSlotOffset; // next active slot offset
! PORT_TIMER_WIDTH deSyncTimeout; // how many slots left before looses sync
! bool isSync; // TRUE iff mote is synchronized to network
! // as shown on the chronogram
! ieee154e_state_t state; // state of the FSM
! OpenQueueEntry_t* dataToSend; // pointer to the data to send
! OpenQueueEntry_t* dataReceived; // pointer to the data received
! OpenQueueEntry_t* ackToSend; // pointer to the ack to send
! OpenQueueEntry_t* ackReceived; // pointer to the ack received
! PORT_TIMER_WIDTH lastCapturedTime; // last captured time
! PORT_TIMER_WIDTH syncCapturedTime; // captured time used to sync
! //channel hopping
! uint8_t freq; // frequency of the current slot
! uint8_t asnOffset; // offset inside the frame
! } ieee154e_vars_t;
!
! ieee154e_vars_t ieee154e_vars;
!
! typedef struct {
! PORT_TIMER_WIDTH num_newSlot;
! PORT_TIMER_WIDTH num_timer;
! PORT_TIMER_WIDTH num_startOfFrame;
! PORT_TIMER_WIDTH num_endOfFrame;
! } ieee154e_dbg_t;
!
! ieee154e_dbg_t ieee154e_dbg;
!
! PRAGMA(pack(1));
! typedef struct {
! uint8_t numSyncPkt; // how many times synchronized on a non-ACK packet
! uint8_t numSyncAck; // how many times synchronized on an ACK
! PORT_SIGNED_INT_WIDTH minCorrection; // minimum time correction
! PORT_SIGNED_INT_WIDTH maxCorrection; // maximum time correction
! uint8_t numDeSync; // number of times a desync happened
! } ieee154e_stats_t;
! PRAGMA(pack());
! ieee154e_stats_t ieee154e_stats;
//=========================== prototypes ======================================
!
// SYNCHRONIZING
! void activity_synchronize_newSlot();
! void activity_synchronize_startOfFrame(PORT_TIMER_WIDTH capturedTime);
! void activity_synchronize_endOfFrame(PORT_TIMER_WIDTH capturedTime);
// TX
! void activity_ti1ORri1();
! void activity_ti2();
! void activity_tie1();
! void activity_ti3();
! void activity_tie2();
! void activity_ti4(PORT_TIMER_WIDTH capturedTime);
! void activity_tie3();
! void activity_ti5(PORT_TIMER_WIDTH capturedTime);
! void activity_ti6();
! void activity_tie4();
! void activity_ti7();
! void activity_tie5();
! void activity_ti8(PORT_TIMER_WIDTH capturedTime);
! void activity_tie6();
! void activity_ti9(PORT_TIMER_WIDTH capturedTime);
// RX
! void activity_ri2();
! void activity_rie1();
! void activity_ri3();
! void activity_rie2();
! void activity_ri4(PORT_TIMER_WIDTH capturedTime);
! void activity_rie3();
! void activity_ri5(PORT_TIMER_WIDTH capturedTime);
! void activity_ri6();
! void activity_rie4();
! void activity_ri7();
! void activity_rie5();
! void activity_ri8(PORT_TIMER_WIDTH capturedTime);
! void activity_rie6();
! void activity_ri9(PORT_TIMER_WIDTH capturedTime);
// frame validity check
! bool isValidAdv(ieee802154_header_iht* ieee802514_header);
bool isValidRxFrame(ieee802154_header_iht* ieee802514_header);
bool isValidAck(ieee802154_header_iht* ieee802514_header,
OpenQueueEntry_t* packetSent);
// ASN handling
! void incrementAsnOffset();
! void asnWriteToAdv(OpenQueueEntry_t* advFrame);
! void asnStoreFromAdv(OpenQueueEntry_t* advFrame);
// synchronization
! void synchronizePacket(PORT_TIMER_WIDTH timeReceived);
void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection);
void changeIsSync(bool newIsSync);
// notifying upper layer
! void notif_sendDone(OpenQueueEntry_t* packetSent, error_t error);
void notif_receive(OpenQueueEntry_t* packetReceived);
// statistics
! void resetStats();
void updateStats(PORT_SIGNED_INT_WIDTH timeCorrection);
// misc
uint8_t calculateFrequency(uint8_t channelOffset);
void changeState(ieee154e_state_t newstate);
! void endSlot();
! bool debugPrint_asn();
! bool debugPrint_isSync();
//=========================== admin ===========================================
--- 9,99 ----
#include "schedule.h"
#include "packetfunctions.h"
#include "scheduler.h"
! #include "leds_ow.h"
#include "neighbors.h"
#include "debugpins.h"
#include "res.h"
+ #include "thread.h"
+
+ #define ENABLE_DEBUG (0)
+ #include "debug.h"
+
//=========================== variables =======================================
! ieee154e_vars_t ieee154e_vars;
! ieee154e_stats_t ieee154e_stats;
! ieee154e_dbg_t ieee154e_dbg;
! //static char openwsn_ieee802154e_rec_stack[KERNEL_CONF_STACKSIZE_MAIN];
! //static char openwsn_ieee802154e_send_stack[KERNEL_CONF_STACKSIZE_MAIN];
//=========================== prototypes ======================================
! void isr_ieee154e_newSlot(void);
! void isr_ieee154e_timer(void);
// SYNCHRONIZING
! void activity_synchronize_newSlot(void);
! void activity_synchronize_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_synchronize_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime);
// TX
! void activity_ti1ORri1(void);
! void activity_ti2(void);
! void activity_tie1(void);
! void activity_ti3(void);
! void activity_tie2(void);
! void activity_ti4(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_tie3(void);
! void activity_ti5(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_ti6(void);
! void activity_tie4(void);
! void activity_ti7(void);
! void activity_tie5(void);
! void activity_ti8(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_tie6(void);
! void activity_ti9(PORT_RADIOTIMER_WIDTH capturedTime);
// RX
! void activity_ri2(void);
! void activity_rie1(void);
! void activity_ri3(void);
! void activity_rie2(void);
! void activity_ri4(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_rie3(void);
! void activity_ri5(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_ri6(void);
! void activity_rie4(void);
! void activity_ri7(void);
! void activity_rie5(void);
! void activity_ri8(PORT_RADIOTIMER_WIDTH capturedTime);
! void activity_rie6(void);
! void activity_ri9(PORT_RADIOTIMER_WIDTH capturedTime);
// frame validity check
!
bool isValidRxFrame(ieee802154_header_iht* ieee802514_header);
bool isValidAck(ieee802154_header_iht* ieee802514_header,
OpenQueueEntry_t* packetSent);
+ // IEs Handling
+ bool ieee154e_processIEs(OpenQueueEntry_t* pkt, uint16_t * lenIE);//xv poipoi
+ void ieee154e_processSlotframeLinkIE(OpenQueueEntry_t* pkt,uint8_t * ptr);//xv poipoi
// ASN handling
! void incrementAsnOffset(void);
! void asnStoreFromAdv(uint8_t* asn);
! void joinPriorityStoreFromAdv(uint8_t jp);
// synchronization
! void synchronizePacket(PORT_RADIOTIMER_WIDTH timeReceived);
void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection);
void changeIsSync(bool newIsSync);
// notifying upper layer
! void notif_sendDone(OpenQueueEntry_t* packetSent, owerror_t error);
void notif_receive(OpenQueueEntry_t* packetReceived);
// statistics
! void resetStats(void);
void updateStats(PORT_SIGNED_INT_WIDTH timeCorrection);
// misc
uint8_t calculateFrequency(uint8_t channelOffset);
void changeState(ieee154e_state_t newstate);
! void endSlot(void);
! bool debugPrint_asn(void);
! bool debugPrint_isSync(void);
//=========================== admin ===========================================
***************
*** 130,137 ****
Call this function once before any other function in this module, possibly
during boot-up.
*/
! void ieee154e_init() {
!
// initialize variables
memset(&ieee154e_vars,0,sizeof(ieee154e_vars_t));
memset(&ieee154e_dbg,0,sizeof(ieee154e_dbg_t));
--- 103,110 ----
Call this function once before any other function in this module, possibly
during boot-up.
*/
! void ieee154e_init(void) {
! DEBUG("%s\n",__PRETTY_FUNCTION__);
// initialize variables
memset(&ieee154e_vars,0,sizeof(ieee154e_vars_t));
memset(&ieee154e_dbg,0,sizeof(ieee154e_dbg_t));
***************
*** 162,178 ****
/**
/brief Difference between some older ASN and the current ASN.
! \param someASN [in] some ASN to compare to the current
\returns The ASN difference, or 0xffff if more than 65535 different
*/
! PORT_TIMER_WIDTH ieee154e_asnDiff(asn_t* someASN) {
! PORT_TIMER_WIDTH diff;
INTERRUPT_DECLARATION();
DISABLE_INTERRUPTS();
if (ieee154e_vars.asn.byte4 != someASN->byte4) {
ENABLE_INTERRUPTS();
! return (PORT_TIMER_WIDTH)0xFFFFFFFF;;
}
diff = 0;
--- 135,151 ----
/**
/brief Difference between some older ASN and the current ASN.
! \param[in] someASN some ASN to compare to the current
\returns The ASN difference, or 0xffff if more than 65535 different
*/
! PORT_RADIOTIMER_WIDTH ieee154e_asnDiff(asn_t* someASN) {
! PORT_RADIOTIMER_WIDTH diff;
INTERRUPT_DECLARATION();
DISABLE_INTERRUPTS();
if (ieee154e_vars.asn.byte4 != someASN->byte4) {
ENABLE_INTERRUPTS();
! return (PORT_RADIOTIMER_WIDTH)0xFFFFFFFF;;
}
diff = 0;
***************
*** 184,190 ****
diff += 0xffff-someASN->bytes0and1;
diff += 1;
} else {
! diff = (PORT_TIMER_WIDTH)0xFFFFFFFF;;
}
ENABLE_INTERRUPTS();
return diff;
--- 157,163 ----
diff += 0xffff-someASN->bytes0and1;
diff += 1;
} else {
! diff = (PORT_RADIOTIMER_WIDTH)0xFFFFFFFF;
}
ENABLE_INTERRUPTS();
return diff;
***************
*** 197,210 ****
This function executes in ISR mode, when the new slot timer fires.
*/
! void isr_ieee154e_newSlot() {
radio_setTimerPeriod(TsSlotDuration);
if (ieee154e_vars.isSync==FALSE) {
! activity_synchronize_newSlot();
} else {
activity_ti1ORri1();
}
ieee154e_dbg.num_newSlot++;
}
/**
--- 170,196 ----
This function executes in ISR mode, when the new slot timer fires.
*/
! void isr_ieee154e_newSlot(void) {
! DEBUG("%s\n",__PRETTY_FUNCTION__);
radio_setTimerPeriod(TsSlotDuration);
+ DEBUG("step 1\n");
if (ieee154e_vars.isSync==FALSE) {
! DEBUG("step 2.1\n");
! if (idmanager_getIsDAGroot()==TRUE) {
! DEBUG("step 2.1.1\n");
! changeIsSync(TRUE);
! } else {
! DEBUG("step 2.1.2\n");
! activity_synchronize_newSlot();
! DEBUG("step 2.1.3\n");
! }
} else {
+ DEBUG("step 2.2.1\n");
activity_ti1ORri1();
+ DEBUG("step 2.2.2\n");
}
ieee154e_dbg.num_newSlot++;
+ DEBUG("end.\n");
}
/**
***************
*** 212,218 ****
This function executes in ISR mode, when the FSM timer fires.
*/
! void isr_ieee154e_timer() {
switch (ieee154e_vars.state) {
case S_TXDATAOFFSET:
activity_ti2();
--- 198,204 ----
This function executes in ISR mode, when the FSM timer fires.
*/
! void isr_ieee154e_timer(void) {
switch (ieee154e_vars.state) {
case S_TXDATAOFFSET:
activity_ti2();
***************
*** 291,297 ****
This function executes in ISR mode.
*/
! void ieee154e_startOfFrame(PORT_TIMER_WIDTH capturedTime) {
if (ieee154e_vars.isSync==FALSE) {
activity_synchronize_startOfFrame(capturedTime);
} else {
--- 277,283 ----
This function executes in ISR mode.
*/
! void ieee154e_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) {
if (ieee154e_vars.isSync==FALSE) {
activity_synchronize_startOfFrame(capturedTime);
} else {
***************
*** 339,345 ****
This function executes in ISR mode.
*/
! void ieee154e_endOfFrame(PORT_TIMER_WIDTH capturedTime) {
if (ieee154e_vars.isSync==FALSE) {
activity_synchronize_endOfFrame(capturedTime);
} else {
--- 325,331 ----
This function executes in ISR mode.
*/
! void ieee154e_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) {
if (ieee154e_vars.isSync==FALSE) {
activity_synchronize_endOfFrame(capturedTime);
} else {
***************
*** 379,385 ****
\returns TRUE if this function printed something, FALSE otherwise.
*/
! bool debugPrint_asn() {
asn_t output;
output.byte4 = ieee154e_vars.asn.byte4;
output.bytes2and3 = ieee154e_vars.asn.bytes2and3;
--- 365,371 ----
\returns TRUE if this function printed something, FALSE otherwise.
*/
! bool debugPrint_asn(void) {
asn_t output;
output.byte4 = ieee154e_vars.asn.byte4;
output.bytes2and3 = ieee154e_vars.asn.bytes2and3;
***************
*** 396,402 ****
\returns TRUE if this function printed something, FALSE otherwise.
*/
! bool debugPrint_isSync() {
uint8_t output=0;
output = ieee154e_vars.isSync;
openserial_printStatus(STATUS_ISSYNC,(uint8_t*)&output,sizeof(uint8_t));
--- 382,388 ----
\returns TRUE if this function printed something, FALSE otherwise.
*/
! bool debugPrint_isSync(void) {
uint8_t output=0;
output = ieee154e_vars.isSync;
openserial_printStatus(STATUS_ISSYNC,(uint8_t*)&output,sizeof(uint8_t));
***************
*** 411,419 ****
\returns TRUE if this function printed something, FALSE otherwise.
*/
! bool debugPrint_macStats() {
// send current stats over serial
openserial_printStatus(STATUS_MACSTATS,(uint8_t*)&ieee154e_stats,sizeof(ieee154e_stats_t));
return TRUE;
}
--- 397,410 ----
\returns TRUE if this function printed something, FALSE otherwise.
*/
! bool debugPrint_macStats(void) {
// send current stats over serial
+ ieee154e_stats.dutyCycle/=(float)SUPERFRAME_LENGTH; //avg on the all slots of a frame
+ ieee154e_stats.dutyCycle/=STATUS_MAX;//because this is executed once every 10 times of debugprint
+ ieee154e_stats.dutyCycle*=100.0;//as is a percentage
openserial_printStatus(STATUS_MACSTATS,(uint8_t*)&ieee154e_stats,sizeof(ieee154e_stats_t));
+ ieee154e_stats.dutyCycle=0; //reset for the next superframe.
+
return TRUE;
}
***************
*** 421,455 ****
//======= SYNCHRONIZING
! port_INLINE void activity_synchronize_newSlot() {
// I'm in the middle of receiving a packet
if (ieee154e_vars.state==S_SYNCRX) {
return;
}
// if this is the first time I call this function while not synchronized,
// switch on the radio in Rx mode
if (ieee154e_vars.state!=S_SYNCLISTEN) {
// change state
changeState(S_SYNCLISTEN);
!
// turn off the radio (in case it wasn't yet)
radio_rfOff();
!
// configure the radio to listen to the default synchronizing channel
radio_setFrequency(SYNCHRONIZING_CHANNEL);
!
// update record of current channel
ieee154e_vars.freq = SYNCHRONIZING_CHANNEL;
// switch on the radio in Rx mode.
radio_rxEnable();
radio_rxNow();
}
// increment ASN (used only to schedule serial activity)
incrementAsnOffset();
!
// to be able to receive and transmist serial even when not synchronized
// take turns every 8 slots sending and receiving
if ((ieee154e_vars.asn.bytes0and1&0x000f)==0x0000) {
--- 412,453 ----
//======= SYNCHRONIZING
! port_INLINE void activity_synchronize_newSlot(void) {
! DEBUG("%s\n",__PRETTY_FUNCTION__);
// I'm in the middle of receiving a packet
if (ieee154e_vars.state==S_SYNCRX) {
return;
}
+ DEBUG("step 1\n");
// if this is the first time I call this function while not synchronized,
// switch on the radio in Rx mode
if (ieee154e_vars.state!=S_SYNCLISTEN) {
+ DEBUG("step 2.1\n");
// change state
changeState(S_SYNCLISTEN);
! DEBUG("step 2.x\n");
// turn off the radio (in case it wasn't yet)
radio_rfOff();
! DEBUG("step 2.2\n");
// configure the radio to listen to the default synchronizing channel
radio_setFrequency(SYNCHRONIZING_CHANNEL);
! DEBUG("step 2.3\n");
// update record of current channel
ieee154e_vars.freq = SYNCHRONIZING_CHANNEL;
// switch on the radio in Rx mode.
radio_rxEnable();
+ DEBUG("step 2.4\n");
+ ieee154e_vars.radioOnInit=radio_getTimerValue();
+ ieee154e_vars.radioOnThisSlot=TRUE;
radio_rxNow();
+ DEBUG("step 2.5\n");
}
// increment ASN (used only to schedule serial activity)
incrementAsnOffset();
! DEBUG("step 3\n");
// to be able to receive and transmist serial even when not synchronized
// take turns every 8 slots sending and receiving
if ((ieee154e_vars.asn.bytes0and1&0x000f)==0x0000) {
***************
*** 461,467 ****
}
}
! port_INLINE void activity_synchronize_startOfFrame(PORT_TIMER_WIDTH capturedTime) {
// don't care about packet if I'm not listening
if (ieee154e_vars.state!=S_SYNCLISTEN) {
--- 459,465 ----
}
}
! port_INLINE void activity_synchronize_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) {
// don't care about packet if I'm not listening
if (ieee154e_vars.state!=S_SYNCLISTEN) {
***************
*** 481,488 ****
ieee154e_vars.syncCapturedTime = capturedTime;
}
! port_INLINE void activity_synchronize_endOfFrame(PORT_TIMER_WIDTH capturedTime) {
ieee802154_header_iht ieee802514_header;
// check state
if (ieee154e_vars.state!=S_SYNCRX) {
--- 479,487 ----
ieee154e_vars.syncCapturedTime = capturedTime;
}
! port_INLINE void activity_synchronize_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) {
ieee802154_header_iht ieee802514_header;
+ uint16_t lenIE=0;//len of IEs being received if any.
// check state
if (ieee154e_vars.state!=S_SYNCRX) {
***************
*** 532,538 ****
sizeof(ieee154e_vars.dataReceived->packet),
&ieee154e_vars.dataReceived->l1_rssi,
&ieee154e_vars.dataReceived->l1_lqi,
! &ieee154e_vars.dataReceived->l1_crc);
// break if packet too short
if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX) {
--- 531,537 ----
sizeof(ieee154e_vars.dataReceived->packet),
&ieee154e_vars.dataReceived->l1_rssi,
&ieee154e_vars.dataReceived->l1_lqi,
! (uint8_t*)(&ieee154e_vars.dataReceived->l1_crc));
// break if packet too short
if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX) {
***************
*** 566,588 ****
ieee154e_vars.dataReceived->l2_dsn = ieee802514_header.dsn;
memcpy(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t));
! // toss the IEEE802.15.4 header
packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength);
// break if invalid ADV
! if (isValidAdv(&ieee802514_header)==FALSE) {
// break from the do-while loop and execute the clean-up code below
break;
}
// turn off the radio
radio_rfOff();
! // record the ASN from the ADV payload
! asnStoreFromAdv(ieee154e_vars.dataReceived);
!
! // toss the ADV payload
! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ADV_PAYLOAD_LENGTH);
// synchronize (for the first time) to the sender's ADV
synchronizePacket(ieee154e_vars.syncCapturedTime);
--- 565,592 ----
ieee154e_vars.dataReceived->l2_dsn = ieee802514_header.dsn;
memcpy(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t));
! // toss the IEEE802.15.4 header -- this does not include IEs as they are processed
! // next.
packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength);
+ // handle IEs -- xv poipoi
// break if invalid ADV
! if ((ieee802514_header.valid==TRUE &&
! ieee802514_header.ieListPresent==TRUE &&
! ieee802514_header.frameType==IEEE154_TYPE_BEACON &&
! packetfunctions_sameAddress(&ieee802514_header.panid,idmanager_getMyID(ADDR_PANID)) &&
! ieee154e_processIEs(ieee154e_vars.dataReceived,&lenIE))==FALSE) {
// break from the do-while loop and execute the clean-up code below
break;
}
// turn off the radio
radio_rfOff();
+ //compute radio duty cycle
+ ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit);
! // toss the IEs including Synch
! packetfunctions_tossHeader(ieee154e_vars.dataReceived,lenIE);
// synchronize (for the first time) to the sender's ADV
synchronizePacket(ieee154e_vars.syncCapturedTime);
***************
*** 619,631 ****
changeState(S_SYNCLISTEN);
}
//======= TX
! port_INLINE void activity_ti1ORri1() {
cellType_t cellType;
open_addr_t neighbor;
uint8_t i;
!
// increment ASN (do this first so debug pins are in sync)
incrementAsnOffset();
--- 623,782 ----
changeState(S_SYNCLISTEN);
}
+ //xv poipoi - IE Handling
+ port_INLINE bool ieee154e_processIEs(OpenQueueEntry_t* pkt, uint16_t * lenIE)
+ {
+ uint8_t ptr,byte0,byte1;
+ uint8_t temp_8b,gr_elem_id,subid;
+ uint16_t temp_16b,len,sublen;
+ volatile PORT_SIGNED_INT_WIDTH timeCorrection;
+
+ ptr=0;
+ //candidate IE header if type ==0 header IE if type==1 payload IE
+ temp_8b = *((uint8_t*)(pkt->payload)+ptr);
+ ptr++;
+ temp_16b = temp_8b + ((*((uint8_t*)(pkt->payload)+ptr))<< 8);
+ ptr++;
+ *lenIE = ptr;
+ if ((temp_16b & IEEE802154E_DESC_TYPE_PAYLOAD_IE) == IEEE802154E_DESC_TYPE_PAYLOAD_IE){
+ //payload IE - last bit is 1
+ len=(temp_16b & IEEE802154E_DESC_LEN_PAYLOAD_IE_MASK)>>IEEE802154E_DESC_LEN_PAYLOAD_IE_SHIFT;
+ gr_elem_id= (temp_16b & IEEE802154E_DESC_GROUPID_PAYLOAD_IE_MASK)>>IEEE802154E_DESC_GROUPID_PAYLOAD_IE_SHIFT;
+ }else {
+ //header IE - last bit is 0
+ len=(temp_16b & IEEE802154E_DESC_LEN_HEADER_IE_MASK)>>IEEE802154E_DESC_LEN_HEADER_IE_SHIFT;
+ gr_elem_id = (temp_16b & IEEE802154E_DESC_ELEMENTID_HEADER_IE_MASK)>>IEEE802154E_DESC_ELEMENTID_HEADER_IE_SHIFT;
+ }
+
+ *lenIE += len;
+ //now determine sub elements if any
+ switch(gr_elem_id){
+ //this is the only groupID that we parse. See page 82.
+ case IEEE802154E_MLME_IE_GROUPID:
+ //IE content can be any of the sub-IEs. Parse and see which
+ do{
+ //read sub IE header
+ temp_8b = *((uint8_t*)(pkt->payload)+ptr);
+ ptr = ptr + 1;
+ temp_16b = temp_8b +(*((uint8_t*)(pkt->payload)+ptr) << 8);
+ ptr = ptr + 1;
+ len = len - 2; //remove header fields len
+ if ((temp_16b & IEEE802154E_DESC_TYPE_LONG) == IEEE802154E_DESC_TYPE_LONG){
+ //long sub-IE - last bit is 1
+ sublen=(temp_16b & IEEE802154E_DESC_LEN_LONG_MLME_IE_MASK)>>IEEE802154E_DESC_LEN_LONG_MLME_IE_SHIFT;
+ subid= (temp_16b & IEEE802154E_DESC_SUBID_LONG_MLME_IE_MASK)>>IEEE802154E_DESC_SUBID_LONG_MLME_IE_SHIFT;
+ }else {
+ //short IE - last bit is 0
+ sublen =(temp_16b & IEEE802154E_DESC_LEN_SHORT_MLME_IE_MASK)>>IEEE802154E_DESC_LEN_SHORT_MLME_IE_SHIFT;
+ subid = (temp_16b & IEEE802154E_DESC_SUBID_SHORT_MLME_IE_MASK)>>IEEE802154E_DESC_SUBID_SHORT_MLME_IE_SHIFT;
+ }
+ switch(subid){
+ case IEEE802154E_MLME_SYNC_IE_SUBID:
+ //content is ASN and Join Priority
+ if (idmanager_getIsDAGroot()==FALSE) {
+ asnStoreFromAdv((uint8_t*)(pkt->payload)+ptr);
+ ptr = ptr + 5; //add ASN len
+ joinPriorityStoreFromAdv(*((uint8_t*)(pkt->payload)+ptr));
+ ptr = ptr + 1;
+ }
+ break;
+ case IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID:
+ ieee154e_processSlotframeLinkIE(pkt,&ptr);
+ break;
+ case IEEE802154E_MLME_TIMESLOT_IE_SUBID:
+ //TODO
+ break;
+ default:
+ return FALSE;
+ break;
+ }
+ len = len - sublen;
+ } while(len>0);
+
+ break;
+ //the rest are elementID
+ case IEEE802154E_ACK_NACK_TIMECORRECTION_ELEMENTID:
+ //IE content is time correction -- apply the time correction on ack received.
+ if (idmanager_getIsDAGroot()==FALSE &&
+ neighbors_isPreferredParent(&(pkt->l2_nextORpreviousHop)) ) {
+ byte0 = *((uint8_t*)(pkt->payload)+ptr);
+ ptr++;
+ byte1 = *((uint8_t*)(pkt->payload)+ptr);
+ ptr++;
+
+ timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_RADIOTIMER_WIDTH)byte1<<8 | (PORT_RADIOTIMER_WIDTH)byte0);
+ timeCorrection /= US_PER_TICK;
+ timeCorrection = -timeCorrection;
+ synchronizeAck(timeCorrection);
+ }
+ break;
+ default:
+ *lenIE = 0;//no header or not recognized.
+ return FALSE;
+ }
+ if (*lenIE>127) {
+ // log the error
+ openserial_printError(COMPONENT_IEEE802154E,ERR_HEADER_TOO_LONG,
+ (errorparameter_t)*lenIE,
+ (errorparameter_t)1);
+ }
+ return TRUE;
+ }
+
+ port_INLINE void ieee154e_processSlotframeLinkIE(OpenQueueEntry_t* pkt,uint8_t * ptr){
+ uint8_t numSlotFrames,i,j,localptr;
+ slotframelink_IE_t sfInfo;
+ linkInfo_subIE_t linkInfo;
+ localptr=*ptr;
+ // number of slot frames 1B
+ numSlotFrames = *((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+ // for each slotframe
+ i=0;
+ while(i < numSlotFrames){
+ //1-slotftramehandle 1B
+ sfInfo.slotframehandle=*((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+ //2-slotframe size 2B
+ sfInfo.slotframesize = *((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+ sfInfo.slotframesize |= (*((uint8_t*)(pkt->payload)+localptr))<<8;
+ localptr++;;
+ //3-number of links 1B
+ sfInfo.numlinks= *((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+
+ for (j=0;j<sfInfo.numlinks;j++){
+ //for each link 5Bytes
+ //TimeSlot 2B
+ linkInfo.tsNum = *((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+ linkInfo.tsNum |= (*((uint8_t*)(pkt->payload)+localptr))<<8;
+ localptr++;
+ //Ch.Offset 2B
+ linkInfo.choffset = *((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+ linkInfo.choffset |= (*((uint8_t*)(pkt->payload)+localptr))<<8;
+ localptr++;
+ //LinkOption bitmap 1B
+ linkInfo.linkoptions = *((uint8_t*)(pkt->payload)+localptr);
+ localptr++;
+ //xv poipoi
+ //TODO - inform schedule of that link so it can update if needed.
+ }
+ i++;
+ }
+ *ptr=localptr;
+ }
+
//======= TX
! port_INLINE void activity_ti1ORri1(void) {
cellType_t cellType;
open_addr_t neighbor;
uint8_t i;
! synch_IE_t syn_IE;
!
// increment ASN (do this first so debug pins are in sync)
incrementAsnOffset();
***************
*** 703,711 ****
// change state
changeState(S_TXDATAOFFSET);
// change owner
! ieee154e_vars.dataToSend->owner = COMPONENT_IEEE802154E;
// fill in the ASN field of the ADV
! asnWriteToAdv(ieee154e_vars.dataToSend);
// record that I attempt to transmit this packet
ieee154e_vars.dataToSend->l2_numTxAttempts++;
// arm tt1
--- 854,867 ----
// change state
changeState(S_TXDATAOFFSET);
// change owner
! ieee154e_vars.dataToSend->owner = COMPONENT_IEEE802154E;
! //copy synch IE -- should be Little endian???
// fill in the ASN field of the ADV
! ieee154e_getAsn(syn_IE.asn);
! syn_IE.join_priority = neighbors_getMyDAGrank()/(2*MINHOPRANKINCREASE); //poipoi -- use dagrank(rank)
!
! memcpy(ieee154e_vars.dataToSend->l2_ASNpayload,&syn_IE,sizeof(synch_IE_t));
!
// record that I attempt to transmit this packet
ieee154e_vars.dataToSend->l2_numTxAttempts++;
// arm tt1
***************
*** 779,785 ****
}
}
! port_INLINE void activity_ti2() {
// change state
changeState(S_TXDATAPREPARE);
--- 935,941 ----
}
}
! port_INLINE void activity_ti2(void) {
// change state
changeState(S_TXDATAPREPARE);
***************
*** 787,793 ****
ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset());
// configure the radio for that frequency
- //radio_setFrequency(frequency);
radio_setFrequency(ieee154e_vars.freq);
// load the packet in the radio's Tx buffer
--- 943,948 ----
***************
*** 796,802 ****
// enable the radio in Tx mode. This does not send the packet.
radio_txEnable();
!
// arm tt2
radiotimer_schedule(DURATION_tt2);
--- 951,958 ----
// enable the radio in Tx mode. This does not send the packet.
radio_txEnable();
! ieee154e_vars.radioOnInit=radio_getTimerValue();
! ieee154e_vars.radioOnThisSlot=TRUE;
// arm tt2
radiotimer_schedule(DURATION_tt2);
***************
*** 804,810 ****
changeState(S_TXDATAREADY);
}
! port_INLINE void activity_tie1() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXDATAPREPARE_OVERFLOW,
(errorparameter_t)ieee154e_vars.state,
--- 960,966 ----
changeState(S_TXDATAREADY);
}
! port_INLINE void activity_tie1(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXDATAPREPARE_OVERFLOW,
(errorparameter_t)ieee154e_vars.state,
***************
*** 814,820 ****
endSlot();
}
! port_INLINE void activity_ti3() {
// change state
changeState(S_TXDATADELAY);
--- 970,976 ----
endSlot();
}
! port_INLINE void activity_ti3(void) {
// change state
changeState(S_TXDATADELAY);
***************
*** 825,831 ****
radio_txNow();
}
! port_INLINE void activity_tie2() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIO_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 981,987 ----
radio_txNow();
}
! port_INLINE void activity_tie2(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIO_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 835,841 ****
endSlot();
}
! port_INLINE void activity_ti4(PORT_TIMER_WIDTH capturedTime) {
// change state
changeState(S_TXDATA);
--- 991,998 ----
endSlot();
}
! //start of frame interrupt
! port_INLINE void activity_ti4(PORT_RADIOTIMER_WIDTH capturedTime) {
// change state
changeState(S_TXDATA);
***************
*** 849,855 ****
radiotimer_schedule(DURATION_tt4);
}
! port_INLINE void activity_tie3() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1006,1012 ----
radiotimer_schedule(DURATION_tt4);
}
! port_INLINE void activity_tie3(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 859,865 ****
endSlot();
}
! port_INLINE void activity_ti5(PORT_TIMER_WIDTH capturedTime) {
bool listenForAck;
// change state
--- 1016,1022 ----
endSlot();
}
! port_INLINE void activity_ti5(PORT_RADIOTIMER_WIDTH capturedTime) {
bool listenForAck;
// change state
***************
*** 869,875 ****
radiotimer_cancel();
// turn off the radio
! radio_rfOff();
// record the captured time
ieee154e_vars.lastCapturedTime = capturedTime;
--- 1026,1033 ----
radiotimer_cancel();
// turn off the radio
! radio_rfOff();
! ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit);
// record the captured time
ieee154e_vars.lastCapturedTime = capturedTime;
***************
*** 896,902 ****
}
}
! port_INLINE void activity_ti6() {
// change state
changeState(S_RXACKPREPARE);
--- 1054,1060 ----
}
}
! port_INLINE void activity_ti6(void) {
// change state
changeState(S_RXACKPREPARE);
***************
*** 904,915 ****
ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset());
// configure the radio for that frequency
- //radio_setFrequency(frequency);
radio_setFrequency(ieee154e_vars.freq);
// enable the radio in Rx mode. The radio is not actively listening yet.
radio_rxEnable();
!
// arm tt6
radiotimer_schedule(DURATION_tt6);
--- 1062,1074 ----
ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset());
// configure the radio for that frequency
radio_setFrequency(ieee154e_vars.freq);
// enable the radio in Rx mode. The radio is not actively listening yet.
radio_rxEnable();
! //caputre init of radio for duty cycle calculation
! ieee154e_vars.radioOnInit=radio_getTimerValue();
! ieee154e_vars.radioOnThisSlot=TRUE;
// arm tt6
radiotimer_schedule(DURATION_tt6);
***************
*** 917,923 ****
changeState(S_RXACKREADY);
}
! port_INLINE void activity_tie4() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXACKPREPARE_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1076,1082 ----
changeState(S_RXACKREADY);
}
! port_INLINE void activity_tie4(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXACKPREPARE_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 927,933 ****
endSlot();
}
! port_INLINE void activity_ti7() {
// change state
changeState(S_RXACKLISTEN);
--- 1086,1092 ----
endSlot();
}
! port_INLINE void activity_ti7(void) {
// change state
changeState(S_RXACKLISTEN);
***************
*** 938,944 ****
radiotimer_schedule(DURATION_tt7);
}
! port_INLINE void activity_tie5() {
// indicate transmit failed to schedule to keep stats
schedule_indicateTx(&ieee154e_vars.asn,FALSE);
--- 1097,1103 ----
radiotimer_schedule(DURATION_tt7);
}
! port_INLINE void activity_tie5(void) {
// indicate transmit failed to schedule to keep stats
schedule_indicateTx(&ieee154e_vars.asn,FALSE);
***************
*** 960,966 ****
endSlot();
}
! port_INLINE void activity_ti8(PORT_TIMER_WIDTH capturedTime) {
// change state
changeState(S_RXACK);
--- 1119,1125 ----
endSlot();
}
! port_INLINE void activity_ti8(PORT_RADIOTIMER_WIDTH capturedTime) {
// change state
changeState(S_RXACK);
***************
*** 974,989 ****
radiotimer_schedule(DURATION_tt8);
}
! port_INLINE void activity_tie6() {
// abort
endSlot();
}
! port_INLINE void activity_ti9(PORT_TIMER_WIDTH capturedTime) {
ieee802154_header_iht ieee802514_header;
! volatile PORT_SIGNED_INT_WIDTH timeCorrection;
! uint8_t byte0;
! uint8_t byte1;
// change state
changeState(S_TXPROC);
--- 1133,1147 ----
radiotimer_schedule(DURATION_tt8);
}
! port_INLINE void activity_tie6(void) {
// abort
endSlot();
}
! port_INLINE void activity_ti9(PORT_RADIOTIMER_WIDTH capturedTime) {
ieee802154_header_iht ieee802514_header;
! //volatile PORT_SIGNED_INT_WIDTH timeCorrection;
! uint16_t lenIE;
// change state
changeState(S_TXPROC);
***************
*** 993,998 ****
--- 1151,1158 ----
// turn off the radio
radio_rfOff();
+ //compute tics radio on.
+ ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit);
// record the captured time
ieee154e_vars.lastCapturedTime = capturedTime;
***************
*** 1031,1037 ****
sizeof(ieee154e_vars.ackReceived->packet),
&ieee154e_vars.ackReceived->l1_rssi,
&ieee154e_vars.ackReceived->l1_lqi,
! &ieee154e_vars.ackReceived->l1_crc);
// break if wrong length
if (ieee154e_vars.ackReceived->length<LENGTH_CRC || ieee154e_vars.ackReceived->length>LENGTH_IEEE154_MAX) {
--- 1191,1197 ----
sizeof(ieee154e_vars.ackReceived->packet),
&ieee154e_vars.ackReceived->l1_rssi,
&ieee154e_vars.ackReceived->l1_lqi,
! (uint8_t*)&ieee154e_vars.ackReceived->l1_crc);
// break if wrong length
if (ieee154e_vars.ackReceived->length<LENGTH_CRC || ieee154e_vars.ackReceived->length>LENGTH_IEEE154_MAX) {
***************
*** 1074,1090 ****
// break from the do-while loop and execute the clean-up code below
break;
}
! // resynchronize if I'm not a DAGroot and ACK from preferred parent
! if (idmanager_getIsDAGroot()==FALSE &&
! neighbors_isPreferredParent(&(ieee154e_vars.ackReceived->l2_nextORpreviousHop)) ) {
! byte0 = ieee154e_vars.ackReceived->payload[0];
! byte1 = ieee154e_vars.ackReceived->payload[1];
! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_TIMER_WIDTH)byte1<<8 | (PORT_TIMER_WIDTH)byte0);
! timeCorrection /= US_PER_TICK;
! timeCorrection = -timeCorrection;
! synchronizeAck(timeCorrection);
}
// inform schedule of successful transmission
schedule_indicateTx(&ieee154e_vars.asn,TRUE);
--- 1234,1251 ----
// break from the do-while loop and execute the clean-up code below
break;
}
+ //hanlde IEs --xv poipoi
+ if (ieee802514_header.ieListPresent==FALSE){
+ break; //ack should contain IEs.
+ }
! if (ieee154e_processIEs(ieee154e_vars.ackReceived,&lenIE)==FALSE){
! //invalid IEs on ACK.
! break;
}
+
+ // toss the IEs including ACK -- xv poipoi
+ packetfunctions_tossHeader(ieee154e_vars.ackReceived,lenIE);
// inform schedule of successful transmission
schedule_indicateTx(&ieee154e_vars.asn,TRUE);
***************
*** 1108,1114 ****
//======= RX
! port_INLINE void activity_ri2() {
// change state
changeState(S_RXDATAPREPARE);
--- 1269,1275 ----
//======= RX
! port_INLINE void activity_ri2(void) {
// change state
changeState(S_RXDATAPREPARE);
***************
*** 1116,1127 ****
ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset());
// configure the radio for that frequency
- //radio_setFrequency(frequency);
radio_setFrequency(ieee154e_vars.freq);
// enable the radio in Rx mode. The radio does not actively listen yet.
radio_rxEnable();
!
// arm rt2
radiotimer_schedule(DURATION_rt2);
--- 1277,1288 ----
ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset());
// configure the radio for that frequency
radio_setFrequency(ieee154e_vars.freq);
// enable the radio in Rx mode. The radio does not actively listen yet.
radio_rxEnable();
! ieee154e_vars.radioOnInit=radio_getTimerValue();
! ieee154e_vars.radioOnThisSlot=TRUE;
// arm rt2
radiotimer_schedule(DURATION_rt2);
***************
*** 1130,1136 ****
changeState(S_RXDATAREADY);
}
! port_INLINE void activity_rie1() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXDATAPREPARE_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1291,1297 ----
changeState(S_RXDATAREADY);
}
! port_INLINE void activity_rie1(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXDATAPREPARE_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 1140,1146 ****
endSlot();
}
! port_INLINE void activity_ri3() {
// change state
changeState(S_RXDATALISTEN);
--- 1301,1307 ----
endSlot();
}
! port_INLINE void activity_ri3(void) {
// change state
changeState(S_RXDATALISTEN);
***************
*** 1151,1162 ****
radiotimer_schedule(DURATION_rt3);
}
! port_INLINE void activity_rie2() {
// abort
endSlot();
}
! port_INLINE void activity_ri4(PORT_TIMER_WIDTH capturedTime) {
// change state
changeState(S_RXDATA);
--- 1312,1324 ----
radiotimer_schedule(DURATION_rt3);
}
! port_INLINE void activity_rie2(void) {
// abort
endSlot();
}
! port_INLINE void activity_ri4(PORT_RADIOTIMER_WIDTH capturedTime) {
!
// change state
changeState(S_RXDATA);
***************
*** 1168,1179 ****
// record the captured time to sync
ieee154e_vars.syncCapturedTime = capturedTime;
!
! // arm rt4
radiotimer_schedule(DURATION_rt4);
}
! port_INLINE void activity_rie3() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1330,1341 ----
// record the captured time to sync
ieee154e_vars.syncCapturedTime = capturedTime;
!
radiotimer_schedule(DURATION_rt4);
}
! port_INLINE void activity_rie3(void) {
!
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 1183,1200 ****
endSlot();
}
! port_INLINE void activity_ri5(PORT_TIMER_WIDTH capturedTime) {
ieee802154_header_iht ieee802514_header;
// change state
changeState(S_TXACKOFFSET);
// cancel rt4
radiotimer_cancel();
!
// turn off the radio
! radio_rfOff();
!
// get a buffer to put the (received) data in
ieee154e_vars.dataReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E);
if (ieee154e_vars.dataReceived==NULL) {
--- 1345,1363 ----
endSlot();
}
! port_INLINE void activity_ri5(PORT_RADIOTIMER_WIDTH capturedTime) {
ieee802154_header_iht ieee802514_header;
+ uint16_t lenIE=0;
// change state
changeState(S_TXACKOFFSET);
// cancel rt4
radiotimer_cancel();
!
// turn off the radio
! //radio_rfOff();
! ieee154e_vars.radioOnTics+=radio_getTimerValue()-ieee154e_vars.radioOnInit;
// get a buffer to put the (received) data in
ieee154e_vars.dataReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E);
if (ieee154e_vars.dataReceived==NULL) {
***************
*** 1230,1236 ****
sizeof(ieee154e_vars.dataReceived->packet),
&ieee154e_vars.dataReceived->l1_rssi,
&ieee154e_vars.dataReceived->l1_lqi,
! &ieee154e_vars.dataReceived->l1_crc);
// break if wrong length
if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX ) {
--- 1393,1399 ----
sizeof(ieee154e_vars.dataReceived->packet),
&ieee154e_vars.dataReceived->l1_rssi,
&ieee154e_vars.dataReceived->l1_lqi,
! (uint8_t*)&ieee154e_vars.dataReceived->l1_crc);
// break if wrong length
if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX ) {
***************
*** 1267,1281 ****
// toss the IEEE802.15.4 header
packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength);
! // if I just received a valid ADV, record the ASN and toss the ADV payload
! if (isValidAdv(&ieee802514_header)==TRUE) {
! if (idmanager_getIsDAGroot()==FALSE) {
! asnStoreFromAdv(ieee154e_vars.dataReceived);
! }
! // toss the ADV payload
! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ADV_PAYLOAD_LENGTH);
}
// record the captured time
ieee154e_vars.lastCapturedTime = capturedTime;
--- 1430,1448 ----
// toss the IEEE802.15.4 header
packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength);
! // handle IEs xv poipoi
! //reset join priority
!
! if ((ieee802514_header.valid==TRUE &&
! ieee802514_header.ieListPresent==TRUE &&
! packetfunctions_sameAddress(&ieee802514_header.panid,idmanager_getMyID(ADDR_PANID)) &&
! ieee154e_processIEs(ieee154e_vars.dataReceived,&lenIE))==FALSE) {
! //log that the packet is not carrying IEs
}
+ // toss the IEs including Synch
+ packetfunctions_tossHeader(ieee154e_vars.dataReceived,lenIE);
+
// record the captured time
ieee154e_vars.lastCapturedTime = capturedTime;
***************
*** 1317,1324 ****
endSlot();
}
! port_INLINE void activity_ri6() {
PORT_SIGNED_INT_WIDTH timeCorrection;
// change state
changeState(S_TXACKPREPARE);
--- 1484,1492 ----
endSlot();
}
! port_INLINE void activity_ri6(void) {
PORT_SIGNED_INT_WIDTH timeCorrection;
+ header_IE_descriptor_t header_desc;
// change state
changeState(S_TXACKPREPARE);
***************
*** 1345,1363 ****
// calculate the time timeCorrection (this is the time when the packet arrive w.r.t the time it should be.
timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_SIGNED_INT_WIDTH)ieee154e_vars.syncCapturedTime-(PORT_SIGNED_INT_WIDTH)TsTxOffset);
!
// add the payload to the ACK (i.e. the timeCorrection)
! packetfunctions_reserveHeaderSize(ieee154e_vars.ackToSend,sizeof(IEEE802154E_ACK_ht));
timeCorrection = -timeCorrection;
timeCorrection *= US_PER_TICK;
! ieee154e_vars.ackToSend->payload[0] = (uint8_t)((((PORT_TIMER_WIDTH)timeCorrection) ) & 0xff);
! ieee154e_vars.ackToSend->payload[1] = (uint8_t)((((PORT_TIMER_WIDTH)timeCorrection)>>8) & 0xff);
// prepend the IEEE802.15.4 header to the ACK
ieee154e_vars.ackToSend->l2_frameType = IEEE154_TYPE_ACK;
ieee154e_vars.ackToSend->l2_dsn = ieee154e_vars.dataReceived->l2_dsn;
ieee802154_prependHeader(ieee154e_vars.ackToSend,
ieee154e_vars.ackToSend->l2_frameType,
IEEE154_SEC_NO_SECURITY,
ieee154e_vars.dataReceived->l2_dsn,
&(ieee154e_vars.dataReceived->l2_nextORpreviousHop)
--- 1513,1541 ----
// calculate the time timeCorrection (this is the time when the packet arrive w.r.t the time it should be.
timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_SIGNED_INT_WIDTH)ieee154e_vars.syncCapturedTime-(PORT_SIGNED_INT_WIDTH)TsTxOffset);
!
// add the payload to the ACK (i.e. the timeCorrection)
! packetfunctions_reserveHeaderSize(ieee154e_vars.ackToSend,sizeof(ack_timecorrection_IE_t));
timeCorrection = -timeCorrection;
timeCorrection *= US_PER_TICK;
! ieee154e_vars.ackToSend->payload[0] = (uint8_t)((((PORT_RADIOTIMER_WIDTH)timeCorrection) ) & 0xff);
! ieee154e_vars.ackToSend->payload[1] = (uint8_t)((((PORT_RADIOTIMER_WIDTH)timeCorrection)>>8) & 0xff);
!
! // add header IE header -- xv poipoi -- pkt is filled in reverse order..
! packetfunctions_reserveHeaderSize(ieee154e_vars.ackToSend,sizeof(header_IE_descriptor_t));
! //create the header for ack IE
! header_desc.length_elementid_type=(sizeof(ack_timecorrection_IE_t)<< IEEE802154E_DESC_LEN_HEADER_IE_SHIFT)|
! (IEEE802154E_ACK_NACK_TIMECORRECTION_ELEMENTID << IEEE802154E_DESC_ELEMENTID_HEADER_IE_SHIFT)|
! IEEE802154E_DESC_TYPE_SHORT;
! memcpy(ieee154e_vars.ackToSend->payload,&header_desc,sizeof(header_IE_descriptor_t));
// prepend the IEEE802.15.4 header to the ACK
ieee154e_vars.ackToSend->l2_frameType = IEEE154_TYPE_ACK;
ieee154e_vars.ackToSend->l2_dsn = ieee154e_vars.dataReceived->l2_dsn;
ieee802154_prependHeader(ieee154e_vars.ackToSend,
ieee154e_vars.ackToSend->l2_frameType,
+ IEEE154_IELIST_YES,//ie in ack
+ IEEE154_FRAMEVERSION,//enhanced ack
IEEE154_SEC_NO_SECURITY,
ieee154e_vars.dataReceived->l2_dsn,
&(ieee154e_vars.dataReceived->l2_nextORpreviousHop)
***************
*** 1370,1376 ****
ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset());
// configure the radio for that frequency
- //radio_setFrequency(frequency);
radio_setFrequency(ieee154e_vars.freq);
// load the packet in the radio's Tx buffer
--- 1548,1553 ----
***************
*** 1379,1385 ****
// enable the radio in Tx mode. This does not send that packet.
radio_txEnable();
!
// arm rt6
radiotimer_schedule(DURATION_rt6);
--- 1556,1563 ----
// enable the radio in Tx mode. This does not send that packet.
radio_txEnable();
! ieee154e_vars.radioOnInit=radio_getTimerValue();
! ieee154e_vars.radioOnThisSlot=TRUE;
// arm rt6
radiotimer_schedule(DURATION_rt6);
***************
*** 1387,1393 ****
changeState(S_TXACKREADY);
}
! port_INLINE void activity_rie4() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXACKPREPARE_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1565,1571 ----
changeState(S_TXACKREADY);
}
! port_INLINE void activity_rie4(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXACKPREPARE_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 1397,1403 ****
endSlot();
}
! port_INLINE void activity_ri7() {
// change state
changeState(S_TXACKDELAY);
--- 1575,1581 ----
endSlot();
}
! port_INLINE void activity_ri7(void) {
// change state
changeState(S_TXACKDELAY);
***************
*** 1405,1414 ****
radiotimer_schedule(DURATION_rt7);
// give the 'go' to transmit
! radio_txNow();
}
! port_INLINE void activity_rie5() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIOTX_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1583,1592 ----
radiotimer_schedule(DURATION_rt7);
// give the 'go' to transmit
! radio_txNow();
}
! port_INLINE void activity_rie5(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIOTX_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 1418,1424 ****
endSlot();
}
! port_INLINE void activity_ri8(PORT_TIMER_WIDTH capturedTime) {
// change state
changeState(S_TXACK);
--- 1596,1602 ----
endSlot();
}
! port_INLINE void activity_ri8(PORT_RADIOTIMER_WIDTH capturedTime) {
// change state
changeState(S_TXACK);
***************
*** 1432,1438 ****
radiotimer_schedule(DURATION_rt8);
}
! port_INLINE void activity_rie6() {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDACKDURATION_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
--- 1610,1616 ----
radiotimer_schedule(DURATION_rt8);
}
! port_INLINE void activity_rie6(void) {
// log the error
openserial_printError(COMPONENT_IEEE802154E,ERR_WDACKDURATION_OVERFLOWS,
(errorparameter_t)ieee154e_vars.state,
***************
*** 1442,1448 ****
endSlot();
}
! port_INLINE void activity_ri9(PORT_TIMER_WIDTH capturedTime) {
// change state
changeState(S_RXPROC);
--- 1620,1626 ----
endSlot();
}
! port_INLINE void activity_ri9(PORT_RADIOTIMER_WIDTH capturedTime) {
// change state
changeState(S_RXPROC);
***************
*** 1476,1502 ****
//======= frame validity check
/**
- \brief Decides whether the packet I just received is a valid ADV
-
- \param [in] ieee802514_header IEEE802.15.4 header of the packet I just
- received.
-
- A valid ADV frame satisfies the following conditions:
- - its IEEE802.15.4 header is well formatted
- - it's a BEACON frame
- - it's sent to the my PANid
- - its payload length is the expected ADV payload length
-
- \returns TRUE if packet is a valid ADV, FALSE otherwise
- */
- port_INLINE bool isValidAdv(ieee802154_header_iht* ieee802514_header) {
- return ieee802514_header->valid==TRUE && \
- ieee802514_header->frameType==IEEE154_TYPE_BEACON && \
- packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \
- ieee154e_vars.dataReceived->length==ADV_PAYLOAD_LENGTH;
- }
-
- /**
\brief Decides whether the packet I just received is valid received frame.
A valid Rx frame satisfies the following constraints:
--- 1654,1659 ----
***************
*** 1505,1511 ****
- it's sent on the same PANid as mine
- it's for me (unicast or broadcast)
! \param [in] ieee802514_header IEEE802.15.4 header of the packet I just received
\returns TRUE if packet is valid received frame, FALSE otherwise
*/
--- 1662,1668 ----
- it's sent on the same PANid as mine
- it's for me (unicast or broadcast)
! \param[in] ieee802514_header IEEE802.15.4 header of the packet I just received
\returns TRUE if packet is valid received frame, FALSE otherwise
*/
***************
*** 1533,1540 ****
- the packet is unicast to me
- the packet comes from the neighbor I sent the data to
! \param [in] ieee802514_header IEEE802.15.4 header of the packet I just received
! \param [in] packetSent points to the packet I just sent
\returns TRUE if packet is a valid ACK, FALSE otherwise.
*/
--- 1690,1697 ----
- the packet is unicast to me
- the packet comes from the neighbor I sent the data to
! \param[in] ieee802514_header IEEE802.15.4 header of the packet I just received
! \param[in] packetSent points to the packet I just sent
\returns TRUE if packet is a valid ACK, FALSE otherwise.
*/
***************
*** 1557,1563 ****
//======= ASN handling
! port_INLINE void incrementAsnOffset() {
// increment the asn
ieee154e_vars.asn.bytes0and1++;
if (ieee154e_vars.asn.bytes0and1==0) {
--- 1714,1720 ----
//======= ASN handling
! port_INLINE void incrementAsnOffset(void) {
// increment the asn
ieee154e_vars.asn.bytes0and1++;
if (ieee154e_vars.asn.bytes0and1==0) {
***************
*** 1571,1610 ****
ieee154e_vars.asnOffset = (ieee154e_vars.asnOffset+1)%16;
}
! port_INLINE void asnWriteToAdv(OpenQueueEntry_t* advFrame) {
! advFrame->l2_payload[0] = (ieee154e_vars.asn.bytes0and1 & 0xff);
! advFrame->l2_payload[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff);
! advFrame->l2_payload[2] = (ieee154e_vars.asn.bytes2and3 & 0xff);
! advFrame->l2_payload[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff);
! advFrame->l2_payload[4] = ieee154e_vars.asn.byte4;
}
! //from upper layer that want to send the ASN to compute timming or latency
! void asnWriteToPkt(OpenQueueEntry_t* frame) {
! frame->payload[0] = (ieee154e_vars.asn.bytes0and1 & 0xff);
! frame->payload[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff);
! frame->payload[2] = (ieee154e_vars.asn.bytes2and3 & 0xff);
! frame->payload[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff);
! frame->payload[4] = ieee154e_vars.asn.byte4;
}
- void asnWriteToSerial(uint8_t* array) {
- array[0] = (ieee154e_vars.asn.bytes0and1 & 0xff);
- array[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff);
- array[2] = (ieee154e_vars.asn.bytes2and3 & 0xff);
- array[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff);
- array[4] = ieee154e_vars.asn.byte4;
- }
!
! port_INLINE void asnStoreFromAdv(OpenQueueEntry_t* advFrame) {
// store the ASN
! ieee154e_vars.asn.bytes0and1 = ieee154e_vars.dataReceived->payload[0]+
! 256*ieee154e_vars.dataReceived->payload[1];
! ieee154e_vars.asn.bytes2and3 = ieee154e_vars.dataReceived->payload[2]+
! 256*ieee154e_vars.dataReceived->payload[3];
! ieee154e_vars.asn.byte4 = ieee154e_vars.dataReceived->payload[4];
// determine the current slotOffset
/*
--- 1728,1756 ----
ieee154e_vars.asnOffset = (ieee154e_vars.asnOffset+1)%16;
}
! //from upper layer that want to send the ASN to compute timing or latency
! port_INLINE void ieee154e_getAsn(uint8_t* array) {
! array[0] = (ieee154e_vars.asn.bytes0and1 & 0xff);
! array[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff);
! array[2] = (ieee154e_vars.asn.bytes2and3 & 0xff);
! array[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff);
! array[4] = ieee154e_vars.asn.byte4;
}
! port_INLINE void joinPriorityStoreFromAdv(uint8_t jp){
! ieee154e_vars.dataReceived->l2_joinPriority = jp;
! ieee154e_vars.dataReceived->l2_joinPriorityPresent = TRUE;
}
! port_INLINE void asnStoreFromAdv(uint8_t* asn) {
// store the ASN
! ieee154e_vars.asn.bytes0and1 = asn[0]+
! 256*asn[1];
! ieee154e_vars.asn.bytes2and3 = asn[2]+
! 256*asn[3];
! ieee154e_vars.asn.byte4 = asn[4];
// determine the current slotOffset
/*
***************
*** 1624,1634 ****
//======= synchronization
! void synchronizePacket(PORT_TIMER_WIDTH timeReceived) {
PORT_SIGNED_INT_WIDTH timeCorrection;
! PORT_TIMER_WIDTH newPeriod;
! PORT_TIMER_WIDTH currentValue;
! PORT_TIMER_WIDTH currentPeriod;
// record the current timer value and period
currentValue = radio_getTimerValue();
currentPeriod = radio_getTimerPeriod();
--- 1770,1780 ----
//======= synchronization
! void synchronizePacket(PORT_RADIOTIMER_WIDTH timeReceived) {
PORT_SIGNED_INT_WIDTH timeCorrection;
! PORT_RADIOTIMER_WIDTH newPeriod;
! PORT_RADIOTIMER_WIDTH currentValue;
! PORT_RADIOTIMER_WIDTH currentPeriod;
// record the current timer value and period
currentValue = radio_getTimerValue();
currentPeriod = radio_getTimerPeriod();
***************
*** 1641,1647 ****
newPeriod += TsSlotDuration;
incrementAsnOffset();
}
! newPeriod = (PORT_TIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)newPeriod+timeCorrection);
// resynchronize by applying the new period
radio_setTimerPeriod(newPeriod);
// reset the de-synchronization timeout
--- 1787,1793 ----
newPeriod += TsSlotDuration;
incrementAsnOffset();
}
! newPeriod = (PORT_RADIOTIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)newPeriod+timeCorrection);
// resynchronize by applying the new period
radio_setTimerPeriod(newPeriod);
// reset the de-synchronization timeout
***************
*** 1664,1674 ****
}
void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection) {
! PORT_TIMER_WIDTH newPeriod;
! PORT_TIMER_WIDTH currentPeriod;
// calculate new period
currentPeriod = radio_getTimerPeriod();
! newPeriod = (PORT_TIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)currentPeriod-timeCorrection);
// resynchronize by applying the new period
radio_setTimerPeriod(newPeriod);
// reset the de-synchronization timeout
--- 1810,1821 ----
}
void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection) {
! PORT_RADIOTIMER_WIDTH newPeriod;
! PORT_RADIOTIMER_WIDTH currentPeriod;
// calculate new period
currentPeriod = radio_getTimerPeriod();
! newPeriod = (PORT_RADIOTIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)currentPeriod-timeCorrection);
!
// resynchronize by applying the new period
radio_setTimerPeriod(newPeriod);
// reset the de-synchronization timeout
***************
*** 1704,1710 ****
//======= notifying upper layer
! void notif_sendDone(OpenQueueEntry_t* packetSent, error_t error) {
// record the outcome of the trasmission attempt
packetSent->l2_sendDoneError = error;
// record the current ASN
--- 1851,1857 ----
//======= notifying upper layer
! void notif_sendDone(OpenQueueEntry_t* packetSent, owerror_t error) {
// record the outcome of the trasmission attempt
packetSent->l2_sendDoneError = error;
// record the current ASN
***************
*** 1714,1719 ****
--- 1861,1869 ----
packetSent->owner = COMPONENT_IEEE802154E_TO_RES;
// post RES's sendDone task
scheduler_push_task(task_resNotifSendDone,TASKPRIO_RESNOTIF_TXDONE);
+ /*thread_create(openwsn_ieee802154e_send_stack, KERNEL_CONF_STACKSIZE_MAIN,
+ PRIORITY_OPENWSN_IEEE802154E, CREATE_STACKTEST,
+ task_resNotifSendDone, "task resNotifSendDone");*/
// wake up the scheduler
SCHEDULER_WAKEUP();
}
***************
*** 1726,1744 ****
// associate this packet with the virtual component
// COMPONENT_IEEE802154E_TO_RES so RES can knows it's for it
packetReceived->owner = COMPONENT_IEEE802154E_TO_RES;
// post RES's Receive task
scheduler_push_task(task_resNotifReceive,TASKPRIO_RESNOTIF_RX);
// wake up the scheduler
SCHEDULER_WAKEUP();
}
//======= stats
! port_INLINE void resetStats() {
ieee154e_stats.numSyncPkt = 0;
ieee154e_stats.numSyncAck = 0;
ieee154e_stats.minCorrection = 127;
ieee154e_stats.maxCorrection = -127;
// do not reset the number of de-synchronizations
}
--- 1876,1899 ----
// associate this packet with the virtual component
// COMPONENT_IEEE802154E_TO_RES so RES can knows it's for it
packetReceived->owner = COMPONENT_IEEE802154E_TO_RES;
+
// post RES's Receive task
scheduler_push_task(task_resNotifReceive,TASKPRIO_RESNOTIF_RX);
+ /*thread_create(openwsn_ieee802154e_rec_stack, KERNEL_CONF_STACKSIZE_MAIN,
+ PRIORITY_OPENWSN_IEEE802154E, CREATE_STACKTEST,
+ task_resNotifSendDone, "task resNotifSendDone");*/
// wake up the scheduler
SCHEDULER_WAKEUP();
}
//======= stats
! port_INLINE void resetStats(void) {
ieee154e_stats.numSyncPkt = 0;
ieee154e_stats.numSyncAck = 0;
ieee154e_stats.minCorrection = 127;
ieee154e_stats.maxCorrection = -127;
+ ieee154e_stats.dutyCycle = 0;
// do not reset the number of de-synchronizations
}
***************
*** 1769,1775 ****
to use a single-channel sniffer; but you can not schedule two links on two
different channel offsets in the same slot.
! \param [in] channelOffset channel offset for the current slot
\returns The calculated frequency channel, an integer between 11 and 26.
*/
--- 1924,1930 ----
to use a single-channel sniffer; but you can not schedule two links on two
different channel offsets in the same slot.
! \param[in] channelOffset channel offset for the current slot
\returns The calculated frequency channel, an integer between 11 and 26.
*/
***************
*** 1785,1791 ****
Besides simply updating the state global variable,
this function toggles the FSM debug pin.
! \param [in] newstate The state the IEEE802.15.4e FSM is now in.
*/
void changeState(ieee154e_state_t newstate) {
// update the state
--- 1940,1946 ----
Besides simply updating the state global variable,
this function toggles the FSM debug pin.
! \param[in] newstate The state the IEEE802.15.4e FSM is now in.
*/
void changeState(ieee154e_state_t newstate) {
// update the state
***************
*** 1839,1848 ****
function should already have been done. If this is not the case, this function
will do that for you, but assume that something went wrong.
*/
! void endSlot() {
// turn off the radio
radio_rfOff();
!
// clear any pending timer
radiotimer_cancel();
--- 1994,2008 ----
function should already have been done. If this is not the case, this function
will do that for you, but assume that something went wrong.
*/
! void endSlot(void) {
!
! float aux; //duty cycle helper.
// turn off the radio
radio_rfOff();
! // compute the duty cycle if radio has been turned on
! if (ieee154e_vars.radioOnThisSlot==TRUE){
! ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit);
! }
// clear any pending timer
radiotimer_cancel();
***************
*** 1850,1855 ****
--- 2010,2022 ----
ieee154e_vars.lastCapturedTime = 0;
ieee154e_vars.syncCapturedTime = 0;
+ //instant duty cycle.. average is computed at debugprint_macstats.
+ aux=(float)ieee154e_vars.radioOnTics/(float)radio_getTimerPeriod();
+ ieee154e_stats.dutyCycle+=aux;//accumulate and avg will be done on serial print
+ //clear vars for duty cycle on this slot
+ ieee154e_vars.radioOnTics=0;
+ ieee154e_vars.radioOnThisSlot=FALSE;
+
// clean up dataToSend
if (ieee154e_vars.dataToSend!=NULL) {
// if everything went well, dataToSend was set to NULL in ti9
***************
*** 1899,1908 ****
ieee154e_vars.ackReceived = NULL;
}
// change state
changeState(S_SLEEP);
}
! bool ieee154e_isSynch(){
return ieee154e_vars.isSync;
! }
\ No newline at end of file
--- 2066,2076 ----
ieee154e_vars.ackReceived = NULL;
}
+
// change state
changeState(S_SLEEP);
}
! bool ieee154e_isSynch(void){
return ieee154e_vars.isSync;
! }