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