diff options
Diffstat (limited to 'drivers/staging/otus')
-rw-r--r-- | drivers/staging/otus/80211core/amsdu.c | 145 |
1 files changed, 70 insertions, 75 deletions
diff --git a/drivers/staging/otus/80211core/amsdu.c b/drivers/staging/otus/80211core/amsdu.c index c9123d58b82..0321288d107 100644 --- a/drivers/staging/otus/80211core/amsdu.c +++ b/drivers/staging/otus/80211core/amsdu.c @@ -34,53 +34,53 @@ /* Stephen Chen Atheros Communications, INC. 2007.2 */ /* */ /************************************************************************/ -zbuf_t* zfGetAmsduSubFrame(zdev_t* dev, zbuf_t* buf, u16_t* offset) +zbuf_t *zfGetAmsduSubFrame(zdev_t *dev, zbuf_t *buf, u16_t *offset) { - u16_t subframeLen; - u16_t amsduLen = zfwBufGetSize(dev, buf); - zbuf_t* newBuf; - - ZM_PERFORMANCE_RX_AMSDU(dev, buf, amsduLen); - - /* Verify A-MSDU length */ - if (amsduLen < (*offset + 14)) - { - return NULL; - } - - /* Locate A-MSDU subframe by offset and verify subframe length */ - subframeLen = (zmw_buf_readb(dev, buf, *offset + 12) << 8) + - zmw_buf_readb(dev, buf, *offset + 13); - if (subframeLen == 0) - { - return NULL; - } - - /* Verify A-MSDU subframe length */ - if ((*offset+14+subframeLen) <= amsduLen) - { - /* Allocate a new buffer */ - if ((newBuf = zfwBufAllocate(dev, 24+2+subframeLen)) != NULL) - { -#ifdef ZM_ENABLE_NATIVE_WIFI - /* Copy and convert subframe to wlan frame format */ - /* SHALL NOT INCLUDE QOS and AMSDU header. Ray 20070807 For Vista */ - zfRxBufferCopy(dev, newBuf, buf, 0, 0, 24); - zfRxBufferCopy(dev, newBuf, buf, 24, *offset+14, subframeLen); - zfwBufSetSize(dev, newBuf, 24+subframeLen); -#else - /* Copy subframe to new buffer */ - zfRxBufferCopy(dev, newBuf, buf, 0, *offset, 14+subframeLen); - zfwBufSetSize(dev, newBuf, 14+subframeLen); -#endif - /* Update offset */ - *offset += (((14+subframeLen)+3) & 0xfffc); - - /* Return buffer pointer */ - return newBuf; - } - } - return NULL; + u16_t subframeLen; + u16_t amsduLen = zfwBufGetSize(dev, buf); + zbuf_t *newBuf; + + ZM_PERFORMANCE_RX_AMSDU(dev, buf, amsduLen); + + /* Verify A-MSDU length */ + if (amsduLen < (*offset + 14)) + return NULL; + + /* Locate A-MSDU subframe by offset and verify subframe length */ + subframeLen = (zmw_buf_readb(dev, buf, *offset + 12) << 8) + + zmw_buf_readb(dev, buf, *offset + 13); + + if (subframeLen == 0) + return NULL; + + /* Verify A-MSDU subframe length */ + if ((*offset+14+subframeLen) <= amsduLen) { + /* Allocate a new buffer */ + newBuf = zfwBufAllocate(dev, 24+2+subframeLen); + if (newBuf != NULL) { + #ifdef ZM_ENABLE_NATIVE_WIFI + /* Copy and convert subframe to wlan frame format + * SHALL NOT INCLUDE QOS and AMSDU header. + * Ray 20070807 For Vista + */ + zfRxBufferCopy(dev, newBuf, buf, 0, 0, 24); + zfRxBufferCopy(dev, newBuf, buf, 24, *offset+14, + subframeLen); + zfwBufSetSize(dev, newBuf, 24+subframeLen); + #else + /* Copy subframe to new buffer */ + zfRxBufferCopy(dev, newBuf, buf, 0, *offset, + 14+subframeLen); + zfwBufSetSize(dev, newBuf, 14+subframeLen); + #endif + /* Update offset */ + *offset += (((14+subframeLen)+3) & 0xfffc); + + /* Return buffer pointer */ + return newBuf; + } + } + return NULL; } @@ -101,34 +101,29 @@ zbuf_t* zfGetAmsduSubFrame(zdev_t* dev, zbuf_t* buf, u16_t* offset) /* Stephen Chen Atheros Communications, INC. 2007.2 */ /* */ /************************************************************************/ -void zfDeAmsdu(zdev_t* dev, zbuf_t* buf, u16_t vap, u8_t encryMode) +void zfDeAmsdu(zdev_t *dev, zbuf_t *buf, u16_t vap, u8_t encryMode) { - u16_t offset = ZM_SIZE_OF_WLAN_DATA_HEADER+ZM_SIZE_OF_QOS_CTRL; - zbuf_t* subframeBuf; - zmw_get_wlan_dev(dev); - - ZM_BUFFER_TRACE(dev, buf) - - if (encryMode == ZM_AES || encryMode == ZM_TKIP) - { - offset += (ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV); - } - else if (encryMode == ZM_WEP64 || encryMode == ZM_WEP128) - { - offset += ZM_SIZE_OF_IV; - } - - /* Repeatly calling zfGetAmsduSubFrame() until NULL returned */ - while ((subframeBuf = zfGetAmsduSubFrame(dev, buf, &offset)) != NULL) - { - wd->commTally.NotifyNDISRxFrmCnt++; - if (wd->zfcbRecvEth != NULL) - { - wd->zfcbRecvEth(dev, subframeBuf, (u8_t)vap); - ZM_PERFORMANCE_RX_MSDU(dev, wd->tick); - } - } - zfwBufFree(dev, buf, 0); - - return; + u16_t offset = ZM_SIZE_OF_WLAN_DATA_HEADER+ZM_SIZE_OF_QOS_CTRL; + zbuf_t *subframeBuf; + zmw_get_wlan_dev(dev); + + ZM_BUFFER_TRACE(dev, buf) + + if (encryMode == ZM_AES || encryMode == ZM_TKIP) + offset += (ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV); + else if (encryMode == ZM_WEP64 || encryMode == ZM_WEP128) + offset += ZM_SIZE_OF_IV; + + + /* Repeatly calling zfGetAmsduSubFrame() until NULL returned */ + while ((subframeBuf = zfGetAmsduSubFrame(dev, buf, &offset)) != NULL) { + wd->commTally.NotifyNDISRxFrmCnt++; + if (wd->zfcbRecvEth != NULL) { + wd->zfcbRecvEth(dev, subframeBuf, (u8_t)vap); + ZM_PERFORMANCE_RX_MSDU(dev, wd->tick); + } + } + zfwBufFree(dev, buf, 0); + + return; } |