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

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

?? mac.c

?? zigbee程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*
 V0.1 Initial Release   10/July/2006
 *
 */

/*
V0.21 fixed problem in OrphanResponse, was not copying the parent's
long address                         27/July/2006

V0.2  added PC-based binding         21/July/2006
V0.1  Initial Release                10/July/2006

*/


#include "compiler.h"
#include "lrwpan_config.h"         //user configurations
#include "lrwpan_common_types.h"   //types common acrosss most files
#include "ieee_lrwpan_defs.h"
#include "console.h"
#include "debug.h"
#include "memalloc.h"
#include "hal.h"
#include "halStack.h"
#include "phy.h"
#include "mac.h"
#include "nwk.h"

#include "neighbor.h"


typedef enum _MAC_RXSTATE_ENUM {
  MAC_RXSTATE_IDLE,
  MAC_RXSTATE_NWK_HANDOFF,
  MAC_RXSTATE_CMD_PENDING
} MAC_RXSTATE_ENUM;

static MAC_RXSTATE_ENUM macRxState;

MAC_PIB mac_pib;
MAC_SERVICE a_mac_service;
MAC_STATE_ENUM macState;



//there can only be one TX in progress at a time, so
//a_mac_tx_data contains the arguments for that TX.
MAC_TX_DATA a_mac_tx_data;

//this is used for parsing of current packet.
MAC_RX_DATA a_mac_rx_data;

LRWPAN_STATUS_ENUM macTxFSM_status;


//locals
static UINT32 mac_utility_timer;   //utility timer

//local functions
static void macTxData(void);
static void macTxFSM(void);
static void macParseHdr(void);
static void macRxFSM(void);
static void macParseBeacon(void);
static void macFormatAssocRequest(void);
static BOOL macCheckDataRejection(void);
static void macFormatOrphanNotify(void);


#ifndef LRWPAN_COORDINATOR
static void macParseOrphanResponse(void);
#endif


#ifdef LRWPAN_FFD
static void macFormatBeacon(void);
static void macFormatAssociationResponse(void);
static void macFormatCoordRealign(SADDR orphan_saddr);
#endif

#ifndef LRWPAN_COORDINATOR
static void macParseAssocResponse(void);
#endif

//does not turn on radio.
void macInit(void){
  macState = MAC_STATE_IDLE;
  macRxState = MAC_RXSTATE_IDLE;
  mac_pib.macCoordShortAddress = 0;
  mac_pib.flags.val = 0;
  mac_pib.rxTail = 0;
  mac_pib.rxHead = 0;
  mac_pib.macPANID = LRWPAN_DEFAULT_PANID;
  mac_pib.macMaxAckRetries = aMaxFrameRetries;
  ntInitAddressMap();  //init the address map
#ifdef LRWPAN_COORDINATOR
  mac_pib.depth = 0;
#else
  mac_pib.depth = 1; //depth will be at least one
#endif
  mac_pib.bcnDepth = 0xFF; //remembers depth of node that responded to beacon
  //other capability information
  mac_pib.macCapInfo = 0;
#ifdef LRWPAN_ALT_COORDINATOR     //not supported, included for completeness
  LRWPAN_SET_CAPINFO_ALTPAN(mac_pib.macCapInfo);
#endif
#ifdef LRWPAN_FFD
  LRWPAN_SET_CAPINFO_DEVTYPE(mac_pib.macCapInfo);
#endif
#ifdef LRWPAN_ACMAIN_POWERED
  LRWPAN_SET_CAPINFO_PWRSRC(mac_pib.macCapInfo);
#endif
#ifdef LRWPAN_RCVR_ON_WHEN_IDLE
  LRWPAN_SET_CAPINFO_RONIDLE(mac_pib.macCapInfo);
#endif
#ifdef LRWPAN_SECURITY_CAPABLE
  LRWPAN_SET_CAPINFO_SECURITY(mac_pib.macCapInfo);
#endif
  //always allocate a short address
  LRWPAN_SET_CAPINFO_ALLOCADDR(mac_pib.macCapInfo);


}

LRWPAN_STATUS_ENUM macWarmStartRadio(void){
 halWarmstart();
 a_phy_service.cmd = LRWPAN_SVC_PHY_INIT_RADIO; //no args
  a_phy_service.args.phy_init_radio_args.radio_flags.bits.listen_mode = 0;
#ifdef LRWPAN_COORDINATOR
  a_phy_service.args.phy_init_radio_args.radio_flags.bits.pan_coordinator = 1;
#else
  a_phy_service.args.phy_init_radio_args.radio_flags.bits.pan_coordinator = 0;
#endif
  phyDoService();
  halSetChannel(phy_pib.phyCurrentChannel);
  halSetRadioPANID(mac_pib.macPANID); //listen on this PANID
  halSetRadioShortAddr(macGetShortAddr());  //non-broadcast, reserved
  return(a_phy_service.status);
}

//this assumes that phyInit, macInit has previously been called.
//turns on the radio

LRWPAN_STATUS_ENUM macInitRadio(void) {

  phy_pib.phyCurrentFrequency = LRWPAN_DEFAULT_FREQUENCY;
  phy_pib.phyCurrentChannel = LRWPAN_DEFAULT_START_CHANNEL;
  if (phy_pib.phyCurrentChannel < 11){
    mac_pib.macAckWaitDuration = SYMBOLS_TO_MACTICKS(120);
  }
  else {
    mac_pib.macAckWaitDuration = SYMBOLS_TO_MACTICKS(54);
  }

  a_phy_service.cmd = LRWPAN_SVC_PHY_INIT_RADIO; //no args
  a_phy_service.args.phy_init_radio_args.radio_flags.bits.listen_mode = 0;
#ifdef LRWPAN_COORDINATOR
  a_phy_service.args.phy_init_radio_args.radio_flags.bits.pan_coordinator = 1;
#else
  a_phy_service.args.phy_init_radio_args.radio_flags.bits.pan_coordinator = 0;
#endif

  phyDoService();
#ifdef LRWPAN_USE_STATIC_PANID
  halSetRadioPANID(LRWPAN_DEFAULT_PANID); //listen on this PANID
#else
  halSetRadioPANID(0xFFFF);      //broadcast
#endif
  halSetRadioShortAddr(0xFFFE);  //non-broadcast, reserved
  return(a_phy_service.status);
}

void macSetPANID(UINT16 panid){
  mac_pib.macPANID = panid;
  halSetRadioPANID(mac_pib.macPANID);
}


void macSetChannel(BYTE channel){
  phy_pib.phyCurrentChannel = channel;
  halSetChannel(channel);
}

void macSetShortAddr(UINT16 saddr) {
#ifdef LRWPAN_RFD
	//when changing the short address for an RFD, always clear the map first
	//since the short address may have changed.
	//for RFDs, there is only one entry
	ntInitAddressMap();
#endif
  ntAddOurselvesToAddressTable(saddr);
  halSetRadioShortAddr(saddr);
}



void macFSM(void) {

  BYTE cmd;
#ifdef LRWPAN_FFD
  NAYBORENTRY *nt_ptr;
#endif


#ifdef LRWPAN_DEBUG
  //assume 2.4 GHZ
  if (debug_level == 0) {
    mac_pib.macAckWaitDuration = SYMBOLS_TO_MACTICKS(54);
  } else {
    mac_pib.macAckWaitDuration = SYMBOLS_TO_MACTICKS(270);  //give longer due to debug output
  }
#endif

  phyFSM();
  //if TxFSM is busy we need to call it
  if (macTXBusy()) macTxFSM();

  macRxFSM();

#ifdef LRWPAN_FFD
macFSM_start:
#endif

  //check background tasks here

  switch (macState) {
	 case MAC_STATE_IDLE:
           if (mac_pib.flags.bits.macPending ) {
             //there is a MAC CMD packet pending in the RX buffer. Handle it.
             cmd = *(a_mac_rx_data.orgpkt->data + a_mac_rx_data.pload_offset);
             switch (cmd) {
             case LRWPAN_MACCMD_BCN_REQ:
               //Beacon Request
#ifdef LRWPAN_RFD
               //as an RFD, I do not handle this. Release this.
               mac_pib.flags.bits.macPending = 0;
#else
               //as a Coordinator or Router, I will only respond
               //only respond if association permitted
               //as this is the stack's only use of beacons
               if (mac_pib.flags.bits.macAssociationPermit) {
                 //will keep spinning through here until TX buffer unlocked
                 if (phyTxUnLocked()) {
                   phyGrabTxLock(); //grab the lock
                   macState = MAC_STATE_SEND_BEACON_RESPONSE;
                   mac_pib.flags.bits.macPending = 0; //release packet
                   goto macFSM_start;
                 }
               }else {
                 //release packet.
                 mac_pib.flags.bits.macPending = 0;
               }


#endif
               break;

			 case LRWPAN_MACCMD_ORPHAN:
               //Orphan Notify
#ifdef LRWPAN_RFD
               //as an RFD, I do not handle this. Release this.
               mac_pib.flags.bits.macPending = 0;
#else
             //will keep spinning through here until TX buffer unlocked
               if (phyTxUnLocked()) {
                   phyGrabTxLock(); //grab the lock
                   macState = MAC_STATE_HANDLE_ORPHAN_NOTIFY;
                   mac_pib.flags.bits.macPending = 0; //release packet
                   goto macFSM_start;
                }
#endif
             case LRWPAN_MACCMD_ASSOC_REQ:
               //Association Request
#ifdef LRWPAN_RFD
               //as an RFD, I do not handle this. Release this.
               mac_pib.flags.bits.macPending = 0;
#else
               //as a Coordinator or Router, I can respond
               //only respond if association permitted
               if (mac_pib.flags.bits.macAssociationPermit) {
                 //will keep spinning through here until TX buffer unlocked
                 if (phyTxUnLocked()) {
                   phyGrabTxLock(); //grab the lock
                   macState = MAC_STATE_SEND_ASSOC_RESPONSE;
                   mac_pib.flags.bits.macPending = 0; //release packet
                   goto macFSM_start;
                 }
               }else {
                 //release packet.
                 mac_pib.flags.bits.macPending = 0;
               }
#endif

               break;


             default:
               DEBUG_STRING(1,"MAC: Received MAC CMD that is not currently implemented, discarding.\n");
               mac_pib.flags.bits.macPending = 0;

             }



           }//end if(mac_pib.flags.bits.macPending )

           break;
	 case MAC_STATE_COMMAND_START:
           switch(a_mac_service.cmd) {
	        case LRWPAN_SVC_MAC_ERROR:
				//dummy service, just return the status that was passed in
				a_mac_service.status = a_mac_service.args.error.status;
				macState = MAC_STATE_IDLE;
				break;

           case LRWPAN_SVC_MAC_GENERIC_TX:
             //send a generic packet with arguments specified by upper level
             macTxData();
             macState = MAC_STATE_GENERIC_TX_WAIT;
             break;
           case LRWPAN_SVC_MAC_RETRANSMIT:
             //retransmit the last packet
             //used for frames that are only transmitted once because of no ACK request
             //assumes the TX lock is grabbed, and the TX buffer formatted.
             macSetTxBusy();
             macTxFSM_status = LRWPAN_STATUS_MAC_INPROGRESS;
             a_phy_service.cmd = LRWPAN_SVC_PHY_TX_DATA;
             phyDoService();
             macState = MAC_STATE_GENERIC_TX_WAIT;
             break;
			
		  case LRWPAN_SVC_MAC_ORPHAN_NOTIFY:
              if (phyTxLocked()) break;
              phyGrabTxLock();  //Grab the lock
              //no ack, long SRC, short DST, broadcast PAN
			  a_mac_tx_data.fcflsb = LRWPAN_FRAME_TYPE_MAC;
              a_mac_tx_data.fcfmsb = LRWPAN_FCF_DSTMODE_SADDR|LRWPAN_FCF_SRCMODE_LADDR;
			  a_mac_tx_data.DestAddr.saddr = LRWPAN_BCAST_PANID;
			  a_mac_tx_data.DestPANID = LRWPAN_BCAST_PANID;
			  a_mac_tx_data.SrcPANID = LRWPAN_BCAST_PANID;
			  macFormatOrphanNotify();
			  mac_pib.flags.bits.GotOrphanResponse = 0;
			  mac_pib.flags.bits.WaitingForOrphanResponse = 1;
              macTxData();
			  macState = MAC_STATE_ORPHAN_WAIT1;
		      break;

           case LRWPAN_SVC_MAC_BEACON_REQ:
             //clear Beacon Response Flag
             mac_pib.flags.bits.GotBeaconResponse =0;        //will be set when get response
             //wait for TX lock to send the beacon request
             if (phyTxLocked()) break;
             phyGrabTxLock();  //Grab the lock
             mac_pib.flags.bits.WaitingForBeaconResponse = 1;  //will be cleared when get response
             //set the channel
             halSetChannel(a_mac_service.args.beacon_req.LogicalChannel);
             //stuff the MAC BEACON REQ command into the TX buffer
             phy_pib.currentTxFrm = &tmpTxBuff[LRWPAN_MAX_FRAME_SIZE-1];
             *phy_pib.currentTxFrm = LRWPAN_MACCMD_BCN_REQ;
             phy_pib.currentTxFlen = 1;

             //no MAC ack requested
             a_mac_tx_data.fcflsb = LRWPAN_FRAME_TYPE_MAC|LRWPAN_FCF_INTRAPAN_MASK;
             //using no src address, dst address and PAN are both broadcast address
             a_mac_tx_data.fcfmsb = LRWPAN_FCF_DSTMODE_SADDR|LRWPAN_FCF_SRCMODE_NOADDR;
             a_mac_tx_data.DestAddr.saddr = LRWPAN_BCAST_SADDR;
#ifdef LRWPAN_USE_STATIC_PANID
             //we only want to talk to nodes who use this PANID
             //this is not compliant with 802.15.4
             //we do this to reduce the number of responses, only want routers/coord
             //to respond who use this panid
             a_mac_tx_data.DestPANID = LRWPAN_DEFAULT_PANID;
#else
             //talk to any nodes willing to send us a beacon
             a_mac_tx_data.DestPANID = LRWPAN_BCAST_PANID;
#endif
             macTxData();
             macState = MAC_STATE_GENERIC_TX_WAIT_AND_UNLOCK;
             break;

           case LRWPAN_SVC_MAC_ASSOC_REQ:
             //break if the TXBUFFER is locked
             if (phyTxLocked()) break;
             phyGrabTxLock();  //Grab the lock
             //may want to put this in a function
             halSetChannel(a_mac_service.args.assoc_req.LogicalChannel);
             mac_pib.flags.bits.macIsAssociated = 0;  //clear to zero

             macFormatAssocRequest();

             a_mac_tx_data.fcflsb = LRWPAN_FRAME_TYPE_MAC|LRWPAN_FCF_ACKREQ_MASK;
#ifdef LRWPAN_FORCE_ASSOCIATION_TARGET
             //forced association occurs on DEFAULT PANID
             a_mac_tx_data.fcfmsb = LRWPAN_FCF_DSTMODE_LADDR|LRWPAN_FCF_SRCMODE_LADDR;
             a_mac_tx_data.DestPANID = LRWPAN_DEFAULT_PANID;
             a_mac_tx_data.DestAddr.laddr.bytes[0] = parent_addr_B0;
             a_mac_tx_data.DestAddr.laddr.bytes[1] = parent_addr_B1;
             a_mac_tx_data.DestAddr.laddr.bytes[2] = parent_addr_B2;
             a_mac_tx_data.DestAddr.laddr.bytes[3] = parent_addr_B3;
             a_mac_tx_data.DestAddr.laddr.bytes[4] = parent_addr_B4;
             a_mac_tx_data.DestAddr.laddr.bytes[5] = parent_addr_B5;
             a_mac_tx_data.DestAddr.laddr.bytes[6] = parent_addr_B6;
             a_mac_tx_data.DestAddr.laddr.bytes[7] = parent_addr_B7;
#else
             //using short address for DST
             a_mac_tx_data.fcfmsb = LRWPAN_FCF_DSTMODE_SADDR|LRWPAN_FCF_SRCMODE_LADDR;
             //use addressing discovered by beacon request
             a_mac_tx_data.DestAddr.saddr = mac_pib.bcnSADDR;
             a_mac_tx_data.DestPANID = mac_pib.bcnPANID;
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美体内she精高潮| 国产亚洲va综合人人澡精品 | 国产亚洲成年网址在线观看| 中文字幕亚洲成人| 欧美一区二区三区四区高清| 欧美亚一区二区| 亚洲一区二区四区蜜桃| 国产视频一区二区三区在线观看 | 欧美久久久影院| 欧美日韩免费电影| 欧美伊人久久久久久久久影院 | 欧美一区二区三区四区在线观看| 亚洲成a人在线观看| 久久精品噜噜噜成人av农村| 午夜激情久久久| 国产一区二区三区在线观看免费 | 欧美在线色视频| zzijzzij亚洲日本少妇熟睡| 欧美主播一区二区三区| 日韩精品91亚洲二区在线观看| 韩国v欧美v日本v亚洲v| 国产a精品视频| 精品久久久久久久久久久久包黑料| 国产精品福利电影一区二区三区四区 | 性感美女久久精品| 色综合久久中文综合久久97| 99vv1com这只有精品| 久久久天堂av| 蜜臀av亚洲一区中文字幕| caoporm超碰国产精品| 日韩精品亚洲一区| 午夜精品久久久久| 日本一区二区三区久久久久久久久不 | 国产午夜精品一区二区 | 国产精品国产馆在线真实露脸 | 天天色图综合网| 亚洲欧洲综合另类在线| 日韩精品亚洲一区| 亚洲第一成人在线| 亚洲第一福利视频在线| 亚洲人成网站色在线观看| 欧美国产综合色视频| 激情综合五月婷婷| 中文一区二区完整视频在线观看| 精品少妇一区二区三区日产乱码| 欧亚洲嫩模精品一区三区| 亚洲成人自拍网| 自拍偷拍国产亚洲| 国产一区二区三区免费| 国产盗摄视频一区二区三区| 中文字幕第一区二区| 亚洲天堂a在线| 视频一区二区三区入口| 成人中文字幕电影| 一区在线观看免费| 亚洲一区视频在线| 麻豆成人91精品二区三区| 精品一区二区在线播放| 91美女蜜桃在线| 精品一区二区三区免费视频| 国产最新精品免费| 亚洲6080在线| 韩国成人在线视频| 91蜜桃婷婷狠狠久久综合9色| 欧日韩精品视频| 国产欧美精品在线观看| 一区二区在线观看不卡| 久久精品欧美一区二区三区不卡| 一区二区三区不卡视频 | 精品婷婷伊人一区三区三| 国产在线视频精品一区| 精品少妇一区二区| 午夜精品福利一区二区三区蜜桃| 成人涩涩免费视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩av中文在线观看| 欧美激情一区二区三区四区 | 色老头久久综合| 色悠久久久久综合欧美99| 欧美激情一区三区| 国产91丝袜在线观看| 国产日韩欧美精品综合| 激情五月激情综合网| 欧美成人猛片aaaaaaa| 奇米精品一区二区三区在线观看一| 亚洲成av人片一区二区| 91麻豆swag| 亚洲午夜在线电影| 精品一区二区三区免费毛片爱 | 久久国产精品色婷婷| 久久久久久夜精品精品免费| 成人精品免费看| 99视频热这里只有精品免费| 国产精品丝袜91| 日日摸夜夜添夜夜添国产精品| 欧美日韩国产一区二区三区地区| 亚洲一区二区三区激情| 欧美成人精品1314www| 国产在线国偷精品免费看| 亚洲激情av在线| 极品美女销魂一区二区三区 | 91年精品国产| 美女视频黄 久久| 国产日韩欧美高清| 欧美肥胖老妇做爰| 99国产精品久| 成人亚洲精品久久久久软件| 亚洲尤物在线视频观看| 亚洲国产精品激情在线观看| 欧美精品一卡二卡| 欧美性受xxxx黑人xyx性爽| 91丨porny丨蝌蚪视频| 国产精品久久久久一区二区三区 | 久久九九久久九九| 欧美福利视频导航| 色欧美片视频在线观看| 国产999精品久久久久久绿帽| 香蕉久久夜色精品国产使用方法| 国产情人综合久久777777| 日韩欧美高清在线| 一区二区中文字幕在线| 久久久久久夜精品精品免费| 国产精品美女www爽爽爽| 欧美日韩高清一区二区| 韩国女主播成人在线| 日韩av不卡一区二区| 日本va欧美va欧美va精品| 亚洲福利电影网| 婷婷丁香久久五月婷婷| 亚洲国产欧美一区二区三区丁香婷| 国产精品久久久久影院亚瑟| 国产精品久久久久三级| 亚洲乱码国产乱码精品精的特点| 亚洲综合男人的天堂| 日韩高清中文字幕一区| 亚洲伦理在线精品| 午夜不卡在线视频| 国产精品69毛片高清亚洲| 中文字幕一区二| 欧美经典一区二区| 欧美日韩色综合| 欧美性生交片4| 久久久国产综合精品女国产盗摄| 国产精品麻豆一区二区| 日韩精品高清不卡| 色噜噜偷拍精品综合在线| 日韩视频一区二区三区| 成人理论电影网| 日韩精品一区二区三区四区视频 | 国产成人av资源| 欧美在线三级电影| 一区2区3区在线看| 国产一区不卡精品| 色欲综合视频天天天| 91精品国产一区二区人妖| 91麻豆视频网站| 91精品麻豆日日躁夜夜躁| 国产精品国产馆在线真实露脸 | 亚洲免费资源在线播放| 一区二区三区.www| 久久不见久久见免费视频1| 国产精品一线二线三线| 欧美亚洲国产一区在线观看网站| 国产亚洲一区字幕| 极品瑜伽女神91| 欧美另类高清zo欧美| 亚洲伦理在线精品| 91捆绑美女网站| 亚洲人成网站色在线观看| 成人免费看视频| 亚洲永久免费av| 久久久久久久久久久黄色| 成人精品免费视频| 日本伊人午夜精品| 久久久精品免费免费| 国产中文一区二区三区| 国产精品视频线看| 777xxx欧美| 99riav久久精品riav| 精东粉嫩av免费一区二区三区| 久久久精品日韩欧美| 91伊人久久大香线蕉| 青椒成人免费视频| 成人免费在线播放视频| 欧美日高清视频| jlzzjlzz欧美大全| 美国三级日本三级久久99| 中国av一区二区三区| 欧美日韩精品一区二区天天拍小说| 蓝色福利精品导航| 日韩一区日韩二区| 欧美精品一区男女天堂| 欧美日韩高清一区二区| 成人亚洲精品久久久久软件| 国产麻豆欧美日韩一区| 捆绑紧缚一区二区三区视频| 亚洲女人的天堂| 亚洲婷婷综合久久一本伊一区| 国产欧美精品一区二区色综合| 精品久久久久久最新网址|