void announce_802_3_packet( IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, IN UCHAR OpMode) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; /* struct sk_buff *pRxPkt; */ PNDIS_PACKET pRxPkt; #ifdef INF_PPA_SUPPORT int ret = 0; unsigned int ppa_flags = 0; /* reserved for now */ #endif /* INF_PPA_SUPPORT */ pAd = pAd; /* avoid compile warning */ MEM_DBG_PKT_FREE_INC(pPacket); ASSERT(pPacket); /* pRxPkt = RTPKT_TO_OSPKT(pPacket); */ pRxPkt = pPacket; #ifdef CONFIG_STA_SUPPORT #endif /* CONFIG_STA_SUPPORT */ /* Push up the protocol stack */ #ifdef IKANOS_VX_1X0 IKANOS_DataFrameRx(pAd, pRxPkt); #else /* mark for bridge fast path, 2009/06/22 */ /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */ #ifdef INF_PPA_SUPPORT if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) { RtmpOsPktInfPpaSend(pRxPkt); pRxPkt=NULL; return; } #endif /* INF_PPA_SUPPORT */ /*#ifdef CONFIG_5VT_ENHANCE */ /* *(int*)(pRxPkt->cb) = BRIDGE_TAG; */ /*#endif */ { /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */ RtmpOsPktProtocolAssign(pRxPkt); RtmpOsPktRcvHandle(pRxPkt); } #endif /* IKANOS_VX_1X0 */ }
void announce_802_3_packet( IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, IN UCHAR OpMode) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc; PNDIS_PACKET pRxPkt = pPacket; ASSERT(pPacket); MEM_DBG_PKT_FREE_INC(pPacket); #ifdef CONFIG_STA_SUPPORT #endif /* CONFIG_STA_SUPPORT */ /* Push up the protocol stack */ #ifdef IKANOS_VX_1X0 { IKANOS_DataFrameRx(pAd, pRxPkt); return; } #endif /* IKANOS_VX_1X0 */ #ifdef INF_PPA_SUPPORT if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) { RtmpOsPktInfPpaSend(pRxPkt); pRxPkt=NULL; return; } #endif /* INF_PPA_SUPPORT */ //+++Add by shiang for debug if (0) { hex_dump("announce_802_3_packet", GET_OS_PKT_DATAPTR(pRxPkt), GET_OS_PKT_LEN(pRxPkt)); } //---Add by shiang for debug RtmpOsPktProtocolAssign(pRxPkt); RtmpOsPktRcvHandle(pRxPkt); }
void announce_802_3_packet( IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, IN UCHAR OpMode) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; /* struct sk_buff *pRxPkt; */ PNDIS_PACKET pRxPkt; #ifdef INF_PPA_SUPPORT int ret = 0; unsigned int ppa_flags = 0; /* reserved for now */ #endif /* INF_PPA_SUPPORT */ pAd = pAd; /* avoid compile warning */ MEM_DBG_PKT_FREE_INC(pPacket); ASSERT(pPacket); /* pRxPkt = RTPKT_TO_OSPKT(pPacket); */ pRxPkt = pPacket; #ifdef CONFIG_STA_SUPPORT #endif /* CONFIG_STA_SUPPORT */ /* Push up the protocol stack */ #ifdef IKANOS_VX_1X0 IKANOS_DataFrameRx(pAd, pRxPkt); return; #endif /* IKANOS_VX_1X0 */ /* mark for bridge fast path, 2009/06/22 */ /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */ #ifdef INF_PPA_SUPPORT if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) { RtmpOsPktInfPpaSend(pRxPkt); pRxPkt=NULL; return; } #endif /* INF_PPA_SUPPORT */ { #ifdef CONFIG_RT2880_BRIDGING_ONLY /* pRxPkt->cb[22]=0xa8; */ PACKET_CB_ASSIGN(pRxPkt, 22) = 0xa8; #endif #if defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE) if(ra_classifier_hook_rx!= NULL) { unsigned int flags; RTMP_IRQ_LOCK(&pAd->page_lock, flags); ra_classifier_hook_rx(pRxPkt, classifier_cur_cycle); RTMP_IRQ_UNLOCK(&pAd->page_lock, flags); } #endif /* CONFIG_RA_CLASSIFIER */ #if !defined(CONFIG_RA_NAT_NONE) #if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE) RtmpOsPktNatMagicTag(pRxPkt); #endif /* bruce+ * ra_sw_nat_hook_rx return 1 --> continue * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx */ if (ra_sw_nat_hook_rx!= NULL) { unsigned int flags; /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */ RtmpOsPktProtocolAssign(pRxPkt); RTMP_IRQ_LOCK(&pAd->page_lock, flags); if(ra_sw_nat_hook_rx(pRxPkt)) { RtmpOsPktRcvHandle(pRxPkt); } RTMP_IRQ_UNLOCK(&pAd->page_lock, flags); } #else { #if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE) RtmpOsPktNatNone(pRxPkt); #endif /* CONFIG_RA_HW_NAT */ } #endif /* CONFIG_RA_NAT_NONE */ } /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */ RtmpOsPktProtocolAssign(pRxPkt); RtmpOsPktRcvHandle(pRxPkt); }
void announce_802_3_packet( IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, IN UCHAR OpMode) { RTMP_ADAPTER *pAd; PNDIS_PACKET pRxPkt = pPacket; pAd = (RTMP_ADAPTER *)pAdSrc; ASSERT(pPacket); MEM_DBG_PKT_FREE_INC(pPacket); #ifdef CONFIG_AP_SUPPORT #ifdef APCLI_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { if (RTMP_MATPktRxNeedConvert(pAd, RtmpOsPktNetDevGet(pRxPkt))) RTMP_MATEngineRxHandle(pAd, pRxPkt, 0); } #endif /* APCLI_SUPPORT */ #endif /* CONFIG_AP_SUPPORT */ /* Push up the protocol stack */ #ifdef CONFIG_AP_SUPPORT #ifdef PLATFORM_BL2348 { extern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb); RtmpOsPktProtocolAssign(pRxPkt); pToUpperLayerPktSent(pRxPkt); return; } #endif /* PLATFORM_BL2348 */ #endif /* CONFIG_AP_SUPPORT */ #ifdef IKANOS_VX_1X0 { IKANOS_DataFrameRx(pAd, pRxPkt); return; } #endif /* IKANOS_VX_1X0 */ #ifdef INF_PPA_SUPPORT if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) { RtmpOsPktInfPpaSend(pRxPkt); pRxPkt=NULL; return; } #endif /* INF_PPA_SUPPORT */ { #ifdef CONFIG_RT2880_BRIDGING_ONLY PACKET_CB_ASSIGN(pRxPkt, 22) = 0xa8; #endif #if defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE) if(ra_classifier_hook_rx!= NULL) { unsigned int flags; RTMP_IRQ_LOCK(&pAd->page_lock, flags); ra_classifier_hook_rx(pRxPkt, classifier_cur_cycle); RTMP_IRQ_UNLOCK(&pAd->page_lock, flags); } #endif /* CONFIG_RA_CLASSIFIER */ #if !defined(CONFIG_RA_NAT_NONE) #if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE) { struct sk_buff *pRxPktb = RTPKT_TO_OSPKT(pRxPkt); FOE_MAGIC_TAG(pRxPktb) = FOE_MAGIC_WLAN; } #endif #ifdef RA_NAT_SUPPORT #if !defined(CONFIG_RA_NAT_NONE) /* bruce+ * ra_sw_nat_hook_rx return 1 --> continue * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx */ if (ra_sw_nat_hook_rx!= NULL) { unsigned int flags; RtmpOsPktProtocolAssign(pRxPkt); RTMP_IRQ_LOCK(&pAd->page_lock, flags); if(ra_sw_nat_hook_rx(pRxPkt)) { netif_rx(pRxPkt); } RTMP_IRQ_UNLOCK(&pAd->page_lock, flags); return; } #endif /* !CONFIG_RA_NAT_NONE */ #endif /* RA_NAT_SUPPORT */ #else { #if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE) FOE_AI(((struct sk_buff *)pRxPkt)) = UN_HIT; #endif /* CONFIG_RA_HW_NAT */ } #endif /* CONFIG_RA_NAT_NONE */ } #ifdef CONFIG_AP_SUPPORT #ifdef BG_FT_SUPPORT if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0) return; #endif /* BG_FT_SUPPORT */ #endif /* CONFIG_AP_SUPPORT */ RtmpOsPktProtocolAssign(pRxPkt); RtmpOsPktRcvHandle(pRxPkt); }
void send_radiotap_monitor_packets( PNET_DEV pNetDev, PNDIS_PACKET pRxPacket, VOID *dot11_hdr, UCHAR *pData, USHORT DataSize, UCHAR L2PAD, UCHAR PHYMODE, UCHAR BW, UCHAR ShortGI, UCHAR MCS, UCHAR LDPC, UCHAR LDPC_EX_SYM, UCHAR AMPDU, UCHAR STBC, UCHAR RSSI1, UCHAR *pDevName, UCHAR Channel, UCHAR CentralChannel, UCHAR sideband_index, UINT32 MaxRssi) { struct sk_buff *pOSPkt; int rate_index = 0; USHORT header_len = 0; UCHAR temp_header[40] = {0}; struct mtk_radiotap_header *mtk_rt_hdr; UINT32 varlen = 0, padding_len = 0; UINT64 tmp64; UINT32 tmp32; UINT16 tmp16; UCHAR *pos; DOT_11_HDR *pHeader = (DOT_11_HDR *)dot11_hdr; MEM_DBG_PKT_FREE_INC(pRxPacket); pOSPkt = RTPKT_TO_OSPKT(pRxPacket); pOSPkt->dev = pNetDev; if (pHeader->FC.Type == 0x2 /* FC_TYPE_DATA */) { DataSize -= LENGTH_802_11; if ((pHeader->FC.ToDs == 1) && (pHeader->FC.FrDs == 1)) header_len = LENGTH_802_11_WITH_ADDR4; else header_len = LENGTH_802_11; /* QOS */ if (pHeader->FC.SubType & 0x08) { header_len += 2; /* Data skip QOS contorl field */ DataSize -= 2; } /* Order bit: A-Ralink or HTC+ */ if (pHeader->FC.Order) { header_len += 4; /* Data skip HTC contorl field */ DataSize -= 4; } /* Copy Header */ if (header_len <= 40) NdisMoveMemory(temp_header, pData, header_len); /* skip HW padding */ if (L2PAD) pData += (header_len + 2); else pData += header_len; } if (DataSize < pOSPkt->len) { skb_trim(pOSPkt, DataSize); } else { skb_put(pOSPkt, (DataSize - pOSPkt->len)); } if ((pData - pOSPkt->data) > 0) { skb_put(pOSPkt, (pData - pOSPkt->data)); skb_pull(pOSPkt, (pData - pOSPkt->data)); } if (skb_headroom(pOSPkt) < (sizeof(*mtk_rt_hdr) + header_len)) { if (pskb_expand_head(pOSPkt, (sizeof(*mtk_rt_hdr) + header_len), 0, GFP_ATOMIC)) { DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __FUNCTION__)); goto err_free_sk_buff; } } if (header_len > 0) NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len); /* tsf */ padding_len = ((varlen % 8) == 0) ? 0 : (8 - (varlen % 8)); varlen += (8 + padding_len); /* flags */ varlen += 1; /* rate */ if (PHYMODE < MODE_HTMIX) varlen += 1; /* channel frequency */ padding_len = ((varlen % 2) == 0) ? 0 : (2 - (varlen % 2)); varlen += (2 + padding_len); /* channel flags */ varlen += 2; /* MCS */ if ((PHYMODE == MODE_HTMIX) || (PHYMODE == MODE_HTGREENFIELD)) { /* known */ varlen += 1; /* flags */ varlen += 1; /* index */ varlen += 1; } /* A-MPDU */ if (AMPDU) { /* reference number */ padding_len = ((varlen % 4) == 0) ? 0 : (4 - (varlen % 4)); varlen += (4 + padding_len); /* flags */ varlen += 2; /* delimiter crc value */ varlen += 1; /* reserved */ varlen += 1; } /* VHT */ if (PHYMODE == MODE_VHT) { /* known */ padding_len = ((varlen % 2) == 0) ? 0 : (2 - (varlen % 2)); varlen += (2 + padding_len); /* flags */ varlen += 1; /* bandwidth */ varlen += 1; /* mcs_nss */ varlen += 4; /* coding */ varlen += 1; /* group_id */ varlen += 1; /* partial_aid */ varlen += 2; } mtk_rt_hdr = (struct mtk_radiotap_header *)skb_push(pOSPkt, sizeof(*mtk_rt_hdr) + varlen); NdisZeroMemory(mtk_rt_hdr, sizeof(*mtk_rt_hdr) + varlen); mtk_rt_hdr->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; mtk_rt_hdr->rt_hdr.it_pad = 0; mtk_rt_hdr->rt_hdr.it_len = cpu2le16(sizeof(*mtk_rt_hdr) + varlen); mtk_rt_hdr->rt_hdr.it_present = cpu2le32( (1 << IEEE80211_RADIOTAP_TSFT) | (1 << IEEE80211_RADIOTAP_FLAGS)); if (PHYMODE < MODE_HTMIX) { mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_RATE); } mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_CHANNEL); if ((PHYMODE == MODE_HTMIX) || (PHYMODE == MODE_HTGREENFIELD)) { mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_MCS); } if (AMPDU) { mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_AMPDU_STATUS); } if (PHYMODE == MODE_VHT) mtk_rt_hdr->rt_hdr.it_present |= cpu2le32(1 << IEEE80211_RADIOTAP_VHT); varlen = 0; pos = mtk_rt_hdr->variable; padding_len = ((varlen % 8) == 0) ? 0 : (8 - (varlen % 8)); pos += padding_len; varlen += padding_len; /* tsf */ tmp64 = 0; NdisMoveMemory(pos, &tmp64, 8); pos += 8; varlen += 8; /* flags */ *pos = 0; pos++; varlen++; /* rate */ if (PHYMODE == MODE_OFDM) { rate_index = (UCHAR)(MCS) + 4; *pos = ralinkrate[rate_index]; pos++; varlen++; } else if (PHYMODE == MODE_CCK) { rate_index = (UCHAR)(MCS); *pos = ralinkrate[rate_index]; pos++; varlen++; } /* channel frequency */ padding_len = ((varlen % 2) == 0) ? 0 : (2 - (varlen % 2)); pos += padding_len; varlen += padding_len; #define ieee80211chan2mhz(x) \ (((x) <= 14) ? \ (((x) == 14) ? 2484 : ((x) * 5) + 2407) : \ ((x) + 1000) * 5) tmp16 = cpu2le16(ieee80211chan2mhz(Channel)); NdisMoveMemory(pos, &tmp16, 2); pos += 2; varlen += 2; if (Channel > 14) { tmp16 = cpu2le16((IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ)); } else { if (PHYMODE == MODE_CCK) { tmp16 = cpu2le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ); } else { tmp16 = cpu2le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ); } } NdisMoveMemory(pos, &tmp16, 2); pos += 2; varlen += 2; /* HT MCS */ if ((PHYMODE == MODE_HTMIX) || (PHYMODE == MODE_HTGREENFIELD)) { *pos = (IEEE80211_RADIOTAP_MCS_HAVE_BW | IEEE80211_RADIOTAP_MCS_HAVE_MCS | IEEE80211_RADIOTAP_MCS_HAVE_GI | IEEE80211_RADIOTAP_MCS_HAVE_FMT | IEEE80211_RADIOTAP_MCS_HAVE_FEC); pos++; varlen++; /* BW */ if (BW == 0) { *pos = HT_BW(IEEE80211_RADIOTAP_MCS_BW_20); } else { *pos = HT_BW(IEEE80211_RADIOTAP_MCS_BW_40); } /* HT GI */ *pos |= HT_GI(ShortGI); /* HT format */ if (PHYMODE == MODE_HTMIX) *pos |= HT_FORMAT(0); else if (PHYMODE == MODE_HTGREENFIELD) *pos |= HT_FORMAT(1); /* HT FEC type */ *pos |= HT_FEC_TYPE(LDPC); pos++; varlen++; /* HT mcs index */ *pos = MCS; pos++; varlen++; } if (AMPDU) { /* reference number */ padding_len = ((varlen % 4) == 0) ? 0 : (4 - (varlen % 4)); varlen += padding_len; pos += padding_len; tmp32 = 0; NdisMoveMemory(pos, &tmp32, 4); pos += 4; varlen += 2; /* flags */ tmp16 = 0; NdisMoveMemory(pos, &tmp16, 2); pos += 2; varlen += 2; /* delimiter CRC value */ *pos = 0; pos++; varlen++; /* reserved */ *pos = 0; pos++; varlen++; } #ifdef DOT11_VHT_AC /* VHT */ if (PHYMODE == MODE_VHT) { /* known */ padding_len = ((varlen % 2) == 0) ? 0 : (2 - (varlen % 2)); varlen += padding_len; pos += padding_len; tmp16 = cpu2le16(IEEE80211_RADIOTAP_VHT_KNOWN_STBC | IEEE80211_RADIOTAP_VHT_KNOWN_GI | IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH); NdisMoveMemory(pos, &tmp16, 2); pos += 2; varlen += 2; /* flags */ *pos = (STBC?IEEE80211_RADIOTAP_VHT_FLAG_STBC:0); *pos |= (ShortGI?IEEE80211_RADIOTAP_VHT_FLAG_SGI:0); *pos |= (LDPC_EX_SYM?IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM:0); pos++; varlen++; /* bandwidth */ if (BW == 0) { *pos = 0; } else if (BW == 1) { *pos = 1; } else if (BW == 2) { *pos = 4; #if 0 if (sideband_index == 0) *pos = 7; /* 20LL */ else if (sideband_index == 1) *pos = 8; /* 20LU */ else if (sideband_index == 2) *pos = 9; /* 20UL */ else if (sideband_index == 3) *pos = 10; /* 20UU */ #endif } else { DBGPRINT(RT_DEBUG_ERROR, ("%s:unknow bw(%d)\n", __FUNCTION__, BW)); } /* mcs_nss */ pos++; varlen++; /* vht_mcs_nss[0] */ *pos = (GET_VHT_NSS(MCS) & 0x0f); *pos |= ((GET_VHT_MCS(MCS) & 0x0f) << 4); pos++; varlen++; /* vht_mcs_nss[1] */ *pos = 0; pos++; varlen++; /* vht_mcs_nss[2] */ *pos = 0; pos++; varlen++; /* vht_mcs_nss[3] */ *pos = 0; pos++; varlen++; /* coding */ if (LDPC) *pos = 1; else *pos = 0; pos++; varlen++; /* group_id */ *pos = 0; pos++; varlen++; /* partial aid */ tmp16 = 0; NdisMoveMemory(pos, &tmp16, 2); pos += 2; varlen += 2; } #endif /* DOT11_VHT_AC */ pOSPkt->dev = pOSPkt->dev; skb_reset_mac_header(pOSPkt); pOSPkt->pkt_type = PACKET_OTHERHOST; pOSPkt->protocol = __constant_htons(ETH_P_80211_RAW); pOSPkt->ip_summed = CHECKSUM_NONE; netif_rx_ni(pOSPkt); return; err_free_sk_buff: RELEASE_NDIS_PACKET(NULL, pRxPacket, NDIS_STATUS_FAILURE); return; }
void announce_802_3_packet(void*pAdSrc,PNDIS_PACKET pPacket,unsigned char OpMode) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc; PNDIS_PACKET pRxPkt = pPacket; ASSERT(pPacket); MEM_DBG_PKT_FREE_INC(pPacket); #ifdef CONFIG_STA_SUPPORT #endif /* CONFIG_STA_SUPPORT */ /* Push up the protocol stack */ #ifdef IKANOS_VX_1X0 { IKANOS_DataFrameRx(pAd, pRxPkt); return; } #endif /* IKANOS_VX_1X0 */ #ifdef INF_PPA_SUPPORT if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) { RtmpOsPktInfPpaSend(pRxPkt); pRxPkt=NULL; return; } #endif /* INF_PPA_SUPPORT */ { #ifdef CONFIG_RT2880_BRIDGING_ONLY PACKET_CB_ASSIGN(pRxPkt, 22) = 0xa8; #endif #if defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE) if(ra_classifier_hook_rx!= NULL) { unsigned int flags; RTMP_IRQ_LOCK(&pAd->page_lock, flags); ra_classifier_hook_rx(pRxPkt, classifier_cur_cycle); RTMP_IRQ_UNLOCK(&pAd->page_lock, flags); } #endif /* CONFIG_RA_CLASSIFIER */ #if !defined(CONFIG_RA_NAT_NONE) #if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE) RtmpOsPktNatMagicTag(pRxPkt); #endif #ifdef RA_NAT_SUPPORT /* bruce+ * ra_sw_nat_hook_rx return 1 --> continue * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx */ if (ra_sw_nat_hook_rx!= NULL) { unsigned int flags; RtmpOsPktProtocolAssign(pRxPkt); RTMP_IRQ_LOCK(&pAd->page_lock, flags); if(ra_sw_nat_hook_rx(pRxPkt)) { RtmpOsPktRcvHandle(pRxPkt); } RTMP_IRQ_UNLOCK(&pAd->page_lock, flags); } #endif /* RA_NAT_SUPPORT */ #else { #if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE) RtmpOsPktNatNone(pRxPkt); #endif /* CONFIG_RA_HW_NAT */ } #endif /* CONFIG_RA_NAT_NONE */ } RtmpOsPktProtocolAssign(pRxPkt); RtmpOsPktRcvHandle(pRxPkt); }