Browse Source

WPS: Add virtual flags in Config Methods for WPS 2.0 if needed

This is a workaround for incorrect configuration (missing
virtual/physical identifier for config methods) for WPS 2.0 to
allow unmodified configuration from WPS 1.0 to be used while
enforcing compliant WPS 2.0 values.
Jouni Malinen 14 years ago
parent
commit
092acb5441
1 changed files with 25 additions and 0 deletions
  1. 25 0
      wpa_supplicant/wps_supplicant.c

+ 25 - 0
wpa_supplicant/wps_supplicant.c

@@ -934,6 +934,29 @@ static void wpas_wps_set_sel_reg_cb(void *ctx, int sel_reg, u16 dev_passwd_id,
 }
 
 
+static u16 wps_fix_config_methods(u16 config_methods)
+{
+#ifdef CONFIG_WPS2
+	if ((config_methods &
+	     (WPS_CONFIG_DISPLAY | WPS_CONFIG_VIRT_DISPLAY |
+	      WPS_CONFIG_PHY_DISPLAY)) == WPS_CONFIG_DISPLAY) {
+		wpa_printf(MSG_INFO, "WPS: Converting display to "
+			   "virtual_display for WPS 2.0 compliance");
+		config_methods |= WPS_CONFIG_VIRT_DISPLAY;
+	}
+	if ((config_methods &
+	     (WPS_CONFIG_PUSHBUTTON | WPS_CONFIG_VIRT_PUSHBUTTON |
+	      WPS_CONFIG_PHY_PUSHBUTTON)) == WPS_CONFIG_PUSHBUTTON) {
+		wpa_printf(MSG_INFO, "WPS: Converting push_button to "
+			   "virtual_push_button for WPS 2.0 compliance");
+		config_methods |= WPS_CONFIG_VIRT_PUSHBUTTON;
+	}
+#endif /* CONFIG_WPS2 */
+
+	return config_methods;
+}
+
+
 int wpas_wps_init(struct wpa_supplicant *wpa_s)
 {
 	struct wps_context *wps;
@@ -961,6 +984,7 @@ int wpas_wps_init(struct wpa_supplicant *wpa_s)
 		os_free(wps);
 		return -1;
 	}
+	wps->config_methods = wps_fix_config_methods(wps->config_methods);
 	if (wpa_s->conf->device_type &&
 	    wps_dev_type_str2bin(wpa_s->conf->device_type,
 				 wps->dev.pri_dev_type) < 0) {
@@ -1442,6 +1466,7 @@ void wpas_wps_update_config(struct wpa_supplicant *wpa_s)
 			wps->config_methods &= ~WPS_CONFIG_LABEL;
 		}
 	}
+	wps->config_methods = wps_fix_config_methods(wps->config_methods);
 
 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_TYPE) {
 		if (wpa_s->conf->device_type &&