int ibss_rsn_start(struct ibss_rsn *ibss_rsn, const u8 *addr) { struct ibss_rsn_peer *peer; int res; if (!ibss_rsn) return -1; /* if the peer already exists, exit immediately */ peer = ibss_rsn_get_peer(ibss_rsn, addr); if (peer) return 0; peer = ibss_rsn_peer_init(ibss_rsn, addr); if (peer == NULL) return -1; /* Open Authentication: send first Authentication frame */ res = ibss_rsn_send_auth(ibss_rsn, addr, 1); if (res) { /* * The driver may not support Authentication frame exchange in * IBSS. Ignore authentication and go through EAPOL exchange. */ peer->authentication_status |= IBSS_RSN_AUTH_BY_US; return ibss_rsn_auth_init(ibss_rsn, peer); } else { os_get_reltime(&peer->own_auth_tx); eloop_register_timeout(1, 0, ibss_rsn_auth_timeout, peer, NULL); } return 0; }
static void ibss_rsn_auth_timeout(void *eloop_ctx, void *timeout_ctx) { struct ibss_rsn_peer *peer = eloop_ctx; /* * Assume peer does not support Authentication exchange or the frame was * lost somewhere - start EAPOL Authenticator. */ wpa_printf(MSG_DEBUG, "RSN: Timeout on waiting Authentication frame response from " MACSTR " - start authenticator", MAC2STR(peer->addr)); peer->authentication_status |= IBSS_RSN_AUTH_BY_US; ibss_rsn_auth_init(peer->ibss_rsn, peer); }
int ibss_rsn_start(struct ibss_rsn *ibss_rsn, const u8 *addr) { 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 " "Supplicant for peer " MACSTR " already " "running", MAC2STR(addr)); return 0; } } wpa_printf(MSG_DEBUG, "RSN: Starting IBSS Authenticator and " "Supplicant for peer " MACSTR, MAC2STR(addr)); peer = os_zalloc(sizeof(*peer)); if (peer == NULL) return -1; peer->ibss_rsn = ibss_rsn; os_memcpy(peer->addr, addr, ETH_ALEN); if (ibss_rsn_supp_init(peer, ibss_rsn->wpa_s->own_addr, ibss_rsn->psk) < 0) { ibss_rsn_free(peer); return -1; } if (ibss_rsn_auth_init(ibss_rsn, peer) < 0) { ibss_rsn_free(peer); return -1; } peer->next = ibss_rsn->peers; ibss_rsn->peers = peer; return 0; }
static int ibss_rsn_peer_authenticated(struct ibss_rsn *ibss_rsn, struct ibss_rsn_peer *peer, int reason) { int already_started; if (ibss_rsn == NULL || peer == NULL) return -1; already_started = ibss_rsn_is_auth_started(peer); peer->authentication_status |= reason; if (already_started) { wpa_printf(MSG_DEBUG, "RSN: IBSS Authenticator already " "started for peer " MACSTR, MAC2STR(peer->addr)); return 0; } wpa_printf(MSG_DEBUG, "RSN: Starting IBSS Authenticator " "for now-authenticated peer " MACSTR, MAC2STR(peer->addr)); return ibss_rsn_auth_init(ibss_rsn, peer); }