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

📄 message.c

📁 Freescale ARM11系列CPU MX31的WINCE 5.0下的BSP
💻 C
📖 第 1 页 / 共 5 页
字号:
                  psActivate->sSSID.acESSID,
                  psActivate->sBSSID.au8Addr[0], psActivate->sBSSID.au8Addr[1],
                  psActivate->sBSSID.au8Addr[2], psActivate->sBSSID.au8Addr[3],
                  psActivate->sBSSID.au8Addr[4], psActivate->sBSSID.au8Addr[5],
                  psActivate->u16PreferredChannel));

        psMsg->u16MsgId = UM_MAN_ACTIVATE_REQ;
        boHALsendMessage( psHAL, psMsg );
    }
#endif
}


//-----------------------------------------------------------------------------
//
// NAME        vHALsendActivateReq
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psActivate  Pointer to Activate structure.
//
// DESCRIPTION This function sends an Activate request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendActivateReq( IN PHAL_CONTEXT psHAL, IN UMI_ACTIVATE * psActivate )
{
    PWLAN_CONTEXT  psWlan = &psHAL->psAdapter->sWlan;
    BOOLEAN        boReject = FALSE;
    UMI_MSG        *psMsg;

    // MIC error handling, reject Activate REQ if necessary.
    if ( psWlan->eMicErrorState >= MICERR_FILTERON )
    {
        boReject = TRUE;
        DBG_LEV1(("Refuse connect request, MIC error, timer = %lu.", psWlan->ulMicErrorTimer));
    }
    else if ( psHAL->psAdapter->sWlan.eMicErrorState == MICERR_ONEERROR )
    {
        psHAL->psAdapter->sWlan.eMicErrorState = MICERR_INIT;
        DBG_LEV1(("Accept connect request, timer = %lu.", psWlan->ulMicErrorTimer));
    }

    if ( !boReject )
    {
        psMsg = psHALnewReqMessage( psHAL, MSG_MAN );

        if ( psMsg != NULL )
        {
            OS_MEMCPY( psMsg->abData, psActivate, sizeof( UMI_ACTIVATE ) );

            psMsg->u16MsgId = UM_MAN_ACTIVATE_REQ;
            boHALsendMessage( psHAL, psMsg );
        }
    }
}


//-----------------------------------------------------------------------------
//
// NAME        vHALhandleActivateCfm
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psMsg    Confirm message to be processed.
//
// DESCRIPTION This function handles Activate confirm messages.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleActivateCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
    UMI_ACTIVATE *psActivate;

    psActivate = (UMI_ACTIVATE *)psMsg->abData;

    if ( psActivate->u16Status == UMI_OK )
    {
        DBG_LEV2(("Successfully Activated MAC. Awaiting connection event...\n"));
    }
    else
    {
        DBG_LEV0(("ERROR: Activate request failed, %d.\n", psActivate->u16Status));
    }

}


//-----------------------------------------------------------------------------
//
// NAME        vHALstartMACconfiguration
//
// PARAMETERS  psHAL    Pointer to HAL context.
//
// DESCRIPTION This function is to start the configuration of the MAC.
//
//-----------------------------------------------------------------------------
VOID
vHALstartMACconfiguration( IN PHAL_CONTEXT psHAL )
{
    UMI_MSG  *psMsg;
    UMI_MIB  *psSetMib;

    psMsg = psHALnewReqMessage( psHAL, MSG_MAN );

    if ( psMsg == NULL )
    {
        DBG_LEV0(("ERROR: Couldn't get MAN message from pool.\n"));
    }
    else
    {
        psSetMib = (UMI_MIB *)psMsg->abData;

        if ( !boCFGgetFirstMibItem(&psHAL->psAdapter->sCFG,
                                   &psHAL->psAdapter->sWlan,
                                   &psSetMib->u16ObjectID,
                                   &psSetMib->uValue) )
        {
            DBG_LEV0(("ERROR: Couldn't get the first MIB item.\n"));
            vHALreturnReqMessage( psHAL, psMsg );
        }
        else
        {
            // MIB_IEEE_ADDRESS is the first MIB, we will use the MAC address
            // from EEPROM instead of the one from registry if don't need
            // override.
            if ( psHAL->psAdapter->boMACAddressOverride == FALSE )
            {
                OS_MEMCPY( &psSetMib->uValue, psHAL->psAdapter->ucCurrentAddress, IEEE_ADDR_LEN );
            }

            DBG_LEV2(("Sending request to set MIB object 0x%x.\n", psSetMib->u16ObjectID));

            psMsg->u16MsgId = UM_MAN_SET_MIB_REQ;
            boHALsendMessage( psHAL, psMsg );
        }
        // Send a Get MIB (MIB_SW_VERSION) .
        vHALsendGetMibReq( psHAL, MIB_SW_VERSION );

        // Send a Get MIB (MIB UWA VERSION) .
        vHALsendGetMibReq( psHAL, MIB_UWA_PROGRAM_VER );
    }
}

//-----------------------------------------------------------------------------
//
// NAME        vHALmakeAssociationInfo
//
// PARAMETERS  psWlan      Pointer to WLAN context.
//          psConnect   Pointer to Connection Event indication message data.
//
// DESCRIPTION This function makes association information.
//
//-----------------------------------------------------------------------------
VOID
vHALmakeAssociationInfo( IN OUT  PEND_CONTEXT   psAdapter, IN UMI_CONNECTION_EVENT * psConnect )
{
    PWLAN_CONTEXT psWlan = &psAdapter->sWlan;
    PNDIS_802_11_ASSOCIATION_INFORMATION   psAssocInfo = &psWlan->sAssocInfo;
    UMI_FM_ELEMENT *psIE;
    PUCHAR      pucEnd;
    ULONG i, j;

    psAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
    psAssocInfo->AvailableRequestFixedIEs = 0x07;

    psAssocInfo->RequestFixedIEs.Capabilities =
        FRAME_CAPINFO_SHORT_PREAMBLE_MASK | FRAME_CAPINFO_SHORT_SLOT_MASK;
    psAssocInfo->RequestFixedIEs.Capabilities |=
        ((psWlan->ulInfraMode == Ndis802_11Infrastructure) ? 
         FRAME_CAPINFO_ESS_MASK : FRAME_CAPINFO_IBSS_MASK);
    if ( psWlan->encoding_enabled )
        psAssocInfo->RequestFixedIEs.Capabilities |= FRAME_CAPINFO_PRIVACY_MASK;
    psAssocInfo->RequestFixedIEs.ListenInterval = psConnect->u16ListenInterval;
    OS_MEMCPY( psAssocInfo->RequestFixedIEs.CurrentAPAddress, &psConnect->sStationID, IEEE_ADDR_LEN );
    psAssocInfo->RequestIELength = 0;
    psAssocInfo->OffsetRequestIEs = 0;

    psAssocInfo->AvailableResponseFixedIEs = 0x07;
    psAssocInfo->ResponseFixedIEs.Capabilities = psConnect->u16ResCapability;
    psAssocInfo->ResponseFixedIEs.StatusCode = 0;
    psAssocInfo->ResponseFixedIEs.AssociationId = psConnect->u16AssociationId;
    psAssocInfo->ResponseIELength =0 ;
    psAssocInfo->OffsetResponseIEs = 0;

    if (psWlan->auth_params[IW_AUTH_WPA_VERSION] &
            (IW_AUTH_WPA_VERSION_WPA2 | IW_AUTH_WPA_VERSION_WPA))
    {
        // Make request IEs.
        psAssocInfo->OffsetRequestIEs = psAssocInfo->Length;

        // SSID.
        psIE = (UMI_FM_ELEMENT *)psWlan->ucAssocIEs;
        psIE->u8Code = FRAME_EL_ESSID;
        psIE->u8Length = (UCHAR)psWlan->sSSID.SsidLength;
        OS_MEMCPY( psIE->u8Data, psWlan->sSSID.Ssid, psIE->u8Length );
        psAssocInfo->RequestIELength += (psIE->u8Length + 2);

        // Supported rates.
        psIE = (UMI_FM_ELEMENT *)&psWlan->ucAssocIEs[ psAssocInfo->RequestIELength ];
        psIE->u8Code = FRAME_EL_SUPPORTED_RATES;
        for ( i=0; i<8 && psWlan->ucSupportedRates[i]; i++ )
            psIE->u8Data[i] = psWlan->ucSupportedRates[i];
        psIE->u8Length = (UCHAR)i;
        psAssocInfo->RequestIELength += (psIE->u8Length + 2);

        // Exteneded supported rates.
        if ( psWlan->ucSupportedRates[i] )
        {
            psIE = (UMI_FM_ELEMENT *)&psWlan->ucAssocIEs[ psAssocInfo->RequestIELength ];
            psIE->u8Code = FRAME_EL_EX_SUPPORTED_RATES;
            for ( j=0; j<8 && psWlan->ucSupportedRates[i]; j++, i++ )
                psIE->u8Data[j] = psWlan->ucSupportedRates[i];
            psIE->u8Length = (UCHAR)j;
            psAssocInfo->RequestIELength += (psIE->u8Length + 2);
        }

        // RSN or SSN.
        if ( psConnect->sRsnCaps.u32CapsMap & UMI_RSN_CAPS_IE_TYPE_MASK )
        {
            psIE = (UMI_FM_ELEMENT *)&psWlan->ucAssocIEs[ psAssocInfo->RequestIELength ];
            psIE->u8Code = (psConnect->sRsnCaps.u32CapsMap & UMI_RSN_CAPS_IE_TYPE_IEEE) ? 
                UMI_RSN_IE_ID_IEEE : UMI_RSN_IE_ID_WECA;

            // Add mandatory and optional fields, if necessary.
            pucEnd = pu8WPAaddRsnIePayloadFields( &psConnect->sRsnCaps, psIE->u8Data );
         
            // Calculate the IE length.
            psIE->u8Length = (UCHAR)(pucEnd - psIE->u8Data);
            psAssocInfo->RequestIELength += (psIE->u8Length + 2);
        }

        // Make response IEs.
        psAssocInfo->OffsetResponseIEs = psAssocInfo->Length + psAssocInfo->RequestIELength;
    }
}


//-----------------------------------------------------------------------------
//
// NAME        vHALhandleConnectionEventInd
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psMsg    Indication message to be processed.
//
// DESCRIPTION This function handles Connection Event indication messages.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleConnectionEventInd( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
    PEND_CONTEXT   psAdapter = psHAL->psAdapter;
    UMI_CONNECTION_EVENT *psConnect;
    PWLAN_CONTEXT  psWlan = &psHAL->psAdapter->sWlan;
    ULONG       i;

    psConnect = (UMI_CONNECTION_EVENT *)psMsg->abData;

    if ( psConnect->u16Event == UMI_DISCONNECTED )
    {
        DBG_LEV1(("vHALhandleConnectionEventInd(), event = %d, reason = %d, IEEEreason = %d, NetState = %d\n", 
                  psConnect->u16Event, psConnect->u16Reason, psConnect->u16IEEEdisconnectReason, 
                  psAdapter->eNetState));

        psAdapter->eNetState = NET_DISCONNECTED;

        if ( psAdapter->eMediaState == NdisMediaStateConnected )
        {
            // Indicate media state disconnected to upper.
            vENDindicateConnectionStatus( psAdapter, NdisMediaStateDisconnected );

            // if previously connected to AP, attempt to reconnect after each Scan completes
            if (( psConnect->u16Reason == UMI_BSS_NO_NETWORK ) &&
                ( psAdapter->sWlan.ulInfraMode == Ndis802_11Infrastructure ))
            {
                psAdapter->sWlan.sChangeNetwork.boRecoverLostAPConnection = TRUE;
                DBG_LEV3(("Setting flag 'boRecoverLostAPConnection' \n"));
            }

        }
        else if ( psWlan->ulInfraMode == Ndis802_11IBSS )
        {
            // If in starting IBSS state, Indicate media state disconnected to upper.  This is
            //   required so that Win CE's Configure Wireless Network Window shows the correct
            //   status of disconnected for this IBSS network in the networks list (WB competitive)...
            vENDindicateConnectionStatus( psAdapter, NdisMediaStateDisconnected );
        }
    }
    else
    {
        bool boReconnect = FALSE;

        if ((psAdapter->eNetState == NET_CONNECTED) ||
            (psConnect->u16Event == UMI_RECONNECTED))
        {
            boReconnect = TRUE;
        }

        if (psConnect->boApRcpiValid)
        {
            DBG_LEV1(("vHALhandleConnectionEventInd(), event = %d, reason = %d, NetState = %d,"
                      " RF Channel Number = %d, CapsMap = 0x%lx, RCPI = %d\n", 
                      psConnect->u16Event, psConnect->u16Reason, psAdapter->eNetState, 
                      psConnect->u8RFchannel, psConnect->sRsnCaps.u32CapsMap, psConnect->i8ApReportedRcpi));

            
        }
        else
        {
         
            DBG_LEV1(("vHALhandleConnectionEventInd(), event = %d, reason = %d, NetState = %d,"
                      " RF Channel Number = %d, CapsMap = 0x%lx\n", 
                      psConnect->u16Event, psConnect->u16Reason, psAdapter->eNetState, 
                      psConnect->u8RFchannel, psConnect->sRsnCaps.u32CapsMap ));
        }

        if ((psConnect->u16Event == UMI_RECONNECTED) && (psWlan->ulInfraMode != Ndis802_11IBSS))
        {
            if ( OS_MEMEQU( &psConnect->sStationID, &psConnect->sPrevBSSID, IEEE_ADDR_LEN ))
            {
                // Issue disconnect event
                vENDindicateConnectionStatus( psAdapter, NdisMediaStateDisconnected );
            }
            else
            {
                DBG_LEV1(("Reconnecting:\n"
                      "\tNew BSSID:          0x%02x%02x%02x%02x%02x%02x\n"
                      "\tPrevious BSSID:     0x%02x%02x%02x%02x%02x%02x\n",
                          psConnect->sStationID.au8Addr[0], 
                          psConnect->sStationID.au8Addr[1],
                          psConnect->sStationID.au8Addr[2], 
                          psConnect->sStationID.au8Addr[3],
                          psConnect->sStationID.au8Addr[4], 
                          psConnect->sStationID.au8Addr[5],
                          psConnect->sPrevBSSID.au8Addr[0], 
                          psConnect->sPrevBSSID.au8Addr[1],
                          psConnect->sPrevBSSID.au8Addr[2], 
                          psConnect->sPrevBSSID.au8Addr[3],
                          psConnect->sPrevBSSID.au8Addr[4], 
                          psConnect->sPrevBSSID.au8Addr[5]));
            }
        }



        // Make association information.
        vHALmakeAssociationInfo( psAdapter, psConnect );
        
        // Update channel number.
        vENDgetChannelFrequency( psConnect->u8RFchannel, &psAdapter->sWlan.sRadioConfig.DSConfig );

        // Update rate set.
        vHALsendGetMibReq( psHAL, MIB_OPERATIONAL_RATE_SET );

        psAdapter->eNetState = NET_CONNECTED;

        // Indicate media state connected to upper.
        vENDindicateConnectionStatus( psAdapter, NdisMediaStateConnected );

        if (boReconnect)
        {
            // This is a reconnect
            // If WPA roaming, tell upper to redo key exchange
            if (psWlan->auth_params[IW_AUTH_WPA_VERSION] &
                    (IW_AUTH_WPA_VERSION_WPA2 | IW_AUTH_WPA_VERSION_WPA))
            {
                NDIS_802_11_AUTHENTICATION_EVENT sAuthEvent;
                sAuthEvent.Status.StatusType =
                    Ndis802_11StatusType_Authentication;
                sAuthEvent.Request[0].Flags = 0;
                sAuthEvent.Request[0].Length =
                    sizeof( NDIS_802_11_AUTHENTICATION_REQUEST );
                OS_MEMCPY( sAuthEvent.Request[0].Bssid,
                           &psConnect->sStationID,
                           IEEE_ADDR_LEN );
                sAuthEvent.Request[0].Flags = NDIS_802_11_AUTH_REQUEST_REAUTH;

                DBG_LEV1(("Requesting 802.1X reauthentication from host.\n"));

                N

⌨️ 快捷键说明

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