X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fap%2Fbeacon.c;h=17cb541e191e55748658d744c11041680512d856;hb=dce044cce59af4e2c56e4428ae905bc0bff85c60;hp=9c65760b96c68690a704b1f483c9baa4ac234fe4;hpb=1c08f8c0f090257c607e7b89f754b4f9a57c9f55;p=libeap.git diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 9c65760..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; @@ -209,8 +213,9 @@ void handle_probe_req(struct hostapd_data *hapd, ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)); for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) - hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, - mgmt->sa, ie, ie_len); + if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, + mgmt->sa, ie, ie_len) > 0) + return; if (!hapd->iconf->send_probe_response) return; @@ -231,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)); @@ -239,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) == @@ -255,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; } @@ -269,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; @@ -307,16 +342,17 @@ void handle_probe_req(struct hostapd_data *hapd, /* Extended supported rates */ pos = hostapd_eid_ext_supp_rates(hapd, pos); + /* RSN, MDIE, WPA */ pos = hostapd_eid_wpa(hapd, pos, epos - pos, sta); - /* Wi-Fi Alliance WMM */ - pos = hostapd_eid_wmm(hapd, pos); - #ifdef CONFIG_IEEE80211N pos = hostapd_eid_ht_capabilities(hapd, pos); pos = hostapd_eid_ht_operation(hapd, pos); #endif /* CONFIG_IEEE80211N */ + /* Wi-Fi Alliance WMM */ + pos = hostapd_eid_wmm(hapd, pos); + #ifdef CONFIG_WPS if (hapd->conf->wps_state && hapd->wps_probe_resp_ie) { os_memcpy(pos, wpabuf_head(hapd->wps_probe_resp_ie), @@ -325,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"); } @@ -343,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); @@ -351,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"); @@ -407,17 +466,18 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) /* Extended supported rates */ tailpos = hostapd_eid_ext_supp_rates(hapd, tailpos); + /* RSN, MDIE, WPA */ tailpos = hostapd_eid_wpa(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE - tailpos, NULL); - /* Wi-Fi Alliance WMM */ - tailpos = hostapd_eid_wmm(hapd, tailpos); - #ifdef CONFIG_IEEE80211N tailpos = hostapd_eid_ht_capabilities(hapd, tailpos); tailpos = hostapd_eid_ht_operation(hapd, tailpos); #endif /* CONFIG_IEEE80211N */ + /* Wi-Fi Alliance WMM */ + tailpos = hostapd_eid_wmm(hapd, tailpos); + #ifdef CONFIG_WPS if (hapd->conf->wps_state && hapd->wps_beacon_ie) { os_memcpy(tailpos, wpabuf_head(hapd->wps_beacon_ie), @@ -426,10 +486,22 @@ 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->conf->iface, hapd, - (u8 *) head, head_len, + if (hapd->drv.set_beacon(hapd, (u8 *) head, head_len, tail, tail_len, hapd->conf->dtim_period, hapd->iconf->beacon_int)) wpa_printf(MSG_ERROR, "Failed to set beacon head/tail or DTIM " @@ -438,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)); }