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

📄 dls.c

📁 Ralink RT61 SoftAP Driver source code. RT61:MiniPCI
💻 C
字号:
/****************************************************************************
 * Ralink Tech Inc.
 * 4F, No. 2 Technology 5th Rd.
 * Science-based Industrial Park
 * Hsin-chu, Taiwan, R.O.C.
 * (c) Copyright 2005, Ralink Technology, Inc.
 *
 * All rights reserved. Ralink's source code is an unpublished work and the
 * use of a copyright notice does not imply otherwise. This source code
 * contains confidential trade secret material of Ralink Tech. Any attemp
 * or participation in deciphering, decoding, reverse engineering or in any
 * way altering the source code is stricitly prohibited, unless the prior
 * written consent of Ralink Technology, Inc. is obtained.
 ****************************************************************************

    Module Name:
    dls.c
 
    Abstract:
    Handle WMM-DLS state machine
 
    Revision History:
    Who         When          What
    --------    ----------    ----------------------------------------------
    Rory Chen   02-14-2006
 */

#include "rt_config.h"

/*  
    ==========================================================================
    Description: 
        DLS state machine init, including state transition and timer init
    Parameters: 
        S - pointer to the DLS state machine
    Note:
        The state machine looks like the following 
        
                                    DLS_IDLE             
        MT2_PEER_DLS_REQ			PeerDlsReqAction 
        MT2_PEER_DLS_RSP			PeerDlsRspAction     
        MT2_PEER_DLS_TEAR_DOWN		PeerDlsTearDownAction
        
    ==========================================================================
 */
VOID DLSStateMachineInit(
    IN	PRTMP_ADAPTER	pAd, 
    IN  STATE_MACHINE *S, 
    OUT STATE_MACHINE_FUNC Trans[]) 
{
    StateMachineInit(S, (STATE_MACHINE_FUNC*)Trans, MAX_DLS_STATE, MAX_DLS_MSG, (STATE_MACHINE_FUNC)Drop, DLS_IDLE, DLS_MACHINE_BASE);

    StateMachineSetAction(S, DLS_IDLE, MT2_PEER_DLS_REQ, (STATE_MACHINE_FUNC)PeerDlsReqAction);
    StateMachineSetAction(S, DLS_IDLE, MT2_PEER_DLS_RSP, (STATE_MACHINE_FUNC)PeerDlsRspAction);
    StateMachineSetAction(S, DLS_IDLE, MT2_PEER_DLS_TEAR_DOWN, (STATE_MACHINE_FUNC)PeerDlsTearDownAction);
}

VOID PeerDlsReqAction(
    IN PRTMP_ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
	PMAC_TABLE_ENTRY	pDAEntry, pSAEntry;
	UCHAR				DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];
	USHORT				CapabilityInfo;
	USHORT				DLSTimeout;
	PUCHAR				pOutBuffer = NULL;
	PFRAME_802_11		Fr;
	USHORT				Status;
	ULONG				FrameLen = 0;
	HEADER_802_11		DlsRspHdr;
	UCHAR				Category = CATEGORY_DLS;
	UCHAR				Action = ACTION_DLS_RESPONSE;

	// frame sanity check
    if (! PeerDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, DA, SA, &CapabilityInfo, &DLSTimeout)) 
        return;
	
	pSAEntry = MacTableLookup(pAd, SA);
	if (!pSAEntry)
		return;

	if (pSAEntry)
		pSAEntry->bDlsInit	= FALSE;

	pDAEntry = MacTableLookup(pAd, DA);
	if (!pDAEntry)
		Status = MLME_DEST_STA_NOT_IN_QBSS;
	else if (pDAEntry && (pDAEntry->ApIdx != pSAEntry->ApIdx))
		Status = MLME_DEST_STA_NOT_IN_QBSS;
	else if (pDAEntry && !CLIENT_STATUS_TEST_FLAG(pDAEntry, fCLIENT_STATUS_WMM_CAPABLE))
		Status = MLME_DEST_STA_IS_NOT_A_QSTA;
	else if (pDAEntry->WepStatus != pSAEntry->WepStatus)
		Status = MLME_QOS_UNSPECIFY;
	else if (!pAd->PortCfg.MBSSID[pSAEntry->ApIdx].bDLSCapable)
		Status = MLME_DLS_NOT_ALLOW_IN_QBSS;
	else
		Status = MLME_SUCCESS;

	if (pDAEntry)
		pDAEntry->bDlsInit	= FALSE;

    Fr = (PFRAME_802_11)Elem->Msg;

	// forward DLS-Request to real destination
	pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG);
	if(pOutBuffer == NULL)
		return;

	// if status is successful, forward DLS-Request frame to destination
	// otherwise send DLS-Response with reason code to originator
	if (Status == MLME_SUCCESS)
	{
		NdisMoveMemory(Fr->Hdr.Addr1, DA, MAC_ADDR_LEN);
		NdisMoveMemory(Fr->Hdr.Addr2, pAd->PortCfg.MBSSID[pSAEntry->ApIdx].Bssid, MAC_ADDR_LEN);
		NdisMoveMemory(Fr->Hdr.Addr3, SA, MAC_ADDR_LEN);
		NdisMoveMemory(pOutBuffer, Elem->Msg, Elem->MsgLen);
		FrameLen = Elem->MsgLen;
	}
	else
	{
		MgtMacHeaderInit(pAd, &DlsRspHdr, SUBTYPE_ACTION, 0, SA, pAd->PortCfg.MBSSID[pSAEntry->ApIdx].Bssid);

		// Capability information and supported rate field are present only when status code is zero	        
        MakeOutgoingFrame(pOutBuffer,                       &FrameLen,
                          sizeof(HEADER_802_11),            &DlsRspHdr,
                          1,                                &Category,
                          1,                                &Action,
                          2,                                &Status,
                          6,                                SA,
                          6,                                DA,
                          END_OF_ARGS);
	}

	MiniportMMRequest(pAd, pOutBuffer, FrameLen);
	kfree(pOutBuffer);

	DBGPRINT(RT_DEBUG_TRACE,"DLS - PeerDlsReqAction() from %02x:%02x:%02x:%02x:%02x:%02x with Status=%d\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5], Status);
}

VOID PeerDlsRspAction(
    IN PRTMP_ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
	PMAC_TABLE_ENTRY	pEntry;
	UCHAR				DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];
	USHORT				CapabilityInfo;
	USHORT				StatusCode;
	PUCHAR				pOutBuffer = NULL;
	PFRAME_802_11		Fr;
	ULONG				FrameLen = 0;

	// frame sanity check
    if (! PeerDlsRspSanity(pAd, Elem->Msg, Elem->MsgLen, DA, SA, &CapabilityInfo, &StatusCode)) 
        return;

    DBGPRINT(RT_DEBUG_TRACE,"DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x with StatusCode=%d\n",
    	SA[0], SA[1], SA[2], SA[3], SA[4], SA[5], StatusCode);
	
	pEntry = MacTableLookup(pAd, SA);
    if (!pEntry)
    	return;

	if (pEntry)
		pEntry->bDlsInit	= FALSE;

    Fr = (PFRAME_802_11)Elem->Msg;

    // forward DLS-Request to real destination
	pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG);
	if(pOutBuffer == NULL)
		return;

	NdisMoveMemory(Fr->Hdr.Addr1, DA, MAC_ADDR_LEN);
	NdisMoveMemory(Fr->Hdr.Addr2, pAd->PortCfg.MBSSID[pEntry->ApIdx].Bssid, MAC_ADDR_LEN);
	NdisMoveMemory(Fr->Hdr.Addr3, SA, MAC_ADDR_LEN);

	NdisMoveMemory(pOutBuffer, Elem->Msg, Elem->MsgLen);
	FrameLen = Elem->MsgLen;

	MiniportMMRequest(pAd, pOutBuffer, FrameLen);
	kfree(pOutBuffer);
}

VOID PeerDlsTearDownAction(
    IN PRTMP_ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
	PMAC_TABLE_ENTRY	pEntry;
	UCHAR				DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN];
	USHORT				ReasonCode;
	PUCHAR				pOutBuffer = NULL;
	PFRAME_802_11		Fr;
	ULONG				FrameLen = 0;

	// frame sanity check
    if (! PeerDlsTearDownSanity(pAd, Elem->Msg, Elem->MsgLen, DA, SA, &ReasonCode)) 
        return;

    DBGPRINT(RT_DEBUG_TRACE,"DLS - PeerDlsTearDownAction() from %02x:%02x:%02x:%02x:%02x:%02x\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]);
	
	pEntry = MacTableLookup(pAd, SA);
    if (!pEntry)
    	return;

	pEntry->bDlsInit	= FALSE;

    Fr = (PFRAME_802_11)Elem->Msg;

    // forward DLS-Request to real destination
	pOutBuffer = kmalloc(MAX_LEN_OF_MLME_BUFFER, MEM_ALLOC_FLAG);
	if(pOutBuffer == NULL)
		return;

	NdisMoveMemory(Fr->Hdr.Addr1, DA, MAC_ADDR_LEN);
	NdisMoveMemory(Fr->Hdr.Addr2, pAd->PortCfg.MBSSID[pEntry->ApIdx].Bssid, MAC_ADDR_LEN);
	NdisMoveMemory(Fr->Hdr.Addr3, SA, MAC_ADDR_LEN);

	NdisMoveMemory(pOutBuffer, Elem->Msg, Elem->MsgLen);
	FrameLen = Elem->MsgLen;

	MiniportMMRequest(pAd, pOutBuffer, FrameLen);
	kfree(pOutBuffer);
}

⌨️ 快捷键说明

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