hostapd: Add wowlan_triggers config param

New kernels in wiphy_suspend() will call cfg80211_leave_all()
that will eventually end up in cfg80211_stop_ap() unless
wowlan_triggers were set.

Bug: 17269024

Change-Id: I14d2191eda090cd86cabe1e5f059975fdf2f69e8
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 9414e8f..f20bc62 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -105,6 +105,9 @@
 "\n";
 #endif /* CONFIG_NO_STDOUT_DEBUG */
 
+struct wowlan_triggers *wpa_get_wowlan_triggers(const char *wowlan_triggers,
+						struct wpa_driver_capa *capa);
+
 /* Configure default/group WEP keys for static WEP */
 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
 {
@@ -3149,75 +3152,20 @@
 }
 
 
-static int wpas_check_wowlan_trigger(const char *start, const char *trigger,
-				     int capa_trigger, u8 *param_trigger)
-{
-	if (os_strcmp(start, trigger) != 0)
-		return 0;
-	if (!capa_trigger)
-		return 0;
-
-	*param_trigger = 1;
-	return 1;
-}
-
-
 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
 				    struct wpa_driver_capa *capa)
 {
-	struct wowlan_triggers triggers;
-	char *start, *end, *buf;
-	int last, ret;
+	struct wowlan_triggers *triggers;
+	int ret = 0;
 
 	if (!wpa_s->conf->wowlan_triggers)
 		return 0;
 
-	buf = os_strdup(wpa_s->conf->wowlan_triggers);
-	if (buf == NULL)
-		return -1;
-
-	os_memset(&triggers, 0, sizeof(triggers));
-
-#define CHECK_TRIGGER(trigger) \
-	wpas_check_wowlan_trigger(start, #trigger,			\
-				  capa->wowlan_triggers.trigger,	\
-				  &triggers.trigger)
-
-	start = buf;
-	while (*start != '\0') {
-		while (isblank(*start))
-			start++;
-		if (*start == '\0')
-			break;
-		end = start;
-		while (!isblank(*end) && *end != '\0')
-			end++;
-		last = *end == '\0';
-		*end = '\0';
-
-		if (!CHECK_TRIGGER(any) &&
-		    !CHECK_TRIGGER(disconnect) &&
-		    !CHECK_TRIGGER(magic_pkt) &&
-		    !CHECK_TRIGGER(gtk_rekey_failure) &&
-		    !CHECK_TRIGGER(eap_identity_req) &&
-		    !CHECK_TRIGGER(four_way_handshake) &&
-		    !CHECK_TRIGGER(rfkill_release)) {
-			wpa_printf(MSG_DEBUG,
-				   "Unknown/unsupported wowlan trigger '%s'",
-				   start);
-			ret = -1;
-			goto out;
-		}
-
-		if (last)
-			break;
-		start = end + 1;
+	triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
+	if (triggers) {
+		ret = wpa_drv_wowlan(wpa_s, triggers);
+		os_free(triggers);
 	}
-#undef CHECK_TRIGGER
-
-	ret = wpa_drv_wowlan(wpa_s, &triggers);
-out:
-	os_free(buf);
 	return ret;
 }