📄 wt_stmac.c
字号:
if( !IsQueueEmpty( &Adapter->AnFrmQ ) ) { pEntry = RemoveHeadQueue(&Adapter->AnFrmQ); //////////////////////////////////////////////////////////// pWtTxBuf = (PWTWLAN_TXBUF)list_entry( (struct list_head *)pEntry, WTWLAN_TXBUF, List ); //////////////////////////////////////////////////////////// Adapter->AnQLen--; } else { pWtTxBuf = QosSendProcess( Adapter ); } } } break; case ASOC_PASS: { if( Adapter->MacParameter.sCfPollable & Adapter->MacParameter.mCfp ) { if( Adapter->MacParameter.bNeedCFACK ) { Adapter->MacParameter.bNeedCFACK = FALSE; // add CFRSP code here pWtTxBuf = QosSendProcess( Adapter ); } } else pWtTxBuf = QosSendProcess( Adapter ); } break; case BSS: case AUTH_PASS: case NO_BSS: default: { //pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; //WT_FREE_SEND_PACKET( Adapter, pWtTxBuf); break; } } break; case WLAN_MACMODE_ESS_AP: case WLAN_MACMODE_NONE: default : { //pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; //WT_FREE_SEND_PACKET( Adapter, pWtTxBuf); break; } } FN_EXIT(0,0); return pWtTxBuf;}// Now tx bank4 as the special bank // mgmt frm and cfack etc urgency frm send via bank4// canceal mechanism can be adopted to optimize performanceBOOL MpSend(IN PWT_ADAPTER Adapter, IN PWTWLAN_TXBUF pWtTxBuf, IN BOOL bMgmtFrm){ int loopCount = MAX_URGENCY_BANK_LOOP_COUNT; int loopIndex = 0; PWTWLAN_TXBUF pWtSentBuf = NULL; UINT MsecDelay = 1; UCHAR TxBank; UCHAR TxBankStatus; p80211_hdr_t *w_hdr; FN_ENTER; w_hdr = (p80211_hdr_t *)&pWtTxBuf->TXHwBuf.pHwTxBuf->dot11Head; pWtTxBuf->Frmtype = ( WLAN_GET_FC_FTYPE(ieee2host16(w_hdr->a3.fc)) ) | ( WLAN_GET_FC_FSTYPE(ieee2host16(w_hdr->a3.fc)) ); if( Adapter->MacParameter.bPowerMgtPend ) { pWtSentBuf->bPowerMgtPend = TRUE; } if( bMgmtFrm ) { // define bank4 as special bank TxBank = WtWlanGetUrgentFreeBank( Adapter ); TxBankStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); if( pWtTxBuf->bUrgency ) { if( TxBankStatus != TX_STATUS_BANK_EMPTY ) { ASSERT( Adapter->WtTDB.pTxbuf[TxBank] ); pWtSentBuf = Adapter->WtTDB.pTxbuf[TxBank]; Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = TxBankStatus; Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START; } } else { while( (loopIndex < loopCount )&&(! (MASK_TX_STATUS_BANK_AVAILABLE & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3))))) { udelay( MsecDelay ); loopIndex++; } TxBankStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); if( TxBankStatus != TX_STATUS_BANK_EMPTY ) { Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START; if( Adapter->WtTDB.pTxbuf[TxBank] != NULL ) { pWtSentBuf = Adapter->WtTDB.pTxbuf[TxBank]; Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); } } } pWtTxBuf->TxBank = TxBank; NICSendPacket(Adapter, pWtTxBuf); } else { TxBank = WtWlanGetFreeBank( Adapter ); // a freebank var may accelerate to find free bank find switch ( Adapter->MacParameter.macmode ) { case WLAN_MACMODE_IBSS_STA: case WLAN_MACMODE_ESS_STA: switch( Adapter->MacParameter.CurrentState ) { case IBSS_IDLE: case IBSS_ACTIVE: { TxBankStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); if( TxBankStatus != TX_STATUS_BANK_EMPTY ) { //ASSERT( Adapter->WtTDB.pTxbuf[TxBank] ); if( Adapter->WtTDB.pTxbuf[TxBank] != NULL ) { Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); if(Adapter->WtTDB.pTxbuf[TxBank]->TxStatus == TX_STATUS_SUCCESS_DONE) { Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_SUCCESS; } else { Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_FAILURE; } TxDoneHandle( Adapter, Adapter->WtTDB.pTxbuf[TxBank]); } Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START; } pWtTxBuf->TxBank = TxBank; NICSendPacket(Adapter, pWtTxBuf); } break; case ASOC_PASS: { TxBankStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); if( TxBankStatus != TX_STATUS_BANK_EMPTY ) { //ASSERT( Adapter->WtTDB.pTxbuf[TxBank] ); if( Adapter->WtTDB.pTxbuf[TxBank] != NULL ) { Adapter->WtTDB.pTxbuf[TxBank]->TxStatus = MASK_TX_BANK & ( Adapter->CSRAddress->TxStatus.RegTxStatus >> (TxBank*3) ); if(Adapter->WtTDB.pTxbuf[TxBank]->TxStatus == TX_STATUS_SUCCESS_DONE) { Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_SUCCESS; } else { Adapter->WtTDB.pTxbuf[TxBank]->SendStatus = NDIS_STATUS_FAILURE; } TxDoneHandle( Adapter, Adapter->WtTDB.pTxbuf[TxBank]); } Adapter->CSRAddress->TxCtrl[TxBank] &= ~MASK_TX_START; } pWtTxBuf->TxBank = TxBank; NICSendPacket(Adapter, pWtTxBuf); } break; case BSS: case AUTH_PASS: case NO_BSS: default: { pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; //dev_kfree_skb(pWtTxBuf->skb); WT_FREE_SEND_PACKET( Adapter, pWtTxBuf); break; } } break; case WLAN_MACMODE_ESS_AP: case WLAN_MACMODE_NONE: default : { pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; //dev_kfree_skb(pWtTxBuf->skb); WT_FREE_SEND_PACKET( Adapter, pWtTxBuf); break; } } } if( pWtSentBuf ) { switch ( pWtSentBuf->TxStatus ) { case TX_STATUS_SUCCESS_DONE: pWtSentBuf->SendStatus = NDIS_STATUS_SUCCESS; break; case TX_STATUS_FAILURE_DONE: case TX_STATUS_FAILURE_TTL: pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; break; case TX_STATUS_UNDERGO: case TX_STATUS_WAITSEND: pWtTxBuf->ReQueueCount = 0; pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; break; default : pWtSentBuf->SendStatus = NDIS_STATUS_FAILURE; break; } WT_SET_FLAG( pWtSentBuf, fWT_TX_CANCEAL_MASK); TxDoneHandle( Adapter, pWtSentBuf); } FN_EXIT(0,0); return TRUE;}BOOL NICRecv(IN PWT_ADAPTER Adapter, IN UINT RcvBank, OUT PWTWLAN_RXBUF pWtRxBuf ){ PWTWLAN_RXBUF pEncryptRxbuf = NULL; PWTWLAN_HWRXBUF pHwRxbuf = NULL; BOOL bSoftDecrypt; ULONG Length; //UINT payload_offset; p80211_hdr_t *w_hdr; UINT8 *daddr = NULL; UINT8 *saddr = NULL; wlan_ethhdr_t *e_hdr; wlan_llc_t *e_llc; wlan_snap_t *e_snap; UINT8 *e_payload; BOOL bEtherIIhead = FALSE; FN_ENTER; pHwRxbuf = &Adapter->MainMemAddress->RxBufMap[RcvBank].HwRxBuf; // auth fram3 also need decrypt, check condition if( pWtRxBuf->ftype == WLAN_FTYPE_DATA ) { if( Adapter->MacParameter.bSoftDecrypt &&(WLAN_GET_FC_ISWEP(pWtRxBuf->FrmCtl))) { bSoftDecrypt = TRUE; //pEncryptRxbuf->RXHwBuf.pHwRxBuf; AllocRxMgmtBuff(Adapter, &pEncryptRxbuf); if( pEncryptRxbuf ) { if( !WTWlanDecryptMPDU( Adapter, RcvBank, pEncryptRxbuf->RXHwBuf.pHwRxBuf )) { NICReturnRxMgmtBuf( Adapter, pEncryptRxbuf); //DBGPRINT(WT_TRACE, ("<-- NICRecv\n")); return FALSE; } else { pHwRxbuf = pEncryptRxbuf->RXHwBuf.pHwRxBuf; } } else { //DBGPRINT(WT_TRACE, ("<-- NICRecv\n")); return FALSE; } } Length = sizeof( WTWLAN_RSB) + MAX_HW_HEAD_LEN ; //////////////////////////////////////////////////////////////////////////////////////// /* NdisMoveFromMappedMemory( pWtRxBuf->RXHwBuf.pRxBuffer, pHwRxbuf, Length ); */ memmove( pWtRxBuf->RXHwBuf.pRxBuffer, pHwRxbuf, Length); ///////////////////////////////////////////////////////////////////////////////////////// //Dump( (char *)pWtRxBuf->RXHwBuf.pHwRxBuf,Length, TRUE, 1 ); //Dump( (char *)pHwRxbuf,Length + pHwRxbuf->RxStatus.RecvBodyLen, TRUE, 1 ); //swap for date add ether head here-------------- e_hdr = (wlan_ethhdr_t *)(pWtRxBuf->RXHwBuf.pHwRxBuf->Buffer); e_llc = (wlan_llc_t *)(&pHwRxbuf->Buffer); e_snap = (wlan_snap_t *) (((UINT8 *) e_llc) + sizeof(wlan_llc_t)); e_payload = ((UINT8 *) e_snap) + sizeof(wlan_snap_t); w_hdr = (p80211_hdr_t*)&pWtRxBuf->RXHwBuf.pHwRxBuf->dot11Head; //DbgPrint("\nThe sequence number of data frame is %4x\n", w_hdr->a3.seq); //FrmCtrl has been changed from ieee to host if ((WLAN_GET_FC_TODS(pWtRxBuf->FrmCtl) == 0) && (WLAN_GET_FC_FROMDS(pWtRxBuf->FrmCtl) == 0)) { daddr = w_hdr->a3.a1; saddr = w_hdr->a3.a2; } else if ((WLAN_GET_FC_TODS(pWtRxBuf->FrmCtl) == 0) && (WLAN_GET_FC_FROMDS(pWtRxBuf->FrmCtl) == 1)) { daddr = w_hdr->a3.a1; saddr = w_hdr->a3.a3; } else if ((WLAN_GET_FC_TODS(pWtRxBuf->FrmCtl) == 1) && (WLAN_GET_FC_FROMDS(pWtRxBuf->FrmCtl) == 0)) { daddr = w_hdr->a3.a3; saddr = w_hdr->a3.a2; } else { daddr = w_hdr->a4.a3; saddr = w_hdr->a4.a4; } // data should > 0 discard other frame include nodata if( ieee2host16( pHwRxbuf->RxStatus.RecvBodyLen ) > 0 ) { if( ( e_llc->dsap == 0xaa ) && ( e_llc->ssap == 0xaa ) && ( e_llc->ctl == 0x03 ) ) { if ((e_snap->oui[0] == 0x00 )&&(e_snap->oui[1] == 0x00 )&&(e_snap->oui[2] == 0xf8 ) ) { //8021h bEtherIIhead = TRUE; } else { // check if( (e_snap->type == host2ieee16(0x80f3))||(e_snap->type == host2ieee16(0x8137)) ) bEtherIIhead = FALSE; else bEtherIIhead = TRUE; } } } else { //DBGPRINT(WT_TRACE, ("<-- NICRecv\n")); return FALSE; } if( bEtherIIhead ) { pWtRxBuf->NDISPacketOffset = sizeof(wlan_llc_t) + sizeof(wlan_snap_t); pWtRxBuf->CopyLen = ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) - pWtRxBuf->NDISPacketOffset ; e_hdr->type = e_snap->type; //printk("File %s Line = %d e_hdr->type = %04x pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen =%d \n", __FILE__, __LINE__,e_hdr->type, ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) ); } else { pWtRxBuf->NDISPacketOffset = 0; pWtRxBuf->CopyLen = ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) - pWtRxBuf->NDISPacketOffset ; e_hdr->type = host2ieee16( ieee2host16( pHwRxbuf->RxStatus.RecvBodyLen ) ); //printk("File %s Line = %d e_hdr->type = %d\n", __FILE__, __LINE__, e_hdr->type ); } //////////////////////////////////////////////////////////////////////////////////// /* NdisMoveMemory( e_hdr->daddr, daddr, ETH_ALEN ); NdisMoveMemory( e_hdr->saddr, saddr, ETH_ALEN ); */ memmove(e_hdr->daddr, daddr, ETH_ALEN); memmove(e_hdr->saddr, saddr, ETH_ALEN); //////////////////////////////////////////////////////////////////////////////////// Length = pWtRxBuf->CopyLen; //printk("File %s Line = %d Length = %d\n", __FILE__, __LINE__, Length ); if( ( Length <= 0 ) || ( pWtRxBuf->NDISPacketOffset >= ieee2host16( pWtRxBuf->RXHwBuf.pHwRxBuf->RxStatus.RecvBodyLen ) ) ) { //DBGPRINT(WT_TRACE, ("<-- NICRecv\n")); return FALSE; } //////////////////////////////////////////////////////////////////////////////////// /*NdisMoveFromMappedMemory(//锟給dy锟?转为锟教
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -