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