1358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/* 2358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * Copyright (C) 2008 The Android Open Source Project 3358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * 4358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * Licensed under the Apache License, Version 2.0 (the "License"); 5358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * you may not use this file except in compliance with the License. 6358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * You may obtain a copy of the License at 7358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * 8358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * http://www.apache.org/licenses/LICENSE-2.0 9358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * 10358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * Unless required by applicable law or agreed to in writing, software 11358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * distributed under the License is distributed on an "AS IS" BASIS, 12358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * See the License for the specific language governing permissions and 14358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt * limitations under the License. 15358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt */ 16358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*-------------------------------------------------------------------*/ 17358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#include "includes.h" 18358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#include "scanmerge.h" 19358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#include "shlist.h" 20358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 21358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#define IS_HIDDEN_AP(a) (((a)->ssid_len == 0) || ((a)->ssid[0] == '\0')) 22358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 23358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtscan_ssid_t *scan_get_ssid( scan_result_t *res_ptr ) 24358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 25358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt static scan_ssid_t ssid_temp; 26358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 27358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt const u8 *res_ie; 28358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 29358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt res_ie = wpa_scan_get_ie(res_ptr, WLAN_EID_SSID); 30358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (!res_ie) 31358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return NULL; 32358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt ssid_temp.ssid_len = (size_t)res_ie[1]; 33358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(ssid_temp.ssid, (res_ie + 2), ssid_temp.ssid_len); 34358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#else 35358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt ssid_temp.ssid_len = res_ptr->ssid_len; 36358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(ssid_temp.ssid, res_ptr->ssid, ssid_temp.ssid_len); 37358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 38358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return &ssid_temp; 39358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 40358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 41358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 42358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_init 43358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Inits scan merge list 44358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 45358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt mydrv - pointer to private driver data structure 46358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: 47358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 48358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid scan_init( struct wpa_driver_ti_data *mydrv ) 49358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 50358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt mydrv->last_scan = -1; 51358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListInitList(&(mydrv->scan_merge_list)); 52358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 53358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 54358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 55358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_free 56358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Frees scan structure private data 57358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 58358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt ptr - pointer to private data structure 59358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: 60358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 61358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtstatic void scan_free( void *ptr ) 62358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 63358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_free(ptr); 64358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 65358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 66358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 67358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_exit 68358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Cleans scan merge list 69358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 70358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt mydrv - pointer to private driver data structure 71358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: 72358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 73358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid scan_exit( struct wpa_driver_ti_data *mydrv ) 74358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 75358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListDelAllItems(&(mydrv->scan_merge_list), scan_free); 76358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 77358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 78358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 79358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_count 80358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Gives number of list elements 81358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 82358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt mydrv - pointer to private driver data structure 83358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: Number of elements in the list 84358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 85358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtunsigned long scan_count( struct wpa_driver_ti_data *mydrv ) 86358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 87358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return shListGetCount(&(mydrv->scan_merge_list)); 88358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 89358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 90358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 91358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_equal 92358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Compares bssid of scan result and scan merge structure 93358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 94358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt val - pointer to scan result structure 95358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt idata - pointer to scan merge structure 96358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: 1 - if equal, 0 - if not 97358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 98358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtstatic int scan_equal( void *val, void *idata ) 99358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 100358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ssid_t n_ssid, l_ssid, *p_ssid; 101358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *new_res = (scan_result_t *)val; 102358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *lst_res = 103358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (scan_result_t *)(&(((scan_merge_t *)idata)->scanres)); 104358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt int ret; 105358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt size_t len; 106358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 107358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt p_ssid = scan_get_ssid(new_res); 108358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (!p_ssid) 109358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return 0; 110358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(&n_ssid, p_ssid, sizeof(scan_ssid_t)); 111358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt p_ssid = scan_get_ssid(lst_res); 112358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (!p_ssid) 113358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return 0; 114358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(&l_ssid, p_ssid, sizeof(scan_ssid_t)); 115358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 116358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt len = (IS_HIDDEN_AP(&n_ssid) || IS_HIDDEN_AP(&l_ssid)) ? 117358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 0 : n_ssid.ssid_len; 118358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt ret = ((l_ssid.ssid_len != n_ssid.ssid_len) && (len != 0)) || 119358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (os_memcmp(new_res->bssid, lst_res->bssid, ETH_ALEN) || 120358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcmp(n_ssid.ssid, l_ssid.ssid, len)); 121358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return !ret; 122358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 123358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 124358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 125358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: copy_scan_res 126358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: copies scan result structure to scan merge list item 127358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 128358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt dst - pointer to scan result structure in the list 129358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt src - source pointer to scan result structure 130358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: NONE 131358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 132358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtvoid copy_scan_res( scan_result_t *dst, scan_result_t *src ) 133358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 134358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_5_X 135358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( IS_HIDDEN_AP(src) ) { 136358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(src->ssid, dst->ssid, dst->ssid_len); 137358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt src->ssid_len = dst->ssid_len; 138358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 139358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 140358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(dst, src, sizeof(scan_result_t)); 141358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 142358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 143358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 144358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_add 145358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: adds scan result structure to scan merge list 146358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 147358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt head - pointer to scan merge list head 148358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt res_ptr - pointer to scan result structure 149358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: Pointer to scan merge item 150358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 151358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtstatic scan_merge_t *scan_add( SHLIST *head, scan_result_t *res_ptr ) 152358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 153358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_merge_t *scan_ptr; 154358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned size = 0; 155358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 156358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 157358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt size += res_ptr->ie_len; 158358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 159358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr = (scan_merge_t *)os_malloc(sizeof(scan_merge_t) + size); 160358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( !scan_ptr ) 161358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 162358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(&(scan_ptr->scanres), res_ptr, sizeof(scan_result_t) + size); 163358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr->count = SCAN_MERGE_COUNT; 164358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListInsLastItem(head, (void *)scan_ptr); 165358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return scan_ptr; 166358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 167358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 168358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 169358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_find 170358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Looks for scan merge item in scan results array 171358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 172358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr - pointer to scan merge item 173358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt results - pointer to scan results array 174358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt number_items - current number of items 175358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: 1 - if item was found, 0 - otherwise 176358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 177358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtstatic int scan_find( scan_merge_t *scan_ptr, scan_result_t *results, 178358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned int number_items ) 179358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 180358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned int i; 181358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 182358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(i=0;( i < number_items );i++) { 183358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( scan_equal(&(results[i]), scan_ptr) ) 184358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return 1; 185358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 186358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return 0; 187358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 188358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 189358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 190358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 191358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_dup 192358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Create copy of scan results entry 193358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 194358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt res_ptr - pointer to scan result item 195358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: pointer to new scan result item, or NULL 196358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 197358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtstatic scan_result_t *scan_dup( scan_result_t *res_ptr ) 198358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 199358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned size; 200358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *new_ptr; 201358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 202358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (!res_ptr) 203358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return NULL; 204358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 205358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt size = sizeof(scan_result_t) + res_ptr->ie_len; 206358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt new_ptr = os_malloc(size); 207358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (!new_ptr) 208358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return NULL; 209358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (res_ptr) { 210358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(new_ptr, res_ptr, size); 211358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 212358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return new_ptr; 213358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 214358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 215358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 216358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 217358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_merge 218358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Merges current scan results with previous 219358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 220358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt mydrv - pointer to private driver data structure 221358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt results - pointer to scan results array 222358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt number_items - current number of items 223358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt max_size - maximum namber of items 224358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: Merged number of items 225358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 226358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 227358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtunsigned int scan_merge( struct wpa_driver_ti_data *mydrv, 228358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t **results, int force_flag, 229358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned int number_items, unsigned int max_size ) 230358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#else 231358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtunsigned int scan_merge( struct wpa_driver_ti_data *mydrv, 232358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *results, int force_flag, 233358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned int number_items, unsigned int max_size ) 234358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 235358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 236358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *head = &(mydrv->scan_merge_list); 237358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item, *del_item; 238358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *res_ptr; 239358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_merge_t *scan_ptr; 240358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt unsigned int i; 241358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 242358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt /* Prepare items for removal */ 243358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListGetFirstItem(head); 244358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt while( item != NULL ) { 245358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr = (scan_merge_t *)(item->data); 246358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( scan_ptr->count != 0 ) 247358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr->count--; 248358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListGetNextItem(head, item); 249358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 250358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 251358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt for(i=0;( i < number_items );i++) { /* Find/Add new items */ 252358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 253358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt res_ptr = results[i]; 254358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#else 255358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt res_ptr = &(results[i]); 256358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 257358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListFindItem( head, res_ptr, scan_equal ); 258358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item ) { 259358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 260358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ssid_t *p_ssid; 261358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *new_ptr; 262358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 263358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr = (scan_merge_t *)(item->data); 264358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt copy_scan_res(&(scan_ptr->scanres), res_ptr); 265358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr->count = SCAN_MERGE_COUNT; 266358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 267358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt p_ssid = scan_get_ssid(res_ptr); 268358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (p_ssid && IS_HIDDEN_AP(p_ssid)) { 269358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt new_ptr = scan_dup(res_ptr); 270358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (new_ptr) { 271358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt results[i] = new_ptr; 272358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_free(res_ptr); 273358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 274358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 275358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 276358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 277358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt else { 278358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_add(head, res_ptr); 279358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 280358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 281358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 282358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListGetFirstItem( head ); /* Add/Remove missing items */ 283358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt while( item != NULL ) { 284358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt del_item = NULL; 285358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ptr = (scan_merge_t *)(item->data); 286358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( scan_ptr->count != SCAN_MERGE_COUNT ) { 287358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( !force_flag && ((scan_ptr->count == 0) || 288358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (mydrv->last_scan == SCAN_TYPE_NORMAL_ACTIVE)) ) { 289358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt del_item = item; 290358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 291358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt else { 292358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( number_items < max_size ) { 293358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#ifdef WPA_SUPPLICANT_VER_0_6_X 294358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt res_ptr = scan_dup(&(scan_ptr->scanres)); 295358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if (res_ptr) { 296358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt results[number_items] = res_ptr; 297358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt number_items++; 298358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 299358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#else 300358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt os_memcpy(&(results[number_items]), 301358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt &(scan_ptr->scanres), sizeof(scan_result_t)); 302358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt number_items++; 303358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt#endif 304358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 305358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 306358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 307358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListGetNextItem(head, item); 308358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt shListDelItem(head, del_item, scan_free); 309358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 310358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 311358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( number_items ); 312358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 313358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 314358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt/*----------------------------------------------------------------------------- 315358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Name: scan_get_by_bssid 316358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtRoutine Description: Gets scan_result pointer to item by bssid 317358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtArguments: 318358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt mydrv - pointer to private driver data structure 319358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt bssid - pointer to bssid value 320358ae72d314bf9df7050908541f30b78a2871c8aDmitry ShmidtReturn Value: pointer to scan_result item 321358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt-----------------------------------------------------------------------------*/ 322358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidtscan_result_t *scan_get_by_bssid( struct wpa_driver_ti_data *mydrv, u8 *bssid ) 323358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt{ 324358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *head = &(mydrv->scan_merge_list); 325358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt SHLIST *item; 326358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_result_t *cur_res; 327358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt scan_ssid_t *p_ssid; 328358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 329358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListGetFirstItem(head); 330358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( item == NULL ) 331358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 332358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt do { 333358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt cur_res = (scan_result_t *)&(((scan_merge_t *)(item->data))->scanres); 334358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt p_ssid = scan_get_ssid(cur_res); 335358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt if( (!os_memcmp(cur_res->bssid, bssid, ETH_ALEN)) && 336358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt (!IS_HIDDEN_AP(p_ssid)) ) { 337358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( cur_res ); 338358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } 339358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt item = shListGetNextItem(head, item); 340358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt } while( item != NULL ); 341358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt 342358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt return( NULL ); 343358ae72d314bf9df7050908541f30b78a2871c8aDmitry Shmidt} 344