Esempio n. 1
0
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;
}
Esempio n. 2
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
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);
}