From dce044cce59af4e2c56e4428ae905bc0bff85c60 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Fri, 8 Oct 2010 18:16:07 +0300 Subject: [PATCH] P2P: Extend P2P manager functionality to work with driver MLME Add P2P IE into Beacon, Probe Response, and (Re)Association Request frames for drivers that generate this frames internally. --- hostapd/Makefile | 5 +++++ src/ap/ap_drv_ops.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++---- src/ap/beacon.c | 25 +-------------------- src/ap/beacon.h | 1 - src/ap/ieee802_11.c | 1 + src/ap/p2p_hostapd.c | 30 ++++++++++++++++++++++++++ src/ap/p2p_hostapd.h | 2 ++ 7 files changed, 96 insertions(+), 29 deletions(-) diff --git a/hostapd/Makefile b/hostapd/Makefile index 7d4bab8..887a62f 100644 --- a/hostapd/Makefile +++ b/hostapd/Makefile @@ -719,6 +719,11 @@ ifdef CONFIG_IEEE80211N OBJS += ../src/ap/ieee802_11_ht.o endif +ifdef CONFIG_P2P_MANAGER +CFLAGS += -DCONFIG_P2P_MANAGER +OBJS += ../src/ap/p2p_hostapd.o +endif + ifdef CONFIG_NO_STDOUT_DEBUG CFLAGS += -DCONFIG_NO_STDOUT_DEBUG endif diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 5aed879..3fd2761 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -22,6 +22,7 @@ #include "ieee802_11.h" #include "sta_info.h" #include "ap_config.h" +#include "p2p_hostapd.h" #include "ap_drv_ops.h" @@ -86,18 +87,70 @@ static int hostapd_set_ap_wps_ie(struct hostapd_data *hapd) } #endif /* CONFIG_P2P */ +#ifdef CONFIG_P2P_MANAGER + if (hapd->conf->p2p & P2P_MANAGE) { + struct wpabuf *a; + + a = wpabuf_alloc(100 + (beacon ? wpabuf_len(beacon) : 0)); + if (a) { + u8 *start, *p; + if (beacon) + wpabuf_put_buf(a, beacon); + if (beacon != hapd->wps_beacon_ie) + wpabuf_free(beacon); + start = wpabuf_put(a, 0); + p = hostapd_eid_p2p_manage(hapd, start); + wpabuf_put(a, p - start); + beacon = a; + } + + a = wpabuf_alloc(100 + (proberesp ? wpabuf_len(proberesp) : + 0)); + if (a) { + u8 *start, *p; + if (proberesp) + wpabuf_put_buf(a, proberesp); + if (proberesp != hapd->wps_probe_resp_ie) + wpabuf_free(proberesp); + start = wpabuf_put(a, 0); + p = hostapd_eid_p2p_manage(hapd, start); + wpabuf_put(a, p - start); + proberesp = a; + } + } +#endif /* CONFIG_P2P_MANAGER */ + #ifdef CONFIG_WPS2 if (hapd->conf->wps_state) assocresp = wps_build_assoc_resp_ie(); #endif /* CONFIG_WPS2 */ +#ifdef CONFIG_P2P_MANAGER + if (hapd->conf->p2p & P2P_MANAGE) { + struct wpabuf *a; + a = wpabuf_alloc(100 + (assocresp ? wpabuf_len(assocresp) : + 0)); + if (a) { + u8 *start, *p; + start = wpabuf_put(a, 0); + p = hostapd_eid_p2p_manage(hapd, start); + wpabuf_put(a, p - start); + if (assocresp) { + wpabuf_put_buf(a, assocresp); + wpabuf_free(assocresp); + } + assocresp = a; + } + } +#endif /* CONFIG_P2P_MANAGER */ + ret = hapd->driver->set_ap_wps_ie(hapd->drv_priv, beacon, proberesp, assocresp); -#ifdef CONFIG_P2P - wpabuf_free(beacon); - wpabuf_free(proberesp); -#endif /* CONFIG_P2P */ + if (beacon != hapd->wps_beacon_ie) + wpabuf_free(beacon); + if (proberesp != hapd->wps_probe_resp_ie) + wpabuf_free(proberesp); wpabuf_free(assocresp); return ret; diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 83c7a27..17cb541 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -30,6 +30,7 @@ #include "wmm.h" #include "ap_config.h" #include "sta_info.h" +#include "p2p_hostapd.h" #include "beacon.h" @@ -195,30 +196,6 @@ static u8 * hostapd_eid_wpa(struct hostapd_data *hapd, u8 *eid, size_t len, } -#ifdef CONFIG_P2P_MANAGER -u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid) -{ - u8 bitmap; - *eid++ = WLAN_EID_VENDOR_SPECIFIC; - *eid++ = 4 + 3 + 1; - WPA_PUT_BE24(eid, OUI_WFA); - eid += 3; - *eid++ = P2P_OUI_TYPE; - - *eid++ = P2P_ATTR_MANAGEABILITY; - WPA_PUT_LE16(eid, 1); - eid += 2; - bitmap = P2P_MAN_DEVICE_MANAGEMENT; - if (hapd->conf->p2p & P2P_ALLOW_CROSS_CONNECTION) - bitmap |= P2P_MAN_CROSS_CONNECTION_PERMITTED; - bitmap |= P2P_MAN_COEXISTENCE_OPTIONAL; - *eid++ = bitmap; - - return eid; -} -#endif /* CONFIG_P2P_MANAGER */ - - void handle_probe_req(struct hostapd_data *hapd, const struct ieee80211_mgmt *mgmt, size_t len) { diff --git a/src/ap/beacon.h b/src/ap/beacon.h index 3df0487..c1510e1 100644 --- a/src/ap/beacon.h +++ b/src/ap/beacon.h @@ -20,7 +20,6 @@ struct ieee80211_mgmt; void handle_probe_req(struct hostapd_data *hapd, const struct ieee80211_mgmt *mgmt, size_t len); -u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid); #ifdef NEED_AP_MLME void ieee802_11_set_beacon(struct hostapd_data *hapd); void ieee802_11_set_beacons(struct hostapd_iface *iface); diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 7e0b89b..c73a794 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -38,6 +38,7 @@ #include "accounting.h" #include "ap_config.h" #include "ap_mlme.h" +#include "p2p_hostapd.h" #include "ieee802_11.h" diff --git a/src/ap/p2p_hostapd.c b/src/ap/p2p_hostapd.c index ffe16bb..6f8b778 100644 --- a/src/ap/p2p_hostapd.c +++ b/src/ap/p2p_hostapd.c @@ -15,13 +15,17 @@ #include "utils/includes.h" #include "utils/common.h" +#include "common/ieee802_11_defs.h" #include "p2p/p2p.h" #include "hostapd.h" +#include "ap_config.h" #include "ap_drv_ops.h" #include "sta_info.h" #include "p2p_hostapd.h" +#ifdef CONFIG_P2P + int hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta, char *buf, size_t buflen) { @@ -88,3 +92,29 @@ void hostapd_p2p_non_p2p_sta_disconnected(struct hostapd_data *hapd) hapd->noa_duration); } } + +#endif /* CONFIG_P2P */ + + +#ifdef CONFIG_P2P_MANAGER +u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid) +{ + u8 bitmap; + *eid++ = WLAN_EID_VENDOR_SPECIFIC; + *eid++ = 4 + 3 + 1; + WPA_PUT_BE24(eid, OUI_WFA); + eid += 3; + *eid++ = P2P_OUI_TYPE; + + *eid++ = P2P_ATTR_MANAGEABILITY; + WPA_PUT_LE16(eid, 1); + eid += 2; + bitmap = P2P_MAN_DEVICE_MANAGEMENT; + if (hapd->conf->p2p & P2P_ALLOW_CROSS_CONNECTION) + bitmap |= P2P_MAN_CROSS_CONNECTION_PERMITTED; + bitmap |= P2P_MAN_COEXISTENCE_OPTIONAL; + *eid++ = bitmap; + + return eid; +} +#endif /* CONFIG_P2P_MANAGER */ diff --git a/src/ap/p2p_hostapd.h b/src/ap/p2p_hostapd.h index ed8aa0b..95b31d9 100644 --- a/src/ap/p2p_hostapd.h +++ b/src/ap/p2p_hostapd.h @@ -36,4 +36,6 @@ static inline int hostapd_p2p_get_mib_sta(struct hostapd_data *hapd, #endif /* CONFIG_P2P */ +u8 * hostapd_eid_p2p_manage(struct hostapd_data *hapd, u8 *eid); + #endif /* P2P_HOSTAPD_H */ -- 2.1.4