Lines Matching refs:wpa_s

31 static void wpa_supplicant_mesh_deinit(struct wpa_supplicant *wpa_s,  in wpa_supplicant_mesh_deinit()  argument
34 wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh, in wpa_supplicant_mesh_deinit()
38 wpa_s->ifmsh = NULL; in wpa_supplicant_mesh_deinit()
39 wpa_s->current_ssid = NULL; in wpa_supplicant_mesh_deinit()
40 os_free(wpa_s->mesh_params); in wpa_supplicant_mesh_deinit()
41 wpa_s->mesh_params = NULL; in wpa_supplicant_mesh_deinit()
44 os_free(wpa_s->mesh_rsn); in wpa_supplicant_mesh_deinit()
45 wpa_s->mesh_rsn = NULL; in wpa_supplicant_mesh_deinit()
48 wpa_supplicant_leave_mesh(wpa_s, false); in wpa_supplicant_mesh_deinit()
52 void wpa_supplicant_mesh_iface_deinit(struct wpa_supplicant *wpa_s, in wpa_supplicant_mesh_iface_deinit() argument
60 mesh_mpm_deinit(wpa_s, ifmsh); in wpa_supplicant_mesh_iface_deinit()
82 static struct mesh_conf * mesh_config_create(struct wpa_supplicant *wpa_s, in mesh_config_create() argument
102 if (wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_BIP) in mesh_config_create()
103 conf->ieee80211w = wpa_s->conf->pmf; in mesh_config_create()
113 wpa_msg(wpa_s, MSG_INFO, "mesh: Invalid pairwise cipher"); in mesh_config_create()
122 wpa_msg(wpa_s, MSG_INFO, "mesh: Invalid group cipher"); in mesh_config_create()
154 struct wpa_supplicant *wpa_s) in wpas_mesh_copy_groups() argument
159 for (num_groups = 0; wpa_s->conf->sae_groups[num_groups] > 0; in wpas_mesh_copy_groups()
163 groups_size = (num_groups + 1) * sizeof(wpa_s->conf->sae_groups[0]); in wpas_mesh_copy_groups()
166 os_memcpy(bss->conf->sae_groups, wpa_s->conf->sae_groups, in wpas_mesh_copy_groups()
171 static int wpas_mesh_init_rsn(struct wpa_supplicant *wpa_s) in wpas_mesh_init_rsn() argument
173 struct hostapd_iface *ifmsh = wpa_s->ifmsh; in wpas_mesh_init_rsn()
174 struct wpa_ssid *ssid = wpa_s->current_ssid; in wpas_mesh_init_rsn()
192 if (wpa_s->conf->sae_groups && wpa_s->conf->sae_groups[0] > 0) { in wpas_mesh_init_rsn()
193 wpas_mesh_copy_groups(bss, wpa_s); in wpas_mesh_init_rsn()
204 wpa_s->mesh_rsn = mesh_rsn_auth_init(wpa_s, ifmsh->mconf); in wpas_mesh_init_rsn()
205 return !wpa_s->mesh_rsn ? -1 : 0; in wpas_mesh_init_rsn()
209 static int wpas_mesh_update_freq_params(struct wpa_supplicant *wpa_s) in wpas_mesh_update_freq_params() argument
211 struct wpa_driver_mesh_join_params *params = wpa_s->mesh_params; in wpas_mesh_update_freq_params()
212 struct hostapd_iface *ifmsh = wpa_s->ifmsh; in wpas_mesh_update_freq_params()
236 wpa_supplicant_mesh_deinit(wpa_s, true); in wpas_mesh_update_freq_params()
244 static int wpas_mesh_complete(struct wpa_supplicant *wpa_s) in wpas_mesh_complete() argument
246 struct hostapd_iface *ifmsh = wpa_s->ifmsh; in wpas_mesh_complete()
247 struct wpa_driver_mesh_join_params *params = wpa_s->mesh_params; in wpas_mesh_complete()
248 struct wpa_ssid *ssid = wpa_s->current_ssid; in wpas_mesh_complete()
262 wpa_s->assoc_freq = ifmsh->freq; in wpas_mesh_complete()
264 if (wpas_mesh_update_freq_params(wpa_s) < 0) in wpas_mesh_complete()
269 wpas_mesh_init_rsn(wpa_s)) { in wpas_mesh_complete()
272 wpa_supplicant_mesh_deinit(wpa_s, false); in wpas_mesh_complete()
277 wpa_s->pairwise_cipher = wpa_s->mesh_rsn->pairwise_cipher; in wpas_mesh_complete()
278 wpa_s->group_cipher = wpa_s->mesh_rsn->group_cipher; in wpas_mesh_complete()
279 wpa_s->mgmt_group_cipher = wpa_s->mesh_rsn->mgmt_group_cipher; in wpas_mesh_complete()
288 wpa_msg(wpa_s, MSG_INFO, "joining mesh %s", in wpas_mesh_complete()
290 ret = wpa_drv_join_mesh(wpa_s, params); in wpas_mesh_complete()
292 wpa_msg(wpa_s, MSG_ERROR, "mesh join error=%d", ret); in wpas_mesh_complete()
295 wpa_drv_set_operstate(wpa_s, 1); in wpas_mesh_complete()
298 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED); in wpas_mesh_complete()
300 wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_STARTED "ssid=\"%s\" id=%d", in wpas_mesh_complete()
303 wpas_notify_mesh_group_started(wpa_s, ssid); in wpas_mesh_complete()
312 struct wpa_supplicant *wpa_s = arg; in wpas_mesh_complete_cb() local
314 wpas_mesh_complete(wpa_s); in wpas_mesh_complete_cb()
320 struct wpa_supplicant *wpa_s = ifmsh->owner; in wpa_supplicant_mesh_enable_iface_cb() local
323 ifmsh->mconf = mesh_config_create(wpa_s, wpa_s->current_ssid); in wpa_supplicant_mesh_enable_iface_cb()
326 bss->msg_ctx = wpa_s; in wpa_supplicant_mesh_enable_iface_cb()
327 os_memcpy(bss->own_addr, wpa_s->own_addr, ETH_ALEN); in wpa_supplicant_mesh_enable_iface_cb()
328 bss->driver = wpa_s->driver; in wpa_supplicant_mesh_enable_iface_cb()
329 bss->drv_priv = wpa_s->drv_priv; in wpa_supplicant_mesh_enable_iface_cb()
333 bss->setup_complete_cb_ctx = wpa_s; in wpa_supplicant_mesh_enable_iface_cb()
337 bss->conf->ap_max_inactivity = wpa_s->conf->mesh_max_inactivity; in wpa_supplicant_mesh_enable_iface_cb()
339 if (wpa_drv_init_mesh(wpa_s)) { in wpa_supplicant_mesh_enable_iface_cb()
340 wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh in driver"); in wpa_supplicant_mesh_enable_iface_cb()
356 struct wpa_supplicant *wpa_s = ifmsh->owner; in wpa_supplicant_mesh_disable_iface_cb() local
359 wpa_supplicant_mesh_deinit(wpa_s, false); in wpa_supplicant_mesh_disable_iface_cb()
381 static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s, in wpa_supplicant_mesh_init() argument
393 if (!wpa_s->conf->user_mpm) { in wpa_supplicant_mesh_init()
395 wpa_msg(wpa_s, MSG_WARNING, in wpa_supplicant_mesh_init()
400 wpa_s->ifmsh = ifmsh = hostapd_alloc_iface(); in wpa_supplicant_mesh_init()
404 ifmsh->owner = wpa_s; in wpa_supplicant_mesh_init()
405 ifmsh->drv_flags = wpa_s->drv_flags; in wpa_supplicant_mesh_init()
406 ifmsh->drv_flags2 = wpa_s->drv_flags2; in wpa_supplicant_mesh_init()
410 ifmsh->bss = os_calloc(wpa_s->ifmsh->num_bss, in wpa_supplicant_mesh_init()
419 ifmsh->bss[0]->msg_ctx = wpa_s; in wpa_supplicant_mesh_init()
420 os_memcpy(bss->own_addr, wpa_s->own_addr, ETH_ALEN); in wpa_supplicant_mesh_init()
421 bss->driver = wpa_s->driver; in wpa_supplicant_mesh_init()
422 bss->drv_priv = wpa_s->drv_priv; in wpa_supplicant_mesh_init()
426 bss->setup_complete_cb_ctx = wpa_s; in wpa_supplicant_mesh_init()
434 wpa_s->assoc_freq = frequency; in wpa_supplicant_mesh_init()
435 wpa_s->current_ssid = ssid; in wpa_supplicant_mesh_init()
476 bss->conf->ap_max_inactivity = wpa_s->conf->mesh_max_inactivity; in wpa_supplicant_mesh_init()
477 bss->conf->mesh_fwding = wpa_s->conf->mesh_fwding; in wpa_supplicant_mesh_init()
479 if (ieee80211_is_dfs(ssid->frequency, wpa_s->hw.modes, in wpa_supplicant_mesh_init()
480 wpa_s->hw.num_modes) && wpa_s->conf->country[0]) { in wpa_supplicant_mesh_init()
483 conf->country[0] = wpa_s->conf->country[0]; in wpa_supplicant_mesh_init()
484 conf->country[1] = wpa_s->conf->country[1]; in wpa_supplicant_mesh_init()
486 wpa_s->mesh_params->handle_dfs = true; in wpa_supplicant_mesh_init()
492 ifmsh->bss[0]->max_plinks = wpa_s->conf->max_peer_links; in wpa_supplicant_mesh_init()
494 wpa_s->conf->dot11RSNASAERetransPeriod; in wpa_supplicant_mesh_init()
495 os_strlcpy(bss->conf->iface, wpa_s->ifname, sizeof(bss->conf->iface)); in wpa_supplicant_mesh_init()
497 mconf = mesh_config_create(wpa_s, ssid); in wpa_supplicant_mesh_init()
562 wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf); in wpa_supplicant_mesh_init()
564 if (wpa_drv_init_mesh(wpa_s)) { in wpa_supplicant_mesh_init()
565 wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh in driver"); in wpa_supplicant_mesh_init()
577 wpa_supplicant_mesh_deinit(wpa_s, true); in wpa_supplicant_mesh_init()
582 void wpa_mesh_notify_peer(struct wpa_supplicant *wpa_s, const u8 *addr, in wpa_mesh_notify_peer() argument
587 wpa_msg(wpa_s, MSG_INFO, in wpa_mesh_notify_peer()
591 wpa_msg(wpa_s, MSG_INFO, "Could not parse beacon from " MACSTR, in wpa_mesh_notify_peer()
595 wpa_mesh_new_mesh_peer(wpa_s, addr, &elems); in wpa_mesh_notify_peer()
599 void wpa_supplicant_mesh_add_scan_ie(struct wpa_supplicant *wpa_s, in wpa_supplicant_mesh_add_scan_ie() argument
612 int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s, in wpa_supplicant_join_mesh() argument
625 wpa_supplicant_mesh_deinit(wpa_s, true); in wpa_supplicant_join_mesh()
627 wpa_s->pairwise_cipher = WPA_CIPHER_NONE; in wpa_supplicant_join_mesh()
628 wpa_s->group_cipher = WPA_CIPHER_NONE; in wpa_supplicant_join_mesh()
629 wpa_s->mgmt_group_cipher = 0; in wpa_supplicant_join_mesh()
633 ibss_mesh_setup_freq(wpa_s, ssid, &params->freq); in wpa_supplicant_join_mesh()
634 wpa_s->mesh_ht_enabled = !!params->freq.ht_enabled; in wpa_supplicant_join_mesh()
635 wpa_s->mesh_vht_enabled = !!params->freq.vht_enabled; in wpa_supplicant_join_mesh()
636 wpa_s->mesh_he_enabled = !!params->freq.he_enabled; in wpa_supplicant_join_mesh()
637 wpa_s->mesh_eht_enabled = !!params->freq.eht_enabled; in wpa_supplicant_join_mesh()
641 if (wpa_s->mesh_vht_enabled) { in wpa_supplicant_join_mesh()
664 if (wpa_s->mesh_he_enabled) in wpa_supplicant_join_mesh()
666 if (wpa_s->mesh_eht_enabled) in wpa_supplicant_join_mesh()
670 else if (wpa_s->conf->beacon_int > 0) in wpa_supplicant_join_mesh()
671 params->beacon_int = wpa_s->conf->beacon_int; in wpa_supplicant_join_mesh()
674 else if (wpa_s->conf->dtim_period > 0) in wpa_supplicant_join_mesh()
675 params->dtim_period = wpa_s->conf->dtim_period; in wpa_supplicant_join_mesh()
676 params->conf.max_peer_links = wpa_s->conf->max_peer_links; in wpa_supplicant_join_mesh()
685 wpa_s->conf->user_mpm = 1; in wpa_supplicant_join_mesh()
688 if (wpa_s->conf->user_mpm) { in wpa_supplicant_join_mesh()
695 params->conf.peer_link_timeout = wpa_s->conf->mesh_max_inactivity; in wpa_supplicant_join_mesh()
701 os_free(wpa_s->mesh_params); in wpa_supplicant_join_mesh()
702 wpa_s->mesh_params = params; in wpa_supplicant_join_mesh()
703 if (wpa_supplicant_mesh_init(wpa_s, ssid, &params->freq)) { in wpa_supplicant_join_mesh()
704 wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh"); in wpa_supplicant_join_mesh()
705 wpa_supplicant_leave_mesh(wpa_s, true); in wpa_supplicant_join_mesh()
715 int wpa_supplicant_leave_mesh(struct wpa_supplicant *wpa_s, bool need_deinit) in wpa_supplicant_leave_mesh() argument
719 wpa_msg(wpa_s, MSG_INFO, "leaving mesh"); in wpa_supplicant_leave_mesh()
723 wpa_supplicant_mesh_deinit(wpa_s, true); in wpa_supplicant_leave_mesh()
725 ret = wpa_drv_leave_mesh(wpa_s); in wpa_supplicant_leave_mesh()
727 wpa_msg(wpa_s, MSG_ERROR, "mesh leave error=%d", ret); in wpa_supplicant_leave_mesh()
729 wpa_drv_set_operstate(wpa_s, 1); in wpa_supplicant_leave_mesh()
830 static int wpas_mesh_get_ifname(struct wpa_supplicant *wpa_s, char *ifname, in wpas_mesh_get_ifname() argument
833 char *ifname_ptr = wpa_s->ifname; in wpas_mesh_get_ifname()
837 wpa_s->mesh_if_idx); in wpas_mesh_get_ifname()
840 os_strlen(wpa_s->ifname) < IFNAMSIZ)) { in wpas_mesh_get_ifname()
842 res = os_snprintf(ifname, len, "mesh-%d", wpa_s->mesh_if_idx); in wpas_mesh_get_ifname()
846 wpa_s->mesh_if_idx++; in wpas_mesh_get_ifname()
851 int wpas_mesh_add_interface(struct wpa_supplicant *wpa_s, char *ifname, in wpas_mesh_add_interface() argument
858 if (ifname[0] == '\0' && wpas_mesh_get_ifname(wpa_s, ifname, len) < 0) in wpas_mesh_add_interface()
861 if (wpa_drv_if_add(wpa_s, WPA_IF_MESH, ifname, NULL, NULL, NULL, addr, in wpas_mesh_add_interface()
872 iface.driver = wpa_s->driver->name; in wpas_mesh_add_interface()
873 iface.driver_param = wpa_s->conf->driver_param; in wpas_mesh_add_interface()
874 iface.ctrl_interface = wpa_s->conf->ctrl_interface; in wpas_mesh_add_interface()
876 mesh_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s); in wpas_mesh_add_interface()
880 wpa_drv_if_remove(wpa_s, WPA_IF_MESH, ifname); in wpas_mesh_add_interface()
888 int wpas_mesh_peer_remove(struct wpa_supplicant *wpa_s, const u8 *addr) in wpas_mesh_peer_remove() argument
890 return mesh_mpm_close_peer(wpa_s, addr); in wpas_mesh_peer_remove()
894 int wpas_mesh_peer_add(struct wpa_supplicant *wpa_s, const u8 *addr, in wpas_mesh_peer_add() argument
897 return mesh_mpm_connect_peer(wpa_s, addr, duration); in wpas_mesh_peer_add()