📄 intprismend.c
字号:
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) <v, 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 + -