void idmanager_triggerAboutBridge() { uint8_t number_bytes_from_input_buffer; uint8_t input_buffer; //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)1); return; }; //handle command switch (input_buffer) { case ACTION_YES: idmanager_setIsBridge(TRUE); break; case ACTION_NO: idmanager_setIsBridge(FALSE); break; case ACTION_TOGGLE: if (idmanager_getIsBridge()) { idmanager_setIsBridge(FALSE); } else { idmanager_setIsBridge(TRUE); } break; } return; }
void icmpv6echo_trigger() { uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[16]; OpenQueueEntry_t* msg; //get command from OpenSerial (16B IPv6 destination address) number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { openserial_printError(COMPONENT_ICMPv6ECHO,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; icmpv6echo_vars.hisAddress.type = ADDR_128B; memcpy(&(icmpv6echo_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); //send if (icmpv6echo_vars.busySending==TRUE) { openserial_printError(COMPONENT_ICMPv6ECHO,ERR_BUSY_SENDING, (errorparameter_t)0, (errorparameter_t)0); } else { icmpv6echo_vars.busySending = TRUE; msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6ECHO); if (msg==NULL) { openserial_printError(COMPONENT_ICMPv6ECHO,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); icmpv6echo_vars.busySending = FALSE; return; } //admin msg->creator = COMPONENT_ICMPv6ECHO; msg->owner = COMPONENT_ICMPv6ECHO; //l4 msg->l4_protocol = IANA_ICMPv6; msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_ECHO_REQUEST; //l3 memcpy(&(msg->l3_destinationAdd),&icmpv6echo_vars.hisAddress,sizeof(open_addr_t)); //payload packetfunctions_reserveHeaderSize(msg,4); packetfunctions_htonl(0x789abcde,(uint8_t*)(msg->payload)); //ICMPv6 header packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; ((ICMPv6_ht*)(msg->payload))->code = 0; // Below Identifier might need to be replaced by the identifier used by icmpv6rpl // packetfunctions_htons(0x1234 ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->identifier); // Below sequence_number might need to be removed // packetfunctions_htons(icmpv6echo_vars.seq++ ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->sequence_number); packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum));//do last //send if (icmpv6_send(msg)!=E_SUCCESS) { icmpv6echo_vars.busySending = FALSE; openqueue_freePacketBuffer(msg); } } }
void openbridge_trigger() { uint8_t input_buffer[136];//worst case: 8B of next hop + 128B of data OpenQueueEntry_t* pkt; uint8_t numDataBytes; numDataBytes = openserial_getNumDataBytes(); openserial_getInputBuffer(&(input_buffer[0]),numDataBytes); if (idmanager_getIsBridge()==TRUE && numDataBytes>0) { pkt = openqueue_getFreePacketBuffer(COMPONENT_OPENBRIDGE); if (pkt==NULL) { openserial_printError(COMPONENT_OPENBRIDGE,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); return; } //admin pkt->creator = COMPONENT_OPENBRIDGE; pkt->owner = COMPONENT_OPENBRIDGE; //l2 pkt->l2_nextORpreviousHop.type = ADDR_64B; memcpy(&(pkt->l2_nextORpreviousHop.addr_64b[0]),&(input_buffer[0]),8); //payload packetfunctions_reserveHeaderSize(pkt,numDataBytes-8); memcpy(pkt->payload,&(input_buffer[8]),numDataBytes-8); //send if ((iphc_sendFromBridge(pkt))==E_FAIL) { openqueue_freePacketBuffer(pkt); } } }
void openbridge_triggerData(void) { uint8_t input_buffer[136];//worst case: 8B of next hop + 128B of data OpenQueueEntry_t* pkt; uint8_t numDataBytes; numDataBytes = openserial_getNumDataBytes(); //poipoi xv //this is a temporal workaround as we are never supposed to get chunks of data //longer than input buffer size.. I assume that HDLC will solve that. // MAC header is 13B + 8 next hop so we cannot accept packets that are longer than 118B if (numDataBytes>(136 - 21) || numDataBytes<8){ //to prevent too short or too long serial frames to kill the stack openserial_printError(COMPONENT_OPENBRIDGE,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)numDataBytes, (errorparameter_t)0); return; } //copying the buffer once we know it is not too big openserial_getInputBuffer(&(input_buffer[0]),numDataBytes); if (idmanager_getIsDAGroot()==TRUE && numDataBytes>0) { pkt = openqueue_getFreePacketBuffer(COMPONENT_OPENBRIDGE); if (pkt==NULL) { openserial_printError(COMPONENT_OPENBRIDGE,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); return; } //admin pkt->creator = COMPONENT_OPENBRIDGE; pkt->owner = COMPONENT_OPENBRIDGE; //l2 pkt->l2_nextORpreviousHop.type = ADDR_64B; memcpy(&(pkt->l2_nextORpreviousHop.addr_64b[0]),&(input_buffer[0]),8); //payload packetfunctions_reserveHeaderSize(pkt,numDataBytes-8); memcpy(pkt->payload,&(input_buffer[8]),numDataBytes-8); //this is to catch the too short packet. remove it after fw-103 is solved. if (numDataBytes<16){ openserial_printError(COMPONENT_OPENBRIDGE,ERR_INVALIDSERIALFRAME, (errorparameter_t)0, (errorparameter_t)0); } //send if ((iphc_sendFromBridge(pkt))==E_FAIL) { openqueue_freePacketBuffer(pkt); } } }
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; }
void tcpinject_trigger() { uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[18]; //get command from OpenSerial (16B IPv6 destination address, 2B destination port) number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { openserial_printError(COMPONENT_TCPINJECT,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; tcpinject_vars.hisAddress.type = ADDR_128B; memcpy(&(tcpinject_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); tcpinject_vars.hisPort = packetfunctions_ntohs(&(input_buffer[16])); //connect opentcp_connect(&tcpinject_vars.hisAddress,tcpinject_vars.hisPort,WKP_TCP_INJECT); }
void udpinject_trigger() { OpenQueueEntry_t* pkt; uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[18]; //get command from OpenSerial (16B IPv6 destination address, 2B destination port) number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { openserial_printError(COMPONENT_UDPINJECT,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; //prepare packet pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPINJECT); if (pkt==NULL) { openserial_printError(COMPONENT_UDPINJECT,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); return; } pkt->creator = COMPONENT_UDPINJECT; pkt->owner = COMPONENT_UDPINJECT; pkt->l4_protocol = IANA_UDP; pkt->l4_sourcePortORicmpv6Type = WKP_UDP_INJECT; pkt->l4_destination_port = packetfunctions_ntohs(&(input_buffer[16])); pkt->l3_destinationAdd.type = ADDR_128B; memcpy(&(pkt->l3_destinationAdd.addr_128b[0]),&(input_buffer[0]),16); packetfunctions_reserveHeaderSize(pkt,6); ((uint8_t*)pkt->payload)[0] = 'p'; ((uint8_t*)pkt->payload)[1] = 'o'; ((uint8_t*)pkt->payload)[2] = 'i'; ((uint8_t*)pkt->payload)[3] = 'p'; ((uint8_t*)pkt->payload)[4] = 'o'; ((uint8_t*)pkt->payload)[5] = 'i'; //send packet if ((openudp_send(pkt))==E_FAIL) { openqueue_freePacketBuffer(pkt); } }
void openserial_handleCommands(void){ uint8_t input_buffer[20]; uint8_t numDataBytes; uint8_t commandId; uint8_t commandLen; uint8_t comandParam_8; uint16_t comandParam_16; uint8_t code,cellOptions,numCell,listOffset,maxListLen; uint8_t ptr; cellInfo_ht celllist_add[CELLLIST_MAX_LEN]; cellInfo_ht celllist_delete[CELLLIST_MAX_LEN]; open_addr_t neighbor; bool foundNeighbor; ptr = 0; memset(celllist_add,0,CELLLIST_MAX_LEN*sizeof(cellInfo_ht)); memset(celllist_delete,0,CELLLIST_MAX_LEN*sizeof(cellInfo_ht)); numDataBytes = openserial_getInputBufferFillLevel(); //copying the buffer openserial_getInputBuffer(&(input_buffer[ptr]),numDataBytes); ptr++; commandId = openserial_vars.inputBuf[ptr]; ptr++; commandLen = openserial_vars.inputBuf[ptr]; ptr++; switch(commandId) { case COMMAND_SET_EBPERIOD: comandParam_8 = openserial_vars.inputBuf[ptr]; sixtop_setEBPeriod(comandParam_8); // one byte, in seconds break; case COMMAND_SET_CHANNEL: comandParam_8 = openserial_vars.inputBuf[ptr]; // set communication channel for protocol stack ieee154e_setSingleChannel(comandParam_8); // one byte break; case COMMAND_SET_KAPERIOD: // two bytes, in slots comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); sixtop_setKaPeriod(comandParam_16); break; case COMMAND_SET_DIOPERIOD: // two bytes, in mili-seconds comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); icmpv6rpl_setDIOPeriod(comandParam_16); break; case COMMAND_SET_DAOPERIOD: // two bytes, in mili-seconds comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); icmpv6rpl_setDAOPeriod(comandParam_16); break; case COMMAND_SET_DAGRANK: // two bytes comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); icmpv6rpl_setMyDAGrank(comandParam_16); break; case COMMAND_SET_SECURITY_STATUS: // one byte comandParam_8 = openserial_vars.inputBuf[ptr]; ieee154e_setIsSecurityEnabled(comandParam_8); break; case COMMAND_SET_SLOTFRAMELENGTH: // two bytes comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); schedule_setFrameLength(comandParam_16); break; case COMMAND_SET_ACK_STATUS: comandParam_8 = openserial_vars.inputBuf[ptr]; ieee154e_setIsAckEnabled(comandParam_8); break; case COMMAND_SET_6P_ADD: case COMMAND_SET_6P_DELETE: case COMMAND_SET_6P_RELOCATE: case COMMAND_SET_6P_COUNT: case COMMAND_SET_6P_LIST: case COMMAND_SET_6P_CLEAR: // get preferred parent foundNeighbor =icmpv6rpl_getPreferredParentEui64(&neighbor); if (foundNeighbor==FALSE) { break; } // the following sequence of bytes are, slotframe, cellOption, numCell, celllist openserial_get6pInfo(commandId,&code,&cellOptions,&numCell,celllist_add,celllist_delete,&listOffset,&maxListLen,ptr,commandLen); sixtop_request( code, // code &neighbor, // neighbor numCell, // number cells cellOptions, // cellOptions celllist_add, // celllist to add celllist_delete, // celllist to delete (not used) msf_getsfid(), // sfid listOffset, // list command offset (not used) maxListLen // list command maximum celllist (not used) ); break; case COMMAND_SET_SLOTDURATION: comandParam_16 = (openserial_vars.inputBuf[ptr] & 0x00ff) | \ ((openserial_vars.inputBuf[ptr+1]<<8) & 0xff00); ieee154e_setSlotDuration(comandParam_16); break; case COMMAND_SET_6PRESPONSE: comandParam_8 = openserial_vars.inputBuf[ptr]; if (comandParam_8 ==1) { sixtop_setIsResponseEnabled(TRUE); } else { if (comandParam_8 == 0) { sixtop_setIsResponseEnabled(FALSE); } else { // security only can be 1 or 0 break; } } break; case COMMAND_SET_UINJECTPERIOD: comandParam_8 = openserial_vars.inputBuf[ptr]; msf_appPktPeriod(comandParam_8); break; case COMMAND_SET_ECHO_REPLY_STATUS: comandParam_8 = openserial_vars.inputBuf[ptr]; if (comandParam_8 == 1) { icmpv6echo_setIsReplyEnabled(TRUE); } else { if (comandParam_8 == 0) { icmpv6echo_setIsReplyEnabled(FALSE); } else { // ack reply break; } } break; case COMMAND_SET_JOIN_KEY: if (commandLen != 16) { break; } idmanager_setJoinKey(&openserial_vars.inputBuf[ptr]); break; default: // wrong command ID break; } }