📄 message.c
字号:
{
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 + -