~ubuntu-branches/ubuntu/saucy/wpasupplicant/saucy

« back to all changes in this revision

Viewing changes to src/ap/hostapd.c

  • Committer: Bazaar Package Importer
  • Author(s): Mathieu Trudel-Lapierre
  • Date: 2010-11-22 09:43:43 UTC
  • mfrom: (1.1.16 upstream)
  • Revision ID: james.westby@ubuntu.com-20101122094343-qgsxaojvmswfri77
Tags: 0.7.3-0ubuntu1
* Get wpasupplicant 0.7.3 from Debian's SVN. Leaving 0.7.3-1 as unreleased
  for now.
* Build-Depend on debhelper 8, since the packaging from Debian uses compat 8.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * hostapd / Initialization and configuration
 
3
 * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
 
4
 *
 
5
 * This program is free software; you can redistribute it and/or modify
 
6
 * it under the terms of the GNU General Public License version 2 as
 
7
 * published by the Free Software Foundation.
 
8
 *
 
9
 * Alternatively, this software may be distributed under the terms of BSD
 
10
 * license.
 
11
 *
 
12
 * See README and COPYING for more details.
 
13
 */
 
14
 
 
15
#include "utils/includes.h"
 
16
 
 
17
#include "utils/common.h"
 
18
#include "utils/eloop.h"
 
19
#include "common/ieee802_11_defs.h"
 
20
#include "radius/radius_client.h"
 
21
#include "drivers/driver.h"
 
22
#include "hostapd.h"
 
23
#include "authsrv.h"
 
24
#include "sta_info.h"
 
25
#include "accounting.h"
 
26
#include "ap_list.h"
 
27
#include "beacon.h"
 
28
#include "iapp.h"
 
29
#include "ieee802_1x.h"
 
30
#include "ieee802_11_auth.h"
 
31
#include "vlan_init.h"
 
32
#include "wpa_auth.h"
 
33
#include "wps_hostapd.h"
 
34
#include "hw_features.h"
 
35
#include "wpa_auth_glue.h"
 
36
#include "ap_drv_ops.h"
 
37
#include "ap_config.h"
 
38
 
 
39
 
 
40
static int hostapd_flush_old_stations(struct hostapd_data *hapd);
 
41
static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd);
 
42
 
 
43
extern int wpa_debug_level;
 
44
 
 
45
 
 
46
int hostapd_reload_config(struct hostapd_iface *iface)
 
47
{
 
48
        struct hostapd_data *hapd = iface->bss[0];
 
49
        struct hostapd_config *newconf, *oldconf;
 
50
        size_t j;
 
51
 
 
52
        if (iface->config_read_cb == NULL)
 
53
                return -1;
 
54
        newconf = iface->config_read_cb(iface->config_fname);
 
55
        if (newconf == NULL)
 
56
                return -1;
 
57
 
 
58
        /*
 
59
         * Deauthenticate all stations since the new configuration may not
 
60
         * allow them to use the BSS anymore.
 
61
         */
 
62
        for (j = 0; j < iface->num_bss; j++)
 
63
                hostapd_flush_old_stations(iface->bss[j]);
 
64
 
 
65
#ifndef CONFIG_NO_RADIUS
 
66
        /* TODO: update dynamic data based on changed configuration
 
67
         * items (e.g., open/close sockets, etc.) */
 
68
        radius_client_flush(hapd->radius, 0);
 
69
#endif /* CONFIG_NO_RADIUS */
 
70
 
 
71
        oldconf = hapd->iconf;
 
72
        hapd->iconf = newconf;
 
73
        hapd->conf = &newconf->bss[0];
 
74
        iface->conf = newconf;
 
75
 
 
76
        if (hostapd_setup_wpa_psk(hapd->conf)) {
 
77
                wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
 
78
                           "after reloading configuration");
 
79
        }
 
80
 
 
81
        if (hapd->conf->ieee802_1x || hapd->conf->wpa)
 
82
                hapd->drv.set_drv_ieee8021x(hapd, hapd->conf->iface, 1);
 
83
        else
 
84
                hapd->drv.set_drv_ieee8021x(hapd, hapd->conf->iface, 0);
 
85
 
 
86
        if (hapd->conf->wpa && hapd->wpa_auth == NULL)
 
87
                hostapd_setup_wpa(hapd);
 
88
        else if (hapd->conf->wpa) {
 
89
                const u8 *wpa_ie;
 
90
                size_t wpa_ie_len;
 
91
                hostapd_reconfig_wpa(hapd);
 
92
                wpa_ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &wpa_ie_len);
 
93
                if (hostapd_set_generic_elem(hapd, wpa_ie, wpa_ie_len))
 
94
                        wpa_printf(MSG_ERROR, "Failed to configure WPA IE for "
 
95
                                   "the kernel driver.");
 
96
        } else if (hapd->wpa_auth) {
 
97
                wpa_deinit(hapd->wpa_auth);
 
98
                hapd->wpa_auth = NULL;
 
99
                hostapd_set_privacy(hapd, 0);
 
100
                hostapd_setup_encryption(hapd->conf->iface, hapd);
 
101
                hostapd_set_generic_elem(hapd, (u8 *) "", 0);
 
102
        }
 
103
 
 
104
        ieee802_11_set_beacon(hapd);
 
105
        hostapd_update_wps(hapd);
 
106
 
 
107
        if (hapd->conf->ssid.ssid_set &&
 
108
            hostapd_set_ssid(hapd, (u8 *) hapd->conf->ssid.ssid,
 
109
                             hapd->conf->ssid.ssid_len)) {
 
110
                wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver");
 
111
                /* try to continue */
 
112
        }
 
113
 
 
114
        hostapd_config_free(oldconf);
 
115
 
 
116
        wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
 
117
 
 
118
        return 0;
 
119
}
 
120
 
 
121
 
 
122
static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd,
 
123
                                              char *ifname)
 
124
{
 
125
        int i;
 
126
 
 
127
        for (i = 0; i < NUM_WEP_KEYS; i++) {
 
128
                if (hapd->drv.set_key(ifname, hapd, WPA_ALG_NONE, NULL, i,
 
129
                                      i == 0 ? 1 : 0, NULL, 0, NULL, 0)) {
 
130
                        wpa_printf(MSG_DEBUG, "Failed to clear default "
 
131
                                   "encryption keys (ifname=%s keyidx=%d)",
 
132
                                   ifname, i);
 
133
                }
 
134
        }
 
135
#ifdef CONFIG_IEEE80211W
 
136
        if (hapd->conf->ieee80211w) {
 
137
                for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) {
 
138
                        if (hapd->drv.set_key(ifname, hapd, WPA_ALG_NONE, NULL,
 
139
                                              i, i == 0 ? 1 : 0, NULL, 0,
 
140
                                              NULL, 0)) {
 
141
                                wpa_printf(MSG_DEBUG, "Failed to clear "
 
142
                                           "default mgmt encryption keys "
 
143
                                           "(ifname=%s keyidx=%d)", ifname, i);
 
144
                        }
 
145
                }
 
146
        }
 
147
#endif /* CONFIG_IEEE80211W */
 
148
}
 
149
 
 
150
 
 
151
static int hostapd_broadcast_wep_clear(struct hostapd_data *hapd)
 
152
{
 
153
        hostapd_broadcast_key_clear_iface(hapd, hapd->conf->iface);
 
154
        return 0;
 
155
}
 
156
 
 
157
 
 
158
static int hostapd_broadcast_wep_set(struct hostapd_data *hapd)
 
159
{
 
160
        int errors = 0, idx;
 
161
        struct hostapd_ssid *ssid = &hapd->conf->ssid;
 
162
 
 
163
        idx = ssid->wep.idx;
 
164
        if (ssid->wep.default_len &&
 
165
            hapd->drv.set_key(hapd->conf->iface,
 
166
                              hapd, WPA_ALG_WEP, NULL, idx,
 
167
                              idx == ssid->wep.idx,
 
168
                              NULL, 0, ssid->wep.key[idx],
 
169
                              ssid->wep.len[idx])) {
 
170
                wpa_printf(MSG_WARNING, "Could not set WEP encryption.");
 
171
                errors++;
 
172
        }
 
173
 
 
174
        if (ssid->dyn_vlan_keys) {
 
175
                size_t i;
 
176
                for (i = 0; i <= ssid->max_dyn_vlan_keys; i++) {
 
177
                        const char *ifname;
 
178
                        struct hostapd_wep_keys *key = ssid->dyn_vlan_keys[i];
 
179
                        if (key == NULL)
 
180
                                continue;
 
181
                        ifname = hostapd_get_vlan_id_ifname(hapd->conf->vlan,
 
182
                                                            i);
 
183
                        if (ifname == NULL)
 
184
                                continue;
 
185
 
 
186
                        idx = key->idx;
 
187
                        if (hapd->drv.set_key(ifname, hapd, WPA_ALG_WEP, NULL,
 
188
                                              idx, idx == key->idx, NULL, 0,
 
189
                                              key->key[idx], key->len[idx])) {
 
190
                                wpa_printf(MSG_WARNING, "Could not set "
 
191
                                           "dynamic VLAN WEP encryption.");
 
192
                                errors++;
 
193
                        }
 
194
                }
 
195
        }
 
196
 
 
197
        return errors;
 
198
}
 
199
 
 
200
/**
 
201
 * hostapd_cleanup - Per-BSS cleanup (deinitialization)
 
202
 * @hapd: Pointer to BSS data
 
203
 *
 
204
 * This function is used to free all per-BSS data structures and resources.
 
205
 * This gets called in a loop for each BSS between calls to
 
206
 * hostapd_cleanup_iface_pre() and hostapd_cleanup_iface() when an interface
 
207
 * is deinitialized. Most of the modules that are initialized in
 
208
 * hostapd_setup_bss() are deinitialized here.
 
209
 */
 
210
static void hostapd_cleanup(struct hostapd_data *hapd)
 
211
{
 
212
        if (hapd->iface->ctrl_iface_deinit)
 
213
                hapd->iface->ctrl_iface_deinit(hapd);
 
214
 
 
215
        iapp_deinit(hapd->iapp);
 
216
        hapd->iapp = NULL;
 
217
        accounting_deinit(hapd);
 
218
        hostapd_deinit_wpa(hapd);
 
219
        vlan_deinit(hapd);
 
220
        hostapd_acl_deinit(hapd);
 
221
#ifndef CONFIG_NO_RADIUS
 
222
        radius_client_deinit(hapd->radius);
 
223
        hapd->radius = NULL;
 
224
#endif /* CONFIG_NO_RADIUS */
 
225
 
 
226
        hostapd_deinit_wps(hapd);
 
227
 
 
228
        authsrv_deinit(hapd);
 
229
 
 
230
        if (hapd->interface_added &&
 
231
            hostapd_if_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface)) {
 
232
                wpa_printf(MSG_WARNING, "Failed to remove BSS interface %s",
 
233
                           hapd->conf->iface);
 
234
        }
 
235
 
 
236
        os_free(hapd->probereq_cb);
 
237
        hapd->probereq_cb = NULL;
 
238
}
 
239
 
 
240
 
 
241
/**
 
242
 * hostapd_cleanup_iface_pre - Preliminary per-interface cleanup
 
243
 * @iface: Pointer to interface data
 
244
 *
 
245
 * This function is called before per-BSS data structures are deinitialized
 
246
 * with hostapd_cleanup().
 
247
 */
 
248
static void hostapd_cleanup_iface_pre(struct hostapd_iface *iface)
 
249
{
 
250
}
 
251
 
 
252
 
 
253
/**
 
254
 * hostapd_cleanup_iface - Complete per-interface cleanup
 
255
 * @iface: Pointer to interface data
 
256
 *
 
257
 * This function is called after per-BSS data structures are deinitialized
 
258
 * with hostapd_cleanup().
 
259
 */
 
260
static void hostapd_cleanup_iface(struct hostapd_iface *iface)
 
261
{
 
262
        hostapd_free_hw_features(iface->hw_features, iface->num_hw_features);
 
263
        iface->hw_features = NULL;
 
264
        os_free(iface->current_rates);
 
265
        iface->current_rates = NULL;
 
266
        ap_list_deinit(iface);
 
267
        hostapd_config_free(iface->conf);
 
268
        iface->conf = NULL;
 
269
 
 
270
        os_free(iface->config_fname);
 
271
        os_free(iface->bss);
 
272
        os_free(iface);
 
273
}
 
274
 
 
275
 
 
276
static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd)
 
277
{
 
278
        int i;
 
279
 
 
280
        hostapd_broadcast_wep_set(hapd);
 
281
 
 
282
        if (hapd->conf->ssid.wep.default_len) {
 
283
                hostapd_set_privacy(hapd, 1);
 
284
                return 0;
 
285
        }
 
286
 
 
287
        for (i = 0; i < 4; i++) {
 
288
                if (hapd->conf->ssid.wep.key[i] &&
 
289
                    hapd->drv.set_key(iface, hapd, WPA_ALG_WEP, NULL, i,
 
290
                                      i == hapd->conf->ssid.wep.idx, NULL, 0,
 
291
                                      hapd->conf->ssid.wep.key[i],
 
292
                                      hapd->conf->ssid.wep.len[i])) {
 
293
                        wpa_printf(MSG_WARNING, "Could not set WEP "
 
294
                                   "encryption.");
 
295
                        return -1;
 
296
                }
 
297
                if (hapd->conf->ssid.wep.key[i] &&
 
298
                    i == hapd->conf->ssid.wep.idx)
 
299
                        hostapd_set_privacy(hapd, 1);
 
300
        }
 
301
 
 
302
        return 0;
 
303
}
 
304
 
 
305
 
 
306
static int hostapd_flush_old_stations(struct hostapd_data *hapd)
 
307
{
 
308
        int ret = 0;
 
309
 
 
310
        if (hostapd_drv_none(hapd) || hapd->drv_priv == NULL)
 
311
                return 0;
 
312
 
 
313
        wpa_printf(MSG_DEBUG, "Flushing old station entries");
 
314
        if (hostapd_flush(hapd)) {
 
315
                wpa_printf(MSG_WARNING, "Could not connect to kernel driver.");
 
316
                ret = -1;
 
317
        }
 
318
        wpa_printf(MSG_DEBUG, "Deauthenticate all stations");
 
319
 
 
320
        /* New Prism2.5/3 STA firmware versions seem to have issues with this
 
321
         * broadcast deauth frame. This gets the firmware in odd state where
 
322
         * nothing works correctly, so let's skip sending this for the hostap
 
323
         * driver. */
 
324
        if (hapd->driver && os_strcmp(hapd->driver->name, "hostap") != 0) {
 
325
                u8 addr[ETH_ALEN];
 
326
                os_memset(addr, 0xff, ETH_ALEN);
 
327
                hapd->drv.sta_deauth(hapd, addr,
 
328
                                     WLAN_REASON_PREV_AUTH_NOT_VALID);
 
329
        }
 
330
 
 
331
        return ret;
 
332
}
 
333
 
 
334
 
 
335
/**
 
336
 * hostapd_validate_bssid_configuration - Validate BSSID configuration
 
337
 * @iface: Pointer to interface data
 
338
 * Returns: 0 on success, -1 on failure
 
339
 *
 
340
 * This function is used to validate that the configured BSSIDs are valid.
 
341
 */
 
342
static int hostapd_validate_bssid_configuration(struct hostapd_iface *iface)
 
343
{
 
344
        u8 mask[ETH_ALEN] = { 0 };
 
345
        struct hostapd_data *hapd = iface->bss[0];
 
346
        unsigned int i = iface->conf->num_bss, bits = 0, j;
 
347
        int res;
 
348
        int auto_addr = 0;
 
349
 
 
350
        if (hostapd_drv_none(hapd))
 
351
                return 0;
 
352
 
 
353
        /* Generate BSSID mask that is large enough to cover the BSSIDs. */
 
354
 
 
355
        /* Determine the bits necessary to cover the number of BSSIDs. */
 
356
        for (i--; i; i >>= 1)
 
357
                bits++;
 
358
 
 
359
        /* Determine the bits necessary to any configured BSSIDs,
 
360
           if they are higher than the number of BSSIDs. */
 
361
        for (j = 0; j < iface->conf->num_bss; j++) {
 
362
                if (hostapd_mac_comp_empty(iface->conf->bss[j].bssid) == 0) {
 
363
                        if (j)
 
364
                                auto_addr++;
 
365
                        continue;
 
366
                }
 
367
 
 
368
                for (i = 0; i < ETH_ALEN; i++) {
 
369
                        mask[i] |=
 
370
                                iface->conf->bss[j].bssid[i] ^
 
371
                                hapd->own_addr[i];
 
372
                }
 
373
        }
 
374
 
 
375
        if (!auto_addr)
 
376
                goto skip_mask_ext;
 
377
 
 
378
        for (i = 0; i < ETH_ALEN && mask[i] == 0; i++)
 
379
                ;
 
380
        j = 0;
 
381
        if (i < ETH_ALEN) {
 
382
                j = (5 - i) * 8;
 
383
 
 
384
                while (mask[i] != 0) {
 
385
                        mask[i] >>= 1;
 
386
                        j++;
 
387
                }
 
388
        }
 
389
 
 
390
        if (bits < j)
 
391
                bits = j;
 
392
 
 
393
        if (bits > 40) {
 
394
                wpa_printf(MSG_ERROR, "Too many bits in the BSSID mask (%u)",
 
395
                           bits);
 
396
                return -1;
 
397
        }
 
398
 
 
399
        os_memset(mask, 0xff, ETH_ALEN);
 
400
        j = bits / 8;
 
401
        for (i = 5; i > 5 - j; i--)
 
402
                mask[i] = 0;
 
403
        j = bits % 8;
 
404
        while (j--)
 
405
                mask[i] <<= 1;
 
406
 
 
407
skip_mask_ext:
 
408
        wpa_printf(MSG_DEBUG, "BSS count %lu, BSSID mask " MACSTR " (%d bits)",
 
409
                   (unsigned long) iface->conf->num_bss, MAC2STR(mask), bits);
 
410
 
 
411
        res = hostapd_valid_bss_mask(hapd, hapd->own_addr, mask);
 
412
        if (res == 0)
 
413
                return 0;
 
414
 
 
415
        if (res < 0) {
 
416
                wpa_printf(MSG_ERROR, "Driver did not accept BSSID mask "
 
417
                           MACSTR " for start address " MACSTR ".",
 
418
                           MAC2STR(mask), MAC2STR(hapd->own_addr));
 
419
                return -1;
 
420
        }
 
421
 
 
422
        if (!auto_addr)
 
423
                return 0;
 
424
 
 
425
        for (i = 0; i < ETH_ALEN; i++) {
 
426
                if ((hapd->own_addr[i] & mask[i]) != hapd->own_addr[i]) {
 
427
                        wpa_printf(MSG_ERROR, "Invalid BSSID mask " MACSTR
 
428
                                   " for start address " MACSTR ".",
 
429
                                   MAC2STR(mask), MAC2STR(hapd->own_addr));
 
430
                        wpa_printf(MSG_ERROR, "Start address must be the "
 
431
                                   "first address in the block (i.e., addr "
 
432
                                   "AND mask == addr).");
 
433
                        return -1;
 
434
                }
 
435
        }
 
436
 
 
437
        return 0;
 
438
}
 
439
 
 
440
 
 
441
static int mac_in_conf(struct hostapd_config *conf, const void *a)
 
442
{
 
443
        size_t i;
 
444
 
 
445
        for (i = 0; i < conf->num_bss; i++) {
 
446
                if (hostapd_mac_comp(conf->bss[i].bssid, a) == 0) {
 
447
                        return 1;
 
448
                }
 
449
        }
 
450
 
 
451
        return 0;
 
452
}
 
453
 
 
454
 
 
455
 
 
456
 
 
457
/**
 
458
 * hostapd_setup_bss - Per-BSS setup (initialization)
 
459
 * @hapd: Pointer to BSS data
 
460
 * @first: Whether this BSS is the first BSS of an interface
 
461
 *
 
462
 * This function is used to initialize all per-BSS data structures and
 
463
 * resources. This gets called in a loop for each BSS when an interface is
 
464
 * initialized. Most of the modules that are initialized here will be
 
465
 * deinitialized in hostapd_cleanup().
 
466
 */
 
467
static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
 
468
{
 
469
        struct hostapd_bss_config *conf = hapd->conf;
 
470
        u8 ssid[HOSTAPD_MAX_SSID_LEN + 1];
 
471
        int ssid_len, set_ssid;
 
472
        char force_ifname[IFNAMSIZ];
 
473
        u8 if_addr[ETH_ALEN];
 
474
 
 
475
        if (!first) {
 
476
                if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) {
 
477
                        /* Allocate the next available BSSID. */
 
478
                        do {
 
479
                                inc_byte_array(hapd->own_addr, ETH_ALEN);
 
480
                        } while (mac_in_conf(hapd->iconf, hapd->own_addr));
 
481
                } else {
 
482
                        /* Allocate the configured BSSID. */
 
483
                        os_memcpy(hapd->own_addr, hapd->conf->bssid, ETH_ALEN);
 
484
 
 
485
                        if (hostapd_mac_comp(hapd->own_addr,
 
486
                                             hapd->iface->bss[0]->own_addr) ==
 
487
                            0) {
 
488
                                wpa_printf(MSG_ERROR, "BSS '%s' may not have "
 
489
                                           "BSSID set to the MAC address of "
 
490
                                           "the radio", hapd->conf->iface);
 
491
                                return -1;
 
492
                        }
 
493
                }
 
494
 
 
495
                hapd->interface_added = 1;
 
496
                if (hostapd_if_add(hapd->iface->bss[0], WPA_IF_AP_BSS,
 
497
                                   hapd->conf->iface, hapd->own_addr, hapd,
 
498
                                   &hapd->drv_priv, force_ifname, if_addr)) {
 
499
                        wpa_printf(MSG_ERROR, "Failed to add BSS (BSSID="
 
500
                                   MACSTR ")", MAC2STR(hapd->own_addr));
 
501
                        return -1;
 
502
                }
 
503
        }
 
504
 
 
505
        hostapd_flush_old_stations(hapd);
 
506
        hostapd_set_privacy(hapd, 0);
 
507
 
 
508
        hostapd_broadcast_wep_clear(hapd);
 
509
        if (hostapd_setup_encryption(hapd->conf->iface, hapd))
 
510
                return -1;
 
511
 
 
512
        /*
 
513
         * Fetch the SSID from the system and use it or,
 
514
         * if one was specified in the config file, verify they
 
515
         * match.
 
516
         */
 
517
        ssid_len = hostapd_get_ssid(hapd, ssid, sizeof(ssid));
 
518
        if (ssid_len < 0) {
 
519
                wpa_printf(MSG_ERROR, "Could not read SSID from system");
 
520
                return -1;
 
521
        }
 
522
        if (conf->ssid.ssid_set) {
 
523
                /*
 
524
                 * If SSID is specified in the config file and it differs
 
525
                 * from what is being used then force installation of the
 
526
                 * new SSID.
 
527
                 */
 
528
                set_ssid = (conf->ssid.ssid_len != (size_t) ssid_len ||
 
529
                            os_memcmp(conf->ssid.ssid, ssid, ssid_len) != 0);
 
530
        } else {
 
531
                /*
 
532
                 * No SSID in the config file; just use the one we got
 
533
                 * from the system.
 
534
                 */
 
535
                set_ssid = 0;
 
536
                conf->ssid.ssid_len = ssid_len;
 
537
                os_memcpy(conf->ssid.ssid, ssid, conf->ssid.ssid_len);
 
538
                conf->ssid.ssid[conf->ssid.ssid_len] = '\0';
 
539
        }
 
540
 
 
541
        if (!hostapd_drv_none(hapd)) {
 
542
                wpa_printf(MSG_ERROR, "Using interface %s with hwaddr " MACSTR
 
543
                           " and ssid '%s'",
 
544
                           hapd->conf->iface, MAC2STR(hapd->own_addr),
 
545
                           hapd->conf->ssid.ssid);
 
546
        }
 
547
 
 
548
        if (hostapd_setup_wpa_psk(conf)) {
 
549
                wpa_printf(MSG_ERROR, "WPA-PSK setup failed.");
 
550
                return -1;
 
551
        }
 
552
 
 
553
        /* Set SSID for the kernel driver (to be used in beacon and probe
 
554
         * response frames) */
 
555
        if (set_ssid && hostapd_set_ssid(hapd, (u8 *) conf->ssid.ssid,
 
556
                                         conf->ssid.ssid_len)) {
 
557
                wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver");
 
558
                return -1;
 
559
        }
 
560
 
 
561
        if (wpa_debug_level == MSG_MSGDUMP)
 
562
                conf->radius->msg_dumps = 1;
 
563
#ifndef CONFIG_NO_RADIUS
 
564
        hapd->radius = radius_client_init(hapd, conf->radius);
 
565
        if (hapd->radius == NULL) {
 
566
                wpa_printf(MSG_ERROR, "RADIUS client initialization failed.");
 
567
                return -1;
 
568
        }
 
569
#endif /* CONFIG_NO_RADIUS */
 
570
 
 
571
        if (hostapd_acl_init(hapd)) {
 
572
                wpa_printf(MSG_ERROR, "ACL initialization failed.");
 
573
                return -1;
 
574
        }
 
575
        if (hostapd_init_wps(hapd, conf))
 
576
                return -1;
 
577
 
 
578
        if (authsrv_init(hapd) < 0)
 
579
                return -1;
 
580
 
 
581
        if (ieee802_1x_init(hapd)) {
 
582
                wpa_printf(MSG_ERROR, "IEEE 802.1X initialization failed.");
 
583
                return -1;
 
584
        }
 
585
 
 
586
        if (hapd->conf->wpa && hostapd_setup_wpa(hapd))
 
587
                return -1;
 
588
 
 
589
        if (accounting_init(hapd)) {
 
590
                wpa_printf(MSG_ERROR, "Accounting initialization failed.");
 
591
                return -1;
 
592
        }
 
593
 
 
594
        if (hapd->conf->ieee802_11f &&
 
595
            (hapd->iapp = iapp_init(hapd, hapd->conf->iapp_iface)) == NULL) {
 
596
                wpa_printf(MSG_ERROR, "IEEE 802.11F (IAPP) initialization "
 
597
                           "failed.");
 
598
                return -1;
 
599
        }
 
600
 
 
601
        if (hapd->iface->ctrl_iface_init &&
 
602
            hapd->iface->ctrl_iface_init(hapd)) {
 
603
                wpa_printf(MSG_ERROR, "Failed to setup control interface");
 
604
                return -1;
 
605
        }
 
606
 
 
607
        if (!hostapd_drv_none(hapd) && vlan_init(hapd)) {
 
608
                wpa_printf(MSG_ERROR, "VLAN initialization failed.");
 
609
                return -1;
 
610
        }
 
611
 
 
612
        ieee802_11_set_beacon(hapd);
 
613
 
 
614
        return 0;
 
615
}
 
616
 
 
617
 
 
618
static void hostapd_tx_queue_params(struct hostapd_iface *iface)
 
619
{
 
620
        struct hostapd_data *hapd = iface->bss[0];
 
621
        int i;
 
622
        struct hostapd_tx_queue_params *p;
 
623
 
 
624
        for (i = 0; i < NUM_TX_QUEUES; i++) {
 
625
                p = &iface->conf->tx_queue[i];
 
626
 
 
627
                if (!p->configured)
 
628
                        continue;
 
629
 
 
630
                if (hostapd_set_tx_queue_params(hapd, i, p->aifs, p->cwmin,
 
631
                                                p->cwmax, p->burst)) {
 
632
                        wpa_printf(MSG_DEBUG, "Failed to set TX queue "
 
633
                                   "parameters for queue %d.", i);
 
634
                        /* Continue anyway */
 
635
                }
 
636
        }
 
637
}
 
638
 
 
639
 
 
640
static int setup_interface(struct hostapd_iface *iface)
 
641
{
 
642
        struct hostapd_data *hapd = iface->bss[0];
 
643
        size_t i;
 
644
        char country[4];
 
645
 
 
646
        /*
 
647
         * Make sure that all BSSes get configured with a pointer to the same
 
648
         * driver interface.
 
649
         */
 
650
        for (i = 1; i < iface->num_bss; i++) {
 
651
                iface->bss[i]->driver = hapd->driver;
 
652
                iface->bss[i]->drv_priv = hapd->drv_priv;
 
653
        }
 
654
 
 
655
        if (hostapd_validate_bssid_configuration(iface))
 
656
                return -1;
 
657
 
 
658
        if (hapd->iconf->country[0] && hapd->iconf->country[1]) {
 
659
                os_memcpy(country, hapd->iconf->country, 3);
 
660
                country[3] = '\0';
 
661
                if (hostapd_set_country(hapd, country) < 0) {
 
662
                        wpa_printf(MSG_ERROR, "Failed to set country code");
 
663
                        return -1;
 
664
                }
 
665
        }
 
666
 
 
667
        if (hostapd_get_hw_features(iface)) {
 
668
                /* Not all drivers support this yet, so continue without hw
 
669
                 * feature data. */
 
670
        } else {
 
671
                int ret = hostapd_select_hw_mode(iface);
 
672
                if (ret < 0) {
 
673
                        wpa_printf(MSG_ERROR, "Could not select hw_mode and "
 
674
                                   "channel. (%d)", ret);
 
675
                        return -1;
 
676
                }
 
677
                ret = hostapd_check_ht_capab(iface);
 
678
                if (ret < 0)
 
679
                        return -1;
 
680
                if (ret == 1) {
 
681
                        wpa_printf(MSG_DEBUG, "Interface initialization will "
 
682
                                   "be completed in a callback");
 
683
                        return 0;
 
684
                }
 
685
        }
 
686
        return hostapd_setup_interface_complete(iface, 0);
 
687
}
 
688
 
 
689
 
 
690
int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err)
 
691
{
 
692
        struct hostapd_data *hapd = iface->bss[0];
 
693
        size_t j;
 
694
        u8 *prev_addr;
 
695
 
 
696
        if (err) {
 
697
                wpa_printf(MSG_ERROR, "Interface initialization failed");
 
698
                eloop_terminate();
 
699
                return -1;
 
700
        }
 
701
 
 
702
        wpa_printf(MSG_DEBUG, "Completing interface initialization");
 
703
        if (hapd->iconf->channel) {
 
704
                iface->freq = hostapd_hw_get_freq(hapd, hapd->iconf->channel);
 
705
                wpa_printf(MSG_DEBUG, "Mode: %s  Channel: %d  "
 
706
                           "Frequency: %d MHz",
 
707
                           hostapd_hw_mode_txt(hapd->iconf->hw_mode),
 
708
                           hapd->iconf->channel, iface->freq);
 
709
 
 
710
                if (hostapd_set_freq(hapd, hapd->iconf->hw_mode, iface->freq,
 
711
                                     hapd->iconf->channel,
 
712
                                     hapd->iconf->ieee80211n,
 
713
                                     hapd->iconf->secondary_channel)) {
 
714
                        wpa_printf(MSG_ERROR, "Could not set channel for "
 
715
                                   "kernel driver");
 
716
                        return -1;
 
717
                }
 
718
        }
 
719
 
 
720
        if (hapd->iconf->rts_threshold > -1 &&
 
721
            hostapd_set_rts(hapd, hapd->iconf->rts_threshold)) {
 
722
                wpa_printf(MSG_ERROR, "Could not set RTS threshold for "
 
723
                           "kernel driver");
 
724
                return -1;
 
725
        }
 
726
 
 
727
        if (hapd->iconf->fragm_threshold > -1 &&
 
728
            hostapd_set_frag(hapd, hapd->iconf->fragm_threshold)) {
 
729
                wpa_printf(MSG_ERROR, "Could not set fragmentation threshold "
 
730
                           "for kernel driver");
 
731
                return -1;
 
732
        }
 
733
 
 
734
        prev_addr = hapd->own_addr;
 
735
 
 
736
        for (j = 0; j < iface->num_bss; j++) {
 
737
                hapd = iface->bss[j];
 
738
                if (j)
 
739
                        os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN);
 
740
                if (hostapd_setup_bss(hapd, j == 0))
 
741
                        return -1;
 
742
                if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0)
 
743
                        prev_addr = hapd->own_addr;
 
744
        }
 
745
 
 
746
        hostapd_tx_queue_params(iface);
 
747
 
 
748
        ap_list_init(iface);
 
749
 
 
750
        if (hostapd_driver_commit(hapd) < 0) {
 
751
                wpa_printf(MSG_ERROR, "%s: Failed to commit driver "
 
752
                           "configuration", __func__);
 
753
                return -1;
 
754
        }
 
755
 
 
756
        wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
 
757
                   iface->bss[0]->conf->iface);
 
758
 
 
759
        return 0;
 
760
}
 
761
 
 
762
 
 
763
/**
 
764
 * hostapd_setup_interface - Setup of an interface
 
765
 * @iface: Pointer to interface data.
 
766
 * Returns: 0 on success, -1 on failure
 
767
 *
 
768
 * Initializes the driver interface, validates the configuration,
 
769
 * and sets driver parameters based on the configuration.
 
770
 * Flushes old stations, sets the channel, encryption,
 
771
 * beacons, and WDS links based on the configuration.
 
772
 */
 
773
int hostapd_setup_interface(struct hostapd_iface *iface)
 
774
{
 
775
        int ret;
 
776
 
 
777
        ret = setup_interface(iface);
 
778
        if (ret) {
 
779
                wpa_printf(MSG_ERROR, "%s: Unable to setup interface.",
 
780
                           iface->bss[0]->conf->iface);
 
781
                return -1;
 
782
        }
 
783
 
 
784
        return 0;
 
785
}
 
786
 
 
787
 
 
788
/**
 
789
 * hostapd_alloc_bss_data - Allocate and initialize per-BSS data
 
790
 * @hapd_iface: Pointer to interface data
 
791
 * @conf: Pointer to per-interface configuration
 
792
 * @bss: Pointer to per-BSS configuration for this BSS
 
793
 * Returns: Pointer to allocated BSS data
 
794
 *
 
795
 * This function is used to allocate per-BSS data structure. This data will be
 
796
 * freed after hostapd_cleanup() is called for it during interface
 
797
 * deinitialization.
 
798
 */
 
799
struct hostapd_data *
 
800
hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
 
801
                       struct hostapd_config *conf,
 
802
                       struct hostapd_bss_config *bss)
 
803
{
 
804
        struct hostapd_data *hapd;
 
805
 
 
806
        hapd = os_zalloc(sizeof(*hapd));
 
807
        if (hapd == NULL)
 
808
                return NULL;
 
809
 
 
810
        hostapd_set_driver_ops(&hapd->drv);
 
811
        hapd->new_assoc_sta_cb = hostapd_new_assoc_sta;
 
812
        hapd->iconf = conf;
 
813
        hapd->conf = bss;
 
814
        hapd->iface = hapd_iface;
 
815
        hapd->driver = hapd->iconf->driver;
 
816
 
 
817
        return hapd;
 
818
}
 
819
 
 
820
 
 
821
void hostapd_interface_deinit(struct hostapd_iface *iface)
 
822
{
 
823
        size_t j;
 
824
 
 
825
        if (iface == NULL)
 
826
                return;
 
827
 
 
828
        hostapd_cleanup_iface_pre(iface);
 
829
        for (j = 0; j < iface->num_bss; j++) {
 
830
                struct hostapd_data *hapd = iface->bss[j];
 
831
                hostapd_free_stas(hapd);
 
832
                hostapd_flush_old_stations(hapd);
 
833
                hostapd_cleanup(hapd);
 
834
        }
 
835
}
 
836
 
 
837
 
 
838
void hostapd_interface_free(struct hostapd_iface *iface)
 
839
{
 
840
        size_t j;
 
841
        for (j = 0; j < iface->num_bss; j++)
 
842
                os_free(iface->bss[j]);
 
843
        hostapd_cleanup_iface(iface);
 
844
}
 
845
 
 
846
 
 
847
/**
 
848
 * hostapd_new_assoc_sta - Notify that a new station associated with the AP
 
849
 * @hapd: Pointer to BSS data
 
850
 * @sta: Pointer to the associated STA data
 
851
 * @reassoc: 1 to indicate this was a re-association; 0 = first association
 
852
 *
 
853
 * This function will be called whenever a station associates with the AP. It
 
854
 * can be called from ieee802_11.c for drivers that export MLME to hostapd and
 
855
 * from drv_callbacks.c based on driver events for drivers that take care of
 
856
 * management frames (IEEE 802.11 authentication and association) internally.
 
857
 */
 
858
void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
 
859
                           int reassoc)
 
860
{
 
861
        if (hapd->tkip_countermeasures) {
 
862
                hapd->drv.sta_deauth(hapd, sta->addr,
 
863
                                     WLAN_REASON_MICHAEL_MIC_FAILURE);
 
864
                return;
 
865
        }
 
866
 
 
867
        hostapd_prune_associations(hapd, sta->addr);
 
868
 
 
869
        /* IEEE 802.11F (IAPP) */
 
870
        if (hapd->conf->ieee802_11f)
 
871
                iapp_new_station(hapd->iapp, sta);
 
872
 
 
873
        /* Start accounting here, if IEEE 802.1X and WPA are not used.
 
874
         * IEEE 802.1X/WPA code will start accounting after the station has
 
875
         * been authorized. */
 
876
        if (!hapd->conf->ieee802_1x && !hapd->conf->wpa)
 
877
                accounting_sta_start(hapd, sta);
 
878
 
 
879
        /* Start IEEE 802.1X authentication process for new stations */
 
880
        ieee802_1x_new_station(hapd, sta);
 
881
        if (reassoc) {
 
882
                if (sta->auth_alg != WLAN_AUTH_FT &&
 
883
                    !(sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS)))
 
884
                        wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH);
 
885
        } else
 
886
                wpa_auth_sta_associated(hapd->wpa_auth, sta->wpa_sm);
 
887
}