diff mbox

[1/3] HT: let the driver advertise its supported smps modes

Message ID 1413775301-549-1-git-send-email-ilan.peer@intel.com
State Accepted
Headers show

Commit Message

Peer, Ilan Oct. 20, 2014, 3:21 a.m. UTC
From: Eliad Peller <eliad@wizery.com>

Add smps_modes field, and let the driver fill it
with its supported smps mode (static/dynamic)

Finally, this will let us start an ap with specific
smps mode (e.g. dynamic) that will allow it to
reduce its power usage.

Signed-off-by: Eliad Peller <eliad@wizery.com>
---
 hostapd/main.c                    |  1 +
 src/ap/hostapd.h                  |  3 +++
 src/ap/hw_features.c              | 23 ++++++++++++++++++-----
 src/drivers/driver.h              |  4 ++++
 wpa_supplicant/ap.c               |  1 +
 wpa_supplicant/wpa_supplicant.c   |  1 +
 wpa_supplicant/wpa_supplicant_i.h |  1 +
 7 files changed, 29 insertions(+), 5 deletions(-)

Comments

Jouni Malinen Oct. 24, 2014, 8:06 a.m. UTC | #1
On Sun, Oct 19, 2014 at 11:21:39PM -0400, Ilan Peer wrote:
> Add smps_modes field, and let the driver fill it
> with its supported smps mode (static/dynamic)
> 
> Finally, this will let us start an ap with specific
> smps mode (e.g. dynamic) that will allow it to
> reduce its power usage.

Thanks, all three patches applied.
diff mbox

Patch

diff --git a/hostapd/main.c b/hostapd/main.c
index a9d91b9..5a47711 100644
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -213,6 +213,7 @@  static int hostapd_driver_init(struct hostapd_iface *iface)
 	if (hapd->driver->get_capa &&
 	    hapd->driver->get_capa(hapd->drv_priv, &capa) == 0) {
 		iface->drv_flags = capa.flags;
+		iface->smps_modes = capa.smps_modes;
 		iface->probe_resp_offloads = capa.probe_resp_offloads;
 		iface->extended_capa = capa.extended_capa;
 		iface->extended_capa_mask = capa.extended_capa_mask;
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index ca01a68..3bd111e 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -293,6 +293,9 @@  struct hostapd_iface {
 
 	unsigned int drv_flags;
 
+	/* smps modes supported by the driver (WPA_DRIVER_SMPS_MODE_*) */
+	unsigned int smps_modes;
+
 	/*
 	 * A bitmap of supported protocols for probe response offload. See
 	 * struct wpa_driver_capa in driver.h
diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c
index 4e66d1b..6796885 100644
--- a/src/ap/hw_features.c
+++ b/src/ap/hw_features.c
@@ -746,11 +746,24 @@  static int ieee80211n_supported_ht_capab(struct hostapd_iface *iface)
 		return 0;
 	}
 
-	if ((conf & HT_CAP_INFO_SMPS_MASK) != (hw & HT_CAP_INFO_SMPS_MASK) &&
-	    (conf & HT_CAP_INFO_SMPS_MASK) != HT_CAP_INFO_SMPS_DISABLED) {
-		wpa_printf(MSG_ERROR, "Driver does not support configured "
-			   "HT capability [SMPS-*]");
-		return 0;
+	switch (conf & HT_CAP_INFO_SMPS_MASK) {
+	case HT_CAP_INFO_SMPS_STATIC:
+		if (!(iface->smps_modes & WPA_DRIVER_SMPS_MODE_STATIC)) {
+			wpa_printf(MSG_ERROR, "Driver does not support "
+				   "configured HT capability [SMPS-STATIC]");
+			return 0;
+		}
+		break;
+	case HT_CAP_INFO_SMPS_DYNAMIC:
+		if (!(iface->smps_modes & WPA_DRIVER_SMPS_MODE_DYNAMIC)) {
+			wpa_printf(MSG_ERROR, "Driver does not support "
+				   "configured HT capability [SMPS-DYNAMIC]");
+			return 0;
+		}
+		break;
+	case HT_CAP_INFO_SMPS_DISABLED:
+	default:
+		break;
 	}
 
 	if ((conf & HT_CAP_INFO_GREEN_FIELD) &&
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index ad9d080..9b67136 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1048,6 +1048,10 @@  struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_MESH			0x0000000100000000ULL
 	u64 flags;
 
+#define WPA_DRIVER_SMPS_MODE_STATIC			0x00000001
+#define WPA_DRIVER_SMPS_MODE_DYNAMIC			0x00000002
+	unsigned int smps_modes;
+
 	int max_scan_ssids;
 	int max_sched_scan_ssids;
 	int sched_scan_supported;
diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c
index 7555c42..ec6e868 100644
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
@@ -555,6 +555,7 @@  int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
 		return -1;
 	hapd_iface->owner = wpa_s;
 	hapd_iface->drv_flags = wpa_s->drv_flags;
+	hapd_iface->smps_modes = wpa_s->drv_smps_modes;
 	hapd_iface->probe_resp_offloads = wpa_s->probe_resp_offloads;
 	hapd_iface->extended_capa = wpa_s->extended_capa;
 	hapd_iface->extended_capa_mask = wpa_s->extended_capa_mask;
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index b05eb86..58aff9c 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -3788,6 +3788,7 @@  static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
 		wpa_s->drv_capa_known = 1;
 		wpa_s->drv_flags = capa.flags;
 		wpa_s->drv_enc = capa.enc;
+		wpa_s->drv_smps_modes = capa.smps_modes;
 		wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
 		wpa_s->max_scan_ssids = capa.max_scan_ssids;
 		wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 5ad283d..1d390ad 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -573,6 +573,7 @@  struct wpa_supplicant {
 
 	u64 drv_flags;
 	unsigned int drv_enc;
+	unsigned int drv_smps_modes;
 
 	/*
 	 * A bitmap of supported protocols for probe response offload. See