diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 5b0a506c8..f264a3e40 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -39,13 +39,20 @@ static int hostapd_sta_flags_to_drv(int flags) } -static int hostapd_set_ap_wps_ie(struct hostapd_data *hapd, - const struct wpabuf *beacon, - const struct wpabuf *proberesp) +static int hostapd_set_ap_wps_ie(struct hostapd_data *hapd) { + struct wpabuf *beacon, *proberesp; + int ret; + if (hapd->driver == NULL || hapd->driver->set_ap_wps_ie == NULL) return 0; - return hapd->driver->set_ap_wps_ie(hapd->drv_priv, beacon, proberesp); + + beacon = hapd->wps_beacon_ie; + proberesp = hapd->wps_probe_resp_ie; + + ret = hapd->driver->set_ap_wps_ie(hapd->drv_priv, beacon, proberesp); + + return ret; } diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index 61956f8e4..3d0bab57c 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -48,9 +48,7 @@ struct hostapd_frame_info { struct hostapd_driver_ops { - int (*set_ap_wps_ie)(struct hostapd_data *hapd, - const struct wpabuf *beacon, - const struct wpabuf *probe); + int (*set_ap_wps_ie)(struct hostapd_data *hapd); int (*send_mgmt_frame)(struct hostapd_data *hapd, const void *msg, size_t len); int (*send_eapol)(struct hostapd_data *hapd, const u8 *addr, diff --git a/src/ap/wps_hostapd.c b/src/ap/wps_hostapd.c index 86ce10f30..bb433add8 100644 --- a/src/ap/wps_hostapd.c +++ b/src/ap/wps_hostapd.c @@ -100,8 +100,7 @@ static int hostapd_wps_set_ie_cb(void *ctx, struct wpabuf *beacon_ie, wpabuf_free(hapd->wps_probe_resp_ie); hapd->wps_probe_resp_ie = probe_resp_ie; ieee802_11_set_beacon(hapd); - return hapd->drv.set_ap_wps_ie(hapd, hapd->wps_beacon_ie, - hapd->wps_probe_resp_ie); + return hapd->drv.set_ap_wps_ie(hapd); } @@ -478,7 +477,7 @@ static void hostapd_wps_clear_ies(struct hostapd_data *hapd) wpabuf_free(hapd->wps_probe_resp_ie); hapd->wps_probe_resp_ie = NULL; - hapd->drv.set_ap_wps_ie(hapd, NULL, NULL); + hapd->drv.set_ap_wps_ie(hapd); } diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 0afc9fc51..5b614f605 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -1591,10 +1591,11 @@ struct wpa_driver_ops { const u8 *ht_oper, size_t ht_oper_len); /** - * set_ap_wps_ie - Add WPS IE into Beacon/Probe Response frames (AP) + * set_ap_wps_ie - Add WPS IE(s) into Beacon/Probe Response frames (AP) * @priv: Private driver interface data - * @beacon: WPS IE for Beacon frames - * @proberesp: WPS IE for Probe Response frames + * @beacon: WPS IE(s) for Beacon frames or %NULL to remove extra IE(s) + * @proberesp: WPS IE(s) for Probe Response frames or %NULL to remove + * extra IE(s) * Returns: 0 on success, -1 on failure * * This is an optional function to add WPS IE in the kernel driver for diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h index fa2ae4fad..a70aa6a3e 100644 --- a/wpa_supplicant/driver_i.h +++ b/wpa_supplicant/driver_i.h @@ -481,4 +481,14 @@ static inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s, return -1; } +static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s, + const struct wpabuf *beacon, + const struct wpabuf *proberesp) +{ + if (!wpa_s->driver->set_ap_wps_ie) + return -1; + return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon, + proberesp); +} + #endif /* DRIVER_I_H */