P2P: Add P2P configuration and callbacks in hostapd code
This commit is contained in:
parent
b22128efdc
commit
e44f8bf20a
6 changed files with 164 additions and 0 deletions
|
@ -313,6 +313,11 @@ struct hostapd_bss_config {
|
||||||
char *model_url;
|
char *model_url;
|
||||||
char *upc;
|
char *upc;
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
|
||||||
|
#define P2P_ENABLED BIT(0)
|
||||||
|
#define P2P_GROUP_OWNER BIT(1)
|
||||||
|
#define P2P_GROUP_FORMATION BIT(2)
|
||||||
|
int p2p;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include "common/ieee802_11_defs.h"
|
#include "common/ieee802_11_defs.h"
|
||||||
#include "common/ieee802_11_common.h"
|
#include "common/ieee802_11_common.h"
|
||||||
#include "drivers/driver.h"
|
#include "drivers/driver.h"
|
||||||
|
#include "wps/wps_defs.h"
|
||||||
|
#include "p2p/p2p.h"
|
||||||
#include "hostapd.h"
|
#include "hostapd.h"
|
||||||
#include "ieee802_11.h"
|
#include "ieee802_11.h"
|
||||||
#include "wpa_auth.h"
|
#include "wpa_auth.h"
|
||||||
|
@ -233,6 +235,21 @@ void handle_probe_req(struct hostapd_data *hapd,
|
||||||
return;
|
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) {
|
if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0) {
|
||||||
wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for "
|
wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for "
|
||||||
"broadcast SSID ignored", MAC2STR(mgmt->sa));
|
"broadcast SSID ignored", MAC2STR(mgmt->sa));
|
||||||
|
@ -241,6 +258,16 @@ void handle_probe_req(struct hostapd_data *hapd,
|
||||||
|
|
||||||
sta = ap_get_sta(hapd, mgmt->sa);
|
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 ||
|
if (elems.ssid_len == 0 ||
|
||||||
(elems.ssid_len == hapd->conf->ssid.ssid_len &&
|
(elems.ssid_len == hapd->conf->ssid.ssid_len &&
|
||||||
os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) ==
|
os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) ==
|
||||||
|
@ -272,6 +299,10 @@ void handle_probe_req(struct hostapd_data *hapd,
|
||||||
if (hapd->wps_probe_resp_ie)
|
if (hapd->wps_probe_resp_ie)
|
||||||
buflen += wpabuf_len(hapd->wps_probe_resp_ie);
|
buflen += wpabuf_len(hapd->wps_probe_resp_ie);
|
||||||
#endif /* CONFIG_WPS */
|
#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);
|
resp = os_zalloc(buflen);
|
||||||
if (resp == NULL)
|
if (resp == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -329,6 +360,15 @@ void handle_probe_req(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_WPS */
|
#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 */
|
||||||
|
|
||||||
if (hapd->drv.send_mgmt_frame(hapd, resp, pos - (u8 *) resp) < 0)
|
if (hapd->drv.send_mgmt_frame(hapd, resp, pos - (u8 *) resp) < 0)
|
||||||
perror("handle_probe_req: send");
|
perror("handle_probe_req: send");
|
||||||
|
|
||||||
|
@ -347,6 +387,11 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
u16 capab_info;
|
u16 capab_info;
|
||||||
size_t head_len, tail_len;
|
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_HEAD_BUF_SIZE 256
|
||||||
#define BEACON_TAIL_BUF_SIZE 512
|
#define BEACON_TAIL_BUF_SIZE 512
|
||||||
head = os_zalloc(BEACON_HEAD_BUF_SIZE);
|
head = os_zalloc(BEACON_HEAD_BUF_SIZE);
|
||||||
|
@ -355,6 +400,10 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
if (hapd->conf->wps_state && hapd->wps_beacon_ie)
|
if (hapd->conf->wps_state && hapd->wps_beacon_ie)
|
||||||
tail_len += wpabuf_len(hapd->wps_beacon_ie);
|
tail_len += wpabuf_len(hapd->wps_beacon_ie);
|
||||||
#endif /* CONFIG_WPS */
|
#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);
|
tailpos = tail = os_malloc(tail_len);
|
||||||
if (head == NULL || tail == NULL) {
|
if (head == NULL || tail == NULL) {
|
||||||
wpa_printf(MSG_ERROR, "Failed to set beacon data");
|
wpa_printf(MSG_ERROR, "Failed to set beacon data");
|
||||||
|
@ -431,6 +480,14 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_WPS */
|
#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 */
|
||||||
|
|
||||||
tail_len = tailpos > tail ? tailpos - tail : 0;
|
tail_len = tailpos > tail ? tailpos - tail : 0;
|
||||||
|
|
||||||
if (hapd->drv.set_beacon(hapd, (u8 *) head, head_len,
|
if (hapd->drv.set_beacon(hapd, (u8 *) head, head_len,
|
||||||
|
@ -442,6 +499,9 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
os_free(tail);
|
os_free(tail);
|
||||||
os_free(head);
|
os_free(head);
|
||||||
|
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
no_beacon:
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
hapd->drv.set_bss_params(hapd, !!(ieee802_11_erp_info(hapd) &
|
hapd->drv.set_bss_params(hapd, !!(ieee802_11_erp_info(hapd) &
|
||||||
ERP_INFO_USE_PROTECTION));
|
ERP_INFO_USE_PROTECTION));
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "ieee802_11.h"
|
#include "ieee802_11.h"
|
||||||
#include "sta_info.h"
|
#include "sta_info.h"
|
||||||
#include "wps_hostapd.h"
|
#include "wps_hostapd.h"
|
||||||
|
#include "p2p_hostapd.h"
|
||||||
#include "ctrl_iface_ap.h"
|
#include "ctrl_iface_ap.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,6 +58,9 @@ static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd,
|
||||||
buflen - len);
|
buflen - len);
|
||||||
if (res >= 0)
|
if (res >= 0)
|
||||||
len += res;
|
len += res;
|
||||||
|
res = hostapd_p2p_get_mib_sta(hapd, sta, buf + len, buflen - len);
|
||||||
|
if (res >= 0)
|
||||||
|
len += res;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,11 +177,17 @@ struct hostapd_data {
|
||||||
int freq);
|
int freq);
|
||||||
void *public_action_cb_ctx;
|
void *public_action_cb_ctx;
|
||||||
|
|
||||||
|
int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len,
|
||||||
|
int freq);
|
||||||
|
void *vendor_action_cb_ctx;
|
||||||
|
|
||||||
void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr,
|
void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr,
|
||||||
const u8 *uuid_e);
|
const u8 *uuid_e);
|
||||||
void *wps_reg_success_cb_ctx;
|
void *wps_reg_success_cb_ctx;
|
||||||
|
|
||||||
#ifdef CONFIG_P2P
|
#ifdef CONFIG_P2P
|
||||||
|
struct p2p_data *p2p;
|
||||||
|
struct p2p_group *p2p_group;
|
||||||
struct wpabuf *p2p_beacon_ie;
|
struct wpabuf *p2p_beacon_ie;
|
||||||
struct wpabuf *p2p_probe_resp_ie;
|
struct wpabuf *p2p_probe_resp_ie;
|
||||||
#endif /* CONFIG_P2P */
|
#endif /* CONFIG_P2P */
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "common/wpa_ctrl.h"
|
#include "common/wpa_ctrl.h"
|
||||||
#include "radius/radius.h"
|
#include "radius/radius.h"
|
||||||
#include "radius/radius_client.h"
|
#include "radius/radius_client.h"
|
||||||
|
#include "p2p/p2p.h"
|
||||||
#include "wps/wps.h"
|
#include "wps/wps.h"
|
||||||
#include "hostapd.h"
|
#include "hostapd.h"
|
||||||
#include "beacon.h"
|
#include "beacon.h"
|
||||||
|
@ -1363,6 +1364,14 @@ static void handle_action(struct hostapd_data *hapd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WLAN_ACTION_VENDOR_SPECIFIC:
|
||||||
|
if (hapd->vendor_action_cb) {
|
||||||
|
if (hapd->vendor_action_cb(hapd->vendor_action_cb_ctx,
|
||||||
|
(u8 *) mgmt, len,
|
||||||
|
hapd->iface->freq) == 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
|
hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
|
||||||
|
|
|
@ -30,10 +30,12 @@
|
||||||
#include "eap_server/eap_methods.h"
|
#include "eap_server/eap_methods.h"
|
||||||
#include "eap_common/eap_wsc_common.h"
|
#include "eap_common/eap_wsc_common.h"
|
||||||
#include "wps/wps.h"
|
#include "wps/wps.h"
|
||||||
|
#include "common/ieee802_11_defs.h"
|
||||||
#include "config_ssid.h"
|
#include "config_ssid.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "wpa_supplicant_i.h"
|
#include "wpa_supplicant_i.h"
|
||||||
#include "driver_i.h"
|
#include "driver_i.h"
|
||||||
|
#include "p2p_supplicant.h"
|
||||||
#include "ap.h"
|
#include "ap.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -160,25 +162,75 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
|
||||||
bss->device_type = os_strdup(wpa_s->conf->device_type);
|
bss->device_type = os_strdup(wpa_s->conf->device_type);
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
if (wpa_s->conf->device_name) {
|
||||||
|
bss->device_name = os_strdup(wpa_s->conf->device_name);
|
||||||
|
bss->friendly_name = os_strdup(wpa_s->conf->device_name);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void ap_public_action_rx(void *ctx, const u8 *buf, size_t len, int freq)
|
static void ap_public_action_rx(void *ctx, const u8 *buf, size_t len, int freq)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
|
const struct ieee80211_mgmt *mgmt;
|
||||||
|
size_t hdr_len;
|
||||||
|
|
||||||
|
mgmt = (const struct ieee80211_mgmt *) buf;
|
||||||
|
hdr_len = (const u8 *) &mgmt->u.action.u.vs_public_action.action - buf;
|
||||||
|
if (hdr_len > len)
|
||||||
|
return;
|
||||||
|
wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid,
|
||||||
|
mgmt->u.action.category,
|
||||||
|
&mgmt->u.action.u.vs_public_action.action,
|
||||||
|
len - hdr_len, freq);
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ap_vendor_action_rx(void *ctx, const u8 *buf, size_t len, int freq)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
|
const struct ieee80211_mgmt *mgmt;
|
||||||
|
size_t hdr_len;
|
||||||
|
|
||||||
|
mgmt = (const struct ieee80211_mgmt *) buf;
|
||||||
|
hdr_len = (const u8 *) &mgmt->u.action.u.vs_public_action.action - buf;
|
||||||
|
if (hdr_len > len)
|
||||||
|
return -1;
|
||||||
|
wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid,
|
||||||
|
mgmt->u.action.category,
|
||||||
|
&mgmt->u.action.u.vs_public_action.action,
|
||||||
|
len - hdr_len, freq);
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ap_probe_req_rx(void *ctx, const u8 *addr, const u8 *ie,
|
static int ap_probe_req_rx(void *ctx, const u8 *addr, const u8 *ie,
|
||||||
size_t ie_len)
|
size_t ie_len)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
|
return wpas_p2p_probe_req_rx(wpa_s, addr, ie, ie_len);
|
||||||
|
#else /* CONFIG_P2P */
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void ap_wps_reg_success_cb(void *ctx, const u8 *mac_addr,
|
static void ap_wps_reg_success_cb(void *ctx, const u8 *mac_addr,
|
||||||
const u8 *uuid_e)
|
const u8 *uuid_e)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
|
wpas_p2p_wps_success(wpa_s, mac_addr, 1);
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -260,6 +312,14 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
if (ssid->mode == WPAS_MODE_P2P_GO)
|
||||||
|
conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER;
|
||||||
|
else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
|
||||||
|
conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER |
|
||||||
|
P2P_GROUP_FORMATION;
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
|
|
||||||
hapd_iface->num_bss = conf->num_bss;
|
hapd_iface->num_bss = conf->num_bss;
|
||||||
hapd_iface->bss = os_zalloc(conf->num_bss *
|
hapd_iface->bss = os_zalloc(conf->num_bss *
|
||||||
sizeof(struct hostapd_data *));
|
sizeof(struct hostapd_data *));
|
||||||
|
@ -280,10 +340,18 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
|
||||||
hapd_iface->bss[i]->msg_ctx = wpa_s;
|
hapd_iface->bss[i]->msg_ctx = wpa_s;
|
||||||
hapd_iface->bss[i]->public_action_cb = ap_public_action_rx;
|
hapd_iface->bss[i]->public_action_cb = ap_public_action_rx;
|
||||||
hapd_iface->bss[i]->public_action_cb_ctx = wpa_s;
|
hapd_iface->bss[i]->public_action_cb_ctx = wpa_s;
|
||||||
|
hapd_iface->bss[i]->vendor_action_cb = ap_vendor_action_rx;
|
||||||
|
hapd_iface->bss[i]->vendor_action_cb_ctx = wpa_s;
|
||||||
hostapd_register_probereq_cb(hapd_iface->bss[i],
|
hostapd_register_probereq_cb(hapd_iface->bss[i],
|
||||||
ap_probe_req_rx, wpa_s);
|
ap_probe_req_rx, wpa_s);
|
||||||
hapd_iface->bss[i]->wps_reg_success_cb = ap_wps_reg_success_cb;
|
hapd_iface->bss[i]->wps_reg_success_cb = ap_wps_reg_success_cb;
|
||||||
hapd_iface->bss[i]->wps_reg_success_cb_ctx = wpa_s;
|
hapd_iface->bss[i]->wps_reg_success_cb_ctx = wpa_s;
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
hapd_iface->bss[i]->p2p = wpa_s->global->p2p;
|
||||||
|
hapd_iface->bss[i]->p2p_group = wpas_p2p_group_init(
|
||||||
|
wpa_s, ssid->p2p_persistent_group,
|
||||||
|
ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION);
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
}
|
}
|
||||||
|
|
||||||
os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN);
|
os_memcpy(hapd_iface->bss[0]->own_addr, wpa_s->own_addr, ETH_ALEN);
|
||||||
|
@ -314,6 +382,10 @@ void wpa_supplicant_ap_deinit(struct wpa_supplicant *wpa_s)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wpa_s->current_ssid = NULL;
|
wpa_s->current_ssid = NULL;
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
wpa_s->ap_iface->bss[0]->p2p_group = NULL;
|
||||||
|
wpas_p2p_group_deinit(wpa_s);
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
hostapd_interface_deinit(wpa_s->ap_iface);
|
hostapd_interface_deinit(wpa_s->ap_iface);
|
||||||
hostapd_interface_free(wpa_s->ap_iface);
|
hostapd_interface_free(wpa_s->ap_iface);
|
||||||
wpa_s->ap_iface = NULL;
|
wpa_s->ap_iface = NULL;
|
||||||
|
@ -481,6 +553,14 @@ int wpa_supplicant_ap_update_beacon(struct wpa_supplicant *wpa_s)
|
||||||
if (ssid == NULL || wpa_s->ap_iface == NULL)
|
if (ssid == NULL || wpa_s->ap_iface == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
if (ssid->mode == WPAS_MODE_P2P_GO)
|
||||||
|
iface->conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER;
|
||||||
|
else if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
|
||||||
|
iface->conf->bss[0].p2p = P2P_ENABLED | P2P_GROUP_OWNER |
|
||||||
|
P2P_GROUP_FORMATION;
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
|
|
||||||
ieee802_11_set_beacons(iface);
|
ieee802_11_set_beacons(iface);
|
||||||
hapd = iface->bss[0];
|
hapd = iface->bss[0];
|
||||||
hapd->drv.set_ap_wps_ie(hapd);
|
hapd->drv.set_ap_wps_ie(hapd);
|
||||||
|
|
Loading…
Reference in a new issue