{
int bssid_changed;
+#ifdef CONFIG_IBSS_RSN
+ ibss_rsn_deinit(wpa_s->ibss_rsn);
+ wpa_s->ibss_rsn = NULL;
+#endif /* CONFIG_IBSS_RSN */
+
if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED)
return;
if (wpa_s->current_ssid &&
wpa_s->current_ssid->mode == WPAS_MODE_IBSS &&
wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
- wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE)
- ibss_rsn_connected(wpa_s->ibss_rsn);
+ wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE &&
+ wpa_s->ibss_rsn == NULL) {
+ wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
+ if (!wpa_s->ibss_rsn) {
+ wpa_msg(wpa_s, MSG_INFO, "Failed to init IBSS RSN");
+ wpa_supplicant_deauthenticate(
+ wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+ return;
+ }
+
+ ibss_rsn_set_psk(wpa_s->ibss_rsn, wpa_s->current_ssid->psk);
+ }
#endif /* CONFIG_IBSS_RSN */
}
l2_packet_deinit(wpa_s->l2);
wpa_s->l2 = NULL;
#ifdef CONFIG_IBSS_RSN
- ibss_rsn_stop(wpa_s->ibss_rsn, NULL);
+ ibss_rsn_deinit(wpa_s->ibss_rsn);
+ wpa_s->ibss_rsn = NULL;
#endif /* CONFIG_IBSS_RSN */
#ifdef CONFIG_TERMINATE_ONLASTIF
/* check if last interface */
}
}
- if (ibss_rsn->init_in_progress && key_len <=
- sizeof(ibss_rsn->init_gtk)) {
- wpa_printf(MSG_DEBUG, "AUTH: Delay setting of initial TX GTK "
- "until RSN IBSS is connected");
- ibss_rsn->init_gtk_idx = idx;
- os_memcpy(ibss_rsn->init_gtk, key, key_len);
- return 0;
- }
-
return wpa_drv_set_key(ibss_rsn->wpa_s, alg, addr, idx,
1, seq, 6, key, key_len);
}
cb.set_key = auth_set_key;
cb.for_each_sta = auth_for_each_sta;
- ibss_rsn->init_in_progress = 1;
ibss_rsn->auth_group = wpa_init(own_addr, &conf, &cb);
- ibss_rsn->init_in_progress = 0;
if (ibss_rsn->auth_group == NULL) {
wpa_printf(MSG_DEBUG, "AUTH: wpa_init() failed");
return -1;
{
struct ibss_rsn_peer *peer;
+ if (ibss_rsn == NULL)
+ return -1;
+
for (peer = ibss_rsn->peers; peer; peer = peer->next) {
if (os_memcmp(addr, peer->addr, ETH_ALEN) == 0) {
wpa_printf(MSG_DEBUG, "RSN: IBSS Authenticator and "
{
struct ibss_rsn_peer *peer;
+ if (ibss_rsn == NULL)
+ return -1;
+
for (peer = ibss_rsn->peers; peer; peer = peer->next) {
if (os_memcmp(src_addr, peer->addr, ETH_ALEN) == 0)
return ibss_rsn_process_rx_eapol(ibss_rsn, peer,
void ibss_rsn_set_psk(struct ibss_rsn *ibss_rsn, const u8 *psk)
{
+ if (ibss_rsn == NULL)
+ return;
os_memcpy(ibss_rsn->psk, psk, PMK_LEN);
}
-
-
-void ibss_rsn_connected(struct ibss_rsn *ibss_rsn)
-{
- u8 seq[6];
- wpa_printf(MSG_DEBUG, "RSN: IBSS connected notification");
- if (ibss_rsn->init_gtk_idx) {
- wpa_printf(MSG_DEBUG, "RSN: Set initial IBSS TX GTK");
- os_memset(seq, 0, sizeof(seq));
- if (wpa_drv_set_key(ibss_rsn->wpa_s, WPA_ALG_CCMP,
- broadcast_ether_addr,
- ibss_rsn->init_gtk_idx,
- 1, seq, sizeof(seq), ibss_rsn->init_gtk,
- 16) < 0)
- wpa_printf(MSG_INFO, "RSN: Failed to set IBSS TX GTK");
- ibss_rsn->init_gtk_idx = 0;
- os_memset(ibss_rsn->init_gtk, 0, sizeof(ibss_rsn->init_gtk));
- }
-}
struct wpa_authenticator *auth_group;
struct ibss_rsn_peer *peers;
u8 psk[PMK_LEN];
-
- int init_in_progress;
- int init_gtk_idx;
- u8 init_gtk[16];
};
int ibss_rsn_rx_eapol(struct ibss_rsn *ibss_rsn, const u8 *src_addr,
const u8 *buf, size_t len);
void ibss_rsn_set_psk(struct ibss_rsn *ibss_rsn, const u8 *psk);
-void ibss_rsn_connected(struct ibss_rsn *ibss_rsn);
#endif /* IBSS_RSN_H */
int assoc_failed = 0;
struct wpa_ssid *old_ssid;
+#ifdef CONFIG_IBSS_RSN
+ ibss_rsn_deinit(wpa_s->ibss_rsn);
+ wpa_s->ibss_rsn = NULL;
+#endif /* CONFIG_IBSS_RSN */
+
if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
#ifdef CONFIG_AP
} else if (ssid->mode == WPAS_MODE_IBSS &&
wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
- ibss_rsn_set_psk(wpa_s->ibss_rsn, ssid->psk);
/*
* RSN IBSS authentication is per-STA and we can disable the
* per-BSSID authentication.
return -1;
}
-#ifdef CONFIG_IBSS_RSN
- wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
- if (!wpa_s->ibss_rsn) {
- wpa_dbg(wpa_s, MSG_DEBUG, "Failed to init IBSS RSN");
- return -1;
- }
-#endif /* CONFIG_IBSS_RSN */
-
#ifdef CONFIG_P2P
if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");