亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mac.c

?? zigbee 2004協議棧
?? C
?? 第 1 頁 / 共 4 頁
字號:

macRxFSM_start:

  switch(macRxState)  {
  case MAC_RXSTATE_IDLE:
    if (macRxBuffEmpty()) break;   //no data, break
    //buffer not empty, start decode
    pkt = macGetRxPacket();
    //dbgPrintPacket(pkt->data+1, *(pkt->data));
    //must be either a DATA, BCN, or MAC packet
    //at this point, we throw away BCN packets if are not waiting
    //for a beacon response
    if ((LRWPAN_IS_BCN(*(pkt->data+1))) &&
        !mac_pib.flags.bits.WaitingForBeaconResponse) {
          DEBUG_STRING(DBG_INFO,"MAC: Received BCN pkt, discarding.\n");
          macFreeRxPacket(TRUE);
          break;
        }
    if (LRWPAN_IS_ACK(*(pkt->data+1))) {
      //This should not happen. ACK packets should be parsed
      //in the HAL layer that copies ACK packets to temp storage.
      //will keep this for completeness.
      DEBUG_STRING(DBG_INFO,"MAC: Received ACK pkt in macStartRxDecode, discarding, check ack packet parsing..\n");
      macFreeRxPacket(TRUE);
      break;
    }
    //at this point, we have a DATA, MAC CMD, or BCN packet.. do something with it.
    //need to parse the header information get to the payload.
    a_mac_rx_data.orgpkt = pkt;
    macParseHdr();
    if ((LRWPAN_IS_BCN(*(pkt->data+1)))){
      DEBUG_STRING(DBG_INFO,"MAC: Parsing BCN pkt.\n");
      //now finished with it.
      macParseBeacon();
      macFreeRxPacket(TRUE);
      break;
    }

    if (LRWPAN_IS_DATA(*(pkt->data+1))){
		//this is a data packet, check if we should reject it
        if (!macCheckDataRejection()) {
            //we need to reject this packet.
            DEBUG_STRING(DBG_INFO,"MAC: Rejecting Data packet from unassociated node, rejecting.\n");
            macFreeRxPacket(TRUE);
            break;
        }
       mac_pib.last_data_rx_time = halGetMACTimer();  //time of last data or mac command
      //at this point, will accept packet, indicate this to network layer
      //set a flag, and pass the nwkStart offset to the NWK layer
      //RX buffer.
      macRxState = MAC_RXSTATE_NWK_HANDOFF;
      goto macRxFSM_start;
    }

    //at this point, we have a MAC command packet, lets do something with it.
    DEBUG_STRING(DBG_INFO,"MAC: Received MAC cmd packet, proceeding.\n");

    //there are some MAC CMDs that we can handle right here.
    //If it is a response, we handle it here. If it is a request,
    //that has to be handled in the main FSM.
    cmd = *(a_mac_rx_data.orgpkt->data + a_mac_rx_data.pload_offset);
    switch(cmd) {
    case LRWPAN_MACCMD_ASSOC_RSP:
#ifndef LRWPAN_COORDINATOR
      if (mac_pib.flags.bits.WaitingForAssocResponse){
        macParseAssocResponse();
      }					
#endif				
      //free this packet, we are finished with it.
      macFreeRxPacket(TRUE);
      break;

	case LRWPAN_MACCMD_COORD_REALIGN:
#ifndef LRWPAN_COORDINATOR
      if (mac_pib.flags.bits.WaitingForOrphanResponse){
        macParseOrphanResponse();
      }					
#endif				
      //free this packet, we are finished with it.
      macFreeRxPacket(TRUE);
      break;



#ifdef LRWPAN_FFD
      //only FFDs handle this
    case LRWPAN_MACCMD_BCN_REQ:
    case LRWPAN_MACCMD_ASSOC_REQ:
	case LRWPAN_MACCMD_ORPHAN:
      //requests must be handled in the main FSM. We need to signal that a MAC
      //CMD packet is packet is pending, and freeze the RX FSM until the
      //main FSM has taken care of it.
      mac_pib.flags.bits.macPending = 1;
      macRxState = MAC_RXSTATE_CMD_PENDING;
      break;
#endif

    default:
      //unhandled MAC packets
      DEBUG_STRING(DBG_INFO,"MAC: Received MAC CMD that is not implemented or not handled by this node, discarding.\n");
      DEBUG_STRING(DBG_INFO,"Cmd is: ");
      DEBUG_UINT8(DBG_INFO,cmd);
      DEBUG_STRING(DBG_INFO,"\n");
      macFreeRxPacket(TRUE);
      break;

    }			

    break;
  case MAC_RXSTATE_NWK_HANDOFF:
		  if (nwkRxBusy()) break;    //nwkRX is still busy
                  //handoff the current packet
                  nwkRxHandoff();
                  //we are finished with this packet.
                  //free the MAC resource, but not the memory. The NWK layer
                  // or above has to free the memory
                  macFreeRxPacket(FALSE);
                  macRxState = MAC_RXSTATE_IDLE;
                  break;
  case MAC_RXSTATE_CMD_PENDING:
    if (mac_pib.flags.bits.macPending ) break;
			 //when macPending is cleared, this means main FSM is finished with packet.
			 //So free the packet, and start parsing new packets again
			 macFreeRxPacket(TRUE);
                         macRxState = MAC_RXSTATE_IDLE;
                         break;


  default: break;

  }

}

//parse the header currently in a_mac_rx_data
//return the offset to the network header.

static void macParseHdr() {
  BYTE *ptr;
  BYTE len,i;
  BYTE srcmode, dstmode;

  ptr = a_mac_rx_data.orgpkt->data;

  //skip first byte since the first byte in the a_mac_rx_data.orgpkt is the
  //packet length
  len = 1;ptr++;


  a_mac_rx_data.fcflsb = *ptr; ptr++;
  a_mac_rx_data.fcfmsb = *ptr; ptr++;
  dstmode = LRWPAN_GET_DST_ADDR(a_mac_rx_data.fcfmsb);
  srcmode = LRWPAN_GET_SRC_ADDR(a_mac_rx_data.fcfmsb);

  //skip DSN
  ptr++;
  len = len +3;

  if (dstmode != LRWPAN_ADDRMODE_NOADDR){
    //get the DEST PANDID
    a_mac_rx_data.DestPANID = *ptr;
    ptr++;
    a_mac_rx_data.DestPANID += (((UINT16)*ptr) << 8);
    ptr++;
    len = len + 2;
  }
  //DST address
  if (dstmode == LRWPAN_ADDRMODE_SADDR) {
    a_mac_rx_data.DestAddr.saddr = *ptr;
    ptr++;
    a_mac_rx_data.DestAddr.saddr += (((UINT16)*ptr) << 8);
    ptr++;
    len = len + 2;

  }else if (dstmode == LRWPAN_ADDRMODE_LADDR) {
    for (i=0;i<8;i++) {
      a_mac_rx_data.DestAddr.laddr.bytes[i] = *ptr;
      ptr++;
    }
    len = len + 8;
  }


  if ( !LRWPAN_GET_INTRAPAN(a_mac_rx_data.fcflsb) &&
      srcmode != LRWPAN_ADDRMODE_NOADDR
        ) {
          //PANID present if INTRAPAN is zero, and src is nonzero
          a_mac_rx_data.SrcPANID = *ptr;
          ptr++;
          a_mac_rx_data.SrcPANID += (((UINT16)*ptr) << 8);
          ptr++;
          len = len + 2;
        }
  //SRC address
  if (srcmode == LRWPAN_ADDRMODE_SADDR) {
    a_mac_rx_data.SrcAddr.saddr = *ptr;
    ptr++;
    a_mac_rx_data.SrcAddr.saddr += (((UINT16)*ptr) << 8);
    ptr++;
    len = len + 2;

  }else if (srcmode == LRWPAN_ADDRMODE_LADDR) {
    for (i=0;i<8;i++) {
      a_mac_rx_data.SrcAddr.laddr.bytes[i] = *ptr;
      ptr++;
    }
    len = len + 8;
  }
  //save offset.
  a_mac_rx_data.pload_offset = len;
}

#ifdef LRWPAN_FFD
//Beacon payload format
// nwk magic number ( 4 bytes) | mac depth
static void macFormatBeacon(void){
  BYTE i;

  //fill in the beacon payload, we have the TX buffer lock
  phy_pib.currentTxFrm = &tmpTxBuff[LRWPAN_MAX_FRAME_SIZE];
#ifndef LRWPAN_ZIGBEE_BEACON_COMPLY
  //fill in the magic number
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B3;
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B2;
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B1;
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B0;
#endif

  //next three bytes are zero for timestep difference
  //for multi-hop beaconing networks. This is currently filled in
  //as zero
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm =0;
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm =0;
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm =0;

  //see if I have space for an END device
  --phy_pib.currentTxFrm;
  if (mac_pib.ChildRFDs == LRWPAN_MAX_NON_ROUTER_CHILDREN) {
	  *phy_pib.currentTxFrm =0; //no room
  } else {
      *phy_pib.currentTxFrm =1;  //have space.
  }

  //fill in my depth
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = mac_pib.depth;

  //see if I have space for a ROUTER device
  --phy_pib.currentTxFrm;
  if (mac_pib.ChildRouters == LRWPAN_MAX_ROUTERS_PER_PARENT) {
	  *phy_pib.currentTxFrm =0; //no room
  } else {
      *phy_pib.currentTxFrm =1;  //have space.
  }

   //network protocol version
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm =LRWPAN_ZIGBEE_PROTOCOL_VER;

   //stack protocol
   --phy_pib.currentTxFrm;
   *phy_pib.currentTxFrm =LRWPAN_STACK_PROFILE;

   //Zigbee protocol ID
   --phy_pib.currentTxFrm;
   *phy_pib.currentTxFrm =LRWPAN_ZIGBEE_PROTOCOL_ID;

  //pending address field
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = 0;  //makes this a NOP

  //GTS directions field
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = 0;  //makes this a NOP

  //2 bytes of superframe
#ifdef LRWPAN_COORDINATOR
  i = LRWPAN_BEACON_SF_PAN_COORD_MASK;
#else
  i = 0;
#endif
  if (mac_pib.flags.bits.macAssociationPermit) {
    i = i | LRWPAN_BEACON_SF_ASSOC_PERMIT_MASK;
  }
  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = i;  //MSB of superframe

  --phy_pib.currentTxFrm;
  *phy_pib.currentTxFrm = 0xFF; //LSB of superframe

  phy_pib.currentTxFlen = LRWPAN_NWK_BEACON_SIZE;

}

#endif

//parse the beacon
static void macParseBeacon(void){
  BYTE *ptr;
  BYTE depth;

  if ( (*(a_mac_rx_data.orgpkt->data)-a_mac_rx_data.pload_offset-PACKET_FOOTER_SIZE +1)
      != LRWPAN_NWK_BEACON_SIZE  ) {
        return; //wrong length
      }

  ptr = a_mac_rx_data.orgpkt->data + a_mac_rx_data.pload_offset;
  //check association bit in MSB of superframe
  if (!LRWPAN_GET_BEACON_SF_ASSOC_PERMIT(*(ptr+1))) {
    //cannot associate with this node. reject
    return;
  }
  // point at payload (skip four bytes of header)
  ptr = ptr + 4;
  //skip if any mismatches on protocol ID/Ver, stack profile, etc.
  //check protocol ID
  if (*ptr != LRWPAN_ZIGBEE_PROTOCOL_ID) return;
  ptr++;
  //check stack profile
  if (*ptr != LRWPAN_STACK_PROFILE) return;
  ptr++;
  //check protocol version
  if (*ptr != LRWPAN_ZIGBEE_PROTOCOL_VER) return;
  ptr++;

  //check router capacity
  //for right now, if I am a router, I have to join as a router.
  //no option as of now for a router joining as an end-device
#ifdef LRWPAN_FFD
  //only routers have to check this
  if (*ptr == 0) return;  //no room to join as router
#endif

  ptr++;

  //get the depth
  depth = *ptr;
  ptr++;

  //check end device capacity
#ifdef LRWPAN_RFD
  //only end devices have to check this.
  if (*ptr == 0) return;  //no room to join as end device
#endif
  ptr++;

  //skip the next three bytes, only for beaconing.
  ptr = ptr + 3;

#ifndef LRWPAN_ZIGBEE_BEACON_COMPLY
  //check the magic number
  if (*ptr != LRWPAN_NWK_MAGICNUM_B0) return;
  ptr++;
  if (*ptr != LRWPAN_NWK_MAGICNUM_B1) return;
  ptr++;
  if (*ptr != LRWPAN_NWK_MAGICNUM_B2) return;
  ptr++;
  if (*ptr != LRWPAN_NWK_MAGICNUM_B3) return;
  ptr++;
#endif

  //at this point, we could accept this node as a parent
  if ((mac_pib.bcnDepth == 0xFF) ||
      (a_mac_rx_data.orgpkt->rssi > mac_pib.bcnRSSI)) {
        //either our first response, or from a closer node
        //save this information.
        //use value with higher RSSI.
        //the RSSI byte is assumed to be formatted as HIGHER IS BETTER
        //the HAL layer converts any native signed RSSI to an unsigned value

        mac_pib.bcnDepth = depth;  //get depth
        mac_pib.bcnRSSI = a_mac_rx_data.orgpkt->rssi;
        mac_pib.bcnSADDR = a_mac_rx_data.SrcAddr.saddr;
        mac_pib.bcnPANID = a_mac_rx_data.SrcPANID;
        DEBUG_STRING(DBG_INFO,"MAC: Bcn rsp is Panid: ");
        DEBUG_UINT16(DBG_INFO, mac_pib.bcnPANID);
         DEBUG_STRING(DBG_INFO,", Saddr: ");
       DEBUG_UINT16(DBG_INFO, mac_pib.bcnSADDR);
        DEBUG_STRING(DBG_INFO,", LQI: ");
       DEBUG_UINT8(DBG_INFO, mac_pib.bcnRSSI);
          DEBUG_STRING(DBG_INFO,", Dpth: ");
       DEBUG_UINT8(DBG_INFO, mac_pib.bcnDepth);
       DEBUG_STRING(DBG_INFO,"\n");
      }
  mac_pib.flags.bits.GotBeaconResponse = 1;
}


static void macFormatAssocRequest(void){
  //fill in payload of request
  phy_pib.currentTxFrm = &tmpTxBuff[LRWPAN_MAX_FRAME_SIZE];

#ifndef IEEE_802_COMPLY
  //put the magic number in the association request
  phy_pib.currentTxFrm--;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B3;

  phy_pib.currentTxFrm--;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B2;

  phy_pib.currentTxFrm--;
  *phy_pib.currentTxFrm = LRWPAN_NWK_MAGICNUM_B1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲高清视频的网址| 欧美白人最猛性xxxxx69交| 在线亚洲人成电影网站色www| 91国产视频在线观看| 欧美日韩一区精品| 欧美一级午夜免费电影| 久久久99精品免费观看| 亚洲人吸女人奶水| 日韩影院精彩在线| 国产a视频精品免费观看| 色婷婷亚洲综合| 91麻豆精品久久久久蜜臀| 久久亚洲免费视频| 亚洲女同一区二区| 秋霞电影一区二区| 成人av在线资源网| 欧美另类videos死尸| 久久久久亚洲蜜桃| 亚洲在线免费播放| 国精产品一区一区三区mba视频| 成人免费毛片嘿嘿连载视频| 欧美视频一区二区| 久久久久高清精品| 午夜激情综合网| 国产福利一区二区| 欧美久久一二三四区| 国产精品蜜臀在线观看| 午夜电影久久久| 成人亚洲一区二区一| 在线不卡一区二区| 国产精品美女久久久久久2018| 天天做天天摸天天爽国产一区| 国产福利一区在线| 7777女厕盗摄久久久| 中文字幕日韩欧美一区二区三区| 日韩高清国产一区在线| 99久久伊人精品| 日韩精品中午字幕| 午夜一区二区三区在线观看| 成人网页在线观看| 日韩欧美综合一区| 亚洲一区二区视频| 成人爱爱电影网址| 精品国产伦一区二区三区观看体验| 亚洲精品老司机| 福利电影一区二区| 欧美本精品男人aⅴ天堂| 亚洲韩国一区二区三区| jlzzjlzz亚洲女人18| 久久亚洲精品小早川怜子| 日韩在线一区二区三区| 欧美一a一片一级一片| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩国产精品久久久| 欧美日韩在线观看一区二区| 亚洲品质自拍视频| 成人黄色免费短视频| 亚洲精品一区二区三区四区高清| 亚洲国产wwwccc36天堂| 色一情一伦一子一伦一区| 国产精品久久久久影院亚瑟| 国产精品一区二区久久不卡| 日韩一区二区免费电影| 亚洲aaa精品| 在线精品观看国产| 亚洲影视资源网| 色婷婷精品久久二区二区蜜臂av| 国产欧美精品区一区二区三区 | 国产在线看一区| 日韩免费高清av| 青青国产91久久久久久| 在线不卡欧美精品一区二区三区| 午夜免费欧美电影| 欧美绝品在线观看成人午夜影视| 亚洲国产日产av| 欧美日韩一区二区三区高清| 亚洲一区日韩精品中文字幕| 欧洲国产伦久久久久久久| 亚洲一级在线观看| 欧美日韩日日骚| 日韩电影一区二区三区四区| 欧美另类一区二区三区| 日本网站在线观看一区二区三区 | 亚洲超碰97人人做人人爱| 在线观看中文字幕不卡| 午夜影视日本亚洲欧洲精品| 6080yy午夜一二三区久久| 视频一区视频二区中文| 91精品国产欧美一区二区| 久久精品国产999大香线蕉| 精品福利一区二区三区| 国产成人在线看| 国产精品欧美极品| 色偷偷一区二区三区| 亚洲精品ww久久久久久p站| 欧美性猛片xxxx免费看久爱| 日韩福利电影在线| 精品欧美一区二区久久| 国产精品1区2区| 中文字幕一区二区三区av | 一区二区三区国产精品| 欧美三级三级三级| 精品一区二区免费看| 国产性做久久久久久| 99在线热播精品免费| 一区二区久久久久| 51午夜精品国产| 国产成人综合精品三级| 日韩理论片网站| 91精品欧美久久久久久动漫| 国产一区二区导航在线播放| 亚洲欧美怡红院| 91麻豆精品久久久久蜜臀| 国产成人自拍网| 亚洲福利视频一区| 久久―日本道色综合久久| 99r国产精品| 日日夜夜精品视频天天综合网| 欧美xxxxxxxx| 91蝌蚪porny| 免费观看久久久4p| 国产精品久久久久影视| 51精品视频一区二区三区| 处破女av一区二区| 亚洲成a人v欧美综合天堂| 久久午夜国产精品| 欧美最猛性xxxxx直播| 国产美女av一区二区三区| 亚洲免费观看高清完整版在线| 欧美一区二区二区| 99视频精品在线| 免费精品视频在线| 亚洲色欲色欲www| 精品久久一区二区三区| 在线免费观看日本一区| 国产一区美女在线| 亚洲v日本v欧美v久久精品| 久久久久久久久久久黄色 | 免费在线观看视频一区| 中文字幕高清一区| 欧美一区二区视频在线观看2022| 成人一道本在线| 久久狠狠亚洲综合| 亚洲综合色自拍一区| 欧美国产一区视频在线观看| 91精品国产综合久久久蜜臀粉嫩 | 国产亚洲一区二区三区四区 | 亚洲猫色日本管| 日韩欧美一二三区| 91福利在线看| 成人在线综合网站| 精品亚洲aⅴ乱码一区二区三区| 一区二区三区在线影院| 国产视频一区在线观看 | 五月天激情综合| 亚洲欧洲综合另类在线| 国产午夜精品久久| 欧美变态tickle挠乳网站| 欧美日韩国产小视频| 99久久99久久精品免费观看| 国产精品资源在线看| 日韩精品一二区| 亚洲国产中文字幕在线视频综合| 国产精品久久久久一区| 久久久久久久久久看片| 欧美岛国在线观看| 欧美一区午夜精品| 欧美主播一区二区三区美女| 99热这里都是精品| 懂色一区二区三区免费观看| 狠狠久久亚洲欧美| 美女高潮久久久| 日本 国产 欧美色综合| 亚洲午夜激情网页| 亚洲综合免费观看高清在线观看| 亚洲欧美日韩电影| 亚洲欧洲成人精品av97| 国产精品美女久久久久久2018| 国产人成亚洲第一网站在线播放| 久久日韩精品一区二区五区| 欧美精品一区二区三区四区| 日韩亚洲国产中文字幕欧美| 欧美美女一区二区在线观看| 欧美视频在线一区| 欧美日韩在线播放| 欧美猛男gaygay网站| 69av一区二区三区| 91精品啪在线观看国产60岁| 欧美一区二区三区在| 制服丝袜亚洲精品中文字幕| 欧美一区二区三区小说| 欧美精品乱人伦久久久久久| 欧美日韩五月天| 欧美喷潮久久久xxxxx| 欧美日韩精品是欧美日韩精品| 欧美视频一区在线| 91麻豆精品国产91久久久| 日韩午夜小视频| 精品国产乱码久久久久久夜甘婷婷| 日韩午夜精品电影|