X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fap%2Fbeacon.c;h=17cb541e191e55748658d744c11041680512d856;hb=dce044cce59af4e2c56e4428ae905bc0bff85c60;hp=bdc2c0a8fd5995ade30cce21caabd8b6d77b81d9;hpb=1bc774a12a775ad3fa86532bedd8c32c9e517f4e;p=libeap.git diff --git a/src/ap/beacon.c b/src/ap/beacon.c index bdc2c0a..17cb541 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -22,12 +22,15 @@ #include "common/ieee802_11_defs.h" #include "common/ieee802_11_common.h" #include "drivers/driver.h" +#include "wps/wps_defs.h" +#include "p2p/p2p.h" #include "hostapd.h" #include "ieee802_11.h" #include "wpa_auth.h" #include "wmm.h" #include "ap_config.h" #include "sta_info.h" +#include "p2p_hostapd.h" #include "beacon.h" @@ -57,7 +60,8 @@ static u8 ieee802_11_erp_info(struct hostapd_data *hapd) } break; } - if (hapd->iface->num_sta_no_short_preamble > 0) + if (hapd->iface->num_sta_no_short_preamble > 0 || + hapd->iconf->preamble == LONG_PREAMBLE) erp |= ERP_INFO_BARKER_PREAMBLE_MODE; return erp; @@ -232,6 +236,21 @@ void handle_probe_req(struct hostapd_data *hapd, return; } +#ifdef CONFIG_P2P + if (hapd->p2p && elems.wps_ie) { + struct wpabuf *wps; + wps = ieee802_11_vendor_ie_concat(ie, ie_len, WPS_DEV_OUI_WFA); + if (wps && !p2p_group_match_dev_type(hapd->p2p_group, wps)) { + wpa_printf(MSG_MSGDUMP, "P2P: Ignore Probe Request " + "due to mismatch with Requested Device " + "Type"); + wpabuf_free(wps); + return; + } + wpabuf_free(wps); + } +#endif /* CONFIG_P2P */ + if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0) { wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for " "broadcast SSID ignored", MAC2STR(mgmt->sa)); @@ -240,6 +259,16 @@ void handle_probe_req(struct hostapd_data *hapd, sta = ap_get_sta(hapd, mgmt->sa); +#ifdef CONFIG_P2P + if ((hapd->conf->p2p & P2P_GROUP_OWNER) && + elems.ssid_len == P2P_WILDCARD_SSID_LEN && + os_memcmp(elems.ssid, P2P_WILDCARD_SSID, + P2P_WILDCARD_SSID_LEN) == 0) { + /* Process P2P Wildcard SSID like Wildcard SSID */ + elems.ssid_len = 0; + } +#endif /* CONFIG_P2P */ + if (elems.ssid_len == 0 || (elems.ssid_len == hapd->conf->ssid.ssid_len && os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) == @@ -256,8 +285,9 @@ void handle_probe_req(struct hostapd_data *hapd, ieee802_11_print_ssid(ssid_txt, elems.ssid, elems.ssid_len); wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR - " for foreign SSID '%s'", - MAC2STR(mgmt->sa), ssid_txt); + " for foreign SSID '%s' (DA " MACSTR ")", + MAC2STR(mgmt->sa), ssid_txt, + MAC2STR(mgmt->da)); } return; } @@ -270,6 +300,10 @@ void handle_probe_req(struct hostapd_data *hapd, if (hapd->wps_probe_resp_ie) buflen += wpabuf_len(hapd->wps_probe_resp_ie); #endif /* CONFIG_WPS */ +#ifdef CONFIG_P2P + if (hapd->p2p_probe_resp_ie) + buflen += wpabuf_len(hapd->p2p_probe_resp_ie); +#endif /* CONFIG_P2P */ resp = os_zalloc(buflen); if (resp == NULL) return; @@ -327,12 +361,26 @@ void handle_probe_req(struct hostapd_data *hapd, } #endif /* CONFIG_WPS */ +#ifdef CONFIG_P2P + if ((hapd->conf->p2p & P2P_ENABLED) && elems.p2p && + hapd->p2p_probe_resp_ie) { + os_memcpy(pos, wpabuf_head(hapd->p2p_probe_resp_ie), + wpabuf_len(hapd->p2p_probe_resp_ie)); + pos += wpabuf_len(hapd->p2p_probe_resp_ie); + } +#endif /* CONFIG_P2P */ +#ifdef CONFIG_P2P_MANAGER + if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) == + P2P_MANAGE) + pos = hostapd_eid_p2p_manage(hapd, pos); +#endif /* CONFIG_P2P_MANAGER */ + if (hapd->drv.send_mgmt_frame(hapd, resp, pos - (u8 *) resp) < 0) perror("handle_probe_req: send"); os_free(resp); - wpa_printf(MSG_MSGDUMP, "STA " MACSTR " sent probe request for %s " + wpa_printf(MSG_EXCESSIVE, "STA " MACSTR " sent probe request for %s " "SSID", MAC2STR(mgmt->sa), elems.ssid_len == 0 ? "broadcast" : "our"); } @@ -345,6 +393,11 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) u16 capab_info; size_t head_len, tail_len; +#ifdef CONFIG_P2P + if ((hapd->conf->p2p & (P2P_ENABLED | P2P_GROUP_OWNER)) == P2P_ENABLED) + goto no_beacon; +#endif /* CONFIG_P2P */ + #define BEACON_HEAD_BUF_SIZE 256 #define BEACON_TAIL_BUF_SIZE 512 head = os_zalloc(BEACON_HEAD_BUF_SIZE); @@ -353,6 +406,10 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) if (hapd->conf->wps_state && hapd->wps_beacon_ie) tail_len += wpabuf_len(hapd->wps_beacon_ie); #endif /* CONFIG_WPS */ +#ifdef CONFIG_P2P + if (hapd->p2p_beacon_ie) + tail_len += wpabuf_len(hapd->p2p_beacon_ie); +#endif /* CONFIG_P2P */ tailpos = tail = os_malloc(tail_len); if (head == NULL || tail == NULL) { wpa_printf(MSG_ERROR, "Failed to set beacon data"); @@ -429,6 +486,19 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) } #endif /* CONFIG_WPS */ +#ifdef CONFIG_P2P + if ((hapd->conf->p2p & P2P_ENABLED) && hapd->p2p_beacon_ie) { + os_memcpy(tailpos, wpabuf_head(hapd->p2p_beacon_ie), + wpabuf_len(hapd->p2p_beacon_ie)); + tailpos += wpabuf_len(hapd->p2p_beacon_ie); + } +#endif /* CONFIG_P2P */ +#ifdef CONFIG_P2P_MANAGER + if ((hapd->conf->p2p & (P2P_MANAGE | P2P_ENABLED | P2P_GROUP_OWNER)) == + P2P_MANAGE) + tailpos = hostapd_eid_p2p_manage(hapd, tailpos); +#endif /* CONFIG_P2P_MANAGER */ + tail_len = tailpos > tail ? tailpos - tail : 0; if (hapd->drv.set_beacon(hapd, (u8 *) head, head_len, @@ -440,6 +510,9 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) os_free(tail); os_free(head); +#ifdef CONFIG_P2P +no_beacon: +#endif /* CONFIG_P2P */ hapd->drv.set_bss_params(hapd, !!(ieee802_11_erp_info(hapd) & ERP_INFO_USE_PROTECTION)); }