📄 message.c
字号:
//---------------------------------------------------------------------------
// Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//--------------------------------------------------------------------------
//
// File: message.c
// Source file for platform specific SDIO WLAN functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// INCLUDE FILES
//------------------------------------------------------------------------------
#include "precomp.h"
//------------------------------------------------------------------------------
// GLOBAL DEFINITIONS
//------------------------------------------------------------------------------
typedef enum {
DATA_TYPE_BYTE = 0,
DATA_TYPE_SINT8,
DATA_TYPE_UINT16,
DATA_TYPE_ULONG,
DATA_TYPE_STRING,
DATA_TYPE_ADDRESS,
} DATA_TYPE_E;
typedef struct MIB_ID_LOOKUP_TABLE {
ULONG ulMibId;
DATA_TYPE_E eDataType;
ULONG ulSize;
} MIB_ID_LOOKUP_TABLE_S;
//------------------------------------------------------------------------------
// GLOBAL OR STATIC VARIABLES
//------------------------------------------------------------------------------
extern NDIS_STATUS iCurOIDStatus;
extern MIB_ID u16MibID_GetMIBAttr;
// For storage of incomplete debug output.
#if !defined (RUNNING_LOG) //binary encoding of debug msgs
static uint8 au8DebugBuffer[UMI_DEBUG_BLOCK_SIZE+1];
static uint8 * pcWriteChar;
#endif
// External function to add RSN IE fields.
extern uint8 *pu8WPAaddRsnIePayloadFields(const UMI_RSN_CAPS *psRsnCaps, uint8 *pOutRsnIeData);
// External function to calculate Max Tx Power Level
extern VOID vENDselectMaxTxPower(IN PWLAN_CONTEXT psWlan, IN PWLAN_BSSID_ENTRY psBssEntry);
static MIB_ID_LOOKUP_TABLE_S sMibIdLookupTable[] = {
{MIB_COUNTRY_STRING, DATA_TYPE_STRING, sizeof(MIB_COUNTRY)}
,
{MIB_IEEE_ADDRESS, DATA_TYPE_ADDRESS, IEEE_ADDR_LEN}
,
{MIB_RTS_THRESHOLD, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_FRAGMENT_THRESHOLD, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_MANUFACTURER_ID, DATA_TYPE_STRING, sizeof(MIB_MAN_ID)}
,
{MIB_PRODUCT_ID, DATA_TYPE_STRING, sizeof(MIB_PROD_ID)}
,
{MIB_MANUFACTURER_OUI, DATA_TYPE_STRING, sizeof(MIB_OUI)}
,
{MIB_UWA_PROGRAM_VER, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_RX_BUF_OVERFLOW_COUNT, DATA_TYPE_ULONG, sizeof(ULONG)}
,
{MIB_UWA_RX_STATS, DATA_TYPE_BYTE, 4 * MIB_UWA_RX_STATS_SEGM_LENGTH}
,
{MIB_UWA_RX_STATS_SEGM2, DATA_TYPE_BYTE,
4 * MIB_UWA_RX_STATS_SEGM_LENGTH}
,
{MIB_UWA_RX_STATS_SEGM3, DATA_TYPE_BYTE,
4 * MIB_UWA_RX_STATS_SEGM_LENGTH}
,
{MIB_REG_DOMAINS_SUPPORTED, DATA_TYPE_BYTE, sizeof(MIB_SET_OF_U8)}
,
{MIB_SUPPORTED_TX_ANTENNAS, DATA_TYPE_BYTE, sizeof(MIB_LIST_OF_U8)}
,
{MIB_SUPPORTED_RX_ANTENNAS, DATA_TYPE_BYTE, sizeof(MIB_LIST_OF_U8)}
,
{MIB_MAX_TX_POWER_LEVEL, DATA_TYPE_SINT8, sizeof(UCHAR)}
,
{MIB_TPC_PARAMS_2_4_GHZ_TABLE, DATA_TYPE_BYTE,
sizeof(MIB_TPC_BG_TABLE_S)}
,
{MIB_TPC_PARAMS_5_GHZ_TABLE, DATA_TYPE_BYTE, sizeof(MIB_TPC_A_TABLE_S)}
,
{MIB_CURRENT_CHANNEL_NUMBER, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_IBSS_CHANNEL_NUMBER, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_RESTRICTED_CHANNEL_NUMBER, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_CHANNEL_SET, DATA_TYPE_BYTE, sizeof(MIB_SET_OF_U8)}
,
{MIB_SNR, DATA_TYPE_ULONG, sizeof(ULONG)}
,
{MIB_UWA_RX_STATS_MASK, DATA_TYPE_ULONG,
sizeof(MIB_UWA_RX_STATS_MASK_TYPE)}
,
{MIB_UWA_POLLING_RATE, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_TX_THROUGHPUT_TIMER, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_POWER_SAVING_CONTROL_MODE, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_DESIRED_ESSID, DATA_TYPE_BYTE, sizeof(MIB_ESS_ID)}
,
{MIB_SCAN_TYPE, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_BSSID, DATA_TYPE_ADDRESS, IEEE_ADDR_LEN}
,
{MIB_ESSID, DATA_TYPE_BYTE, sizeof(MIB_ESS_ID)}
,
{MIB_BEACON_PERIOD, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_DTIM_PERIOD, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_ATIM_WINDOW, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_ALL_RATE_SET, DATA_TYPE_BYTE, sizeof(MIB_SET_OF_U8)}
,
{MIB_BSS_BASIC_RATE_SET, DATA_TYPE_ULONG, sizeof(ULONG)}
,
{MIB_OPERATIONAL_RATE_SET, DATA_TYPE_ULONG, sizeof(ULONG)}
,
{MIB_SHORT_PREAMBLE_SUPPORT_FOR_EACH_RATE, DATA_TYPE_BYTE,
sizeof(MIB_SET_OF_U8)}
,
{MIB_LISTEN_INTERVAL, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_SOFTWARE_CONFIG, DATA_TYPE_ULONG, sizeof(ULONG)}
,
{MIB_STATION_AID, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_SW_VERSION, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_ASIC_VER, DATA_TYPE_ULONG, sizeof(MIB_ASIC_VER_TYPE)}
,
{MIB_BOOT_VER, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_CA_DEVICE_CAPS, DATA_TYPE_ULONG, sizeof(ULONG)}
,
{MIB_CHECK_ROAMING_TIMEOUT, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_RSSITH, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_RSSI_ROAM_HYS, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_FORCE_RATE, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_BSS_PHY_CAPS, DATA_TYPE_UINT16, sizeof(UINT16)}
,
{MIB_WME_DAMPING_FACTORS, DATA_TYPE_UINT16, sizeof(WME_3WORD_ARRAY)}
,
{MIB_RSN_CONTROL, DATA_TYPE_BYTE, sizeof(RSNMIB_CONTROL)}
,
{MIB_RSN_PAIRWISE_ALERT_THRESHOLDS, DATA_TYPE_UINT16,
sizeof(RSNMIB_PAIRWISE_ALERT_THRESHOLDS)}
,
{MIB_RSN_GROUP_ALERT_THRESHOLDS, DATA_TYPE_UINT16,
sizeof(RSNMIB_GROUP_ALERT_THRESHOLDS)}
,
{MIB_RSN_IE, DATA_TYPE_BYTE, sizeof(MIB_RSN_IE_PARAMS)}
,
{MIB_BACKGROUND_SCAN_PARAMS, DATA_TYPE_UINT16,
sizeof(MIB_BACKGROUND_SCAN_PARAMS_S)}
,
{0, DATA_TYPE_BYTE, sizeof(UCHAR)} // Default value - Keep this always at the end.
};
#define SIZEOF_MIB_ID_LOOKUP_TABLE (sizeof(sMibIdLookupTable)/sizeof(MIB_ID_LOOKUP_TABLE_S))
#define MIB_ID_MAX MIB_TPC_PARAMS_5_GHZ_TABLE
//-----------------------------------------------------------------------------
//
// NAME vHALMessageResponse
//
// PARAMETERS psHAL Pointer to HAL context.
// psMsg Message structure pointer.
//
// DESCRIPTION Make a response to the indication message.
//
//-----------------------------------------------------------------------------
VOID
vHALMessageResponse( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
// Toggle the direction bit, change indication message to response.
MSG_MAKE_REPLY( psMsg->u16MsgId );
if ( !boHALsendMessage( psHAL, psMsg ) )
{
DBG_LEV0(("ERROR: Failed to send the response message, id = 0x%x.\n", psMsg->u16MsgId));
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALsendGetStatsReq
//
// PARAMETERS psHAL Pointer to HAL context.
//
// DESCRIPTION This function sends a Get 802.11 Stats request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendGetStatsReq( IN PHAL_CONTEXT psHAL )
{
UMI_MSG *psMsg;
UMI_GET_802_11_STATS *psGetStats;
psMsg = psHALnewReqMessage( psHAL, MSG_MAN );
if ( psMsg != NULL )
{
psGetStats = (UMI_GET_802_11_STATS *)psMsg->abData;
psGetStats->u16Status = UMI_OK;
psMsg->u16MsgId = UM_MAN_GET_802_11_STATS_REQ;
boHALsendMessage( psHAL, psMsg );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALhandleGetStatsCfm
//
// PARAMETERS psHAL Pointer to HAL context.
// psMsg Confirm message to be processed.
//
// DESCRIPTION This function handles Get 802.11 Stats confirm message.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleGetStatsCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
UMI_GET_802_11_STATS *psGetStats;
PWLAN_CONTEXT psWlan = &psHAL->psAdapter->sWlan;
PNDIS_802_11_STATISTICS psStats = &psWlan->sStatistics;
PPENDING_OID psPendingOID = &psHAL->psAdapter->sPendingOID;
NDIS_STATUS iStatus = NDIS_STATUS_NOT_ACCEPTED;
psGetStats = (UMI_GET_802_11_STATS *)psMsg->abData;
if ( psGetStats->u16Status == UMI_OK )
{
psStats->TransmittedFragmentCount.QuadPart = psGetStats->u32TxFragCount;
psStats->MulticastTransmittedFrameCount.QuadPart = psGetStats->u32TxMulticastCount;
psStats->FailedCount.QuadPart = psGetStats->u32TxFailedCount;
psStats->RetryCount.QuadPart = psGetStats->u32TxRetryCount;
psStats->FrameDuplicateCount.QuadPart = psGetStats->u32RxDuplicateCount;
psStats->ReceivedFragmentCount.QuadPart = psGetStats->u32RxFragCount;
psStats->MulticastReceivedFrameCount.QuadPart = psGetStats->u32RxMulticastCount;
psStats->FCSErrorCount.QuadPart = psGetStats->u32RxFcsErrorCount;
psStats->Length = sizeof( NDIS_802_11_STATISTICS );
DBG_LEV2(("Successfully Get 802.11 Stats.\n"));
}
else
{
DBG_LEV0(("ERROR: Get 802.11 Stats failed, %d.\n", psGetStats->u16Status));
}
if ( psPendingOID->ulOid == OID_802_11_STATISTICS )
{
// Clear the pending OID flag.
psPendingOID->ulOid = 0;
if ( psGetStats->u16Status == UMI_OK )
{
OS_MEMCPY( psPendingOID->pvBuffer, psStats, psStats->Length );
*psPendingOID->pulBytesWritten = psStats->Length;
iStatus = NDIS_STATUS_SUCCESS;
}
// Complete the prior pending OID request.
NdisMQueryInformationComplete( psHAL->psAdapter->hMiniportAdapterHandle, iStatus );
iCurOIDStatus = iStatus;
DBG_LEV2(("PENDING Query Completed for OID 0x%x\n", psPendingOID->ulOid));
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALsendClearUwaStatsReq
//
// PARAMETERS psHAL Pointer to HAL context.
//
// DESCRIPTION This function sends a Clear Stats request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendClearUwaStatsReq( IN PHAL_CONTEXT psHAL )
{
UMI_MSG *psMsg;
UMI_UWA_CLEAR_STATS *psClearStats;
psMsg = psHALnewReqMessage( psHAL, MSG_MAN );
if ( psMsg != NULL )
{
// we just clear them all so set the clearall ID
psClearStats = (UMI_UWA_CLEAR_STATS *)psMsg->abData;
psClearStats->u8StatId = UMI_UWA_CLEARSTATS_CLEARALL_ID;
DBG_LEV1(("Sent clear stats\n"));
psMsg->u16MsgId = UM_MAN_CLEAR_STATS_REQ;
boHALsendMessage( psHAL, psMsg );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALhandleClearStatsCfm
//
// PARAMETERS psHAL Pointer to HAL context.
// psMsg Confirm message to be processed.
//
// DESCRIPTION This function handles Clear Stats confirm messages received
// from the device.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleClearStatsCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
UMI_UWA_CLEAR_STATS *psClearStats;
psClearStats = (UMI_UWA_CLEAR_STATS *)psMsg->abData;
DBG_LEV1(("Successfully cleared stats\n"));
}
//-----------------------------------------------------------------------------
//
// NAME vHALsendGetGenStatsReq
//
// PARAMETERS psHAL Pointer to HAL context.
//
// DESCRIPTION This function sends a Get Generic Stats request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendGetGenStatsReq( IN PHAL_CONTEXT psHAL )
{
UMI_MSG *psMsg;
UMI_GET_GEN_STATS *psGetStats;
psMsg = psHALnewReqMessage( psHAL, MSG_MAN );
if ( psMsg != NULL )
{
psGetStats = (UMI_GET_GEN_STATS *)psMsg->abData;
psGetStats->u16Status = UMI_OK;
psMsg->u16MsgId = UM_MAN_GET_GEN_STATS_REQ;
boHALsendMessage( psHAL, psMsg );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -