summaryrefslogtreecommitdiff
path: root/wl1271/stad/src/Sta_Management/scanResultTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/stad/src/Sta_Management/scanResultTable.c')
-rw-r--r--wl1271/stad/src/Sta_Management/scanResultTable.c1368
1 files changed, 0 insertions, 1368 deletions
diff --git a/wl1271/stad/src/Sta_Management/scanResultTable.c b/wl1271/stad/src/Sta_Management/scanResultTable.c
deleted file mode 100644
index 370e763..0000000
--- a/wl1271/stad/src/Sta_Management/scanResultTable.c
+++ /dev/null
@@ -1,1368 +0,0 @@
-/*
- * scanResultTable.c
- *
- * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name Texas Instruments nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** \file scanResultTable.c
- * \brief implements a table holding scan results, by BSSID
- *
- * \see scanResultTable.h
- */
-
-
-#define __FILE_ID__ FILE_ID_81
-#include "osApi.h"
-#include "report.h"
-#include "scanResultTable.h"
-#include "siteMgrApi.h"
-#include "freq.h"
-
-
-//#define TABLE_ENTRIES_NUMBER 32
-
-#define MILISECONDS(seconds) (seconds * 1000)
-#define UPDATE_LOCAL_TIMESTAMP(pSite, hOs) pSite->localTimeStamp = os_timeStampMs(hOs);
-
-#define UPDATE_BSSID(pSite, pFrame) MAC_COPY((pSite)->bssid, *((pFrame)->bssId))
-#define UPDATE_BAND(pSite, pFrame) (pSite)->eBand = (pFrame)->band
-#define UPDATE_BEACON_INTERVAL(pSite, pFrame) pSite->beaconInterval = (pFrame)->parsedIEs->content.iePacket.beaconInerval
-#define UPDATE_CAPABILITIES(pSite, pFrame) pSite->capabilities = (pFrame)->parsedIEs->content.iePacket.capabilities
-#define UPDATE_PRIVACY(pSite, pFrame) pSite->privacy = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_PRIVACY_SHIFT) & CAP_PRIVACY_MASK) ? TI_TRUE : TI_FALSE
-#define UPDATE_AGILITY(pSite, pFrame) pSite->agility = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_AGILE_SHIFT) & CAP_AGILE_MASK) ? TI_TRUE : TI_FALSE
-#define UPDATE_SLOT_TIME(pSite, pFrame) pSite->newSlotTime = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_SLOT_TIME_SHIFT) & CAP_SLOT_TIME_MASK) ? PHY_SLOT_TIME_SHORT : PHY_SLOT_TIME_LONG
-#define UPDATE_PROTECTION(pSite, pFrame) pSite->useProtection = ((pFrame)->parsedIEs->content.iePacket.useProtection)
-#define UPDATE_CHANNEL(pSite, pFrame, rxChannel) if ((pFrame)->parsedIEs->content.iePacket.pDSParamsSet == NULL) \
- pSite->channel = rxChannel; \
- else \
- pSite->channel = (pFrame)->parsedIEs->content.iePacket.pDSParamsSet->currChannel;
-#define UPDATE_DTIM_PERIOD(pSite, pFrame) if ((pFrame)->parsedIEs->content.iePacket.pTIM != NULL) \
- pSite->dtimPeriod = (pFrame)->parsedIEs->content.iePacket.pTIM->dtimPeriod
-#define UPDATE_ATIM_WINDOW(pSite, pFrame) if ((pFrame)->parsedIEs->content.iePacket.pIBSSParamsSet != NULL) \
- pSite->atimWindow = (pFrame)->parsedIEs->content.iePacket.pIBSSParamsSet->atimWindow
-#define UPDATE_AP_TX_POWER(pSite, pFrame) if ((pFrame)->parsedIEs->content.iePacket.TPCReport != NULL) \
- pSite->APTxPower = (pFrame)->parsedIEs->content.iePacket.TPCReport->transmitPower
-#define UPDATE_BSS_TYPE(pSite, pFrame) pSite->bssType = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_ESS_SHIFT) & CAP_ESS_MASK) ? BSS_INFRASTRUCTURE : BSS_INDEPENDENT
-#define UPDATE_RSN_IE(pScanResultTable, pSite, pNewRsnIe, newRsnIeLen) if ((pNewRsnIe) != NULL) { \
- TI_UINT8 length=0, index=0;\
- dot11_RSN_t *pTempRsnIe = (pNewRsnIe); \
- (pSite)->rsnIeLen = (newRsnIeLen);\
- while ((length < (pSite)->rsnIeLen) && (index < MAX_RSN_IE)) {\
- (pSite)->pRsnIe[index].hdr[0] = pTempRsnIe->hdr[0];\
- (pSite)->pRsnIe[index].hdr[1] = pTempRsnIe->hdr[1];\
- os_memoryCopy(pScanResultTable->hOS, (void *)(pSite)->pRsnIe[index].rsnIeData, (void *)pTempRsnIe->rsnIeData, pTempRsnIe->hdr[1]);\
- length += (pTempRsnIe->hdr[1]+2); \
- pTempRsnIe += 1; \
- index++;}\
- } \
- else {pSite->rsnIeLen = 0;}
-#define UPDATE_BEACON_TIMESTAMP(pScanResultTable, pSite, pFrame) os_memoryCopy(pScanResultTable->hOS, pSite->tsfTimeStamp, (void *)(pFrame)->parsedIEs->content.iePacket.timestamp, TIME_STAMP_LEN)
-
-/* Updated from beacons */
-#define UPDATE_BEACON_MODULATION(pSite, pFrame) pSite->beaconModulation = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_PBCC_SHIFT) & CAP_PBCC_MASK) ? DRV_MODULATION_PBCC : DRV_MODULATION_CCK
-#define UPDATE_BEACON_RECV(pSite) pSite->beaconRecv = TI_TRUE
-
-/* Updated from probes */
-#define UPDATE_PROBE_MODULATION(pSite, pFrame) pSite->probeModulation = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_PBCC_SHIFT) & CAP_PBCC_MASK) ? DRV_MODULATION_PBCC : DRV_MODULATION_CCK
-#define UPDATE_PROBE_RECV(pSite) pSite->probeRecv = TI_TRUE
-#define UPDATE_APSD(pSite, pFrame) if ((pFrame)->parsedIEs->content.iePacket.WMEParams == NULL) \
- (pSite)->APSDSupport = ((((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_APSD_SHIFT) & CAP_APSD_MASK) ? TI_TRUE : TI_FALSE); \
- else \
- pSite->APSDSupport = (((((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_APSD_SHIFT) & CAP_APSD_MASK) ? TI_TRUE : TI_FALSE) || \
- ((((pFrame)->parsedIEs->content.iePacket.WMEParams->ACInfoField >> AP_QOS_INFO_UAPSD_SHIFT) & AP_QOS_INFO_UAPSD_MASK) ? TI_TRUE : TI_FALSE));
-#define UPDATE_PREAMBLE(pSite, pFrame) { (pSite)->currentPreambleType = (((pFrame)->parsedIEs->content.iePacket.capabilities >> CAP_PREAMBLE_SHIFT) & CAP_PREAMBLE_MASK) ? PREAMBLE_SHORT : PREAMBLE_LONG; \
- (pSite)->barkerPreambleType = (pFrame)->parsedIEs->content.iePacket.barkerPreambleMode; }
-#define UPDATE_QOS(pSite, pFrame) if ( ((pFrame)->parsedIEs->content.iePacket.WMEParams != NULL) && \
- (((((pFrame)->parsedIEs->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK) != pSite->lastWMEParameterCnt) || (!pSite->WMESupported)) ) \
- pSite->WMESupported = TI_TRUE; \
- else \
- pSite->WMESupported = TI_FALSE;
-#define UPDATE_FRAME_BUFFER(pScanResultTable, pBuffer, uLength, pFrame) if (pFrame->bufferLength < MAX_BEACON_BODY_LENGTH) \
- { \
- os_memoryCopy (pScanResultTable->hOS, pBuffer, pFrame->buffer, pFrame->bufferLength); \
- uLength = pFrame->bufferLength; \
- }
-#define UPDATE_RSSI(pSite, pFrame) (pSite)->rssi = (pFrame)->rssi;
-#define UPDATE_SNR(pSite, pFrame) (pSite)->snr = (pFrame)->snr;
-#define UPDATE_RATE(pSite, pFrame) if ((DRV_RATE_1M <= (pFrame)->rate) && (DRV_RATE_54M <= (pFrame)->rate)) \
- (pSite)->rxRate = (pFrame)->rate;
-#define UPDATE_UNKOWN_IE(pScanResultTable, pSite, pNewUnknwonIe, newUnknwonIeLen) if ((pNewUnknwonIe) != NULL) { \
- pSite->unknownIeLen = newUnknwonIeLen; \
- os_memoryCopy(pScanResultTable->hOS, \
- (void *)(pSite->pUnknownIe), \
- pNewUnknwonIe, \
- newUnknwonIeLen); \
- } else { \
- pSite->unknownIeLen = 0; \
- }
-
-
-typedef struct
-{
- TI_HANDLE hOS; /**< Handle to the OS object */
- TI_HANDLE hReport; /**< handle to the report object */
- TI_HANDLE hSiteMgr; /**< Handle to the site manager object */
- TSiteEntry *pTable; /**< site table */
- TI_UINT32 uCurrentSiteNumber; /**< number of sites currently in the table */
- TI_UINT32 uEntriesNumber; /**< max size of the table */
- TI_UINT32 uIterator; /**< table iterator used for getFirst / getNext */
- TI_UINT32 uSraThreshold; /**< Rssi threshold for frame filtering */
- TI_BOOL bStable; /**< table status (updating / stable) */
- EScanResultTableClear eClearTable; /** inicates if table should be cleared at scan */
-} TScanResultTable;
-
-static TSiteEntry *scanResultTbale_AllocateNewEntry (TI_HANDLE hScanResultTable);
-static void scanResultTable_UpdateSiteData (TI_HANDLE hScanResultTable, TSiteEntry *pSite, TScanFrameInfo *pFrame);
-static void scanResultTable_updateRates(TI_HANDLE hScanResultTable, TSiteEntry *pSite, TScanFrameInfo *pFrame);
-static void scanResultTable_UpdateWSCParams (TSiteEntry *pSite, TScanFrameInfo *pFrame);
-static TI_STATUS scanResultTable_CheckRxSignalValidity(TScanResultTable *pScanResultTable, siteEntry_t *pSite, TI_INT8 rxLevel, TI_UINT8 channel);
-static void scanResultTable_RemoveEntry(TI_HANDLE hScanResultTable, TI_UINT32 uIndex);
-
-
-/**
- * \fn scanResultTable_Create
- * \brief Create a scan result table object.
- *
- * Create a scan result table object. Allocate system resources.
- *
- * \note
- * \param hOS - handle to the OS object
- * \return Handle to the newly created scan result table object, NULL if an error occured.
- * \sa scanResultTable_Init, scanResultTable_Destroy
- */
-TI_HANDLE scanResultTable_Create (TI_HANDLE hOS, TI_UINT32 uEntriesNumber)
-{
- TScanResultTable *pScanResultTable = NULL;
-
- /* Allocate object storage */
- pScanResultTable = (TScanResultTable*)os_memoryAlloc (hOS, sizeof(TScanResultTable));
- if (NULL == pScanResultTable)
- {
- /* because the malloc failure here the TRACEx can not be used (no pointer for the 1st parameter to TRACEx) */
- WLAN_OS_REPORT(("scanResultTable_Create: Unable to allocate memory for pScanResultTable of %d bytes\n",
- sizeof (TScanResultTable)));
- return NULL; /* this is done similarly to the next error case */
- }
-
- pScanResultTable->hOS = hOS;
- /* allocate memory for sites' data */
- pScanResultTable->pTable =
- (TSiteEntry *)os_memoryAlloc (pScanResultTable->hOS, sizeof (TSiteEntry) * uEntriesNumber);
- if (NULL == pScanResultTable->pTable)
- {
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_ERROR ,
- "scanResultTable_Create: Unable to allocate memory for %d entries of %d bytes\n",
- uEntriesNumber , sizeof (TSiteEntry));
- os_memoryFree(pScanResultTable->hOS, pScanResultTable, sizeof(TScanResultTable));
- return NULL;
- }
- pScanResultTable->uEntriesNumber = uEntriesNumber;
- os_memoryZero(pScanResultTable->hOS, pScanResultTable->pTable, sizeof(TSiteEntry) * uEntriesNumber);
- return (TI_HANDLE)pScanResultTable;
-}
-
-/**
- * \fn scanResultTable_Init
- * \brief Initializes the scan result table object
- *
- * Initializes the scan result table object. Set handles to other objects.
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pStadHandles - modules handles table
- * \param eClearTable - indicates if the table should be cleared, used when a frame arrives
- * or setStable is called and the table is in stable state
- * \return None
- * \sa scanResultTable_Create
- */
-void scanResultTable_Init (TI_HANDLE hScanResultTable, TStadHandlesList *pStadHandles, EScanResultTableClear eClearTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
-
- /* set handles to other modules */
- pScanResultTable->hReport = pStadHandles->hReport;
- pScanResultTable->hSiteMgr = pStadHandles->hSiteMgr;
-
- /* initialize other parameters */
- pScanResultTable->uCurrentSiteNumber = 0;
- pScanResultTable->bStable = TI_TRUE;
- pScanResultTable->uIterator = 0;
- pScanResultTable->eClearTable = eClearTable;
- /* default Scan Result Aging threshold is 60 second */
- pScanResultTable->uSraThreshold = 60;
-}
-
-
-/**
- * \fn scanResultTable_Destroy
- * \brief Destroys the scan result table object
- *
- * Destroys the scan result table object. Release system resources
- *
- * \param hScanResultTable - handle to the scan result table object
- * \return None
- * \sa scanResultTable_Create
- */
-void scanResultTable_Destroy (TI_HANDLE hScanResultTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
-
- /* if the table memory has already been allocated */
- if (NULL != pScanResultTable->pTable)
- {
- /* free table memory */
- os_memoryFree (pScanResultTable->hOS, (void*)pScanResultTable->pTable,
- sizeof (TSiteEntry) * pScanResultTable->uEntriesNumber);
- }
-
- /* free scan result table object memeory */
- os_memoryFree (pScanResultTable->hOS, (void*)hScanResultTable, sizeof (TScanResultTable));
-}
-
-/**
- * \fn scanResultTable_SetSraThreshold
- * \brief set Scan Result Aging threshold
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param uSraThreshold - Scan Result Aging threshold
- * \return None
- * \sa scanResultTable_performAging
- */
-void scanResultTable_SetSraThreshold(TI_HANDLE hScanResultTable, TI_UINT32 uSraThreshold)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- pScanResultTable->uSraThreshold = uSraThreshold;
-}
-
-/**
- * \fn scanResultTable_UpdateEntry
- * \brief Update or insert a site data.
- *
- * Update a site's data in the table if it already exists, or create an entry if the site doesn't exist.
- * If the table is in stable state, will move it to updating state and clear its contents if bClearTable
- * is eClearTable.
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pBssid - a pointer to the site BSSID
- * \param pframe - a pointer to the received frame data
- * \return TI_OK if entry was inseretd or updated successfuly, TI_NOK if table is full
- * \sa scanResultTable_SetStableState
- */
-TI_STATUS scanResultTable_UpdateEntry (TI_HANDLE hScanResultTable, TMacAddr *pBssid, TScanFrameInfo* pFrame)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TSiteEntry *pSite;
- TSsid tTempSsid;
-
- TRACE6(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_UpdateEntry: Adding or updating BBSID: %02x:%02x:%02x:%02x:%02x:%02x\n", (*pBssid)[ 0 ], (*pBssid)[ 1 ], (*pBssid)[ 2 ], (*pBssid)[ 3 ], (*pBssid)[ 4 ], (*pBssid)[ 5 ]);
-
- /* check if the table is in stable state */
- if (TI_TRUE == pScanResultTable->bStable)
- {
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_UpdateEntry: table is stable, clearing table and moving to updating state\n");
- /* move the table to updating state */
- pScanResultTable->bStable = TI_FALSE;
-
- if (SCAN_RESULT_TABLE_CLEAR == pScanResultTable->eClearTable)
- {
- /* clear table contents */
- pScanResultTable->uCurrentSiteNumber = 0;
- }
- }
-
- /* Verify that the SSID IE is available (if not return NOK) */
- if (NULL == pFrame->parsedIEs->content.iePacket.pSsid)
- {
- TRACE6(pScanResultTable->hReport, REPORT_SEVERITY_WARNING, "scanResultTable_UpdateEntry: can't add site %02d:%02d:%02d:%02d:%02d:%02d" " because SSID IE is NULL\n", pBssid[ 0 ], pBssid[ 1 ], pBssid[ 2 ], pBssid[ 3 ], pBssid[ 4 ], pBssid[ 5 ]);
- return TI_NOK;
- }
-
- /* use temporary SSID structure, and verify SSID length */
- tTempSsid.len = pFrame->parsedIEs->content.iePacket.pSsid->hdr[1];
- if (tTempSsid.len > MAX_SSID_LEN)
- {
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_WARNING, "scanResultTable_UpdateEntry: SSID len=%d out of range. replaced by %d\n", tTempSsid.len, MAX_SSID_LEN);
- return TI_NOK;
- }
- os_memoryCopy(pScanResultTable->hOS,
- (void *)&(tTempSsid.str[ 0 ]),
- (void *)&(pFrame->parsedIEs->content.iePacket.pSsid->serviceSetId[ 0 ]),
- tTempSsid.len);
- if (MAX_SSID_LEN > tTempSsid.len)
- tTempSsid.str[ tTempSsid.len ] ='\0';
-
- /* check if the SSID:BSSID pair already exists in the table */
- pSite = scanResultTable_GetBySsidBssidPair (hScanResultTable, &tTempSsid ,pBssid);
- if (NULL != pSite)
- {
- if (TI_NOK != scanResultTable_CheckRxSignalValidity(pScanResultTable, pSite, pFrame->rssi, pFrame->channel))
- {
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_UpdateEntry: entry already exists, updating\n");
- /* BSSID exists: update its data */
- scanResultTable_UpdateSiteData (hScanResultTable, pSite, pFrame);
- }
- }
- else
- {
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_UpdateEntry: entry doesn't exist, allocating a new entry\n");
- /* BSSID doesn't exist: allocate a new entry for it */
- pSite = scanResultTbale_AllocateNewEntry (hScanResultTable);
- if (NULL == pSite)
- {
- TRACE6(pScanResultTable->hReport, REPORT_SEVERITY_WARNING , "scanResultTable_UpdateEntry: can't add site %02d:%02d:%02d:%02d:%02d:%02d" " because table is full\n", pBssid[ 0 ], pBssid[ 1 ], pBssid[ 2 ], pBssid[ 3 ], pBssid[ 4 ], pBssid[ 5 ]);
- return TI_NOK;
- }
-
- /* and update its data */
- scanResultTable_UpdateSiteData (hScanResultTable,
- pSite,
- pFrame);
- }
-
- return TI_OK;
-}
-
-/**
- * \fn scanResultTable_SetStableState
- * \brief Moves the table to stable state
- *
- * Moves the table to stable state. Also clears the tabel contents if required.
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param eClearTable - indicates if the table should be cleared in case the table
- * is in stable state (no result where received in last scan).
- * \return None
- * \sa scanResultTable_UpdateEntry
- */
-void scanResultTable_SetStableState (TI_HANDLE hScanResultTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
-
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_SetStableState: setting stable state\n");
-
- /* if also asked to clear the table, if it is at Stable mode means that no results were received, clear it! */
- if ((TI_TRUE == pScanResultTable->bStable) && (SCAN_RESULT_TABLE_CLEAR == pScanResultTable->eClearTable))
- {
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_SetStableState: also clearing table contents\n");
-
- pScanResultTable->uCurrentSiteNumber = 0;
- }
-
- /* set stable state */
- pScanResultTable->bStable = TI_TRUE;
-
-}
-
-/**
- * \fn scanResultTable_GetFirst
- * \brief Retrieves the first entry in the table
- *
- * Retrieves the first entry in the table
- *
- * \param hScanResultTable - handle to the scan result table object
- * \return A pointer to the first entry in the table, NULL if the table is empty
- * \sa scanResultTable_GetNext
- */
-TSiteEntry *scanResultTable_GetFirst (TI_HANDLE hScanResultTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
-
- /* initialize the iterator to point at the first site */
- pScanResultTable->uIterator = 0;
-
- /* and return the next entry... */
- return scanResultTable_GetNext (hScanResultTable);
-}
-
-/**
- * \fn scanResultTable_GetNext
- * \brief Retreives the next entry in the table
- *
- * Retreives the next entry in the table, until table is exhusted. A call to scanResultTable_GetFirst
- * must preceed a sequence of calls to this function.
- *
- * \param hScanResultTable - handle to the scan result table object
- * \return A pointer to the next entry in the table, NULL if the table is exhsuted
- * \sa scanResultTable_GetFirst
- */
-TSiteEntry *scanResultTable_GetNext (TI_HANDLE hScanResultTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
-
- /* if the iterator points to a site behind current table storage, return error */
- if (pScanResultTable->uCurrentSiteNumber <= pScanResultTable->uIterator)
- {
- return NULL;
- }
-
- return &(pScanResultTable->pTable[ pScanResultTable->uIterator++ ]);
-}
-
-/**
- * \fn scanResultTable_GetByBssid
- * \brief retreives an entry according to its SSID and BSSID
- *
- * retreives an entry according to its BSSID
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pSsid - SSID to search for
- * \param pBssid - BSSID to search for
- * \return A pointer to the entry with macthing BSSID, NULL if no such entry was found.
- */
-TSiteEntry *scanResultTable_GetBySsidBssidPair (TI_HANDLE hScanResultTable, TSsid *pSsid, TMacAddr *pBssid)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TI_UINT32 uIndex;
-
- TRACE6(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBySsidBssidPair: Searching for SSID BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", (*pBssid)[ 0 ], (*pBssid)[ 1 ], (*pBssid)[ 2 ], (*pBssid)[ 3 ], (*pBssid)[ 4 ], (*pBssid)[ 5 ]);
-
- /* check all entries in the table */
- for (uIndex = 0; uIndex < pScanResultTable->uCurrentSiteNumber; uIndex++)
- {
- /* if the BSSID and SSID match */
- if (MAC_EQUAL (*pBssid, pScanResultTable->pTable[ uIndex ].bssid) &&
- ((pSsid->len == pScanResultTable->pTable[ uIndex ].ssid.len) &&
- (0 == os_memoryCompare (pScanResultTable->hOS, (TI_UINT8 *)(&(pSsid->str[ 0 ])),
- (TI_UINT8 *)(&(pScanResultTable->pTable[ uIndex ].ssid.str[ 0 ])),
- pSsid->len))))
- {
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "Entry found at index %d\n", uIndex);
- return &(pScanResultTable->pTable[ uIndex ]);
- }
- }
-
- /* site wasn't found: return NULL */
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBySsidBssidPair: Entry was not found\n");
- return NULL;
-}
-
-/**
- * \fn scanResultTable_FindHidden
- * \brief find entry with hidden SSID anfd return it's index
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param uHiddenSsidIndex - entry index to return
- * \return TI_OK if found, TI_NOT if not.
- */
-static TI_STATUS scanResultTable_FindHidden (TScanResultTable *pScanResultTable, TI_UINT32 *uHiddenSsidIndex)
-{
- TI_UINT32 uIndex;
-
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_FindHidden: Searching for hidden SSID\n");
-
- /* check all entries in the table */
- for (uIndex = 0; uIndex < pScanResultTable->uCurrentSiteNumber; uIndex++)
- {
- /* check if entry is with hidden SSID */
- if ( (pScanResultTable->pTable[ uIndex ].ssid.len == 0) ||
- ((pScanResultTable->pTable[ uIndex ].ssid.len == 1) && (pScanResultTable->pTable[ uIndex ].ssid.str[0] == 0)))
- {
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_FindHidden: Entry found at index %d\n", uIndex);
- *uHiddenSsidIndex = uIndex;
- return TI_OK;
- }
- }
-
- /* site wasn't found: return NULL */
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_FindHidden: Entry was not found\n");
- return TI_NOK;
-}
-
-/**
- * \fn scanResultTable_performAging
- * \brief Deletes from table all entries which are older than the Sra threshold
- *
- * \param hScanResultTable - handle to the scan result table object
- * \return None
- * \sa scanResultTable_SetSraThreshold
- */
-void scanResultTable_PerformAging(TI_HANDLE hScanResultTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TI_UINT32 uIndex = 0;
-
- /* check all entries in the table */
- while (uIndex < pScanResultTable->uCurrentSiteNumber)
- {
- /* check if the entry's age is old if it remove it */
- if (pScanResultTable->pTable[uIndex].localTimeStamp <
- os_timeStampMs(pScanResultTable->hOS) - MILISECONDS(pScanResultTable->uSraThreshold))
- {
- /* The removeEntry places the last entry instead of the deleted entry
- * in order to preserve the table's continuity. For this reason the
- * uIndex is not incremented because we want to check the entry that
- * was placed instead of the entry deleted */
- scanResultTable_RemoveEntry(hScanResultTable, uIndex);
- }
- else
- {
- /* If the entry was not deleted check the next entry */
- uIndex++;
- }
- }
-}
-
-/**
- * \fn scanResultTable_removeEntry
- * \brief Deletes entry from table
- * the function keeps a continuty in the table by copying the last
- * entry in the table to the place the entry was deleted from
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param uIndex - index of the entry to be deleted
- * \return TI_OK if entry deleted successfully TI_NOK otherwise
- */
-void scanResultTable_RemoveEntry(TI_HANDLE hScanResultTable, TI_UINT32 uIndex)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
-
- if (uIndex >= pScanResultTable->uCurrentSiteNumber)
- {
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_ERROR , "scanResultTable_removeEntry: %d out of bound entry index\n", uIndex);
- return;
- }
-
- /* if uIndex is not the last entry, then copy the last entry in the table to the uIndex entry */
- if (uIndex < (pScanResultTable->uCurrentSiteNumber - 1))
- {
- os_memoryCopy(pScanResultTable->hOS,
- &(pScanResultTable->pTable[uIndex]),
- &(pScanResultTable->pTable[pScanResultTable->uCurrentSiteNumber - 1]),
- sizeof(TSiteEntry));
- }
-
- /* clear the last entry */
- os_memoryZero(pScanResultTable->hOS, &(pScanResultTable->pTable[pScanResultTable->uCurrentSiteNumber - 1]), sizeof(TSiteEntry));
- /* decrease the current table size */
- pScanResultTable->uCurrentSiteNumber--;
-}
-
-/**
- * \fn scanresultTbale_AllocateNewEntry
- * \brief Allocates an empty entry for a new site
- *
- * Function Allocates an empty entry for a new site (and nullfiies required entry fields)
- *
- * \param hScanResultTable - handle to the scan result table object
- * \return Pointer to the site entry (NULL if the table is full)
- */
-TSiteEntry *scanResultTbale_AllocateNewEntry (TI_HANDLE hScanResultTable)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TI_UINT32 uHiddenSsidIndex;
-
- /* if the table is full */
- if (pScanResultTable->uCurrentSiteNumber >= pScanResultTable->uEntriesNumber)
- {
- /* replace hidden SSID entry with the new result */
- if (scanResultTable_FindHidden(pScanResultTable, &uHiddenSsidIndex) == TI_OK)
- {
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTbale_AllocateNewEntry: Table is full, found hidden SSID at index %d to replace with\n", uHiddenSsidIndex);
-
- /* Nullify new site data */
- os_memoryZero(pScanResultTable->hOS, &(pScanResultTable->pTable[ uHiddenSsidIndex ]), sizeof (TSiteEntry));
-
- /* return the site */
- return &(pScanResultTable->pTable[ uHiddenSsidIndex ]);
- }
-
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTbale_AllocateNewEntry: Table is full, no Hidden SSDI to replace, can't allocate new entry\n");
- return NULL;
- }
-
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTbale_AllocateNewEntry: New entry allocated at index %d\n", pScanResultTable->uCurrentSiteNumber);
-
- /* Nullify new site data */
- os_memoryZero(pScanResultTable->hOS, &(pScanResultTable->pTable[ pScanResultTable->uCurrentSiteNumber ]), sizeof (TSiteEntry));
-
- /* return the site (and update site count) */
- pScanResultTable->uCurrentSiteNumber++;
- return &(pScanResultTable->pTable[ pScanResultTable->uCurrentSiteNumber - 1 ]);
-}
-
-/**
- * \fn scanResultTable_UpdateSiteData
- * \brief Update a site entry data from a received frame (beacon or probe response)
- *
- * Update a site entry data from a received frame (beacon or probe response)
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pSite - the site entry to update
- * \param pFrame - the received frame information
- * \return None
- */
-void scanResultTable_UpdateSiteData (TI_HANDLE hScanResultTable, TSiteEntry *pSite, TScanFrameInfo *pFrame)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- paramInfo_t param;
-
- /* Update SSID */
- if (pFrame->parsedIEs->content.iePacket.pSsid != NULL)
- {
- pSite->ssid.len = pFrame->parsedIEs->content.iePacket.pSsid->hdr[1];
- if (pSite->ssid.len > MAX_SSID_LEN)
- {
- TRACE2( pScanResultTable->hReport, REPORT_SEVERITY_ERROR, "scanResultTable_UpdateSiteData: pSite->ssid.len=%d exceeds the limit. Set to limit value %d\n", pSite->ssid.len, MAX_SSID_LEN);
- pSite->ssid.len = MAX_SSID_LEN;
- }
- os_memoryCopy(pScanResultTable->hOS,
- (void *)pSite->ssid.str,
- (void *)pFrame->parsedIEs->content.iePacket.pSsid->serviceSetId,
- pSite->ssid.len);
- if (pSite->ssid.len < MAX_SSID_LEN)
- {
- pSite->ssid.str[pSite->ssid.len] = '\0';
- }
- }
-
- /* Since a new scan was initiated the entry can be selected again */
- pSite->bConsideredForSelect = TI_FALSE;
- UPDATE_LOCAL_TIMESTAMP(pSite, pScanResultTable->hOS);
-
- UPDATE_BSSID (pSite, pFrame);
- UPDATE_BAND (pSite, pFrame);
- UPDATE_BEACON_INTERVAL (pSite, pFrame);
- UPDATE_CAPABILITIES (pSite, pFrame);
- UPDATE_PRIVACY (pSite, pFrame);
- UPDATE_RSN_IE (pScanResultTable, pSite, pFrame->parsedIEs->content.iePacket.pRsnIe, pFrame->parsedIEs->content.iePacket.rsnIeLen);
- UPDATE_APSD (pSite, pFrame);
- UPDATE_PREAMBLE (pSite, pFrame);
- UPDATE_AGILITY (pSite, pFrame);
- UPDATE_RSSI (pSite, pFrame);
- UPDATE_SNR (pSite, pFrame);
- UPDATE_RATE (pSite, pFrame);
- UPDATE_UNKOWN_IE(pScanResultTable, pSite, pFrame->parsedIEs->content.iePacket.pUnknownIe, pFrame->parsedIEs->content.iePacket.unknownIeLen );
-
- param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
- siteMgr_getParam (pScanResultTable->hSiteMgr, &param);
- if (param.content.siteMgrDot11OperationalMode == DOT11_G_MODE)
- {
- UPDATE_SLOT_TIME (pSite, pFrame);
- UPDATE_PROTECTION (pSite, pFrame);
- }
-
- scanResultTable_updateRates (hScanResultTable, pSite, pFrame);
-
- if ((pFrame->parsedIEs->content.iePacket.pDSParamsSet != NULL) &&
- (pFrame->parsedIEs->content.iePacket.pDSParamsSet->currChannel != pFrame->channel))
- {
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_ERROR , "scanResultTable_UpdateSiteData: wrong channels, radio channel=%d, frame channel=%d\n", pFrame->channel, pFrame->parsedIEs->content.iePacket.pDSParamsSet->currChannel);
- }
- else
- UPDATE_CHANNEL (pSite, pFrame , pFrame->channel);
-
- UPDATE_BSS_TYPE (pSite, pFrame);
- UPDATE_ATIM_WINDOW (pSite, pFrame);
- UPDATE_AP_TX_POWER (pSite, pFrame);
- UPDATE_QOS (pSite, pFrame);
- UPDATE_BEACON_TIMESTAMP (pScanResultTable, pSite, pFrame);
- scanResultTable_UpdateWSCParams (pSite, pFrame);
- siteMgr_UpdatHtParams (pScanResultTable->hSiteMgr, pSite, pFrame->parsedIEs);
-
- if (BEACON == pFrame->parsedIEs->subType)
- {
- /* DTIM is only available in beacons */
- if (pSite->bssType == BSS_INFRASTRUCTURE)
- {
- UPDATE_DTIM_PERIOD (pSite, pFrame);
- }
-
- UPDATE_BEACON_MODULATION (pSite, pFrame);
-
- /* If the BSS type is independent, the beacon & probe modulation are equal,
- It is important to update this field here for dynamic PBCC algorithm compatibility */
- if (pSite->bssType == BSS_INDEPENDENT)
- {
- UPDATE_PROBE_MODULATION (pSite, pFrame);
- }
-
- pSite->bChannelSwitchAnnoncIEFound = (pFrame->parsedIEs->content.iePacket.channelSwitch != NULL)?TI_TRUE:TI_FALSE;
-
- UPDATE_BEACON_RECV (pSite);
- UPDATE_FRAME_BUFFER (pScanResultTable, (pSite->beaconBuffer), (pSite->beaconLength), pFrame);
- }
- else if (PROBE_RESPONSE == pFrame->parsedIEs->subType)
- {
- UPDATE_PROBE_MODULATION (pSite, pFrame);
-
- /* If the BSS type is independent, the beacon & probe modulation are equal,
- It is important to update this field here for dynamic PBCC algorithm compatibility */
- if (pSite->bssType == BSS_INDEPENDENT)
- UPDATE_BEACON_MODULATION (pSite, pFrame);
-
- UPDATE_PROBE_RECV (pSite);
- UPDATE_FRAME_BUFFER (pScanResultTable, (pSite->probeRespBuffer), (pSite->probeRespLength), pFrame);
-
- pSite->bChannelSwitchAnnoncIEFound = TI_FALSE;
- }
- else
- {
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_ERROR , "scanResultTable_UpdateSiteData: unknown frame sub type %d\n", pFrame->parsedIEs->subType);
- }
-}
-
-/**
- * \fn scanResultTable_updateRates
- * \brief Update a scan result table entry with rates information
- *
- * Called by the function 'updateSiteInfo()' in order to translate the rates received
- * in the beacon or probe response to rate used by the driver. Perfoms the following:
- * - Check the rates. validity. If rates are invalid, return
- * - Get the max active rate & max basic rate, if invalid, return
- * - Translate the max active rate and max basic rate from network rates to host rates.
- * The max active & max basic rate are used by the driver from now on in all the processes:
- * (selection, join, transmission, etc....)
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pSite - a pointer to the site entry to update
- * \param pFrame - a pointer to the received frame
- * \return None
- * \sa scanResultTable_UpdateSiteData
- */
-void scanResultTable_updateRates(TI_HANDLE hScanResultTable, TSiteEntry *pSite, TScanFrameInfo *pFrame)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TI_UINT8 maxBasicRate = 0, maxActiveRate = 0;
- TI_UINT32 bitMapExtSupp = 0;
- TI_UINT32 uMcsSupportedRateMask = 0, uMcsbasicRateMask = 0;
-
- if (pFrame->parsedIEs->content.iePacket.pRates == NULL)
- {
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_ERROR, "scanResultTable_updateRates, pRates=NULL, beacon & probeResp are:\n");
- TRACE_INFO_HEX(pScanResultTable->hReport, (TI_UINT8*)pFrame->parsedIEs->content.iePacket.pRates, pFrame->parsedIEs->content.iePacket.pRates->hdr[1]+2);
- TRACE_INFO_HEX(pScanResultTable->hReport, (TI_UINT8*)pFrame->parsedIEs->content.iePacket.pRates, pFrame->parsedIEs->content.iePacket.pRates->hdr[1]+2);
- return;
- }
-
- /* Update the rate elements */
- maxBasicRate = (TI_UINT8)rate_GetMaxBasicFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pRates->rates,
- pFrame->parsedIEs->content.iePacket.pRates->hdr[1], (ENetRate)maxBasicRate);
- maxActiveRate = (TI_UINT8)rate_GetMaxActiveFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pRates->rates,
- pFrame->parsedIEs->content.iePacket.pRates->hdr[1], (ENetRate)maxActiveRate);
-
- if (pFrame->parsedIEs->content.iePacket.pExtRates)
- {
- maxBasicRate = (TI_UINT8)rate_GetMaxBasicFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pExtRates->rates,
- pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1], (ENetRate)maxBasicRate);
- maxActiveRate = (TI_UINT8)rate_GetMaxActiveFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pExtRates->rates,
- pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1], (ENetRate)maxActiveRate);
- }
-
- if (maxActiveRate == 0)
- {
- maxActiveRate = maxBasicRate;
- }
-
- /* Now update it from network to host rates */
- pSite->maxBasicRate = rate_NetToDrv (maxBasicRate);
- pSite->maxActiveRate = rate_NetToDrv (maxActiveRate);
- if (pSite->maxActiveRate == DRV_RATE_INVALID)
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_ERROR, "scanResultTable_updateRates: Network To Host Rate failure, no active network rate\n");
-
- if (pSite->maxBasicRate != DRV_RATE_INVALID)
- {
- if (pSite->maxActiveRate != DRV_RATE_INVALID)
- {
- pSite->maxActiveRate = TI_MAX (pSite->maxActiveRate, pSite->maxBasicRate);
- }
- } else { /* in case some vendors don't specify basic rates */
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_WARNING, "scanResultTable_updateRates: Network To Host Rate failure, no basic network rate");
- pSite->maxBasicRate = pSite->maxActiveRate;
- }
-
- /* build rates bit map */
- rate_NetStrToDrvBitmap (&pSite->rateMask.supportedRateMask,
- pFrame->parsedIEs->content.iePacket.pRates->rates,
- pFrame->parsedIEs->content.iePacket.pRates->hdr[1]);
- rate_NetBasicStrToDrvBitmap (&pSite->rateMask.basicRateMask,
- pFrame->parsedIEs->content.iePacket.pRates->rates,
- pFrame->parsedIEs->content.iePacket.pRates->hdr[1]);
-
- if (pFrame->parsedIEs->content.iePacket.pExtRates)
- {
- rate_NetStrToDrvBitmap (&bitMapExtSupp,
- pFrame->parsedIEs->content.iePacket.pExtRates->rates,
- pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1]);
-
- pSite->rateMask.supportedRateMask |= bitMapExtSupp;
-
- rate_NetBasicStrToDrvBitmap (&bitMapExtSupp,
- pFrame->parsedIEs->content.iePacket.pExtRates->rates,
- pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1]);
-
- pSite->rateMask.basicRateMask |= bitMapExtSupp;
- }
-
- if (pFrame->parsedIEs->content.iePacket.pHtCapabilities != NULL)
- {
- /* MCS build rates bit map */
- rate_McsNetStrToDrvBitmap (&uMcsSupportedRateMask,
- (pFrame->parsedIEs->content.iePacket.pHtCapabilities->aHtCapabilitiesIe + DOT11_HT_CAPABILITIES_MCS_RATE_OFFSET));
-
- pSite->rateMask.supportedRateMask |= uMcsSupportedRateMask;
- }
-
- if (pFrame->parsedIEs->content.iePacket.pHtInformation != NULL)
- {
- /* MCS build rates bit map */
- rate_McsNetStrToDrvBitmap (&uMcsbasicRateMask,
- (pFrame->parsedIEs->content.iePacket.pHtInformation->aHtInformationIe + DOT11_HT_INFORMATION_MCS_RATE_OFFSET));
-
- pSite->rateMask.basicRateMask |= uMcsbasicRateMask;
- }
-}
-
-/**
- * \fn scanResultTable_UpdateWSCParams
- * \brief Update a scan result table entry with WSC information
- *
- * Update a scan result table entry with WSC information
- *
- * \param pSite - a pointer to the site entry to update
- * \param pFrame - a pointer to the received frame
- * \return None
- * \sa scanResultTable_UpdateSiteData
- */
-void scanResultTable_UpdateWSCParams (TSiteEntry *pSite, TScanFrameInfo *pFrame)
-{
- /* if the IE is not null => the WSC is on - check which method is supported */
- if (pFrame->parsedIEs->content.iePacket.WSCParams != NULL)
- {
- TI_UINT8 *tlvPtr,*endPtr;
- TI_UINT16 tlvPtrType,tlvPtrLen,selectedMethod=0;
-
- tlvPtr = (TI_UINT8*)pFrame->parsedIEs->content.iePacket.WSCParams->WSCBeaconOrProbIE;
- endPtr = tlvPtr + pFrame->parsedIEs->content.iePacket.WSCParams->hdr[1] - DOT11_OUI_LEN;
-
- do
- {
- tlvPtrType = WLANTOHS (WLAN_WORD(tlvPtr));
-
- if (tlvPtrType == DOT11_WSC_DEVICE_PASSWORD_ID)
- {
- tlvPtr+=2;
- tlvPtr+=2;
- selectedMethod = WLANTOHS (WLAN_WORD(tlvPtr));
- break;
- }
- else
- {
- tlvPtr+=2;
- tlvPtrLen = WLANTOHS (WLAN_WORD(tlvPtr));
- tlvPtr+=tlvPtrLen+2;
- }
- } while ((tlvPtr < endPtr) && (selectedMethod == 0));
-
- if (tlvPtr > endPtr)
- {
- pSite->WSCSiteMode = TIWLN_SIMPLE_CONFIG_OFF;
- return;
- }
-
- if (selectedMethod == DOT11_WSC_DEVICE_PASSWORD_ID_PIN)
- pSite->WSCSiteMode = TIWLN_SIMPLE_CONFIG_PIN_METHOD;
- else if (selectedMethod == DOT11_WSC_DEVICE_PASSWORD_ID_PBC)
- pSite->WSCSiteMode = TIWLN_SIMPLE_CONFIG_PBC_METHOD;
- else
- pSite->WSCSiteMode = TIWLN_SIMPLE_CONFIG_OFF;
- }
- else
- {
- pSite->WSCSiteMode = TIWLN_SIMPLE_CONFIG_OFF;
- }
-}
-
-/**
- * \fn scanResultTable_GetNumOfBSSIDInTheList
- * \brief Returns the number of BSSID's in the scan result list
- *
- * \param hScanResultTable - handle to the scan result table
- * \return The number of BSSID's in the list
- * \sa scanResultTable_GetBssidSupportedRatesList
- */
-TI_UINT32 scanResultTable_GetNumOfBSSIDInTheList (TI_HANDLE hScanResultTable)
-{
- return ((TScanResultTable*)hScanResultTable)->uCurrentSiteNumber;
-}
-
-/**
- * \fn scanResultTable_CalculateBssidListSize
- * \brief Calculates the size required for BSSID list storage
- *
- * Calculates the size required for BSSID list storage
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param bAllVarIes - whether to include all variable size IEs
- * \return The total length required
- * \sa scanResultTable_GetBssidList
- */
-TI_UINT32 scanResultTable_CalculateBssidListSize (TI_HANDLE hScanResultTable, TI_BOOL bAllVarIes)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TI_UINT32 uSiteIndex, uSiteLength, uLength = 0;
- TSiteEntry *pSiteEntry;
-
- /* set the length of the list header (sites count) */
- uLength = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX);
-
- /* check lengthes of all sites in the table */
- for (uSiteIndex = 0; uSiteIndex < pScanResultTable->uCurrentSiteNumber; uSiteIndex++)
- {
- pSiteEntry = &(pScanResultTable->pTable[ uSiteIndex ]);
- /* if full list is requested */
- if (bAllVarIes)
- {
- /* set length of all IEs for this site */
- uSiteLength = sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs);
- /* and add beacon or probe response length */
- if (TI_TRUE == pSiteEntry->probeRecv)
- {
- uSiteLength += pSiteEntry->probeRespLength;
- }
- else
- {
- uSiteLength += pSiteEntry->beaconLength;
- }
-
- }
- /* partial list is requested */
- else
- {
- uSiteLength = (sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs) +
- (pSiteEntry->ssid.len + 2) + (DOT11_MAX_SUPPORTED_RATES + 2) +
- + (DOT11_DS_PARAMS_ELE_LEN +2) + pSiteEntry->rsnIeLen + pSiteEntry->unknownIeLen);
-
- /* QOS_WME information element */
- if (pSiteEntry->WMESupported)
- {
- /* length of element + header */
- uSiteLength += (DOT11_WME_PARAM_ELE_LEN + 2);
- }
- }
-
- /* make sure length is 4 bytes aligned */
- if (uSiteLength % 4)
- {
- uSiteLength += (4 - (uSiteLength % 4));
- }
-
- /* add this site length to the total length */
- uLength += uSiteLength;
-
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_calculateBssidListSize: BSSID length=%d on site index %d\n", uSiteLength, uSiteIndex);
- }
-
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_calculateBssidListSize: total length=%d \n", uLength);
-
- return uLength;
-}
-
-/**
- * \fn scanResultTable_GetBssidList
- * \brief Retrieves the site table content
- *
- * Retrieves the site table content
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pBssidList - pointer to a buffer large enough to hols the BSSID list
- * \param plength - length of the supplied buffer, will be overwritten with the actual list length
- * \param bAllVarIes - whether to include all variable size IEs
- * \return None
- * \sa scanResultTable_CalculateBssidListSize
- */
-TI_STATUS scanResultTable_GetBssidList (TI_HANDLE hScanResultTable,
- OS_802_11_BSSID_LIST_EX *pBssidList,
- TI_UINT32 *pLength,
- TI_BOOL bAllVarIes)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TI_UINT32 uLength, uSiteIndex, rsnIndex, rsnIeLength, len, firstOFDMloc = 0;
- TSiteEntry *pSiteEntry;
- OS_802_11_BSSID_EX *pBssid;
- OS_802_11_FIXED_IEs *pFixedIes;
- OS_802_11_VARIABLE_IEs *pVarIes;
- TI_UINT8 *pData;
-
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList called, pBssidList= 0x%p, pLength=%d\n", pBssidList, *pLength);
-
- /* verify the supplied length is enough */
- uLength = scanResultTable_CalculateBssidListSize (hScanResultTable, bAllVarIes);
- if (uLength > *pLength)
- {
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_ERROR , "scanResultTable_GetBssidList: received length %d, insufficient to hold list of size %d\n", *pLength, uLength);
- *pLength = uLength;
- return TI_NOK;
- }
-#ifdef TI_DBG
- else
- {
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList: supplied length: %d, required length: %d\n", *pLength, uLength);
- }
-#endif
-
- /* Nullify number of items in the BSSID list */
- pBssidList->NumberOfItems = 0;
-
- /* set length to list header size (only list count) */
- uLength = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX);
-
- /* set data pointer to first item in list */
- pData = (TI_UINT8*)&(pBssidList->Bssid[0]);
-
- for (uSiteIndex = 0; uSiteIndex < pScanResultTable->uCurrentSiteNumber; uSiteIndex++)
- {
- /* set BSSID entry pointer to current location in buffer */
- pBssid = (OS_802_11_BSSID_EX*)pData;
-
- /* set pointer to site entry */
- pSiteEntry = &(pScanResultTable->pTable[ uSiteIndex ]);
-
- TRACE7(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList: copying entry at index %d, BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", uSiteIndex, pSiteEntry->bssid[ 0 ], pSiteEntry->bssid[ 1 ], pSiteEntry->bssid[ 2 ], pSiteEntry->bssid[ 3 ], pSiteEntry->bssid[ 4 ], pSiteEntry->bssid[ 5 ]);
-
- /* start copy stuff: */
- /* MacAddress */
- MAC_COPY (pBssid->MacAddress, pSiteEntry->bssid);
-
- /* Capabilities */
- pBssid->Capabilities = pSiteEntry->capabilities;
-
- /* SSID */
- os_memoryZero (pScanResultTable->hOS, &(pBssid->Ssid.Ssid), MAX_SSID_LEN);
- if (pSiteEntry->ssid.len > MAX_SSID_LEN)
- {
- pSiteEntry->ssid.len = MAX_SSID_LEN;
- }
- os_memoryCopy (pScanResultTable->hOS,
- (void *)pBssid->Ssid.Ssid,
- (void *)pSiteEntry->ssid.str,
- pSiteEntry->ssid.len);
- pBssid->Ssid.SsidLength = pSiteEntry->ssid.len;
-
- /* privacy */
- pBssid->Privacy = pSiteEntry->privacy;
-
- /* RSSI */
- pBssid->Rssi = pSiteEntry->rssi;
-
- pBssid->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
- pBssid->Configuration.BeaconPeriod = pSiteEntry->beaconInterval;
- pBssid->Configuration.ATIMWindow = pSiteEntry->atimWindow;
- pBssid->Configuration.Union.channel = Chan2Freq(pSiteEntry->channel);
-
- if (pSiteEntry->bssType == BSS_INDEPENDENT)
- pBssid->InfrastructureMode = os802_11IBSS;
- else
- pBssid->InfrastructureMode = os802_11Infrastructure;
- /* Supported Rates */
- os_memoryZero (pScanResultTable->hOS, (void *)pBssid->SupportedRates, sizeof(OS_802_11_RATES_EX));
- rate_DrvBitmapToNetStr (pSiteEntry->rateMask.supportedRateMask,
- pSiteEntry->rateMask.basicRateMask,
- (TI_UINT8*)pBssid->SupportedRates,
- &len,
- &firstOFDMloc);
-
- /* set network type acording to band and rates */
- if (RADIO_BAND_2_4_GHZ == pSiteEntry->eBand)
- {
- if (firstOFDMloc == len)
- {
- pBssid->NetworkTypeInUse = os802_11DS;
- } else {
- pBssid->NetworkTypeInUse = os802_11OFDM24;
- }
- }
- else
- {
- pBssid->NetworkTypeInUse = os802_11OFDM5;
- }
-
- /* start copy IE's: first nullify length */
- pBssid->IELength = 0;
-
- /* copy fixed IEs from site entry */
- pFixedIes = (OS_802_11_FIXED_IEs*)&(pBssid->IEs[ pBssid->IELength ]);
- os_memoryCopy (pScanResultTable->hOS, (void*)pFixedIes->TimeStamp,
- &(pSiteEntry->tsfTimeStamp[ 0 ]), TIME_STAMP_LEN);
- pFixedIes->BeaconInterval = pSiteEntry->beaconInterval;
- pFixedIes->Capabilities = pSiteEntry->capabilities;
- pBssid->IELength += sizeof(OS_802_11_FIXED_IEs);
-
- /* set pointer for variable length IE's */
- pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]);
-
- if (!bAllVarIes)
- { /* copy only some variable IEs */
-
- /* copy SSID */
- pVarIes->ElementID = SSID_IE_ID;
- pVarIes->Length = pSiteEntry->ssid.len;
- os_memoryCopy (pScanResultTable->hOS,
- (void *)pVarIes->data,
- (void *)pSiteEntry->ssid.str,
- pSiteEntry->ssid.len);
- pBssid->IELength += (pVarIes->Length + 2);
-
- /* copy RATES */
- pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]);
- pVarIes->ElementID = SUPPORTED_RATES_IE_ID;
- rate_DrvBitmapToNetStr (pSiteEntry->rateMask.supportedRateMask,
- pSiteEntry->rateMask.basicRateMask,
- (TI_UINT8 *)pVarIes->data,
- &len,
- &firstOFDMloc);
- pVarIes->Length = len;
- pBssid->IELength += (pVarIes->Length + 2);
-
- /* copy DS */
- pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]);
- pVarIes->ElementID = DS_PARAMETER_SET_IE_ID;
- pVarIes->Length = DOT11_DS_PARAMS_ELE_LEN;
- os_memoryCopy (pScanResultTable->hOS, (void *)pVarIes->data,
- &(pSiteEntry->channel), DOT11_DS_PARAMS_ELE_LEN);
- pBssid->IELength += (pVarIes->Length + 2);
-
- /* copy RSN information elements */
- if (0 < pSiteEntry->rsnIeLen)
- {
- rsnIeLength = 0;
- for (rsnIndex=0; rsnIndex < MAX_RSN_IE && pSiteEntry->pRsnIe[ rsnIndex ].hdr[1] > 0; rsnIndex++)
- {
- pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength + rsnIeLength ]);
- pVarIes->ElementID = pSiteEntry->pRsnIe[ rsnIndex ].hdr[0];
- pVarIes->Length = pSiteEntry->pRsnIe[ rsnIndex ].hdr[1];
- os_memoryCopy (pScanResultTable->hOS, (void *)pVarIes->data,
- (void *)pSiteEntry->pRsnIe[ rsnIndex ].rsnIeData,
- pSiteEntry->pRsnIe[ rsnIndex ].hdr[1]);
- rsnIeLength += pSiteEntry->pRsnIe[ rsnIndex ].hdr[1] + 2;
- }
- pBssid->IELength += pSiteEntry->rsnIeLen;
- }
-
- /* QOS_WME/XCC */
- if (TI_TRUE == pSiteEntry->WMESupported)
- {
- /* oui */
- TI_UINT8 ouiWME[3] = {0x50, 0xf2, 0x01};
- dot11_WME_PARAM_t *pWMEParams;
-
- /* fill in the general element parameters */
- pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]);
- pVarIes->ElementID = DOT11_WME_ELE_ID;
- pVarIes->Length = DOT11_WME_PARAM_ELE_LEN;
-
- /* fill in the specific element parameters */
- pWMEParams = (dot11_WME_PARAM_t*)pVarIes;
- os_memoryCopy (pScanResultTable->hOS, (void *)pWMEParams->OUI, ouiWME, 3);
- pWMEParams->OUIType = dot11_WME_OUI_TYPE;
- pWMEParams->OUISubType = dot11_WME_OUI_SUB_TYPE_PARAMS_IE;
- pWMEParams->version = dot11_WME_VERSION;
- pWMEParams->ACInfoField = dot11_WME_ACINFO_MASK & pSiteEntry->lastWMEParameterCnt;
-
- /* fill in the data */
- os_memoryCopy (pScanResultTable->hOS, &(pWMEParams->WME_ACParameteres),
- &(pSiteEntry->WMEParameters), sizeof(dot11_ACParameters_t));
-
-
- /* update the general length */
- pBssid->IELength += (pVarIes->Length + 2);
- }
-
- /* Copy the unknown IEs */
- if ( 0 < pSiteEntry->unknownIeLen ) {
- os_memoryCopy (pScanResultTable->hOS, (void *)(&pBssid->IEs[ pBssid->IELength ]),
- (void *)pSiteEntry->pUnknownIe,
- pSiteEntry->unknownIeLen );
- pBssid->IELength += pSiteEntry->unknownIeLen;
- }
-
- }
- else
- { /* Copy all variable IEs */
- if (pSiteEntry->probeRecv)
- {
- /* It looks like it never happens. Anyway decided to check */
- if ( pSiteEntry->probeRespLength > MAX_BEACON_BODY_LENGTH )
- /* it may have sense to check the Len here for 0 or MIN_BEACON_BODY_LENGTH also */
- {
- TRACE2( pScanResultTable->hReport, REPORT_SEVERITY_ERROR,
- "scanResultTable_GetBssidList. pSiteEntry->probeRespLength=%d exceeds the limit %d\n",
- pSiteEntry->probeRespLength, MAX_BEACON_BODY_LENGTH);
- handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION);
- return TI_NOK;
- }
- os_memoryCopy (pScanResultTable->hOS, pVarIes,
- pSiteEntry->probeRespBuffer, pSiteEntry->probeRespLength);
- pBssid->IELength += pSiteEntry->probeRespLength;
- }
- else
- {
- /* It looks like it never happens. Anyway decided to check */
- if ( pSiteEntry->beaconLength > MAX_BEACON_BODY_LENGTH )
- /* it may have sense to check the Len here for 0 or MIN_BEACON_BODY_LENGTH also */
- {
- TRACE2( pScanResultTable->hReport, REPORT_SEVERITY_ERROR,
- "scanResultTable_GetBssidList. pSiteEntry->beaconLength=%d exceeds the limit %d\n",
- pSiteEntry->beaconLength, MAX_BEACON_BODY_LENGTH);
- handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION);
- return TI_NOK;
- }
- os_memoryCopy (pScanResultTable->hOS, pVarIes,
- pSiteEntry->beaconBuffer, pSiteEntry->beaconLength);
- pBssid->IELength += pSiteEntry->beaconLength;
- }
- }
-
- /* -1 to remove the IEs[1] placeholder in OS_802_11_BSSID_EX which is taken into account in pBssid->IELength */
- pBssid->Length = sizeof(OS_802_11_BSSID_EX) + pBssid->IELength - 1;
-
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList: before alignment fix, IEs length: %d, BSSID length %d\n", pBssid->IELength, pBssid->Length);
-
- /* make sure length is 4 bytes aligned */
- if (pBssid->Length % 4)
- {
- pBssid->Length += (4 - (pBssid->Length % 4));
- }
-
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList: after alignment fix, IEs length: %d, BSSID length %d\n", pBssid->IELength, pBssid->Length);
-
- pData += pBssid->Length;
- uLength += pBssid->Length;
-
- TRACE1(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList: current length: %d\n", uLength);
- }
-
- pBssidList->NumberOfItems = pScanResultTable->uCurrentSiteNumber;
- *pLength = uLength;
-
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidList: total length: %d, number of items: %d\n", uLength, pBssidList->NumberOfItems);
-
- return TI_OK;
-}
-
-
-/**
- * \fn scanResultTable_GetBssidSupportedRatesList
- * \brief Retrieves the Rate table corresponding with the site
- * table
- *
- *
- * \param hScanResultTable - handle to the scan result table object
- * \param pRateList - pointer to a buffer large enough to hols
- * the rate list
- * \param pLength - length of the supplied buffer,
- * \return TI_STATUS
- * \sa scanResultTable_GetBssidSupportedRatesList
- */
-TI_STATUS scanResultTable_GetBssidSupportedRatesList (TI_HANDLE hScanResultTable,
- OS_802_11_N_RATES *pRateList,
- TI_UINT32 *pLength)
-{
- TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable;
- TSiteEntry *pSiteEntry;
- TI_UINT32 uSiteIndex, firstOFDMloc = 0;
- TI_UINT32 requiredLength;
- OS_802_11_N_RATES *pCurrRateString;
-
- TRACE0(pScanResultTable->hReport, REPORT_SEVERITY_INFORMATION , "scanResultTable_GetBssidSupportedRatesList called");
-
- /* Verify the supplied length is enough*/
- requiredLength = pScanResultTable->uCurrentSiteNumber*sizeof(OS_802_11_N_RATES);
- if (requiredLength > *pLength)
- {
- TRACE2(pScanResultTable->hReport, REPORT_SEVERITY_ERROR , "scanResultTable_GetBssidSupportedRatesList: received length %d, insufficient to hold list of size %d\n", *pLength, requiredLength);
- *pLength = requiredLength;
- return TI_NOK;
- }
-
- /* Create the rate list*/
- for (uSiteIndex = 0; uSiteIndex < pScanResultTable->uCurrentSiteNumber; uSiteIndex++)
- {
- pCurrRateString = &(pRateList[uSiteIndex]);
- pSiteEntry = &(pScanResultTable->pTable[ uSiteIndex ]);
-
- /* Supported Rates */
- os_memoryZero (pScanResultTable->hOS, (void *)pCurrRateString, sizeof(OS_802_11_N_RATES));
- rate_DrvBitmapToNetStrIncluding11n (pSiteEntry->rateMask.supportedRateMask,
- pSiteEntry->rateMask.basicRateMask,
- (TI_UINT8*)pCurrRateString,
- &firstOFDMloc);
- }
-
- return TI_OK;
-}
-
-
-/***********************************************************************
- * siteMgr_CheckRxSignalValidity
- ***********************************************************************
-DESCRIPTION: Called by the scanResultTable_UpdateEntry when receiving managment frame
- Find the ste in the site table and validate that the
- RSSI of that site signal is not lower then -80DB + not lower
- then the exising site RSSI
-
-
-INPUT: hSiteMgr - site mgr handle.
- rxLevel - Rx level the frame received in
- bssid - BSSID of the frame
-
-OUTPUT:
-
-RETURN: TI_OK / TI_NOK
-
-************************************************************************/
-/**
- * \fn scanResultTable_CheckRxSignalValidity
- * \brief return the state of the table to its state after scan
- *
- * Called by the scanResultTable_UpdateEntry when receiving managment frame
- * validate that the RSSI of that site signal is not lower then then the exising site RSSI.
- * validate that the channel in correct.
- *
- * \param pScanResultTable - scan result table object
- * \param pSite - entry from the table
- * \param rssi - RSSI level at which frame was received
- * \param channel - channel on which the frame was received
- * \return None
- * \sa
- */
-static TI_STATUS scanResultTable_CheckRxSignalValidity(TScanResultTable *pScanResultTable, TSiteEntry *pSite, TI_INT8 rxLevel, TI_UINT8 channel)
-{
- if ((channel != pSite->channel) &&
- (rxLevel < pSite->rssi))
- { /* Ignore wrong packets with lower RSSI that were detect as
- ripples from different channels */
- TRACE4(pScanResultTable->hReport, REPORT_SEVERITY_WARNING, "scanResultTable_CheckRxSignalValidity:Rx RSSI =%d, on channel=%d, is lower then given RSSI =%d on channel=%d, dropping it.\n", rxLevel, channel, pSite->rssi, pSite->channel);
- return TI_NOK;
- }
-
- return TI_OK;
-}
-
-
-