/******************************************************************************* Function: void WF_ScanGetResult(uint8_t listIndex, tWFScanResult *p_scanResult) Summary: Read scan results back from MRF24W. Description: After a scan has completed this function is used to read one or more of the scan results from the MRF24W. The scan results will be written contiguously starting at p_scanResult (see tWFScanResult structure for format of scan result). MRF24WB0M & MRF24WG0M support up to max of 60 scan results (SSIDs). Precondition: MACInit must be called first. WF_EVENT_SCAN_RESULTS_READY event must have already occurrerd. Parameters: listIndex - Index (0-based list) of the scan entry to retrieve. p_scanResult - Pointer to location to store the scan result structure Returns: None. Remarks: RSSI can only be obtained from the scan results p_scanResult->rssi. MRF24W checks out the signal strength from the preamble of the incoming packets. The higher the values, the stronger is the received signal strength. p_scanResult->rssi contains received signal strength indicator (RSSI). * MRF24WB : RSSI_MAX (200) , RSSI_MIN (106). * MRF24WG : RSSI_MAX (128) , RSSI_MIN (43). The RSSI value is not directly translated to dbm because this is not calibrated number. However, as a guideline, for 802.11b, MAX(200) corresponds to 0 dbm, MIN (106) corresponds to -94 dbm. *****************************************************************************/ void WF_ScanGetResult(uint8_t listIndex, tWFScanResult *p_scanResult) { uint8_t hdr[4]; /* char rssiChan[48]; */ /* reference for how to retrieve RSSI */ hdr[0] = WF_MGMT_REQUEST_TYPE; hdr[1] = WF_SCAN_GET_RESULTS_SUBTYPE; hdr[2] = listIndex; /* scan result index to read from */ hdr[3] = 1; /* number of results to read */ SendMgmtMsg(hdr, /* header */ sizeof(hdr), /* size of header */ NULL, /* no data */ 0); /* no data */ /* index 4 contains number of scan results returned, index 5 is first byte of first scan result */ WaitForMgmtResponseAndReadData(WF_SCAN_GET_RESULTS_SUBTYPE, /* expected subtype */ sizeof(tWFScanResult), /* num data bytes to read */ 5, /* starting at this index */ (uint8_t *)p_scanResult); /* write the response data here */ /* fix up endianness on the two 16-bit values in the scan results */ p_scanResult->beaconPeriod = WFSTOHS(p_scanResult->beaconPeriod); p_scanResult->atimWindow = WFSTOHS(p_scanResult->atimWindow); /* reference for how to retrieve RSSI */ /* Display SSID & Channel */ /* sprintf(rssiChan, " => RSSI: %u, Channel: %u\r\n", p_scanResult->rssi, p_scanResult->channel); */ /* putsUART(rssiChan); */ }
/***************************************************************************** * FUNCTION: WFProcessMgmtIndicateMsg * * RETURNS: error code * * PARAMS: None * * NOTES: Processes a management indicate message *****************************************************************************/ void WFProcessMgmtIndicateMsg() { tMgmtIndicateHdr hdr; UINT8 buf[6]; UINT8 event = 0xff; UINT16 eventInfo; tMgmtIndicatePassphraseReady passphraseReady; /* read 2-byte header of management message */ RawRead(RAW_MGMT_RX_ID, 0, sizeof(tMgmtIndicateHdr), (UINT8 *)&hdr); /* Determine which event occurred and handle it */ switch (hdr.subType) { /*-----------------------------------------------------------------*/ case WF_EVENT_CONNECTION_ATTEMPT_STATUS_SUBTYPE: /*-----------------------------------------------------------------*/ #if defined(MRF24WG) /* There is one data byte with this message */ RawRead(RAW_MGMT_RX_ID, sizeof(tMgmtIndicateHdr),2, buf); /* read first 2 bytes after header */ /* if connection attempt successful */ if (buf[0] == CONNECTION_ATTEMPT_SUCCESSFUL) { event = WF_EVENT_CONNECTION_SUCCESSFUL; eventInfo = WF_NO_ADDITIONAL_INFO; SignalWiFiConnectionChanged(TRUE); #if defined (STACK_USE_DHCP_CLIENT) RenewDhcp(); #endif SetLogicalConnectionState(TRUE); } /* else connection attempt failed */ else { event = WF_EVENT_CONNECTION_FAILED; eventInfo = (UINT16)(buf[0] << 8 | buf[1]); /* contains connection failure code */ SetLogicalConnectionState(FALSE); } #else /* !defined(MRF24WG) */ /* There is one data byte with this message */ RawRead(RAW_MGMT_RX_ID, sizeof(tMgmtIndicateHdr), 1, buf); /* read first byte after header */ /* if connection attempt successful */ if (buf[0] == CONNECTION_ATTEMPT_SUCCESSFUL) { event = WF_EVENT_CONNECTION_SUCCESSFUL; eventInfo = WF_NO_ADDITIONAL_INFO; SignalWiFiConnectionChanged(TRUE); #if defined (STACK_USE_DHCP_CLIENT) RenewDhcp(); #endif SetLogicalConnectionState(TRUE); } /* else connection attempt failed */ else { event = WF_EVENT_CONNECTION_FAILED; eventInfo = (UINT16)buf[0]; /* contains connection failure code */ SetLogicalConnectionState(FALSE); } #endif /* defined(MRF24WG) */ break; /*-----------------------------------------------------------------*/ case WF_EVENT_CONNECTION_LOST_SUBTYPE: /*-----------------------------------------------------------------*/ /* read index 2 and 3 from message and store in buf[0] and buf[1] buf[0] -- 1: Connection temporarily lost 2: Connection permanently lost 3: Connection Reestablished buf[1] -- 0: Beacon Timeout 1: Deauth from AP */ RawRead(RAW_MGMT_RX_ID, sizeof(tMgmtIndicateHdr), 2, buf); if (buf[0] == CONNECTION_TEMPORARILY_LOST) { event = WF_EVENT_CONNECTION_TEMPORARILY_LOST; eventInfo = (UINT16)buf[1]; /* lost due to beacon timeout or deauth */ SignalWiFiConnectionChanged(FALSE); } else if (buf[0] == CONNECTION_PERMANENTLY_LOST) { event = WF_EVENT_CONNECTION_PERMANENTLY_LOST; eventInfo = (UINT16)buf[1]; /* lost due to beacon timeout or deauth */ SetLogicalConnectionState(FALSE); SignalWiFiConnectionChanged(FALSE); } else if (buf[0] == CONNECTION_REESTABLISHED) { event = WF_EVENT_CONNECTION_REESTABLISHED; eventInfo = (UINT16)buf[1]; /* originally lost due to beacon timeout or deauth */ #if defined(STACK_USE_DHCP_CLIENT) RenewDhcp(); #endif SignalWiFiConnectionChanged(TRUE); SetLogicalConnectionState(TRUE); } else { /* invalid parameter in message */ WF_ASSERT(FALSE); } break; /*-----------------------------------------------------------------*/ case WF_EVENT_SCAN_RESULTS_READY_SUBTYPE: /*-----------------------------------------------------------------*/ /* read index 2 of mgmt indicate to get the number of scan results */ RawRead(RAW_MGMT_RX_ID, sizeof(tMgmtIndicateHdr), 1, buf); event = WF_EVENT_SCAN_RESULTS_READY; eventInfo = (UINT16)buf[0]; /* number of scan results */ break; /*-----------------------------------------------------------------*/ case WF_EVENT_SCAN_IE_RESULTS_READY_SUBTYPE: /*-----------------------------------------------------------------*/ event = WF_EVENT_IE_RESULTS_READY; /* read indexes 2 and 3 containing the 16-bit value of IE bytes */ RawRead(RAW_MGMT_RX_ID, sizeof(tMgmtIndicateHdr), 2, (UINT8 *)&eventInfo); eventInfo = WFSTOHS(eventInfo); /* fix endianess of 16-bit value */ break; #if defined(MRF24WG) case WF_EVENT_KEY_CALCULATION_REQUEST_SUBTYPE: event = WF_EVENT_KEY_CALCULATION_REQUEST; RawRead(RAW_MGMT_RX_ID, sizeof(tMgmtIndicateHdr), sizeof(tMgmtIndicatePassphraseReady), (UINT8 *)&passphraseReady); break; #endif /*-----------------------------------------------------------------*/ default: /*-----------------------------------------------------------------*/ WF_ASSERT(FALSE); break; } /* free mgmt buffer */ DeallocateMgmtRxBuffer(); /* if the application wants to be notified of the event */ if (isNotifyApp(event)) { // WF_ProcessEvent(event, eventInfo, (UINT8 *)&passphraseReady); } }