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

📄 message.c

📁 Freescale ARM11系列CPU MX31的WINCE 5.0下的BSP
💻 C
📖 第 1 页 / 共 5 页
字号:
{
    UMI_MSG     *psMsg;
    UMI_MIB     *psSetMib;

    // Need to reject the set MIB request from upper during Setup state.
    if ( psHAL->psAdapter->eNetState == NET_SETUP )
    {
        DBG_LEV1(("Initializing device, rejected the request from upper, MIB id 0x%x.\n", u16MibId));
    }
    else
    {
        psMsg = psHALnewReqMessage( psHAL, MSG_MAN );

        if ( psMsg != NULL )
        {
            psSetMib = (UMI_MIB *)psMsg->abData;
            psSetMib->u16ObjectID = u16MibId;
            psSetMib->u16Status = UMI_OK;
            OS_MEMCPY( &psSetMib->uValue, puValue, sizeof( MIB_VALUE ) );

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


//-----------------------------------------------------------------------------
//
// NAME        vHALhandleSetMibCfm
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psMsg    Confirm message to be processed.
//
// DESCRIPTION This function handles Set MIB confirm messages received 
//          from the device in MIB setup and other states.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleSetMibCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
    UMI_MIB        *psSetMib;
    UMI_POWER_MODE *psPowerMode;
    PEND_CONTEXT   psAdapter = psHAL->psAdapter;
    NET_STATE      eNetState = psAdapter->eNetState;
    PWLAN_CONTEXT  psWlan = &psAdapter->sWlan;

    psSetMib = (UMI_MIB *)psMsg->abData;

    if ( psSetMib->u16Status == UMI_OK )
    {
        DBG_LEV2(("Successfully Set MIB, item 0x%x.\n", psSetMib->u16ObjectID));
    }
    else
    {
        DBG_LEV0(("ERROR: Set MIB request failed, item 0x%x, error %d.\n",
                  psSetMib->u16ObjectID, psSetMib->u16Status));
    }

    if ( eNetState == NET_SETUP )
    {
        /*
        * If there are any further MIB objects to be set, then send a set
        * request for the next in the list using this message buffer.
        * Otherwise, progress to the next state and set the Power Mode.
        */
        if ( boCFGgetNextMibItem( &psAdapter->sCFG, &psAdapter->sWlan, 
                                  &psSetMib->u16ObjectID, &psSetMib->uValue ) )
        {
            DBG_LEV2(("Sending request to set MIB object 0x%x.\n", psSetMib->u16ObjectID));

            psMsg->u16MsgId = UM_MAN_SET_MIB_REQ;
            boHALsendMessage( psHAL, psMsg );
        }
        else
        {
            /*
            * Send a set power mode request, extracting the MAC
            * configuration from the Config block. Change to the power mode
            * state.
            */
            psPowerMode = (UMI_POWER_MODE *)psMsg->abData;

            if ( boCFGisPowerSavingEnabled(&psAdapter->sCFG) )
            {
                DBG_LEV2(("Sending Power Mode enable request...\n"));
                psPowerMode->u16PowerMode = 1;
            }
            else
            {
                DBG_LEV2(("Sending Power Mode disable request...\n"));
                psPowerMode->u16PowerMode = 0;
            }

            psMsg->u16MsgId = UM_MAN_POWER_MODE_REQ;
            boHALsendMessage( psHAL, psMsg );
        }
    }
    // Continue the connection process.
    else if ( psAdapter->sWlan.sChangeNetwork.ulOid && 
              (psSetMib->u16ObjectID == MIB_AUTHENTICATION_MODE   ||
               psSetMib->u16ObjectID == MIB_PRIVACY_STATUS     ||
               psSetMib->u16ObjectID == MIB_IBSS_CHANNEL_NUMBER   ||
               psSetMib->u16ObjectID == MIB_WEP_DEFAULT_KEYS) )
    {
        vENDconnectNetwork( psAdapter, 
                            ( psAdapter->sWlan.sChangeNetwork.ulOid == OID_802_11_SSID ), FALSE );
    }
}


//-----------------------------------------------------------------------------
//
// NAME        vHALsendPowerModeReq
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          boEnablePS  TRUE if power saving mode enabled, FALSE otherwise.
//
// DESCRIPTION This function sends a Power Mode request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendPowerModeReq( IN PHAL_CONTEXT psHAL, IN BOOLEAN boEnablePS )
{
    UMI_MSG        *psMsg;
    UMI_POWER_MODE *psPowerMode;

    psMsg = psHALnewReqMessage( psHAL, MSG_MAN );

    if ( psMsg != NULL )
    {
        psPowerMode = (UMI_POWER_MODE *)psMsg->abData;
        psPowerMode->u16PowerMode = boEnablePS;

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


//-----------------------------------------------------------------------------
//
// NAME        vHALhandlePowerModeCfm
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psMsg    Confirm message to be processed.
//
// DESCRIPTION This function handles Power Mode confirm messages.
//
//-----------------------------------------------------------------------------
VOID
vHALhandlePowerModeCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
    UMI_POWER_MODE *psPowerMode;
    PEND_CONTEXT   psAdapter = psHAL->psAdapter;
    PWLAN_CONTEXT  psWlan = &psAdapter->sWlan;
    NET_STATE      eNetState = psAdapter->eNetState;

    psPowerMode = (UMI_POWER_MODE *)psMsg->abData;

    if ( psPowerMode->u16Status == UMI_OK )
    {
        psWlan->ulPowerMode = (psPowerMode->u16PowerMode) ? Ndis802_11PowerModeMAX_PSP : Ndis802_11PowerModeCAM;
        DBG_LEV1(("Successfully set Power Mode %lu.\n", psWlan->ulPowerMode));
    }
    else
    {
        DBG_LEV0(("ERROR: Failed to set Power Mode.\n"));
    }

    if ( eNetState == NET_SETUP )
    {
#ifdef   NDIS51_MINIPORT
        psAdapter->eNetState = NET_DISCONNECTED;

        // Indicate media state disconnected to upper.
        vENDindicateConnectionStatus( psAdapter, NdisMediaStateDisconnected );

        // Send power off request to device if radio off configured.
        if ( psWlan->boDesiredRadio == FALSE )
        {
            vHALsendPowerOffReq( psHAL );
        }
#else    
        // Try to scan before activation.
        UMI_SCAN *psScan = (UMI_SCAN *)psMsg->abData;

        //psScan->u16BSStype = UMI_BSS_ANY;
        psScan->u16Status = UMI_OK;

        // Set scan flag.
        psWlan->boScanInProgress = TRUE;

        psMsg->u16MsgId = UM_MAN_SCAN_REQ;
        boHALsendMessage( psHAL, psMsg );
#endif   // NDIS51_MINIPORT
    }
}


//-----------------------------------------------------------------------------
//
// NAME        vHALsendScanReq
//
// PARAMETERS  psHAL    Pointer to HAL context.
//
// DESCRIPTION This function sends a Scan request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendScanReq( IN PHAL_CONTEXT psHAL )
{
    UMI_MSG        *psMsg;
    UMI_SCAN    *psScan;
    PWLAN_CONTEXT  psWlan = &psHAL->psAdapter->sWlan;

    psMsg = psHALnewReqMessage( psHAL, MSG_MAN );

    if ( psMsg != NULL )
    {
        psScan = (UMI_SCAN *)psMsg->abData;
        psScan->u16Status = UMI_OK;

        // Set scan flag.
        psWlan->boScanInProgress = TRUE;
      
        psMsg->u16MsgId = UM_MAN_SCAN_REQ;
        boHALsendMessage( psHAL, psMsg );
    }
}


//-----------------------------------------------------------------------------
//
// NAME        vHALhandleScanCfm
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psMsg    Confirm message to be processed.
//
// DESCRIPTION This function handles Scan confirm message.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleScanCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
    UMI_SCAN    *psScan;
    PEND_CONTEXT   psAdapter = psHAL->psAdapter;
    PWLAN_CONTEXT  psWlan = &psAdapter->sWlan;

    psScan = (UMI_SCAN *)psMsg->abData;

    if ( psScan->u16Status == UMI_OK )
    {
        DBG_LEV2(("Successfully send Scan request.\n"));

        // hold off clearing boScanInProgress flag
        // until Device sends Scan Complete Ind.
    }
    else
    {
        // Note: device may reject the host Scan Request if device is:
        //   a) still in the Holdoff period after the Connection Event
        //      (psScan->u16Status == UMI_MC_BUSY).  The device is
        //      still waiting for upper layers to complete the connection
        //      (e.g, DHCP, 802.1x key installation, etc.).
        //   b) in the process of reconnecting to the BSS after finishing
        //      a background scan operation (psScan->u16Status == 
        //      UMI_BSS_ALREADY_ACTIVE).

        DBG_LEV1(("WARNING: Scan request rejected, %d.\n", psScan->u16Status));

        // Clear scan flag.
        psWlan->boScanInProgress = FALSE;
    }
}

//-----------------------------------------------------------------------------
//
// NAME        vHALhandleScanCompleteInd
//
// PARAMETERS  psHAL    Pointer to HAL context.
//          psMsg    Ind message to be processed.
//
// DESCRIPTION This function handles Scan Complete message.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleScanCompleteInd( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
    PEND_CONTEXT   psAdapter = psHAL->psAdapter;
    PWLAN_CONTEXT  psWlan = &psAdapter->sWlan;
    PPENDING_OID   psPendingOID = &psAdapter->sPendingOID;
   
    DBG_LEV1(("Scan Complete Ind\n"));

    // Clear scan flag.
    psWlan->boScanInProgress = FALSE;


    DBG_LEV3(("boRecoverLostAPConnection = %d.\n", psWlan->sChangeNetwork.boRecoverLostAPConnection));

    // if system is disconnected at this point, attempt to reconnect to currently configured SSID if it was found 
    //  during the scan
    if (( psAdapter->eNetState == NET_DISCONNECTED ) &&
        ( psWlan->sChangeNetwork.boRecoverLostAPConnection ) &&
        ( psWlan->sSSID.SsidLength != 0 ))
    {
        ULONG i;
        // Note: Flag will be cleared when connection to this AP is re-established or when OS changes network and device connects to new AP
        // psWlan->sChangeNetwork.boRecoverLostAPConnection = FALSE;
        for ( i=0; i<psWlan->ulNumOfBssidBuf; i++ )
        {
            PNDIS_WLAN_BSSID_EX     psBssid = psWlan->sBssidList[i].psBssid;
            if (( psWlan->sBssidList[i].llTimeStamp > 0) &&       // Entry is valid
                ( psWlan->sSSID.SsidLength == psBssid->Ssid.SsidLength ) &&
                ( NdisEqualMemory( psWlan->sSSID.Ssid, psBssid->Ssid.Ssid, psBssid->Ssid.SsidLength ) ))
            {
                // Only attempt reconnect if Host has not requested a Network Change...
                if ((psWlan->sChangeNetwork.ulOid == 0) &&
                    (!psWlan->sChangeNetwork.boNeedDisconnect) &&
                    (!psWlan->sChangeNetwork.boAuthModeChanged) &&
                    (!psWlan->sChangeNetwork.boEncryptStatusChanged))
                {
                    vENDconnectSSID( psAdapter, &psBssid->Ssid, FALSE );

                    DBG_LEV1(("Sending Activate request...\n"
                              "\tESSID:         %s\n"
                              "\tBSSID:         0x%02x%02x%02x%02x%02x%02x\n",
                              psBssid->Ssid.Ssid,
                              psBssid->MacAddress[0], psBssid->MacAddress[1],
                              psBssid->MacAddress[2], psBssid->MacAddress[3],
                              psBssid->MacAddress[4], psBssid->MacAddress[5]));
                }
                break;
            }
        }
    }

#ifndef  NDIS51_MINIPORT
    if ( psAdapter->eNetState == NET_SETUP )
    {
        UMI_ACTIVATE   *psActivate;
        ULONG       ulChannel;
        CFG_NETWORK_TYPE eNetworkType;
        const PCHAR apacNetworkType[CFG_NUM_NET_TYPES] =
            {
                "Infra Station", "Adhoc Station", "Access Point", "Test MAC"
            };

        /*
        * Activate the MAC and progress to the next state.
        */
        psActivate = (UMI_ACTIVATE *)psMsg->abData;
 
        vENDgetChannelFrequency( psWlan->sRadioConfig.DSConfig, &ulChannel );
        psActivate->u16PreferredChannel = (USHORT)ulChannel;

        OS_MEMCPY( &psActivate->sBSSID, psWlan->ucBSSID, IEEE_ADDR_LEN );

        psActivate->sSSID.u8Length = (UCHAR)psWlan->sSSID.SsidLength;
        OS_MEMCPY( psActivate->sSSID.acESSID, psWlan->sSSID.Ssid, psWlan->sSSID.SsidLength );

        eNetworkType = (psWlan->ulInfraMode == Ndis802_11IBSS) ? CFG_ADHOC_STATION : CFG_INFRA_STATION;

        /* We only use this parameter if we are a station. */
        if ( eNetworkType == CFG_INFRA_STATION )
        {
            psActivate->u16BSStype = UMI_BSS_INFRA;
        }
        else if ( eNetworkType == CFG_ADHOC_STATION )
        {
            psActivate->u16BSStype = UMI_BSS_ADHOC;
        }

        DBG_LEV2(("Sending Activate request...\n"
                  "\tNetwork Type:   %s\n"
                  "\tESSID:       %s\n"
                  "\tBSSID:       0x%02x%02x%02x%02x%02x%02x\n"
                  "\tChannel:     %d\n",
                  apacNetworkType[eNetworkType],

⌨️ 快捷键说明

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