/***************************************************************************** * 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); } }
/***************************************************************************** * FUNCTION: WFProcessMgmtIndicateMsg * * RETURNS: error code * * PARAMS: None * * NOTES: Processes a management indicate message *****************************************************************************/ void WFProcessMgmtIndicateMsg() { tMgmtIndicateHdr hdr; uint8_t buf[6]; uint8_t event = 0xff; uint16_t eventInfo; // read mgmt indicate header (2 bytes) RawRead(RAW_SCRATCH_ID, MGMT_INDICATE_BASE, sizeof(tMgmtIndicateHdr), (uint8_t *)&hdr); /* if not a management indicate then fatal error */ SYS_ASSERT((hdr.type == WF_MGMT_INDICATE_TYPE), "Invalid Indicate Header" ); /* Determine which event occurred and handle it */ switch (hdr.subType) { /*-----------------------------------------------------------------*/ case WF_EVENT_CONNECTION_ATTEMPT_STATUS_SUBTYPE: /*-----------------------------------------------------------------*/ RawReadRelative(RAW_SCRATCH_ID, 2, buf); /* read first 2 bytes after header */ /* if connection attempt successful */ if (buf[0] == CONNECTION_ATTEMPT_SUCCESSFUL) { event = DRV_WIFI_EVENT_CONNECTION_SUCCESSFUL; eventInfo = DRV_WIFI_NO_ADDITIONAL_INFO; SignalWiFiConnectionChanged(true); #if defined(TCPIP_STACK_USE_IPV6) WF_Initialize_IPV6_Multicast_Filter(); #endif #if defined (TCPIP_STACK_USE_DHCP_CLIENT) RenewDhcp(); #endif SetLogicalConnectionState(true); } /* else connection attempt failed */ else { event = DRV_WIFI_EVENT_CONNECTION_FAILED; eventInfo = (uint16_t)(buf[0] << 8 | buf[1]); /* contains connection failure code */ SetLogicalConnectionState(false); } break; /*-----------------------------------------------------------------*/ case WF_EVENT_CONNECTION_LOST_SUBTYPE: /*-----------------------------------------------------------------*/ /* read next two data bytes in message buf[0] -- 1: Connection temporarily lost 2: Connection permanently lost 3: Connection Reestablished buf[1] -- 0: Beacon Timeout 1: Deauth from AP */ RawReadRelative(RAW_SCRATCH_ID, 2, buf); if (buf[0] == CONNECTION_TEMPORARILY_LOST) { event = DRV_WIFI_EVENT_CONNECTION_TEMPORARILY_LOST; eventInfo = (uint16_t)buf[1]; /* lost due to beacon timeout or deauth */ SignalWiFiConnectionChanged(false); SetLogicalConnectionState(false); } else if (buf[0] == CONNECTION_PERMANENTLY_LOST) { event = DRV_WIFI_EVENT_CONNECTION_PERMANENTLY_LOST; eventInfo = (uint16_t)buf[1]; /* lost due to beacon timeout or deauth */ SetLogicalConnectionState(false); SignalWiFiConnectionChanged(false); } else if (buf[0] == CONNECTION_REESTABLISHED) { event = DRV_WIFI_EVENT_CONNECTION_REESTABLISHED; eventInfo = (uint16_t)buf[1]; /* originally lost due to beacon timeout or deauth */ #if defined(TCPIP_STACK_USE_DHCP_CLIENT) RenewDhcp(); #endif SignalWiFiConnectionChanged(true); SetLogicalConnectionState(true); } else { /* invalid parameter in message */ SYS_ASSERT(false, ""); } break; /*-----------------------------------------------------------------*/ case WF_EVENT_SCAN_RESULTS_READY_SUBTYPE: /*-----------------------------------------------------------------*/ RawReadRelative(RAW_SCRATCH_ID, 1, buf); event = DRV_WIFI_EVENT_SCAN_RESULTS_READY; eventInfo = (uint16_t)buf[0]; /* number of scan results */ break; /*-----------------------------------------------------------------*/ case WF_EVENT_SCAN_IE_RESULTS_READY_SUBTYPE: /*-----------------------------------------------------------------*/ event = DRV_WIFI_EVENT_IE_RESULTS_READY; /* read indexes 2 and 3 containing the 16-bit value of IE bytes */ RawReadRelative(RAW_SCRATCH_ID, 2, (uint8_t *)&eventInfo); eventInfo = TCPIP_Helper_ntohs(eventInfo); /* fix endianess of 16-bit value */ break; /*-----------------------------------------------------------------*/ case WF_EVENT_KEY_CALCULATION_REQUEST_SUBTYPE: /*-----------------------------------------------------------------*/ event = DRV_WIFI_EVENT_KEY_CALCULATION_REQUEST; RawReadRelative(RAW_SCRATCH_ID, sizeof(tMgmtIndicatePassphraseReady), (uint8_t *)&passphraseReady); WifiAsyncSetEventPending(ASYNC_WPABUTTON_CONNECT); break; /*-----------------------------------------------------------------*/ case WF_EVENT_SOFT_AP_EVENT_SUBTYPE: /* Valid only with 3108 or the later module FW version */ /*-----------------------------------------------------------------*/ event = DRV_WIFI_EVENT_SOFT_AP; RawReadRelative(RAW_SCRATCH_ID, sizeof(DRV_WIFI_MGMT_INDICATE_SOFT_AP_EVENT), (uint8_t *)&g_softAPEvent); break; /*-----------------------------------------------------------------*/ case WF_EVENT_DISCONNECT_DONE_SUBTYPE: /*-----------------------------------------------------------------*/ event = DRV_WIFI_EVENT_DISCONNECT_DONE; /* set state to no connection */ SetLogicalConnectionState(false); break; /*-----------------------------------------------------------------*/ default: /*-----------------------------------------------------------------*/ SYS_ASSERT(false, ""); break; } /* if the application wants to be notified of the event */ WF_UserEventsSet(event, eventInfo, 1); }