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

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

?? vxbufs.c

?? 基于vxworks操作系統(tǒng),Tornado2.0平臺(tái),生成樹STP源碼.直接在其對(duì)應(yīng)的設(shè)備中添加即可.
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
 * Copyright (c) 2000-2002 Atheros Communications, Inc., All Rights Reserved
 *
 * $Id: //depot/sw/releases/4.0/src/ap/vxbufs.c#3 $
 *
 * This module implements the conversion between mBlk and Atheros descriptors
 * functions.
 *
 * mBlk are specially designed for VxWorks.  It is defined as a structure of
 * clusters.
 * 
 * typedef struct mBlk {
 *        M_BLK_HDR   mBlkHdr;        // header
 *        M_PKT_HDR   mBlkPktHdr;     // pkthdr
 *        CL_BLK     *pClBLK;         // pointer to cluster blk
 * } M_BLK;
 *
 * // header at beginning of each mBlk
 *
 * typedef struct mHdr {
 *        struct mBlk *mNext;      // next buffer in chain
 *        struct mBlk *mNextPkt;   // next chain in queue/record
 *        char        *mData;      // location of data
 *        int          mLen;       // amount of data in this mBlk
 *        UCHAR        mType;      // type of data in this mBlk
 *        UCHAR        mFlags;     // flags; see below
 *        USHORT       reserved;
 * } M_BLK_HDR;
 *
 * record/packet header in first mBlk of chain; valid if M_PKTHDR set
 *
 * typedef struct  pktHdr {
 *        struct ifnet *rcvif;  // rcv interface
 *        int           len;    // total packet length
 * } M_PKT_HDR;
 *
 * description of external storage mapped into mBlk, valid if M_EXT set
 *
 * typedef struct clBlk {
 *        CL_BLK_LIST clNode;         // union of next clBlk, buffer ptr
 *        UINT        clSize;         // cluster size
 *        int         clRefCnt;       // reference count of the cluster
 *        FUNCPTR     pClFreeRtn;     // pointer to cluster free routine
 *        int         clFreeArg1;     // free routine arg 1
 *        int         clFreeArg2;     // free routine arg 2
 *        int         clFreeArg3;     // free routine arg 3
 *        struct netPool *pNetPool;   // pointer to the netPool
 *  } CL_BLK;
 *
 * The Atheros descriptors, ATHEROS_DESC, is a combination of the MAC
 * hardware DMA descriptor and software only fields.
 *
 * The header and frame body are put into separate descriptors.  Chances are the
 * header will always be a contingous physical buffer and the frame body may
 * occupy serveral smaller physical buffers.
 * 
 * All clusters are allocated as received buffers for the incoming data.
 *
 * The MBlk and Atheros structures are the different way of the link for
 * the input data buffers.
 *
 * To convert Atheros Descriptors to mBlk structures: XXX
 *
 * To convert mBlk structures to Atheros Descriptors: XXX
 *
 */

#include "vxbufs.h"
#include "stdlib.h"
#include "netBufLib.h"
#include "private\timerLibP.h"

#include "wlandrv.h"
#include "wlanext.h"
#include "wlansmeext.h"
#include "wlanSend.h"
#include "apdefs.h"
#include "halApi.h"
#include "ui.h"

#define IS_ETHERTYPE(_typeOrLen)    ((_typeOrLen) >= 0x0600)

int vxDescNoMblk;

/*******************************************************************************
*
* vxDescToMBlk - converts Atheros Descriptors to VxWorks mBlk structures
*
* The input data from MAC has to be put into clusters directly. The clusters
* are reserved for the receive function during initialization phase by calling
* netClusterGet(). And the receive descriptors are pre-allocated and built up
* using clusters.
* After the incoming frame is received and put into the descriptor, i.e. cluster
* Then the clusters are linked using Mblk structures chain and passed to the
* protocol or DSM layer.
*
* the input descriptor is kept for DS purpose. The calling part should free the
* input descriptor when it is no longer needed or error condition
*
*
* RETURNS:  NULL if unsuccesful
*           pointer of mBlk structures if successful
*/
M_BLK*
vxDescToMblk(WLAN_DEV_INFO *pdevInfo, ATHEROS_DESC *pDesc, A_BOOL dup)
{
    NET_POOL_ID     pNetPool = pdevInfo->pNetPool;
    ATHEROS_DESC    *pCurrDesc;
    M_BLK           *pMblk = NULL;
    M_BLK           *pPrevMblk = NULL;
    M_BLK           *pVarMblk, *pAllocMblk;
    ATHEROS_DESC    *pHeadDesc = NULL;

    pHeadDesc = pDesc;

    /* any field can we use to check the integrity of descriptor ??? */

    while (pDesc != NULL) {
        /* reserve a Mblk */
        if ( (pAllocMblk = netMblkGet(pNetPool, M_DONTWAIT, MT_DATA)) == NULL ) {
            /* ran out of mblks, a receive resource => loaned resources aren't
             * being returned in time; slow ethernet? slow stack?
             */
            LOG_DROP_FRAME(pdevInfo, rx);
            if (pMblk != NULL) {
                netMblkClChainFree(pMblk);
            }
            ++vxDescNoMblk;
            freeBuffandDescChain(pdevInfo, dup ? pHeadDesc : pDesc);
            return NULL;
        }

        /* join Mblk */
        if ((pVarMblk = netMblkClJoin(pAllocMblk, pDesc->pOSDescPtr)) == NULL ) {
            /* generally shouldn't happen */
            uiPrintf("\nvxDescToMblk: error in join mBlk\n");
            netMblkFree(pNetPool, pAllocMblk);
            if (pMblk != NULL) {
                netMblkClChainFree(pMblk);
            }
            freeBuffandDescChain(pdevInfo, dup ? pHeadDesc : pDesc);
            return NULL;
        }

        /* assign the first M_BLK */
        if (pMblk == NULL) {
            pMblk = pVarMblk;
            pMblk->mBlkHdr.mFlags |= M_PKTHDR;
            pMblk->mBlkPktHdr.len = 0;
        }

        ASSERT((void *)A_DATA_P2V(pDesc->bufferPhysPtr) == pDesc->pBufferVirtPtr.ptr);

        pVarMblk->mBlkHdr.mNext    = NULL;
        pVarMblk->mBlkHdr.mNextPkt = NULL;
        pVarMblk->mBlkHdr.mData    = pDesc->pBufferVirtPtr.byte;
        pVarMblk->mBlkHdr.mLen     = pDesc->hw.txControl.bufferLength;

        /* calculate the total length of the frame */
        pMblk->mBlkPktHdr.len += pVarMblk->mBlkHdr.mLen;

        /* get the previous mblk in the chain */
        if (pPrevMblk != NULL) {
            pPrevMblk->mBlkHdr.mNext = pVarMblk;
        }

        /* next descriptor */
        pCurrDesc = pDesc;
        pDesc = pDesc->pNextVirtPtr;
        pPrevMblk = pVarMblk;

        /* free the current descriptor */
        if (dup) {
            pCurrDesc->pOSDescPtr->clRefCnt += 1;
        } else {
            memFreeDescriptor(pdevInfo, pCurrDesc);
        }
    }

    return pMblk;
}

/*******************************************************************************
*
* vxMblkToDesc - converts VxWorks mBlk structures to Atheros Descriptors
*
* This routine allocates a descriptor to put the 802.3 header in it and then
* walk through all the strucures to link the data.  this routine could be part
* of the driver sending routine
*
* The calling routine is responsible for the releasing of input mBlk due to DS
*
* Ref: Tornado BSP Developer's kit for VxWorks pp 366
*
* RETURNS:  NULL if unsuccesful
*           pointer of Atheros Descriptors if successful
*/
ATHEROS_DESC*
vxMblkToDesc(WLAN_DEV_INFO* pdevInfo, M_BLK* pHeadMblk)
{
    ATHEROS_DESC *pHeadDesc = NULL;
    ATHEROS_DESC *pLastDesc = NULL;
    ATHEROS_DESC *pDesc;
    M_BLK        *pMblk;

    /* verify the first MBLK contains the header */
    if ((pHeadMblk->mBlkHdr.mFlags & M_PKTHDR) != M_PKTHDR) {
        uiPrintf("vxMblkToDesc: M_PKTHDR not set on first mblk\n");
        netMblkClChainFree(pHeadMblk);
        return NULL;
    }

    /* generate a descriptor for each of the Mblk */
    for (pMblk = pHeadMblk; pMblk; pMblk = pMblk->mBlkHdr.mNext) {
        /* vxWorks protocol stack is known to send empty mblks */
        if (pMblk->mBlkHdr.mLen == 0) {
            continue;
        }

        /* allocate a descriptor for Mblk, i.e. frame data */
        pDesc = memAllocateDescriptor(pdevInfo);
        if (!pDesc) {
            /* clean up before leaving */
            freeBuffandDescChain(pdevInfo, pHeadDesc);
            netMblkClChainFree(pHeadMblk);

            LOG_DROP_FRAME(pdevInfo, tx);
            return NULL;
        }
 


        /* Initialize the fields of descriptor */
        pDesc->pOSDescPtr                = pMblk->pClBlk;
        pDesc->pBufferVirtPtr.ptr        = pMblk->mBlkHdr.mData;
        pDesc->bufferPhysPtr             = (A_UINT32)A_DATA_V2P(pDesc->pBufferVirtPtr.ptr);
        pDesc->pOrigBufferVirtPtr        = pDesc->pOSDescPtr->clNode.pClBuf;
        pDesc->pOrigbufferPhysPtr        = (A_UINT32)A_DATA_V2P(pDesc->pOrigBufferVirtPtr);
        pDesc->hw.txControl.bufferLength = pMblk->mBlkHdr.mLen;
        pDesc->pOSDescPtr->clRefCnt     += 1;
  
      if (pHeadDesc) {
            /* Link to last descriptor */
            ASSERT(pLastDesc);
            pLastDesc->nextPhysPtr       = pDesc->thisPhysPtr;
            pLastDesc->pNextVirtPtr      = pDesc;
            pLastDesc->hw.txControl.more = 1;
        } else {
            pHeadDesc = pDesc;
            pHeadDesc->hw.txControl.frameLength =  pMblk->mBlkPktHdr.len;
 
  
        }
        pLastDesc = pDesc;
    }

    netMblkClChainFree(pHeadMblk);
 
    return pHeadDesc;
}

/******************************************************************************
*
* wlanPacketDataGet - return the beginning of the packet data
*
* This routine fills the given <pLinkHdrInfo> with the appropriate offsets.
* We call this in the MUX, only after decapsulation from dot11 to to 802.3
* or DIX.
*
* RETURNS: OK or ERROR.
*/

A_STATUS
wlanPacketDataGet(M_BLK_ID pMblk, LL_HDR_INFO *pLinkHdrInfo)
{
    LAN_FRAME_HEADER      *pEnetHdr;
    LAN_FRAME_HEADER       enetHdr;

    struct llc *           pLLCHdr;
    struct llc             llcHdr;

    A_UINT16               etherType;

    pLinkHdrInfo->destAddrOffset        = 0;
    pLinkHdrInfo->destSize              = 6;
    pLinkHdrInfo->srcAddrOffset         = 6;
    pLinkHdrInfo->srcSize               = 6;

    /* Try for RFC 894 first as it's the most common. */

    /* 
     * make sure entire ether_header is in first M_BLK 
     * if not then copy the data to a temporary buffer 
     */

    if (pMblk->mBlkHdr.mLen < sizeof(LAN_FRAME_HEADER)) {
        pEnetHdr = &enetHdr;
        if (netMblkOffsetToBufCopy (pMblk, 0, (char *) pEnetHdr, 
                                    sizeof(LAN_FRAME_HEADER), (FUNCPTR) bcopy) 
            < sizeof(LAN_FRAME_HEADER))
        {
            return (ERROR);
        }
    } else {
        pEnetHdr = (LAN_FRAME_HEADER *)pMblk->mBlkHdr.mData;
    }

    etherType = be2cpu16(pEnetHdr->lanTypeOrLen);

    /* Deal with 802.3 addressing. */

    /* Here is the algorithm. */
    /* If the etherType is less than the MTU then we know that */
    /* this is an 802.x address from RFC 1700. */
   /*if (etherType < sizeof(LAN_FRAME_HEADER)) */
	if(!IS_ETHERTYPE(etherType)){

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产高清一区二区三区 | 开心九九激情九九欧美日韩精美视频电影 | 日韩免费高清电影| 蜜桃精品视频在线观看| 欧美电影免费观看高清完整版在线| 日韩国产精品久久| 欧美电视剧在线看免费| 精品一区二区三区视频在线观看| 欧美大片日本大片免费观看| 国产一区二区视频在线播放| 欧美国产一区在线| 日本精品一区二区三区高清| 亚洲主播在线播放| 91精品国产91久久久久久最新毛片| 蜜桃av一区二区| 久久网这里都是精品| 成人av在线播放网址| 亚洲激情中文1区| 91麻豆精品国产91久久久久久久久| 麻豆国产精品一区二区三区| 久久午夜老司机| 色呦呦一区二区三区| 天天综合网天天综合色| 精品国精品自拍自在线| 菠萝蜜视频在线观看一区| 亚洲国产日韩精品| 久久婷婷国产综合国色天香| 99久久精品久久久久久清纯| 午夜欧美2019年伦理| 久久精品视频一区| 欧美午夜精品理论片a级按摩| 久久爱另类一区二区小说| 国产精品美女久久久久久久久久久 | 日本一二三不卡| 欧美色中文字幕| 国产精品538一区二区在线| 亚洲精品国产成人久久av盗摄 | 日韩一二三区视频| 99久久99久久精品免费观看 | 一区二区三区不卡视频在线观看| 91精品国产综合久久久蜜臀粉嫩 | 久久精品国产精品亚洲综合| 国产精品乱码一区二区三区软件 | 欧美变态口味重另类| 91一区二区在线| 精品一区二区综合| 亚洲自拍偷拍综合| 国产精品天天看| 日韩精品中文字幕在线不卡尤物| 91免费版在线看| 国产精品99久久久久久似苏梦涵| 亚洲成年人网站在线观看| 国产欧美日韩精品a在线观看| 欧美一区二区三区喷汁尤物| 91香蕉国产在线观看软件| 国产一区二区三区在线观看精品| 亚洲国产精品欧美一二99| 国产精品福利一区二区三区| 亚洲精品一区二区三区99| 884aa四虎影成人精品一区| 一本到一区二区三区| 国产不卡视频在线播放| 极品少妇xxxx精品少妇偷拍| 日韩在线一区二区| 亚洲成av人片在线| 亚洲制服丝袜av| 亚洲老司机在线| 日韩一区在线播放| 国产精品初高中害羞小美女文| 精品国产一二三| 日韩欧美国产麻豆| 日韩一区二区电影网| 欧美精品第1页| 欧美区在线观看| 欧美丝袜丝交足nylons图片| 色婷婷综合中文久久一本| 91麻豆蜜桃一区二区三区| 99久久精品国产毛片| 97精品视频在线观看自产线路二| 成人国产精品免费| 不卡电影一区二区三区| 丁香另类激情小说| 成人午夜电影小说| 波多野结衣亚洲| 99热精品一区二区| 色哟哟一区二区三区| 欧美综合色免费| 欧美老肥妇做.爰bbww| 欧美美女视频在线观看| 日韩一区二区三区观看| 日韩欧美的一区二区| 精品不卡在线视频| 中文子幕无线码一区tr| 国产精品国产三级国产aⅴ入口 | 日韩精品欧美精品| 青草国产精品久久久久久| 韩日av一区二区| 盗摄精品av一区二区三区| 99精品久久99久久久久| 欧洲精品在线观看| 欧美一区二区三区电影| 久久久亚洲综合| 国产精品护士白丝一区av| 亚洲夂夂婷婷色拍ww47| 色综合激情五月| 欧美三级日本三级少妇99| 4438亚洲最大| 日本一区二区三区国色天香| 亚洲三级在线观看| 日韩成人免费在线| 国产.欧美.日韩| 日本韩国欧美一区| 精品国精品国产| 亚洲三级在线观看| 久久国产人妖系列| 99re66热这里只有精品3直播| 欧美午夜不卡在线观看免费| 91精品国产综合久久久蜜臀图片| 国产日韩欧美综合一区| 一区二区三区加勒比av| 极品尤物av久久免费看| 91免费看视频| 久久男人中文字幕资源站| 亚洲精品网站在线观看| 理论片日本一区| 日本道色综合久久| 久久理论电影网| 亚州成人在线电影| 不卡av电影在线播放| 日韩欧美激情在线| 亚洲女人****多毛耸耸8| 久久精品国产色蜜蜜麻豆| 成人黄色av电影| 精品国产乱码久久久久久牛牛| 悠悠色在线精品| 国产成人精品影院| 91精品国产高清一区二区三区| 中文字幕中文字幕一区| 久久精品国产免费看久久精品| 日本久久精品电影| 国产精品理伦片| 狠狠色丁香九九婷婷综合五月| 91黄色免费观看| 国产精品国产a| 国产精品一级在线| 日韩欧美一区在线观看| 亚洲午夜激情网站| 91麻豆免费视频| 国产精品你懂的在线| 国产精品自产自拍| 日韩一区二区在线免费观看| 亚洲国产裸拍裸体视频在线观看乱了 | 国产精品色呦呦| 久久国产视频网| 91精品国产一区二区三区| 亚洲美女免费在线| 99久久久精品免费观看国产蜜| 国产偷国产偷精品高清尤物| 另类中文字幕网| 日韩三级伦理片妻子的秘密按摩| 亚洲动漫第一页| 欧美午夜精品久久久| 亚洲精品视频在线观看免费 | 99久久婷婷国产精品综合| 免费人成网站在线观看欧美高清| 波多野结衣中文字幕一区| 国产亚洲精品7777| 国产成人精品网址| 久久精品男人天堂av| 国产精品影视网| 国产日本欧美一区二区| 久久99久久精品欧美| 精品国产免费一区二区三区四区 | 日韩国产欧美三级| 91精品国产免费| 麻豆精品蜜桃视频网站| 91精品国产一区二区三区蜜臀| 视频一区在线播放| 日韩一区二区高清| 国产一区二区三区免费| 国产日产欧美一区二区三区| 国产精品自产自拍| 国产精品护士白丝一区av| 97se亚洲国产综合自在线观| 中文字幕一区av| 91传媒视频在线播放| 亚洲午夜av在线| 日韩欧美国产高清| 国产电影一区二区三区| 中文字幕一区在线观看视频| 91亚洲午夜精品久久久久久| 亚洲一级二级三级| 日韩精品专区在线影院观看| 国产精品一二一区| 椎名由奈av一区二区三区| 欧美调教femdomvk| 狠狠色丁香久久婷婷综| 成人免费在线视频| 欧美日韩另类一区| 国产一区91精品张津瑜|