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

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

?? vxbufs.c

?? 基于vxworks操作系統,Tornado2.0平臺,生成樹STP源碼.直接在其對應的設備中添加即可.
?? C
?? 第 1 頁 / 共 2 頁
字號:
        /*
         * make sure entire ether_header + llc_hdr is in first M_BLK 
         * if not then copy the data to a temporary buffer 
         */
        if (pMblk->mBlkHdr.mLen < sizeof(LAN_FRAME_HEADER) +
            LLC_SNAP_FRAMELEN)
        {
            pLLCHdr = &llcHdr;
            if (netMblkOffsetToBufCopy (pMblk, sizeof(LAN_FRAME_HEADER), 
                                        (char *) pLLCHdr, etherType,
                                        (FUNCPTR) bcopy) < etherType)
            {
                return (A_ERROR);
            }
        } else {
            pLLCHdr = (struct llc *)((char *)pEnetHdr +
                                     sizeof(LAN_FRAME_HEADER));
        }
        /* Now it may be IP over 802.x so we check to see if the */
        /* destination SAP is IP, if so we snag the ethertype from the */
        /* proper place. */
        
        /* Now if it's NOT IP over 802.x then we just used the DSAP as */
        /* the etherType.  */

        if (pLLCHdr->llc_dsap == LLC_SNAP_LSAP) {
            etherType = ntohs(pLLCHdr->llc_un.type_snap.ether_type);
            pLinkHdrInfo->dataOffset = sizeof(LAN_FRAME_HEADER) + 8;
        } else if (isL2UF((A_UINT8 *)pLLCHdr)) {
            pLinkHdrInfo->dataOffset = 0; // No data in this frame
        } else { /* no SNAP header */
            etherType = pLLCHdr->llc_dsap;
            pLinkHdrInfo->dataOffset = sizeof(LAN_FRAME_HEADER) + 3;
        }
    } else {
        pLinkHdrInfo->dataOffset        = sizeof(LAN_FRAME_HEADER);
    }
    pLinkHdrInfo->pktType               = etherType;

    return (A_OK);
}

/**************************************************************************
* hwAllocatePhysBuffer - allocate a physically contiguous buffer
*
* This routine will create a physically contiguous buffer and get
* the virtual and physical address of it.
*
* RETURNS: A_OK if got buffer, A_ERROR otherwise
*/
A_STATUS
hwAllocatePhysBuffer(WLAN_DEV_INFO *pdevInfo,
                     A_UINT16 buffSize,         /* size to create */
                     A_UINT32 *pPhysAddress,    /* return physical address */
                     void **ppVirtAddress,      /* return virtual address */
                     CL_BLK_ID *ppOSDescPtr)    /* return OS desc address */
{
    NET_POOL_ID pNetPoolId;             /* pointer to the net pool */
    CL_POOL_ID  pClPoolId;              /* pointer to the cluster pool */
    CL_BLK_ID   pClBlk;                 /* pointer to the CLBlk */

    /* Get the net Pool ID */
    pNetPoolId = pdevInfo->pNetPool;

    /* Get the cluster pool ID */
    if ((pClPoolId = netClPoolIdGet(pNetPoolId, buffSize, FALSE)) == NULL) {
        /* this shouldn't fail generally; the latter fails when the
         * pool is empty
         */
        uiPrintf("\nnetClPoolIdGet error!\n");
        return A_NO_MEMORY;
    }

    /* Get the cluster */
    if ((*ppVirtAddress = netClusterGet(pNetPoolId, pClPoolId)) == NULL) {
        return A_NO_MEMORY;
    }

    *pPhysAddress = (A_UINT32)A_DATA_V2P(*ppVirtAddress);

    /* For VxWorks, the os descriptor is the ClBlk */
    if ((pClBlk = netClBlkGet(pNetPoolId, M_DONTWAIT)) == NULL) {
        uiPrintf("\nClBlk reserve error!\n");
        netClFree(pNetPoolId, *ppVirtAddress);
        return A_NO_MEMORY;
    }

    /* join the cluster with the clBlk */
    if ((*ppOSDescPtr = netClBlkJoin(pClBlk, *ppVirtAddress, buffSize, NULL,
                                     0, 0, 0)) == NULL)
    {
        uiPrintf("\nClBLK join error!\n");
        netClFree(pNetPoolId, *ppVirtAddress);
        netClBlkFree(pNetPoolId, pClBlk);
        return A_NO_MEMORY;
    }

    return A_OK;
}

/**************************************************************************
* hwFreePhysBuffer - free the physically contiguous buffer
*
* This routine will free the physically contiguous buffer previously
* allocated by hwAllocatePhysBuffer()
*
* RETURNS: N/A
*/
void
hwFreePhysBuffer(WLAN_DEV_INFO *pdevInfo, void *pVirtAddress,
                 CL_BLK_ID pOSDescPtr)
{
    NET_POOL_ID pNetPoolId;

    /* get the net Pool ID */
    pNetPoolId = pOSDescPtr->pNetPool;

    /* free the cluster */
    netClBlkFree(pNetPoolId, pOSDescPtr);

    return;
}


/**************************************************************************
* Ideally these are system utilities and do not belong in this
* file - but we don't have another file!
*/

LOCAL void
vxDelayedExecISR(DELAYED_EXEC_RECORD *pRecord)
{
    pRecord->func(pRecord->pdevInfo);
    wdDelete(pRecord->wdog);
    A_DRIVER_FREE(pRecord, sizeof(DELAYED_EXEC_RECORD));
}

A_STATUS
vxDelayedExec(WLAN_DEV_INFO* pdevInfo, A_UINT32 delay,
              void (*func)(WLAN_DEV_INFO *))
{
    DELAYED_EXEC_RECORD *pRecord;

    pRecord = (DELAYED_EXEC_RECORD *) A_DRIVER_MALLOC(sizeof(*pRecord));
    if (!pRecord) {
        return A_ERROR;
    }

    pRecord->func     = func;
    pRecord->pdevInfo = pdevInfo;
    pRecord->wdog     = wdCreate();
    if (!pRecord->wdog) {
        A_DRIVER_FREE(pRecord, sizeof(DELAYED_EXEC_RECORD));
        return A_ERROR;
    }

    delay = (delay * sysClkRateGet()) >> 10;
    if (wdStart(pRecord->wdog, delay,
                (FUNCPTR)vxDelayedExecISR, (int)pRecord) == ERROR)
    {
        wdDelete(pRecord->wdog);
        A_DRIVER_FREE(pRecord, sizeof(DELAYED_EXEC_RECORD));
        return A_ERROR;
    }

    return OK;
}

/**************************************************************************
* timer routines, os dependent
*
*/

LOCAL void
drvVxTimerHandler(timer_t timerId, int arg)
{
    A_TIMER *pTimer = (A_TIMER *)arg;
    
    ASSERT(pTimer);
    ASSERT(pTimer->pFunc);
    
    pTimer->pFunc((void *)pTimer->param);
}

/* drvVxTimerInit - Initialize Atheros timer in vxWorks environment
 * This function stores parameters in the Atheros timer object and
 * and initializes vxWorks timer object part of Atheros timer using
 * vxWorks call.
 * Called by A_TIMER_INIT() macro.
 */
A_STATUS
drvVxTimerInit(
    WLAN_DEV_INFO   *pDevInfo,
    A_TIMER         *pTimer,    /* Pointer to timer object */
    void            *pFunc,     /* timer function */
    A_BOOL          repeat)     /* 0 if one shot timer, 1 if periodic */
{

    pTimer->pdevInfo   = pDevInfo;
    pTimer->pFunc      = pFunc;
    pTimer->repeat     = repeat;
    pTimer->state      = FALSE;
    

    /* Init a timer in vxWorks */
    if (timer_create(CLOCK_REALTIME, NULL, (timer_t *)&pTimer->osTimerObj) !=
        A_OK)
    {
        uiPrintf("Timer allocate fails!\n");
        return A_ERROR;
    }

    if (timer_connect((timer_t)pTimer->osTimerObj, (VOIDFUNCPTR)drvVxTimerHandler,
                      (int)pTimer) != A_OK)
    {
        uiPrintf("Timer binding fails!\n");
        return A_ERROR;
    }
    return A_OK;
}

/* drvVxTimerSet - Fire off the timer that is already initialized.
 * This function stores timer parameter in the fixed location in the
 * timer object and sets the vx timer with given timeout period value.
 * Called by A_TIMEOUT() macro.
 */
A_STATUS
drvVxTimerSet(A_TIMER *pTimer, A_UINT32 timeVal,
              A_UINT32 param, A_UINT32 oper)
{
    struct itimerspec timerValue;
    A_UINT32          tv_sec = 0, tv_msec = timeVal;

    if (timeVal > 1000) {
        tv_sec = timeVal/1000;
        tv_msec = timeVal - tv_sec * 1000;
    }

    pTimer->param     = param;
    pTimer->operation = oper;
    pTimer->timeVal   = timeVal;
    pTimer->state     = FALSE;
    timerValue.it_value.tv_sec      = tv_sec;
    timerValue.it_value.tv_nsec     = tv_msec*1000*1000;
    timerValue.it_interval.tv_sec   = 0;

    if (pTimer->osTimerObj == NULL) {
        return A_ERROR;
    }

    if (pTimer->repeat) {
        timerValue.it_interval.tv_sec = tv_sec;
        timerValue.it_interval.tv_nsec = tv_msec*1000*1000;
        timer_settime((timer_t)pTimer->osTimerObj, 0,
                      &timerValue, NULL);
    } else {
        timerValue.it_interval.tv_nsec = 0;
        timer_settime((timer_t)pTimer->osTimerObj, 0,
                      &timerValue, NULL);
    }

    return A_OK;
}

/* drvVxTimerCancel - This function cancels a timer that is already
 * fired off. It doesn't know if the timer has expired, it cancels the timeout
 * anyway.
 * Called by A_UNTIMEOUT() macro.
 */
A_BOOL
drvVxTimerCancel(A_TIMER *pTimer)
{
    A_BOOL cancelled = FALSE;

    ASSERT(pTimer);

    if (pTimer->osTimerObj && pTimer->state == FALSE) {
        if (timer_cancel((timer_t)pTimer->osTimerObj) == A_OK) {
            cancelled = TRUE;
        }
    }
    
    pTimer->operation = INVALID_TIMEOUT;

    return cancelled;
}

/* drvVxTimerDelete - This function deletes a timer.
 * It doesn't know if the timer has expired, it cancels the timeout
 * anyway.
 * Called by A_DELETE_TIMER() macro.
 */
A_STATUS
drvVxTimerDelete(A_TIMER *pTimer)
{
    A_BOOL cancelled = FALSE;

    if (pTimer && pTimer->osTimerObj) {
        if (pTimer->state == FALSE) {
            if (timer_delete((timer_t)pTimer->osTimerObj) == A_OK) {
                cancelled     = TRUE;
                pTimer->state = TRUE;
            }
        }

        /* delete the object now. */
        pTimer->osTimerObj = NULL;
    }
    
    return A_OK;
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人精品3d动漫h| 欧美日韩视频不卡| 精品一区二区三区日韩| 日韩国产精品大片| 欧美精品xxxxbbbb| 欧美精品在线视频| 91精品啪在线观看国产60岁| 国产剧情一区在线| 国产suv精品一区二区883| 亚洲人成网站精品片在线观看| 亚洲国产精品精华液2区45| 久久久国际精品| 国产精品每日更新在线播放网址| 最新高清无码专区| 亚洲欧美色图小说| 午夜成人免费电影| 国产精品网站一区| 51精品秘密在线观看| 日韩一区二区免费在线电影| 日韩亚洲欧美成人一区| 91啪亚洲精品| 国产很黄免费观看久久| 91视频一区二区| 国产专区综合网| 五月综合激情婷婷六月色窝| 秋霞av亚洲一区二区三| 国产精品一级在线| 久久精品99国产精品日本| 亚洲欧美另类图片小说| 国产日韩欧美制服另类| 一区二区三区毛片| 中文字幕一区二区三区av| 久久蜜桃av一区二区天堂| 亚洲视频一区在线| 国产精品免费丝袜| 婷婷综合久久一区二区三区| 亚洲视频一区二区在线| 麻豆国产欧美一区二区三区| 99久久久久久| fc2成人免费人成在线观看播放| 免费av网站大全久久| 天天综合天天综合色| 亚洲一区二区在线观看视频| 国产一区二区在线视频| 裸体歌舞表演一区二区| 91九色02白丝porn| 99这里都是精品| 久久综合九色综合久久久精品综合| 自拍偷拍亚洲综合| 亚洲精品日韩综合观看成人91| 性欧美疯狂xxxxbbbb| 亚洲成va人在线观看| 亚洲电影你懂得| www.在线成人| 欧美经典一区二区| 精品在线一区二区三区| 国产精品123| 欧美一区二区日韩| 久久中文字幕电影| 国产欧美日韩精品一区| 国产精品伊人色| www.av精品| 中文字幕免费一区| 亚洲一区影音先锋| 99热这里都是精品| 国产拍欧美日韩视频二区| 亚洲伦理在线精品| 亚洲va韩国va欧美va| 青青草国产精品亚洲专区无| 欧美三片在线视频观看 | 欧美亚洲综合一区| 欧美日韩在线观看一区二区| 欧美精品自拍偷拍| 久久久99久久精品欧美| 精品中文av资源站在线观看| 欧美成人aa大片| 国产精品国产三级国产普通话三级| 中文字幕在线不卡一区| 91色.com| 久久久久久久久久久久久女国产乱| 国产精品色哟哟| 色综合中文综合网| 一区二区三区精品在线| 日韩电影在线观看网站| 欧美精品在欧美一区二区少妇| 亚洲午夜久久久久久久久电影院 | 日韩三级视频中文字幕| 国产人久久人人人人爽| jlzzjlzz亚洲女人18| 成人欧美一区二区三区黑人麻豆| 色综合色综合色综合色综合色综合| 51精品秘密在线观看| 久久99国产精品久久99果冻传媒| 2021国产精品久久精品| 懂色av一区二区三区蜜臀| 亚洲视频在线一区| 国产成人99久久亚洲综合精品| 国产精品久久久久久久午夜片| 喷水一区二区三区| 国产欧美一区二区三区在线看蜜臀 | 日韩色在线观看| 亚洲女子a中天字幕| 精品视频一区二区不卡| 麻豆中文一区二区| 国产亚洲欧美日韩俺去了| 日本大香伊一区二区三区| 欧美韩国一区二区| 欧美在线观看一区二区| 国产精品久久久久久久久免费丝袜| 五月天婷婷综合| 欧美性大战久久久久久久| 久久99久久久欧美国产| 中文字幕字幕中文在线中不卡视频| 欧美亚洲免费在线一区| 一区二区三区蜜桃网| 99精品欧美一区| 精品一区二区久久久| 亚洲国产日韩综合久久精品| 日韩色视频在线观看| 蜜桃一区二区三区在线观看| 日韩伦理av电影| 国产午夜精品在线观看| 懂色av中文一区二区三区| 调教+趴+乳夹+国产+精品| 在线播放欧美女士性生活| 成人午夜电影网站| 久久狠狠亚洲综合| 亚洲第一电影网| 自拍偷拍欧美激情| 日本道精品一区二区三区 | 亚洲欧美在线aaa| 精品国产乱码久久久久久老虎| 欧美亚洲国产一卡| 亚洲va在线va天堂| 亚洲乱码国产乱码精品精可以看| 久久久五月婷婷| 日韩欧美电影在线| 欧美疯狂做受xxxx富婆| 欧美性高清videossexo| 奇米四色…亚洲| 日韩电影免费在线观看网站| 亚洲国产日韩综合久久精品| 亚洲欧美另类久久久精品2019| 精品视频123区在线观看| 日韩成人免费看| 爽爽淫人综合网网站| 久久影院电视剧免费观看| 成人国产精品免费观看| 亚洲精品精品亚洲| 亚洲精品国产视频| 亚洲精品视频免费看| 亚洲精品国产a久久久久久| 欧美日韩国产bt| 国产在线乱码一区二区三区| 亚洲欧美在线观看| 亚洲欧洲日韩在线| 亚洲裸体xxx| 26uuu精品一区二区| 久久久久国产精品麻豆ai换脸 | 国产原创一区二区| 一区二区三区日韩欧美| 亚洲美女一区二区三区| 亚洲精品一区二区三区福利| 2欧美一区二区三区在线观看视频| 日韩欧美一区二区免费| 91视频国产观看| 欧美影院午夜播放| www.亚洲免费av| 欧美日韩视频不卡| av午夜精品一区二区三区| 91色九色蝌蚪| 欧美狂野另类xxxxoooo| 欧美一二三在线| 国产日韩欧美精品综合| 日韩无一区二区| 中文成人综合网| 欧美岛国在线观看| 欧美国产一区二区| 亚洲欧美激情小说另类| 天天综合色天天综合| 色综合激情五月| 色久优优欧美色久优优| 91精品婷婷国产综合久久| 久久久三级国产网站| 欧美精品久久99久久在免费线| 成人小视频免费在线观看| 狠狠色丁香婷婷综合| 91免费精品国自产拍在线不卡| 狠狠色狠狠色综合日日91app| 99久久久精品| 国产激情视频一区二区在线观看 | 国产精品18久久久久久久久久久久 | 国产成人av一区二区| 91在线一区二区三区| 欧美一区二区成人6969| 欧美肥妇bbw| 欧美日韩一区 二区 三区 久久精品| 欧美一区二区视频在线观看| 中文字幕av资源一区| 蜜臀久久久99精品久久久久久|