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