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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vxbufs.c

?? 基于vxworks操作系統,Tornado2.0平臺,生成樹STP源碼.直接在其對應的設備中添加即可.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * 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)){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲在线免费播放| www.久久久久久久久| 懂色av一区二区三区蜜臀| 一本久久综合亚洲鲁鲁五月天| 9191国产精品| 亚洲同性同志一二三专区| 麻豆专区一区二区三区四区五区| 成人免费视频播放| 欧美一区二区三区视频在线观看 | 18欧美乱大交hd1984| 三级欧美在线一区| 色视频一区二区| 国产精品三级视频| 久久99久久99小草精品免视看| 91激情在线视频| ㊣最新国产の精品bt伙计久久| 精品一区二区国语对白| 欧美日韩国产成人在线91| 亚洲少妇30p| 岛国av在线一区| 国产亚洲精品7777| 韩日av一区二区| 91精品啪在线观看国产60岁| 一区二区三区四区在线| 9i看片成人免费高清| 久久久99免费| 国产乱人伦偷精品视频不卡| 日韩视频在线你懂得| 视频精品一区二区| 欧美三级电影一区| 亚洲国产综合在线| 欧美综合在线视频| 亚洲一区二区三区视频在线 | 亚洲欧美一区二区三区极速播放 | 国产精品精品国产色婷婷| 国产麻豆精品theporn| 日韩欧美国产一二三区| 日本中文字幕不卡| 91精品免费观看| 日本美女视频一区二区| 欧美一区国产二区| 麻豆成人久久精品二区三区小说| 欧美一区二区三区日韩视频| 日本欧美一区二区三区乱码 | 欧美一级在线免费| 久久99精品国产| 国产亚洲精品bt天堂精选| 懂色av噜噜一区二区三区av| 国产精品美女久久久久久久久| 不卡av电影在线播放| 成人免费在线视频| 色8久久人人97超碰香蕉987| 亚洲国产aⅴ成人精品无吗| 欧美日韩亚洲国产综合| 日本欧美加勒比视频| 精品国产一区二区精华| 国产精品一区二区视频| 中文字幕中文乱码欧美一区二区 | 国产亚洲精品超碰| www.欧美色图| 亚洲午夜一区二区三区| 91精品国产综合久久国产大片| 久草热8精品视频在线观看| 精品福利一区二区三区免费视频| 国产激情一区二区三区| 成人免费在线观看入口| 91 com成人网| 国产乱码一区二区三区| 亚洲欧美激情一区二区| 777a∨成人精品桃花网| 国产一区在线精品| 亚洲精品国产成人久久av盗摄| 欧美三级日韩在线| 国产精品一品二品| 一区二区三区欧美| 欧美不卡一区二区三区四区| 国产精品资源网站| 亚洲精品乱码久久久久久久久 | 成人免费视频视频在线观看免费| 亚洲一线二线三线视频| 精品美女一区二区| 欧美影院精品一区| 成人一区二区三区在线观看| 视频一区在线播放| 亚洲欧美日韩系列| 久久综合五月天婷婷伊人| 日本大香伊一区二区三区| 精品综合免费视频观看| 亚洲精品欧美专区| 欧美国产日韩精品免费观看| 666欧美在线视频| a在线欧美一区| 精品综合久久久久久8888| 一区二区三区四区国产精品| 久久综合999| 91精品国产91久久久久久最新毛片| 成人avav在线| 久久99精品国产麻豆婷婷洗澡| 亚洲精品水蜜桃| 国产精品天干天干在观线| 精品剧情在线观看| 777久久久精品| 精品视频在线视频| 色噜噜夜夜夜综合网| 成人白浆超碰人人人人| 国产一区亚洲一区| 久久66热re国产| 久久国产成人午夜av影院| 日韩经典一区二区| 亚洲一区在线播放| 中文字幕在线一区二区三区| 久久久久久久久久美女| 欧美一级欧美三级| 日韩欧美亚洲国产另类| 91精品国产高清一区二区三区| 日本韩国一区二区三区视频| 91在线视频官网| 色综合咪咪久久| 在线观看一区日韩| 欧美日韩在线电影| 欧美日韩色综合| 欧美精品久久天天躁| 91精品国产色综合久久不卡蜜臀 | 91视频xxxx| 99国产一区二区三精品乱码| 99久久er热在这里只有精品15 | 国产精品白丝jk黑袜喷水| 国产在线播放一区二区三区| 国产乱码字幕精品高清av | 五月天国产精品| 日av在线不卡| 精品一区二区免费在线观看| 国产麻豆精品在线| 成人av免费在线| 91国产免费看| 日韩欧美黄色影院| 久久久一区二区三区捆绑**| 国产日本欧洲亚洲| 亚洲精品乱码久久久久久久久| 亚洲午夜在线视频| 久久不见久久见免费视频1| 国产白丝网站精品污在线入口| 91免费看片在线观看| 欧美精品在欧美一区二区少妇| 日韩三级精品电影久久久 | 狠狠色狠狠色合久久伊人| 国产精品77777竹菊影视小说| av亚洲产国偷v产偷v自拍| 在线视频国内一区二区| 日韩三级免费观看| 亚洲欧美另类久久久精品| 亚洲aaa精品| 风流少妇一区二区| 欧美视频精品在线观看| 日韩视频一区二区三区| 国产精品每日更新| 午夜精品久久久久久久久久| 国产伦精品一区二区三区免费 | 欧美一区二区视频在线观看2022| 精品国产91洋老外米糕| 亚洲欧美中日韩| 日韩av电影免费观看高清完整版| 国产成人小视频| 欧美日韩视频在线第一区| 欧美国产日韩一二三区| 婷婷久久综合九色综合伊人色| 国产一区二区精品久久91| 欧美色偷偷大香| 欧美国产日韩在线观看| 日韩成人午夜电影| 色综合色狠狠综合色| 国产午夜亚洲精品午夜鲁丝片| 午夜精品aaa| 色噜噜夜夜夜综合网| 久久久精品天堂| 天天操天天综合网| 91色在线porny| 国产性色一区二区| 捆绑调教美女网站视频一区| 91高清在线观看| 专区另类欧美日韩| 国产精品一区二区在线观看网站| 欧美一二三四在线| 亚洲成人动漫在线观看| 91丨九色丨国产丨porny| 久久久久久9999| 麻豆成人免费电影| 欧美一级黄色大片| 日韩高清欧美激情| 宅男在线国产精品| 日韩精品一二三| 欧美视频在线观看一区二区| 中文字幕视频一区二区三区久| 国产老肥熟一区二区三区| 日韩一区二区在线观看视频| 亚洲444eee在线观看| 欧美午夜理伦三级在线观看| 亚洲少妇中出一区| 91黄色在线观看| 亚洲综合视频在线观看|