Beispiel #1
0
void sme_printBssidList(TI_HANDLE hSme)
{
	TSme *sme = (TSme *) hSme;
	TI_UINT32 length;
	TI_UINT8 *blist;
	TMacAddr temp_bssid = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

	length =
	    scanResultTable_CalculateBssidListSize(sme->hScanResultTable,
						   TI_FALSE);

	blist = os_memoryAlloc(NULL, length);

	if (!blist) {
		WLAN_OS_REPORT(("ERROR. sme_printBssidList(): Cannot allocate memory!! length = %d\n", length));
		return;
	}

	scanResultTable_GetBssidList(sme->hScanResultTable,
				     (POS_802_11_BSSID_LIST_EX) blist, &length,
				     TI_FALSE);

	PrintBssidList((OS_802_11_BSSID_LIST_EX *) blist, 0, temp_bssid);

	os_memoryFree(NULL, blist, length);
}
/** 
 * \fn     scanCncnApp_GetParam
 * \brief  Parses and executes a get param command
 * 
 * Parses and executes a get param command (get BSSID list)
 * 
 * \param  hScanCncn - handle to the scan concentrator object
 * \param  pParam - the param to get
 * \return operation status (OK / NOK / PARAM_NOT_SUPPORTED)
 * \sa     scanCncnApp_SetParam
 */ 
TI_STATUS scanCncnApp_GetParam (TI_HANDLE hScanCncn, paramInfo_t *pParam)
{
    TScanCncn   *pScanCncn = (TScanCncn*)hScanCncn;

    TRACE1(pScanCncn->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnApp_GetParam: received request of type %d\n", pParam->paramType);

    switch (pParam->paramType)
    {
    case SCAN_CNCN_BSSID_LIST_SIZE_PARAM:
        /* retrieves the size to allocate for the app scan result taBle BBSID list (see next code) */
        pParam->paramLength = sizeof(TI_UINT32);
        pParam->content.uBssidListSize = 
            scanResultTable_CalculateBssidListSize (pScanCncn->hScanResultTable, TI_FALSE);
        break;

    case SCAN_CNCN_BSSID_LIST_PARAM:
        /* retrieve the app scan result table */
        return scanResultTable_GetBssidList (pScanCncn->hScanResultTable, pParam->content.pBssidList, 
                                             &pParam->paramLength, TI_FALSE);
        break;

    default:
        TRACE1(pScanCncn->hReport, REPORT_SEVERITY_ERROR , "scanCncnApp_GetParam: unrecognized param type :%d\n", pParam->paramType);
        return PARAM_NOT_SUPPORTED;
    }

    return TI_OK;
}
Beispiel #3
0
/**
 * \fn     scanCncnApp_GetParam
 * \brief  Parses and executes a get param command
 *
 * Parses and executes a get param command (get BSSID list)
 *
 * \param  hScanCncn - handle to the scan concentrator object
 * \param  pParam - the param to get
 * \return operation status (OK / NOK / PARAM_NOT_SUPPORTED)
 * \sa     scanCncnApp_SetParam
 */
TI_STATUS scanCncnApp_GetParam (TI_HANDLE hScanCncn, paramInfo_t *pParam)
{
    TScanCncn   *pScanCncn = (TScanCncn*)hScanCncn;

    TRACE1(pScanCncn->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnApp_GetParam: received request of type %d\n", pParam->paramType);

    switch (pParam->paramType)
    {

    case SCAN_CNCN_NUM_BSSID_IN_LIST_PARAM:
        /* retrieve the number of BSSID's in the scan result table*/
        pParam->paramLength = sizeof(TI_UINT32);
        pParam->content.uNumBssidInList = scanResultTable_GetNumOfBSSIDInTheList (pScanCncn->hScanResultTable);
        break;

    case SCAN_CNCN_BSSID_LIST_SIZE_PARAM:
        /* retrieves the size to allocate for the app scan result taBle BBSID list (see next code) */
        pParam->paramLength = sizeof(TI_UINT32);
        pParam->content.uBssidListSize = scanResultTable_CalculateBssidListSize (pScanCncn->hScanResultTable, TI_TRUE);
        break;

    case SCAN_CNCN_BSSID_LIST_PARAM:
        /* retrieve the app scan result table */
        return scanResultTable_GetBssidList (pScanCncn->hScanResultTable, pParam->content.pBssidList,
                                             &pParam->paramLength, TI_TRUE);

    case SCAN_CNCN_BSSID_RATE_LIST_PARAM:
        /* retrieve supported rates list equivalent to the supported rates list
         in the scan result table, but is extended to include 11n rates as well*/
        return scanResultTable_GetBssidSupportedRatesList (pScanCncn->hScanResultTable, pParam->content.pRateList,
                &pParam->paramLength);

    default:
        TRACE1(pScanCncn->hReport, REPORT_SEVERITY_ERROR , "scanCncnApp_GetParam: unrecognized param type :%d\n", pParam->paramType);
        return PARAM_NOT_SUPPORTED;
    }

    return TI_OK;
}
/**
 * \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;

    /* verify the supplied length is enough */
    uLength = scanResultTable_CalculateBssidListSize (hScanResultTable, bAllVarIes);
    if (uLength > *pLength)
    {
        *pLength = uLength;
        return TI_NOK;
    }

    /* 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 ]);

        /* 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 */
                {
                    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 */
                {
                    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;

        /* make sure length is 4 bytes aligned */
        if (pBssid->Length % 4)
        {
            pBssid->Length += (4 - (pBssid->Length % 4));
        }

        pData += pBssid->Length;
        uLength += pBssid->Length;
    }

    pBssidList->NumberOfItems = pScanResultTable->uCurrentSiteNumber;
    *pLength = uLength;

    return TI_OK;
}