Beispiel #1
0
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;
   }
}
Beispiel #2
0
void schedule_init() {
   uint8_t         i;
   slotOffset_t    running_slotOffset;
   open_addr_t     temp_neighbor;

   // reset local variables
   memset(&schedule_vars,0,sizeof(schedule_vars_t));
   for (i=0;i<MAXACTIVESLOTS;i++) {
      schedule_resetEntry(&schedule_vars.scheduleBuf[i]);
   }
   schedule_vars.backoffExponent = MINBE-1;
   memset(&schedule_dbg, 0,sizeof(schedule_dbg_t));

   // set frame length
   schedule_setFrameLength(SUPERFRAME_LENGTH);
   
   // start at slot 0
   running_slotOffset = 0;
   
   // advertisement slot(s)
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   for (i=0;i<NUMADVSLOTS;i++) {
      schedule_addActiveSlot(
         running_slotOffset,      // slot offset
         CELLTYPE_ADV,            // type of slot
         FALSE,                   // shared?
         0,                       // channel offset
         &temp_neighbor,           // neighbor
         FALSE                     //no update but insert
      );
      running_slotOffset++;
   } 
   
   // shared TXRX anycast slot(s)
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   temp_neighbor.type             = ADDR_ANYCAST;
   for (i=0;i<NUMSHAREDTXRX;i++) {
      schedule_addActiveSlot(
         running_slotOffset,      // slot offset
         CELLTYPE_TXRX,           // type of slot
         TRUE,                    // shared?
         0,                       // channel offset
         &temp_neighbor,          // neighbor
         FALSE                    //no update but insert
      );
      running_slotOffset++;
   }
   

   /*
   for (i=0;i<NUMSERIALRX-1;i++) {
      schedule_addActiveSlot(
         running_slotOffset,      // slot offset
         CELLTYPE_MORESERIALRX,   // type of slot
         FALSE,                   // shared?
         0,                       // channel offset
         &temp_neighbor           // neighbor
      );
      running_slotOffset++;
   }
   */

   /*if(NUMNODE == 0){//DAG ROOT
	   // shared TXRX anycast slot(s)
	      memset(&temp_neighbor,0,sizeof(temp_neighbor));
	      temp_neighbor.type             = ADDR_ANYCAST;
	      for (i=0;i<NUMRX;i++) {
	         schedule_addActiveSlot(
	            running_slotOffset,      // slot offset
	            CELLTYPE_RX,           // type of slot
	            FALSE,                    // shared?
	            0,                       // channel offset
	            &temp_neighbor,          // neighbor
	            FALSE                    //no update but insert
	         );
	         running_slotOffset++;
	      }
   }else{//other node
	   running_slotOffset += (NUMNODE-1);
	   memset(&temp_neighbor,0,sizeof(temp_neighbor));
	   	      temp_neighbor.type             = ADDR_ANYCAST;
	   	         schedule_addActiveSlot(
	   	            running_slotOffset,      // slot offset
	   	            CELLTYPE_TX,           // type of slot
	   	            FALSE,                    // shared?
	   	            0,                       // channel offset
	   	            &temp_neighbor,          // neighbor
	   	            FALSE                    //no update but insert
	   	         );
	   	         running_slotOffset++;

   }*/
   // serial RX slot(s)
    memset(&temp_neighbor,0,sizeof(temp_neighbor));
    schedule_addActiveSlot(
       running_slotOffset,         // slot offset
       CELLTYPE_SERIALRX,          // type of slot
       FALSE,                      // shared?
       0,                          // channel offset
       &temp_neighbor,             // neighbor
       FALSE                       //no update but insert
    );
    running_slotOffset++;
}
Beispiel #3
0
/* piggy902: addr-specific schedule */ 
void schedule_init() {
   uint8_t     i;
   open_addr_t temp_neighbor;

   // reset local variables
   memset(&schedule_vars,0,sizeof(schedule_vars_t));
   memset(&schedule_dbg, 0,sizeof(schedule_dbg_t));
   for (i=0;i<MAXACTIVESLOTS;i++){
      schedule_resetEntry(&schedule_vars.scheduleBuf[i]);
   }

   // set frame length
   schedule_setFrameLength(11);

   // slot 0 is advertisement slot
   i = 0;
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   schedule_addActiveSlot(i,
         CELLTYPE_ADV,
         FALSE,
         0,
         &temp_neighbor);
   
    switch(idmanager_getMyID(ADDR_16B)->addr_16b[1]){
    case DEBUG_MOTEID_MASTER:
       // slot 1 is shared TXRX, but with specific neighbour rather than anycast
       i = 1;
       memset(&temp_neighbor,0,sizeof(temp_neighbor));
       temp_neighbor.type             = ADDR_64B;
       temp_neighbor.addr_64b[6]    = 0xED;
       temp_neighbor.addr_64b[7]    = DEBUG_MOTEID_2;
       schedule_addActiveSlot(i,
             CELLTYPE_TXRX,
             FALSE,
             0,
             &temp_neighbor);
       
       // slot 2 is shared TXRX, but with specific neighbour rather than anycast
       i = 2;
       memset(&temp_neighbor,0,sizeof(temp_neighbor));
       schedule_addActiveSlot(i,
             CELLTYPE_MORESERIALRX,
             FALSE,
             0,
             &temp_neighbor); 
       
       i = 3;
       memset(&temp_neighbor,0,sizeof(temp_neighbor));
       schedule_addActiveSlot(i,
             CELLTYPE_MORESERIALRX,
             FALSE,
             0,
             &temp_neighbor);
        break;
        
    case DEBUG_MOTEID_2:
       // slot 1 is shared TXRX, but with specific neighbour rather than anycast
       i = 1;
       memset(&temp_neighbor,0,sizeof(temp_neighbor));
       temp_neighbor.type             = ADDR_64B;
       temp_neighbor.addr_64b[6]    = 0xED;
       temp_neighbor.addr_64b[7]    = DEBUG_MOTEID_MASTER;
       schedule_addActiveSlot(i,
             CELLTYPE_TXRX,
             FALSE,
             0,
             &temp_neighbor);
     
       i = 2;
       memset(&temp_neighbor,0,sizeof(temp_neighbor));
       schedule_addActiveSlot(i,
             CELLTYPE_MORESERIALRX,
             FALSE,
             0,
             &temp_neighbor);
    
       i = 3;
       memset(&temp_neighbor,0,sizeof(temp_neighbor));
       schedule_addActiveSlot(i,
             CELLTYPE_MORESERIALRX,
             FALSE,
             0,
             &temp_neighbor); 
        break;
        
    default:
        break;
   }
   
   // slot 4 is SERIALRX
   i = 4;
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   schedule_addActiveSlot(i,
         CELLTYPE_SERIALRX,
         FALSE,
         0,
         &temp_neighbor);

   // slot 5 is MORESERIALRX
   i = 5;
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   schedule_addActiveSlot(i,
         CELLTYPE_MORESERIALRX,
         FALSE,
         0,
         &temp_neighbor);
   
   // Noise Floor Probe
   i = 6; 
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   schedule_addActiveSlot(i,
         CELLTYPE_NF,
         FALSE,
         0,
         &temp_neighbor);
   
   i = 7; 
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   schedule_addActiveSlot(i,
         CELLTYPE_NF,
         FALSE,
         0,
         &temp_neighbor);
   
   //for RPL DIOs?
   i = 8;
   memset(&temp_neighbor,0,sizeof(temp_neighbor));
   temp_neighbor.type             = ADDR_64B;
   temp_neighbor.addr_64b[0]          = 0xff;
   temp_neighbor.addr_64b[1]          = 0xff;
   temp_neighbor.addr_64b[2]          = 0xff;
   temp_neighbor.addr_64b[3]          = 0xff;
   temp_neighbor.addr_64b[4]          = 0xff;
   temp_neighbor.addr_64b[5]          = 0xff;
   temp_neighbor.addr_64b[6]          = 0xff;
   temp_neighbor.addr_64b[7]          = 0xff;
   schedule_addActiveSlot(i,
         CELLTYPE_TXRX,
         FALSE,
         0,
         &temp_neighbor);
}