📄 sta_assoc.c
字号:
pDisassocReq = (PMLME_DISASSOC_REQ_STRUCT)(Elem->Msg);
// allocate and send out DeassocReq frame
pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG);
if (pOutBuffer == NULL)
{
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - StaMlmeDisassocReqAction() allocate memory failed\n");
*pCurrState = STA_ASSOC_IDLE;
StaCtrlMsg.Status = MLME_FAIL_NO_RESOURCE;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_DEASSOC_RSP,
sizeof(STA_CTRL_MSG_STRUCT), &StaCtrlMsg, ifIndex);
return;
}
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - Send DISASSOC request [BSSID::%02x:%02x:%02x:%02x:%02x:%02x] \n",
pDisassocReq->Addr[0], pDisassocReq->Addr[1], pDisassocReq->Addr[2],
pDisassocReq->Addr[3], pDisassocReq->Addr[4], pDisassocReq->Addr[5]);
ApCliMgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, pDisassocReq->Addr, ifIndex);
MakeOutgoingFrame(pOutBuffer, &FrameLen,
sizeof(HEADER_802_11),&DisassocHdr,
2, &pDisassocReq->Reason,
END_OF_ARGS);
MiniportMMRequest(pAd, pOutBuffer, FrameLen);
kfree(pOutBuffer);
// Set the control aux SSID to prevent it reconnect to old SSID
// Since calling this indicate user don't want to connect to that SSID anymore.
// 2004-11-10 can't reset this info, cause it may be the new SSID that user requests for
// pAd->MlmeAux.SsidLen = MAX_LEN_OF_SSID;
// NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
// NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
#if defined(WPA_SUPPLICANT_SUPPORT) && (WPA_SUPPLICANT_SUPPORT == 1)
if (pAd->PortCfg.WPA_Supplicant == TRUE)
{
//send disassociate event to wpa_supplicant
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.flags = RT_DISASSOC_EVENT_FLAG;
wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);
}
#endif
//pAd->PortCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING;
//COPY_MAC_ADDR(pAd->PortCfg.DisassocSta, pDisassocReq->Addr);
*pCurrState = STA_ASSOC_IDLE;
StaCtrlMsg.Status = MLME_SUCCESS;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_DEASSOC_RSP,
sizeof(STA_CTRL_MSG_STRUCT), &StaCtrlMsg, ifIndex);
return;
}
/*
==========================================================================
Description:
peer sends assoc rsp back
Parameters:
Elme - MLME message containing the received frame
==========================================================================
*/
VOID StaPeerAssocRspAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem,
OUT PULONG pCurrState,
IN USHORT ifIndex)
{
USHORT CapabilityInfo, Status, Aid;
UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;
UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;
UCHAR Addr2[MAC_ADDR_LEN];
EDCA_PARM EdcaParm;
#if defined(WPA_SUPPLICANT_SUPPORT) && (WPA_SUPPLICANT_SUPPORT == 1)
union iwreq_data wrqu;
#endif
STA_CTRL_MSG_STRUCT StaCtrlMsg;
if (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &EdcaParm))
{
// The frame is for me ?
if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid))
{
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status);
RTMPCancelTimer(&pAd->MlmeAux.ApCliAssocTimer);
if(Status == MLME_SUCCESS)
{
// go to procedure listed on page 376
AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, &EdcaParm);
#if defined(WPA_SUPPLICANT_SUPPORT) && (WPA_SUPPLICANT_SUPPORT == 1)
if (pAd->PortCfg.WPA_Supplicant == TRUE)
{
// collect associate info
link_status_handler(pAd);
//send associnfo event to wpa_supplicant
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.flags = RT_ASSOC_EVENT_FLAG;
wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);
}
#endif
StaCtrlMsg.Status = MLME_SUCCESS;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_ASSOC_RSP,
sizeof(STA_CTRL_MSG_STRUCT), &StaCtrlMsg, ifIndex);
}
*pCurrState = STA_ASSOC_IDLE;
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - StaPeerAssocRspAction() sanity check fail\n");
}
return;
}
/*
==========================================================================
Description:
left part of IEEE 802.11/1999 p.374
Parameters:
Elem - MLME message containing the received frame
==========================================================================
*/
VOID StaPeerDisassocAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem,
OUT PULONG pCurrState,
IN USHORT ifIndex)
{
UCHAR Addr2[MAC_ADDR_LEN];
USHORT Reason;
#if defined(WPA_SUPPLICANT_SUPPORT) && (WPA_SUPPLICANT_SUPPORT == 1)
union iwreq_data wrqu;
#endif
if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason))
{
if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2))
{
*pCurrState = STA_ASSOC_IDLE;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_PEER_DISCONNECT_REQ, 0, NULL, ifIndex);
#if defined(WPA_SUPPLICANT_SUPPORT) && (WPA_SUPPLICANT_SUPPORT == 1)
if (pAd->PortCfg.WPA_Supplicant == TRUE) {
// send disassoc event to wpa_supplicant
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.flags = RT_DISASSOC_EVENT_FLAG;
wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);
}
#endif
#if 0
// 2004-09-11 john: can't remember why AP will DISASSOCIATE us.
// But since it says for 2430 only, we temporaily remove the patch.
// 2002/11/21 -
// patch RT2430/RT2420 hangup issue. We suspect this AP DIS-ASSOCIATE frame
// is caused by PHY hangup, so we reset PHY, then auto recover the connection.
// if this attempt fails, then remains in LinkDown and leaves the problem
// to MlmePeriodicExec()
// NICPatchRT2430Bug(pAd);
pAd->RalinkCounters.BeenDisassociatedCount ++;
// Remove auto recover effort when disassociate by AP, re-enable for patch 2430 only
DBGPRINT(RT_DEBUG_TRACE, "ASSOC - Disassociated by AP, Auto Recovery attempt #%d\n", pAd->RalinkCounters.BeenDisassociatedCount);
MlmeAutoReconnectLastSSID(pAd);
#endif
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - StaPeerDisassocAction() sanity check fail\n");
}
return;
}
/*
==========================================================================
Description:
what the state machine will do after assoc timeout
==========================================================================
*/
VOID StaAssocTimeoutAction(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem,
OUT PULONG pCurrState,
IN USHORT ifIndex)
{
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - StaAssocTimeoutAction\n");
*pCurrState = STA_ASSOC_IDLE;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_ASSOC_REQ_TIMEOUT, 0, NULL, ifIndex);
return;
}
VOID StaInvalidStateWhenAssoc(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem,
OUT PULONG pCurrState,
IN USHORT ifIndex)
{
STA_CTRL_MSG_STRUCT StaCtrlMsg;
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - StaInvalidStateWhenAssoc(state=%d), reset STA_ASSOC state machine\n",
*pCurrState);
*pCurrState = STA_ASSOC_IDLE;
StaCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_ASSOC_RSP,
sizeof(STA_CTRL_MSG_STRUCT), &StaCtrlMsg, ifIndex);
return;
}
VOID StaInvalidStateWhenDisassociate(
IN PRTMP_ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem,
OUT PULONG pCurrState,
IN USHORT ifIndex)
{
STA_CTRL_MSG_STRUCT StaCtrlMsg;
DBGPRINT(RT_DEBUG_TRACE, "STA_ASSOC - InvalidStateWhenApCliDisassoc(state=%d), reset STA_ASSOC state machine\n",
*pCurrState);
*pCurrState = STA_ASSOC_IDLE;
StaCtrlMsg.Status = MLME_STATE_MACHINE_REJECT;
StaMlmeEnqueue(pAd, STA_CTRL_STATE_MACHINE, STA_CTRL_DEASSOC_RSP,
sizeof(STA_CTRL_MSG_STRUCT), &StaCtrlMsg, ifIndex);
return;
}
/*
==========================================================================
Description:
procedures on IEEE 802.11/1999 p.376
Parametrs:
==========================================================================
*/
VOID AssocPostProc(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pAddr2,
IN USHORT CapabilityInfo,
IN USHORT Aid,
IN UCHAR SupRate[],
IN UCHAR SupRateLen,
IN UCHAR ExtRate[],
IN UCHAR ExtRateLen,
IN PEDCA_PARM pEdcaParm)
{
pAd->MlmeAux.BssType = BSS_INFRA;
pAd->MlmeAux.Aid = Aid;
pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO;
NdisMoveMemory(&pAd->MlmeAux.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM));
// filter out un-supported rates
pAd->MlmeAux.SupRateLen = SupRateLen;
NdisMoveMemory(pAd->MlmeAux.SupRate, SupRate, SupRateLen);
RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen);
// filter out un-supported rates
pAd->MlmeAux.ExtRateLen = ExtRateLen;
NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen);
RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -