⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intprismend.c

📁 vworks 下wlan的实现代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                                WLAN_LOG(DEBUG_ERROR, ("intPrismInt: TimeoutBAP0\n",                                                       0,0,0,0,0,0));                                goto rxDone;                                }                            reg = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_OFF0);                            }                        while ((reg & WLAN_OFF_BUSY) != 0);                                                if ((reg & WLAN_OFF_ERR) != 0)                            {                            WLAN_LOG(DEBUG_ERROR, ("intPrismInt: Offset error on"                                                   " BAP 0\n",0,0,0,0,0,0));                            goto rxDone;                            }                        /* Read  frame header, minus the etherheader, etc*/                        for (i=0; i< (WLAN_802_3_OFFSET)/2; i++)                            {                            *(( (UINT16*)(pRxPacket->pData))+i) =                                 WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);                            }                                                /* Read ethernet dst and src addresses */                        for (i=0; i< (WLAN_ENET_ADDR_LEN * 2)/2; i++)                            {                            *((UINT16*)(pRxPacket->pData + WLAN_802_3_OFFSET) + i) =                                 WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR + WLAN_DATA0);                            }                        /* Skip SNAP header, but increment internal card                         pointer */                        for (i=0; i < (WLAN_SNAP_HDR_LEN) / 2; i++)                            reg = WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR+WLAN_DATA0);                        /* Rest of data and type field */                        for (i=0; i < (datalen - WLAN_ENET_ADDR_LEN -                                   WLAN_ENET_ADDR_LEN+1)/2;  i++)                            {                            *((UINT16*)(pRxPacket->pData + WLAN_802_3_OFFSET +                                         2*WLAN_ENET_ADDR_LEN)+i) =                                WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR + WLAN_DATA0);                            }                        netJobAdd(pWlanDev->pWds->receiveRtn, (int)pWlanDev->pWds,                                   (int)pRxPacket->pData, (int)datalen - WLAN_SNAP_HDR_LEN +                                  WLAN_802_3_OFFSET, 0, 0);                                                }                    /* NON-WDS packets, or packets with no WDS link driver                       installed */                    else if ((frame.status & WLAN_STAT_1042) != 0)                        {  /* There is a SNAP header present - strip it */                                                /* Read ethernet dst and src addresses */                        for (i=0; i< (WLAN_ENET_ADDR_LEN * 2)/2; i++)                            {                            *((UINT16*)(pRxPacket->pData + WLAN_OFFSET) + i) =                                 WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR + WLAN_DATA0);                            }                        /* Skip SNAP header, but increment internal card                         pointer */                        for (i=0; i < (WLAN_SNAP_HDR_LEN) / 2; i++)                            reg = WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR+WLAN_DATA0);                        /* Rest of data and type field */                        for (i=0;                             i < (datalen - WLAN_ENET_ADDR_LEN -                                   WLAN_ENET_ADDR_LEN+1)/2;                               i++)                            {                            *((UINT16*)(pRxPacket->pData+WLAN_OFFSET+2*WLAN_ENET_ADDR_LEN)+i) =                                 WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR + WLAN_DATA0);                            }                                                pRxPacket->length = datalen - WLAN_SNAP_HDR_LEN;                        pRxPacket->pNext = NULL;                        if (pWlanDev->pRxTail != NULL)                            pWlanDev->pRxTail->pNext = pRxPacket;                        pWlanDev->pRxTail = pRxPacket;                                                if (pWlanDev->pRxHead == NULL)                            {                            /* Set the head pointer so the RX rtn has somewhere to                             go */                            pWlanDev->pRxHead = pRxPacket;                            netJobAdd((FUNCPTR)intPrismReceive, (int)pWlanDev,                                       (int)pRxPacket, (int)datalen - WLAN_SNAP_HDR_LEN,                                      0,0);                            }                        else                            {                            /*logMsg("A packet is already enqueued\n",0,0,0,0,0,0);*/                            }                                                }                    else /* NO SNAP header, this is easy to read */                        {                        for (i=0;i<(datalen + WLAN_EH_SIZE + 1)/2; i++)                            {                            *((UINT16*)(pRxPacket->pData+WLAN_OFFSET) + i) =                                 WLAN_IN_16_ENDIAN(WLAN_BASE_ADDR + WLAN_DATA0);                            }                                                pRxPacket->length = datalen;                                                pRxPacket->pNext = NULL;                        if (pWlanDev->pRxTail != NULL)                            pWlanDev->pRxTail->pNext = pRxPacket;                        pWlanDev->pRxTail = pRxPacket;                                                if (pWlanDev->pRxHead == NULL)                            {                            /* Set the head pointer so the RX rtn has somewhere to                             go */                            pWlanDev->pRxHead = pRxPacket;                            netJobAdd((FUNCPTR)intPrismReceive, (int)pWlanDev,                                       (int)pRxPacket, (int)datalen,0,0);                            }                        }                    }                }            } rxDone:        /* Check if there's an INFO event. */        if ((status & (WLAN_EV_INFO)) != 0)            {            infoFID = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_INFO_FID);            WLAN_OUT_16(WLAN_BASE_ADDR + WLAN_SEL0, infoFID);            WLAN_OUT_16(WLAN_BASE_ADDR + WLAN_OFF0, 0);            i = 0;            do                 {                if (i++ > WLAN_DEVICE_TIMEOUT)                    {                    WLAN_LOG(DEBUG_ERROR, ("intPrismInt: Timeout on BAP 0\n",                                           0,0,0,0,0,0));                    goto infoDone;                    }                reg = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_OFF0);                }            while ((reg & WLAN_OFF_BUSY) != 0);            if ((reg & WLAN_OFF_ERR) != 0)                {                WLAN_LOG(DEBUG_ERROR, ("intPrismInt: Offset error on BAP 0\n",                                       0,0,0,0,0,0));                goto infoDone;                }            ltv.length = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);            ltv.type = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);            switch (ltv.type)                {                /* COUNTERS frames are sent whenever one of the internal                 statistics counters wraps over - they're 16 bit registers,                 so for the bytes TX'd and RX'd that's fairly often in a                high traffic case.  */                case WLAN_INFO_COUNTERS:                                    for (i = 0; i< ltv.length - 1; i++)                        ltv.data[i] = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);                    pWlanDev->stats.TxUnicastFrames += ltv.data[0];                    pWlanDev->stats.TxMulticastFrames += ltv.data[1];                    pWlanDev->stats.TxFragments += ltv.data[2];                    pWlanDev->stats.TxUnicastOctets += ltv.data[3];                    pWlanDev->stats.TxMulticastOctets += ltv.data[4];                    pWlanDev->stats.TxDeferredTransmissions += ltv.data[5];                    pWlanDev->stats.TxSingleRetryFrames += ltv.data[6];                    pWlanDev->stats.TxMultipleRetryFrames += ltv.data[7];                    pWlanDev->stats.TxRetryLimitExceeded += ltv.data[8];                    pWlanDev->stats.TxDiscards += ltv.data[9];                    pWlanDev->stats.RxUnicastFrames += ltv.data[10];                    pWlanDev->stats.RxMulticastFrames += ltv.data[11];                    pWlanDev->stats.RxFragments += ltv.data[12];                    pWlanDev->stats.RxUnicastOctets += ltv.data[13];                    pWlanDev->stats.RxMulticastOctets += ltv.data[14];                    pWlanDev->stats.RxFCSErrors += ltv.data[15];                    pWlanDev->stats.RxDiscardsNoBuffer += ltv.data[16];                    pWlanDev->stats.TxDiscardsWrongSA += ltv.data[17];                    pWlanDev->stats.RxDiscardsWEPUndecryptable += ltv.data[18];                    pWlanDev->stats.RxMessageInMsgFragments += ltv.data[19];                    pWlanDev->stats.RxMessageInBadMsgFragments += ltv.data[20];                    break;                    /* A links status frame is sent whenever the link                     status changes*/                case WLAN_INFO_LINK_STAT:                    for (i = 0; i< ltv.length - 1; i++)                        ltv.data[i] = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);                    switch (ltv.data[0])                        {                        case WLAN_LINKSTAT_CONNECTED:                            WLAN_LOG(DEBUG_INFO,                                      ("INFO: Link Stat: Connected \n",                                      0,0,0,0,0,0));                            break;                        case WLAN_LINKSTAT_DISCONNECTED:                            WLAN_LOG(DEBUG_INFO,                                      ("INFO: Link Stat: Disconnected\n",                                      0,0,0,0,0,0));                            break;                        case WLAN_LINKSTAT_AP_CHANGE:                            WLAN_LOG(DEBUG_INFO,                                     ("INFO: Link Stat: AP Change\n",                                      0,0,0,0,0,0));                            break;                        case WLAN_LINKSTAT_AP_OUT_OF_RANGE:                            WLAN_LOG(DEBUG_INFO,                                     ("INFO: Link Stat: AP Out of Range\n",                                      0,0,0,0,0,0));                            break;                        case WLAN_LINKSTAT_AP_IN_RANGE:                            WLAN_LOG(DEBUG_INFO,                                     ("INFO: Link Stat: AP In Range\n",                                      0,0,0,0,0,0));                            break;                        case WLAN_LINKSTAT_ASSOC_FAILED:                            WLAN_LOG(DEBUG_INFO,                                     ("INFO: Link Stat: Assoc. Failed\n",                                      0,0,0,0,0,0));                            break;                        default:                            WLAN_LOG(DEBUG_ERROR,                                     ("INFO: Link Stat: ERROR - unknown\n",                                      0,0,0,0,0,0));                            break;                        }                    pWlanDev->linkStatus = ltv.data[0];                    break;                case WLAN_INFO_ASSOC_STAT:                    WLAN_LOG(DEBUG_INFO,("INFO: Assoc Stat\n",0,0,0,0,0,0));                    break;                case WLAN_INFO_NOTIFY:                    WLAN_LOG(DEBUG_ERROR, ("INFO: NOTIFY\n",0,0,0,0,0,0));                    break;                case WLAN_INFO_SCAN_RESULTS:                    WLAN_LOG(DEBUG_INFO, ("INFO: Scan Results\n",                                          0,0,0,0,0,0));                    break;                case WLAN_INFO_AUTH_REQ:                    /*                    this msg. would not appear if AP was not enabled, so                    pass authentication request to AP to handle                     */                    if (pWlanDev->cardMode != WLAN_CARDMODE_TERT_AP)                        break;                    WLAN_LOG(DEBUG_INFO, ("INFO: Auth Request\n",                                          0,0,0,0,0,0));                    for (i = 0; i< ltv.length - 1; i++)                        ltv.data[i] = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);                    netJobAdd((FUNCPTR)intPrismTertApStaAuthenticate,                               (UINT16)ltv.data[0],                              (UINT16)ltv.data[1],                               (UINT16)ltv.data[2],                               (UINT8)ltv.data[3], 0);                    /* See if there's an 802.1x authentication callback                    installed, and call it */                    if (pWlanDev->pAuthCallback != NULL)                        {                        WLAN_LOG(DEBUG_INFO, ("intPrismInt: 802.1x callback"                                              " called for station "                                              "%04x%04x%04x\n",                                              (UINT16)ltv.data[0],                                              (UINT16)ltv.data[1],                                               (UINT16)ltv.data[2],                                               0, 0, 0));                        /* The association (802.1x authentication) callback                        is passed the following parameters:                        Param 0 :  END_OBJ * pEnd                        Param 1 :  INT32  Bytes 0 - 3 of MAC address                        Param 2 :  INT32  Bytes 4 - 5 (lower 16 bit)of MAC                        Param 3 :  INT32  Message type                        */                        netJobAdd(pWlanDev->pAuthCallback,                                  (int)&pWlanDev->endObj,                                  (L_TO_B_ENDIAN_16((UINT16)ltv.data[0])<<16) |                                  L_TO_B_ENDIAN_16((UINT16)ltv.data[1]),                                   L_TO_B_ENDIAN_16((UINT16)ltv.data[2]),                                   ONEX_CALLBACK_ASSOC, 0);                        }                    break;                case WLAN_INFO_CHANNEL_SCAN:                    WLAN_LOG(DEBUG_ERROR, ("INFO: Channel Scan Results\n",                                            0,0,0,0,0,0));                    for (i = 0; i< ltv.length - 1; i++)                        ltv.data[i] = WLAN_IN_16(WLAN_BASE_ADDR + WLAN_DATA0);                    netJobAdd((FUNCPTR)intPrismTertApChannelInfoOutput,                              (int) &ltv, 0,0,0,0);                    break;                case WLAN_INFO_POWER_SAVE:                    break;                default:                    WLAN_LOG(DEBUG_ERROR, ("INFO: Unknown type 0x%04x\n",                                           ltv.type,0,0,0,0,0));                    break;                }            }  infoDone:                /* Just ack any events that we don't normally handle */        if (status != 0x0000)            {            WLAN_OUT_16(WLAN_BASE_ADDR + WLAN_EVENT_ACK, status);            }        }     while ((WLAN_IN_16(WLAN_BASE_ADDR + WLAN_EVENT_STAT) &             (WLAN_EV_RX | WLAN_EV_ALLOC | WLAN_EV_INFO | WLAN_EV_CMD) ) != 0);     return OK;    }/************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -