diff options
author | Jouni Malinen <j@w1.fi> | 2011-12-03 13:20:40 +0200 |
---|---|---|
committer | Jouni Malinen <j@w1.fi> | 2011-12-03 13:20:40 +0200 |
commit | bfba8deb8bd990f711f762b2f47956efb3be2f03 (patch) | |
tree | d475ec7833b3c44c954d05f73d0b2efc58fc6600 /wpa_supplicant | |
parent | aef85ba20442f1b2e43872f28dead4d7461f4a64 (diff) | |
download | external_wpa_supplicant_8_ti-bfba8deb8bd990f711f762b2f47956efb3be2f03.zip external_wpa_supplicant_8_ti-bfba8deb8bd990f711f762b2f47956efb3be2f03.tar.gz external_wpa_supplicant_8_ti-bfba8deb8bd990f711f762b2f47956efb3be2f03.tar.bz2 |
Update internal MAC address on EVENT_INTERFACE_ENABLED events
This allows the MAC address of the interface to be changed when the
interface is set down even if the interface does not get completed
removed and re-added.
Signed-hostap: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'wpa_supplicant')
-rw-r--r-- | wpa_supplicant/events.c | 1 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant.c | 34 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant_i.h | 1 |
3 files changed, 24 insertions, 12 deletions
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index f062d0a..dd17a42 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -2380,6 +2380,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, case EVENT_INTERFACE_ENABLED: wpa_dbg(wpa_s, MSG_DEBUG, "Interface was enabled"); if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { + wpa_supplicant_update_mac_addr(wpa_s); #ifdef CONFIG_AP if (!wpa_s->ap_iface) { wpa_supplicant_set_state(wpa_s, diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 0abcd80..9fa39b2 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -2054,25 +2054,15 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, } -/** - * wpa_supplicant_driver_init - Initialize driver interface parameters - * @wpa_s: Pointer to wpa_supplicant data - * Returns: 0 on success, -1 on failure - * - * This function is called to initialize driver interface parameters. - * wpa_drv_init() must have been called before this function to initialize the - * driver interface. - */ -int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) +int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s) { - static int interface_count = 0; - if (wpa_s->driver->send_eapol) { const u8 *addr = wpa_drv_get_mac_addr(wpa_s); if (addr) os_memcpy(wpa_s->own_addr, addr, ETH_ALEN); } else if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) { + l2_packet_deinit(wpa_s->l2); wpa_s->l2 = l2_packet_init(wpa_s->ifname, wpa_drv_get_mac_addr(wpa_s), ETH_P_EAPOL, @@ -2094,6 +2084,26 @@ int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) MAC2STR(wpa_s->own_addr)); wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr); + return 0; +} + + +/** + * wpa_supplicant_driver_init - Initialize driver interface parameters + * @wpa_s: Pointer to wpa_supplicant data + * Returns: 0 on success, -1 on failure + * + * This function is called to initialize driver interface parameters. + * wpa_drv_init() must have been called before this function to initialize the + * driver interface. + */ +int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) +{ + static int interface_count = 0; + + if (wpa_supplicant_update_mac_addr(wpa_s) < 0) + return -1; + if (wpa_s->bridge_ifname[0]) { wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge " "interface '%s'", wpa_s->bridge_ifname); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 9afdcee..37237f0 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -522,6 +522,7 @@ int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s); const char * wpa_supplicant_state_txt(enum wpa_states state); +int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s); int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s); int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, struct wpa_ssid *ssid, |