void idmanager_triggerAboutRoot() { uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[9]; open_addr_t myPrefix; uint8_t dodagid[16]; //=== get command from OpenSerial number_bytes_from_input_buffer = openserial_getInputBuffer(input_buffer,sizeof(input_buffer)); if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { openserial_printError(COMPONENT_IDMANAGER,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; //=== handle command // take action (byte 0) switch (input_buffer[0]) { case ACTION_YES: idmanager_setIsDAGroot(TRUE); break; case ACTION_NO: idmanager_setIsDAGroot(FALSE); break; case ACTION_TOGGLE: if (idmanager_getIsDAGroot()) { idmanager_setIsDAGroot(FALSE); } else { idmanager_setIsDAGroot(TRUE); } break; } // store prefix (bytes 1-8) myPrefix.type = ADDR_PREFIX; memcpy( myPrefix.prefix, &input_buffer[1], sizeof(myPrefix.prefix) ); idmanager_setMyID(&myPrefix); // indicate DODAGid to RPL memcpy(&dodagid[0],idmanager_vars.myPrefix.prefix,8); // prefix memcpy(&dodagid[8],idmanager_vars.my64bID.addr_64b,8); // eui64 icmpv6rpl_writeDODAGid(dodagid); return; }
/** \brief Called when RPL message received. \param[in] msg Pointer to the received message. */ void icmpv6rpl_receive(OpenQueueEntry_t* msg) { uint8_t icmpv6code; open_addr_t myPrefix; // take ownership msg->owner = COMPONENT_ICMPv6RPL; // retrieve ICMPv6 code icmpv6code = (((ICMPv6_ht*)(msg->payload))->code); // toss ICMPv6 header packetfunctions_tossHeader(msg,sizeof(ICMPv6_ht)); // handle message switch (icmpv6code) { case IANA_ICMPv6_RPL_DIO: if (idmanager_getIsBridge()==TRUE) { // stop here if I'm in bridge mode break; // break, don't return } // update neighbor table neighbors_indicateRxDIO(msg); // update DODAGID in DIO/DAO memcpy( &(icmpv6rpl_vars.dio.DODAGID[0]), &(((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0]), sizeof(icmpv6rpl_vars.dio.DODAGID) ); memcpy( &(icmpv6rpl_vars.dao.DODAGID[0]), &(((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0]), sizeof(icmpv6rpl_vars.dao.DODAGID) ); // remember I got a DODAGID icmpv6rpl_vars.DODAGIDFlagSet=1; // update my prefix myPrefix.type = ADDR_PREFIX; memcpy( myPrefix.prefix, &((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0], sizeof(myPrefix.prefix) ); idmanager_setMyID(&myPrefix); break; case IANA_ICMPv6_RPL_DAO: // this should never happen openserial_printCritical(COMPONENT_ICMPv6RPL,ERR_UNEXPECTED_DAO, (errorparameter_t)0, (errorparameter_t)0); break; default: // this should never happen openserial_printCritical(COMPONENT_ICMPv6RPL,ERR_MSG_UNKNOWN_TYPE, (errorparameter_t)icmpv6code, (errorparameter_t)0); break; } // free message openqueue_freePacketBuffer(msg); }