18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / P2P integration
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Atheros Communications
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p/p2p.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "hostapd.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_config.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_drv_ops.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sta_info.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p_hostapd.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    char *buf, size_t buflen)
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (sta->p2p_ie == NULL)
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return p2p_ie_text(sta->p2p_ie, buf, buf + buflen);
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint hostapd_p2p_set_noa(struct hostapd_data *hapd, u8 count, int start,
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int duration)
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_printf(MSG_DEBUG, "P2P: Set NoA parameters: count=%u start=%d "
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		   "duration=%d", count, start, duration);
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count == 0) {
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->noa_enabled = 0;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->noa_start = 0;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hapd->noa_duration = 0;
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count != 255) {
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "P2P: Non-periodic NoA - set "
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "NoA parameters");
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return hostapd_driver_set_noa(hapd, count, start, duration);
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hapd->noa_enabled = 1;
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hapd->noa_start = start;
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hapd->noa_duration = duration;
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->num_sta_no_p2p == 0) {
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "P2P: No legacy STAs connected - update "
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "periodic NoA parameters");
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return hostapd_driver_set_noa(hapd, count, start, duration);
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_printf(MSG_DEBUG, "P2P: Legacy STA(s) connected - do not enable "
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		   "periodic NoA");
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_p2p_non_p2p_sta_connected(struct hostapd_data *hapd)
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_printf(MSG_DEBUG, "P2P: First non-P2P device connected");
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->noa_enabled) {
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "P2P: Disable periodic NoA");
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hostapd_driver_set_noa(hapd, 0, 0, 0);
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_p2p_non_p2p_sta_disconnected(struct hostapd_data *hapd)
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_printf(MSG_DEBUG, "P2P: Last non-P2P device disconnected");
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->noa_enabled) {
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "P2P: Enable periodic NoA");
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hostapd_driver_set_noa(hapd, 255, hapd->noa_start,
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       hapd->noa_duration);
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P_MANAGER
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtu8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid)
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 bitmap;
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*eid++ = WLAN_EID_VENDOR_SPECIFIC;
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*eid++ = 4 + 3 + 1;
99a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt	WPA_PUT_BE32(eid, P2P_IE_VENDOR_TYPE);
100a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt	eid += 4;
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*eid++ = P2P_ATTR_MANAGEABILITY;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_LE16(eid, 1);
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eid += 2;
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	bitmap = P2P_MAN_DEVICE_MANAGEMENT;
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hapd->conf->p2p & P2P_ALLOW_CROSS_CONNECTION)
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		bitmap |= P2P_MAN_CROSS_CONNECTION_PERMITTED;
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	bitmap |= P2P_MAN_COEXISTENCE_OPTIONAL;
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*eid++ = bitmap;
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return eid;
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P_MANAGER */
114