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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? aps.c

?? ZIGBEE2006協(xié)議棧
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
			  apsRxState = APS_RXSTATE_IDLE;
			  break;
		  }

		  //parse this and see what to do with it.
		  if (APS_IS_CMD(a_aps_rx_data.aps_fcf)) {
			  //currently don't handle CMD packets. Discard.
			  DEBUG_STRING(DBG_INFO,"APS: Received APS CMD packet, discarding.\n");
			  //NWK,MAC resource already free; need to free the MEM resource
			  MemFree(a_aps_rx_data.orgpkt.data);
			  apsRxState = APS_RXSTATE_IDLE;
			  break;
		  }
		  //have a DATA or ACK packet, lets do something.
		  //parse it to figure out what it is.
		  apsParseHdr(a_aps_rx_data.orgpkt.data + a_aps_rx_data.apsOffset);
		  if (APS_IS_ACK(a_aps_rx_data.aps_fcf)) {
			  if (!aps_pib.flags.bits.ackPending) {
				  //not currently expecting an ACK so discard
				  DEBUG_STRING(DBG_INFO,"APS: Received unexpected ACK, discarding.\n");
			  }else {
				  //lets see if this is our ack.
				  if (apsCheckAck()) {
					  DEBUG_STRING(DBG_INFO,"APS: Received APS ack\n");
					  //this is our ACK, clear the ackPending bit
					  aps_pib.flags.bits.ackPending = 0;
				  } else {
					  DEBUG_STRING(DBG_INFO,"APS: Received ACK, did not match expected.\n");
				  }

			  }
			  //NWK,MAC resource already free; need to free the MEM resource
			  MemFree(a_aps_rx_data.orgpkt.data);
			  apsRxState = APS_RXSTATE_IDLE;
			  break;
		  }

		  //check for indirect message
		  if (!a_aps_rx_data.flags.bits.dstEP){
			  //no dest endpoint, must be an indirect message.
#ifdef LRWPAN_COORDINATOR
			  //see if we have room to buffer this packet
			  if (apsRxBuffFull()) {
				  //no room, discard this buffer
				  DEBUG_STRING(DBG_INFO,"APS: No room for indirect packet storage, discarding.\n");
				  MemFree(a_aps_rx_data.orgpkt.data);
				  apsRxState = APS_RXSTATE_IDLE;
				  break;
			  }
			  //copy this packet to the APS RX buffer
			  apsRxBuffAdd (&a_aps_rx_data);
			  //first, check to see if an ACK is requested.
			  if (APS_GET_FRM_ACKREQ(a_aps_rx_data.aps_fcf)){
				  //ack request send has to be done in the main FSM
				  aps_pib.flags.bits.ackSendPending = 1;
				  //will have both ackPending and indirectPending set,
				  //the ack pending will be handled first.
			  }

			  //I am the coordinator, must resolve binding
			  aps_pib.flags.bits.indirectPending = 1;
			  apsRxState = APS_RXSTATE_RESOLVE_INDIRECT;
			  goto apsRxFSM_start;
#else
			  //this is an ERROR. Non-coordinator has an unresolved indirect packet.
			  DEBUG_STRING(DBG_INFO,"APS: Non-Coord Received indirect packet, should not happen, check code.\n");
			  MemFree(a_aps_rx_data.orgpkt.data);
			  apsRxState = APS_RXSTATE_IDLE;
			  break;
#endif
		  }


		  //check for DST endpoint of 0, special endpoint
		  if (a_aps_rx_data.dstEP == 0) {
			  //not a user endpoint, handle this
			  DEBUG_STRING(DBG_INFO,"APS: Received ZEP Request.\n");
			  callback_status = zepHandleRxPacket();
			  goto apsRxFSM_freepkt;
		  }

		  //at this point, we have a user endpoint. Check profile
		  if (a_aps_rx_data.profile != LRWPAN_APP_PROFILE){
			  //reject, not our profile
			  DEBUG_STRING(DBG_INFO,"APS: Received data packet with wrong profile, rejecting.\n");
			  MemFree(a_aps_rx_data.orgpkt.data);
			  apsRxState = APS_RXSTATE_IDLE;
			  break;
		  }

		  //accept this packet, do Usr Callback
		  callback_status = usrRxPacketCallback();

apsRxFSM_freepkt:
		  //finished, free the space
		  MemFree(a_aps_rx_data.orgpkt.data);

		  //see if an ACK is requested. Only send back the ack if the callback status
		  //returned as success!
		  if (APS_GET_FRM_ACKREQ(a_aps_rx_data.aps_fcf) && callback_status == LRWPAN_STATUS_SUCCESS) {
			  //ack request send has to be done in the main FSM
			  aps_pib.flags.bits.ackSendPending = 1;
			  apsRxState = APS_RXSTATE_ACK_SEND_WAIT;
			  break;
		  }

		  apsRxState = APS_RXSTATE_IDLE;
		  break;


#ifdef LRWPAN_COORDINATOR
  case APS_RXSTATE_RESOLVE_INDIRECT:
	  if (aps_pib.flags.bits.indirectPending) break;
	  //the main FSM will free up the memory associated with the RX packet

	  apsRxState = APS_RXSTATE_IDLE;
	  break;
#endif

  case APS_RXSTATE_ACK_SEND_WAIT:
	  if (aps_pib.flags.bits.ackSendPending) break;  //waiting for ACK to be sent
	  //main FSM is finished, can now proceed with new RX
	  apsRxState = APS_RXSTATE_IDLE;
	  break;

  default:
	  break;
	}



}

//see if this matches expected ack.
static BOOL apsCheckAck(void){
	if (a_aps_rx_data.flags.bits.dstEP && a_aps_rx_data.flags.bits.srcEP) {
		//both are present.
		if ((a_aps_rx_data.srcEP == a_aps_tx_data.dstEP) &&
			(a_aps_rx_data.dstEP == a_aps_tx_data.srcEP)) {
				//this is our ack
				return TRUE;
			}
	} else if (a_aps_rx_data.flags.bits.dstEP) {
		//indirect, check just the EP
		if ((a_aps_rx_data.dstEP == a_aps_tx_data.srcEP) ) {
			return TRUE;
		}
	} else if (a_aps_rx_data.flags.bits.srcEP) {
		//indirect, check just the EP
		if ((a_aps_rx_data.srcEP == a_aps_tx_data.dstEP) ) {
			return TRUE;
		}

	}
	//if we reach here, must not be our expected ack
	return(FALSE);
}

//Callback from NWK Layer
//Returns TRUE if aps is still busy with last RX packet.

BOOL apsRxBusy(void){
	return(apsRxState != APS_RXSTATE_IDLE);
}

void apsRxHandoff(void){
	a_aps_rx_data.orgpkt.data = a_nwk_rx_data.orgpkt.data;
	a_aps_rx_data.orgpkt.rssi = a_nwk_rx_data.orgpkt.rssi;
	a_aps_rx_data.apsOffset = a_nwk_rx_data.nwkOffset+8;
	a_aps_rx_data.srcSADDR = a_nwk_rx_data.srcSADDR;
	a_aps_rx_data.aps_fcf = *(a_aps_rx_data.orgpkt.data + a_aps_rx_data.apsOffset);//get first byte
	a_aps_rx_data.flags.val = 0;
	apsRxState = APS_RXSTATE_START;

}

//parse the APS header, also the AF header as well
static void apsParseHdr(BYTE *ptr){
	BYTE len;

	//get the aps fcf byte
	a_aps_rx_data.aps_fcf = *ptr;
	ptr++;

	len = 1;

	if (!((APS_GET_FRM_DLVRMODE(a_aps_rx_data.aps_fcf) == APS_FRM_DLVRMODE_INDIRECT) &&
		(APS_GET_FRM_INDIRECT_SUBMODE(a_aps_rx_data.aps_fcf)))) {
			//have a destination EP
			a_aps_rx_data.flags.bits.dstEP = 1;
			a_aps_rx_data.dstEP = *ptr;
			ptr++;
			len++;

		}
		//get the cluster ID
		if (APS_GET_FRM_TYPE(a_aps_rx_data.aps_fcf) == APS_FRM_TYPE_DATA){
			a_aps_rx_data.cluster = *ptr;
			ptr++;
		}

		if ((APS_GET_FRM_TYPE(a_aps_rx_data.aps_fcf) == APS_FRM_TYPE_DATA) ||
			(APS_GET_FRM_TYPE(a_aps_rx_data.aps_fcf) == APS_FRM_TYPE_ACK)
			){
				//get the profile ID
				a_aps_rx_data.profile = *ptr;
				ptr++;
				a_aps_rx_data.profile += (((UINT16)*ptr) << 8);
				ptr++;
			}

			len = len +3;

			//get the SRC EP
			if (!((APS_GET_FRM_DLVRMODE(a_aps_rx_data.aps_fcf) == APS_FRM_DLVRMODE_INDIRECT) &&
				(!APS_GET_FRM_INDIRECT_SUBMODE(a_aps_rx_data.aps_fcf)))) {
					//have a SRC EP
					a_aps_rx_data.flags.bits.srcEP = 1;
					a_aps_rx_data.srcEP = *ptr;
					ptr++;
					len++;
				}

				//parse AF frame, assume MSG type
				a_aps_rx_data.afOffset = len;

				//save the af_fcf byte
				a_aps_rx_data.af_fcf = *ptr;
				ptr++;

				//get the transaction number
				a_aps_rx_data.tsn = *ptr;
				ptr++;

				//get the length of the payload
				a_aps_rx_data.usrPlen = *ptr;
				ptr++;
				//save the pointer to the payload
				a_aps_rx_data.usrPload = ptr;

}

//this does not actually format the ACK, just sets
// the aps_tx fields correctly
static void apsFormatAck(void){

	a_aps_tx_data.usrPlen = 0;
	a_aps_tx_data.usrPload = NULL;
	a_aps_tx_data.aps_fcf = APS_FRM_TYPE_ACK;
	a_aps_tx_data.srcSADDR = macGetShortAddr();
	a_aps_tx_data.dstSADDR = a_aps_rx_data.srcSADDR;
	a_aps_tx_data.flags.val = 0;


	DEBUG_STRING(DBG_INFO,"APS:Formatted ack\n");
	if (a_aps_rx_data.flags.bits.dstEP && a_aps_rx_data.flags.bits.srcEP){
		//both are present, so must be direct delivery mode
		a_aps_tx_data.aps_fcf |= APS_FRM_DLVRMODE_NORMAL;
		a_aps_tx_data.dstEP = a_aps_rx_data.srcEP;
		a_aps_tx_data.srcEP = a_aps_rx_data.dstEP;
		a_aps_tx_data.cluster = a_aps_rx_data.cluster;
	} else if (a_aps_rx_data.flags.bits.dstEP){
		//indirect packet
		//only dstEP is present, so this ack must be going back to the COORD
		a_aps_tx_data.aps_fcf |= APS_FRM_DLVRMODE_INDIRECT;
		a_aps_tx_data.srcEP = a_aps_rx_data.dstEP;
		//set the submode bit indicating only src EP will be present
		a_aps_tx_data.aps_fcf |=APS_FRM_INDIRECT_SUBMODE_MASK;
	} else if (a_aps_rx_data.flags.bits.srcEP){
		//indirect packet
		//only srcEP is present, so this ack must be going from COORD to src
		a_aps_tx_data.aps_fcf |= APS_FRM_DLVRMODE_INDIRECT;
		a_aps_tx_data.dstEP = a_aps_rx_data.srcEP;
	}

}

//handles retries for APS packets that require ACKs
static void apsTxFSM(void) {
	if(!apsTXIdle()) {
		//we are not idle
		if (nwkIdle()) {
			//cannot check anything until NWK is idle
			if (a_nwk_service.status != LRWPAN_STATUS_SUCCESS) {
				//don't bother waiting for ACK, TX did not start correctly
				aps_pib.flags.bits.ackPending = 0;
				apsSetTxIdle();  //mark TX as idle
				apsTxFSM_status = a_nwk_service.status; //return status
			} else if (!aps_pib.flags.bits.ackPending) {
				//either no ACK requested or ACK has been received
				apsSetTxIdle();  //finished successfully, mark as idle
				apsTxFSM_status = LRWPAN_STATUS_SUCCESS;
			}
			//check timeout
			else if (halMACTimerNowDelta(aps_pib.tx_start_time)> aps_pib.apscAckWaitDuration)
			{
				//first, check the apsAckWaitMultiplier
				if(aps_pib.apsAckWaitMultiplierCntr) aps_pib.apsAckWaitMultiplierCntr--;  //this is based on number of hops for the apsAck
				if (aps_pib.apsAckWaitMultiplierCntr) {
					//reset the timer.
					aps_pib.tx_start_time = halGetMACTimer();
				}else {
					DEBUG_STRING(1,"APS: TX retry\n");
					// ACK timeout
					aps_pib.currentAckRetries--;
					if (!aps_pib.currentAckRetries) {
						//retries are zero. We have failed.
						apsSetTxIdle();
						DEBUG_STRING(1,"APS TX Retry exceeded\n");
					} else {
						//retry...
						//must reset the len, frm pointers to the beginning of
						// the formatted aps header before retry
						phy_pib.currentTxFlen = a_aps_tx_data.aps_flen;
						phy_pib.currentTxFrm = a_aps_tx_data.aps_ptr;
						aps_pib.tx_start_time = halGetMACTimer();  //reset the timer
						aps_pib.apsAckWaitMultiplierCntr = aps_pib.apsAckWaitMultiplier;
						apsTxData(TRUE);  //reuse the last packet.
					}
				}
			}

		}

	}

}

#ifdef LRWPAN_COORDINATOR

void apsRxBuffInit(void);
BOOL apsRxBuffFull(void);
BOOL apsRxBuffEmpty(void);
APS_RX_DATA *apsGetRxPacket(void);
void apsFreeRxPacket(BOOL freemem);
void apsRxBuffAdd (APS_RX_DATA *ptr);

//copies data into RX buffer
void apsRxBuffAdd (APS_RX_DATA *ptr){
	if (aps_pib.rxCnt == APS_RXBUFF_SIZE) {
		DEBUG_STRING(DBG_ERR,"APS:Trying to add to full buffer in apsRxBuffAdd\n");
		return;
	}
	halUtilMemCopy((BYTE *)&aps_pib.rxBuff[aps_pib.rxHead], (BYTE *)ptr, sizeof(APS_RX_DATA));
	aps_pib.rxCnt++;
	aps_pib.rxHead++; //head points to next free location
	//wrap index
	if (aps_pib.rxHead == APS_RXBUFF_SIZE) aps_pib.rxHead = 0;
}



void apsRxBuffInit(void){
	aps_pib.rxCnt = 0;
	aps_pib.rxTail = 0;
	aps_pib.rxHead = 0;
}

BOOL apsRxBuffFull(void){
	return(aps_pib.rxCnt == APS_RXBUFF_SIZE);
}


BOOL apsRxBuffEmpty(void){
	return(aps_pib.rxCnt == 0);
}

//this does NOT remove the packet from the buffer
APS_RX_DATA *apsGetRxPacket(void) {
	return(&aps_pib.rxBuff[aps_pib.rxTail]);
}

//frees the first packet in the buffer.
void apsFreeRxPacket(BOOL freemem) {
	if (aps_pib.rxCnt == 0) {
		DEBUG_STRING(DBG_ERR,"APS:Trying to free empty buffer in apsFreeRxPacket\n");
		return;
	}
	if (freemem)MemFree(aps_pib.rxBuff[aps_pib.rxTail].orgpkt.data);
	aps_pib.rxCnt--;
	aps_pib.rxTail++;
	if (aps_pib.rxTail == APS_RXBUFF_SIZE) aps_pib.rxTail = 0;

}
#endif

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区在线看| 国产视频一区二区在线| 五月激情综合网| 美女一区二区在线观看| 99久久久精品免费观看国产蜜| 欧美性色综合网| 国产视频一区在线观看| 日韩高清一区二区| 色av综合在线| 日本一区二区成人在线| 免费成人av在线| 欧美性大战久久久久久久| 中文欧美字幕免费| 国产自产视频一区二区三区| 欧美精品一二三| 亚洲精品午夜久久久| 成人午夜视频免费看| 精品88久久久久88久久久| 视频一区在线视频| 在线视频亚洲一区| 亚洲免费大片在线观看| 成人av中文字幕| 欧美激情综合五月色丁香小说| 精油按摩中文字幕久久| 日韩一区二区免费在线观看| 午夜精品福利一区二区三区蜜桃| 91色porny| 亚洲欧美另类久久久精品2019| 国产成人夜色高潮福利影视| www国产成人免费观看视频 深夜成人网| 一区二区三区高清不卡| 99综合影院在线| 国产一区二区三区在线看麻豆| 欧美日韩在线亚洲一区蜜芽| 亚洲一区在线播放| 欧美在线不卡一区| 亚洲国产综合人成综合网站| 欧美中文字幕不卡| 亚洲成a人片在线不卡一二三区| 在线欧美小视频| 亚洲一二三四在线| 欧美日韩国产天堂| 五月天视频一区| 欧美一区二区三区在线看| 奇米色一区二区三区四区| 欧美一区二区三区视频在线| 久久精品国产在热久久| 久久久电影一区二区三区| 成人综合在线网站| 亚洲欧美另类图片小说| 欧美日韩免费观看一区三区| 天天爽夜夜爽夜夜爽精品视频| 欧美日韩夫妻久久| 精品综合久久久久久8888| 久久精品欧美一区二区三区麻豆| 顶级嫩模精品视频在线看| 中文字幕在线免费不卡| 91久久精品国产91性色tv| 亚洲第一在线综合网站| 欧美一区二区久久| 成人免费av资源| 亚洲国产中文字幕在线视频综合 | 蜜桃精品视频在线观看| 欧美aaaaaa午夜精品| 欧美一级高清大全免费观看| 国产精选一区二区三区| 国产精品国产三级国产aⅴ原创 | av不卡免费电影| 亚洲国产成人av网| 精品福利二区三区| 不卡电影一区二区三区| 亚洲成av人在线观看| 久久久久免费观看| 色综合网色综合| 91精品久久久久久久99蜜桃| 精品在线播放免费| 亚洲精品免费一二三区| 欧美一级爆毛片| 成a人片国产精品| 日韩国产成人精品| ●精品国产综合乱码久久久久 | 国产成人在线免费| 亚洲高清久久久| 国产精品色一区二区三区| 欧美日韩免费观看一区二区三区 | 国产精品无人区| 欧美一区二区精品| 91亚洲午夜精品久久久久久| 午夜欧美在线一二页| 中文字幕乱码一区二区免费| 欧美福利视频一区| 99国产精品一区| 国产成人综合网站| 奇米色777欧美一区二区| 亚洲女人小视频在线观看| 久久久蜜桃精品| 8x8x8国产精品| 91九色最新地址| 国产精品一卡二| 色偷偷成人一区二区三区91| 国产一区日韩二区欧美三区| 日韩国产欧美三级| 一区二区在线观看视频| 日本一区二区免费在线观看视频 | 精品一区二区三区欧美| 亚洲国产一区二区a毛片| 国产精品国产三级国产aⅴ中文| wwwwww.欧美系列| 日韩美女天天操| 欧美久久高跟鞋激| 欧美色图12p| 日本高清不卡在线观看| 91小视频免费观看| 成人美女在线观看| 国产91精品入口| 国产精品亚洲一区二区三区在线| 日韩av电影免费观看高清完整版 | 国产视频一区二区三区在线观看| 日韩欧美精品三级| 欧美一区二区三级| 欧美一级视频精品观看| 8x8x8国产精品| 91精品欧美一区二区三区综合在| 51精品视频一区二区三区| 777精品伊人久久久久大香线蕉| 国产精品国产三级国产aⅴ中文 | 婷婷成人综合网| 天天操天天色综合| 日韩国产欧美三级| 久久精品国产**网站演员| 另类小说欧美激情| 国内精品自线一区二区三区视频| 国产自产v一区二区三区c| 精品一区二区三区视频| 国产精品一二三区在线| 成人国产精品免费| 色狠狠一区二区三区香蕉| 欧美视频一区二区在线观看| 欧美色综合影院| 日韩欧美色电影| 久久精品视频一区二区三区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产91丝袜在线观看| 国产自产视频一区二区三区| 国产91精品精华液一区二区三区| 99v久久综合狠狠综合久久| 色综合久久久久久久久久久| 欧美欧美欧美欧美| 精品理论电影在线观看 | 久久精品免费看| 国产成人8x视频一区二区| av中文字幕不卡| 欧美色图在线观看| 精品久久99ma| 国产精品网站在线播放| 亚洲成人午夜电影| 国产一区二区在线观看免费| 一本一本大道香蕉久在线精品| 678五月天丁香亚洲综合网| 久久久精品人体av艺术| 亚洲图片一区二区| 黄色资源网久久资源365| av亚洲精华国产精华| 91精品国产综合久久久久久久久久| 26uuu色噜噜精品一区二区| 亚洲人妖av一区二区| 蜜臀va亚洲va欧美va天堂| 99热在这里有精品免费| 欧美一区在线视频| 国产精品传媒在线| 蜜臀国产一区二区三区在线播放| av一区二区久久| 欧美一区二区三区四区高清| 国产精品久久久久永久免费观看 | 久久精品国产**网站演员| 成人国产精品免费网站| 4438x亚洲最大成人网| 欧美国产视频在线| 麻豆精品久久精品色综合| 91在线小视频| 久久综合久久综合九色| 亚洲一区二区美女| 成人激情动漫在线观看| 日韩一区二区在线看| 一区二区三区中文在线观看| 精品中文字幕一区二区小辣椒 | 欧美日韩国产综合一区二区三区| 国产色产综合色产在线视频| 蜜桃视频第一区免费观看| 91国产精品成人| 国产精品丝袜黑色高跟| 裸体一区二区三区| 欧美日本精品一区二区三区| 亚洲同性同志一二三专区| 国产一区二区三区久久久| 91精品中文字幕一区二区三区| ...中文天堂在线一区| 国产黄色91视频| 精品毛片乱码1区2区3区| 午夜精品久久久久久久99樱桃|