Beispiel #1
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;
}
static struct ibss_rsn_peer *
ibss_rsn_peer_init(struct ibss_rsn *ibss_rsn, const u8 *addr)
{
	struct ibss_rsn_peer *peer;
	if (ibss_rsn == NULL)
		return NULL;

	peer = ibss_rsn_get_peer(ibss_rsn, addr);
	if (peer) {
		wpa_printf(MSG_DEBUG, "RSN: IBSS Supplicant for peer "MACSTR
			   " already running", MAC2STR(addr));
		return peer;
	}

	wpa_printf(MSG_DEBUG, "RSN: Starting IBSS Supplicant for peer "MACSTR,
		   MAC2STR(addr));

	peer = os_zalloc(sizeof(*peer));
	if (peer == NULL) {
		wpa_printf(MSG_DEBUG, "RSN: Could not allocate memory.");
		return NULL;
	}

	peer->ibss_rsn = ibss_rsn;
	os_memcpy(peer->addr, addr, ETH_ALEN);
	peer->authentication_status = IBSS_RSN_AUTH_NOT_AUTHENTICATED;

	if (ibss_rsn_supp_init(peer, ibss_rsn->wpa_s->own_addr,
			       ibss_rsn->psk) < 0) {
		ibss_rsn_free(peer);
		return NULL;
	}

	peer->next = ibss_rsn->peers;
	ibss_rsn->peers = peer;

	return peer;
}