void task_resNotifSendDone() { OpenQueueEntry_t* msg; // get recently-sent packet from openqueue msg = openqueue_resGetSentPacket(); if (msg==NULL) { // log the error openserial_printError(COMPONENT_RES,ERR_NO_SENT_PACKET, (errorparameter_t)0, (errorparameter_t)0); // abort return; } // declare it as mine msg->owner = COMPONENT_RES; // indicate transmission (to update statistics) if (msg->l2_sendDoneError==E_SUCCESS) { neighbors_indicateTx(&(msg->l2_nextORpreviousHop), msg->l2_numTxAttempts, TRUE, &msg->l2_asn); /* piggy502: only apply Rx mask after a RES packet is sent */ switch(msg->creator){ case COMPONENT_RES: applyRxMask(); break; default: break; } } else { neighbors_indicateTx(&(msg->l2_nextORpreviousHop), msg->l2_numTxAttempts, FALSE, &msg->l2_asn); } // send the packet to where it belongs if (msg->creator == COMPONENT_RES) { // discard (ADV or KA) packets this component has created openqueue_freePacketBuffer(msg); // I can send the next ADV or KA res_vars.busySending = FALSE; // restart a random timer res_vars.periodMaintenance = 1700+(openrandom_get16b()&0xff); opentimers_setPeriod(res_vars.timerId, TIME_MS, res_vars.periodMaintenance); } else { // send the rest up the stack iphc_sendDone(msg,msg->l2_sendDoneError); } }
void task_sixtopNotifSendDone() { OpenQueueEntry_t* msg; // get recently-sent packet from openqueue msg = openqueue_sixtopGetSentPacket(); if (msg==NULL) { openserial_printCritical( COMPONENT_SIXTOP, ERR_NO_SENT_PACKET, (errorparameter_t)0, (errorparameter_t)0 ); return; } // take ownership msg->owner = COMPONENT_SIXTOP; // update neighbor statistics if (msg->l2_sendDoneError==E_SUCCESS) { neighbors_indicateTx( &(msg->l2_nextORpreviousHop), msg->l2_numTxAttempts, TRUE, &msg->l2_asn ); } else { neighbors_indicateTx( &(msg->l2_nextORpreviousHop), msg->l2_numTxAttempts, FALSE, &msg->l2_asn ); } // send the packet to where it belongs switch (msg->creator) { case COMPONENT_SIXTOP: if (msg->l2_frameType==IEEE154_TYPE_BEACON) { // this is a ADV // not busy sending ADV anymore sixtop_vars.busySendingEB = FALSE; } else { // this is a KA // not busy sending KA anymore sixtop_vars.busySendingKA = FALSE; } // discard packets openqueue_freePacketBuffer(msg); // restart a random timer sixtop_vars.periodMaintenance = 872+(openrandom_get16b()&0xff); opentimers_setPeriod( sixtop_vars.maintenanceTimerId, TIME_MS, sixtop_vars.periodMaintenance ); break; case COMPONENT_SIXTOP_RES: sixtop_six2six_sendDone(msg,msg->l2_sendDoneError); break; default: // send the rest up the stack iphc_sendDone(msg,msg->l2_sendDoneError); break; } }