P2PS: WPS changes needed for P2PS default PIN
This provides additional WPS definitions and rules for negotiating use of P2PS default PIN configuration method. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
1a94b0adcc
commit
4f88fc0464
9 changed files with 48 additions and 5 deletions
|
@ -3723,6 +3723,8 @@ const char * p2p_wps_method_text(enum p2p_wps_method method)
|
||||||
return "PBC";
|
return "PBC";
|
||||||
case WPS_NFC:
|
case WPS_NFC:
|
||||||
return "NFC";
|
return "NFC";
|
||||||
|
case WPS_P2PS:
|
||||||
|
return "P2PS";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "??";
|
return "??";
|
||||||
|
|
|
@ -56,7 +56,8 @@ struct p2p_channels {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum p2p_wps_method {
|
enum p2p_wps_method {
|
||||||
WPS_NOT_READY, WPS_PIN_DISPLAY, WPS_PIN_KEYPAD, WPS_PBC, WPS_NFC
|
WPS_NOT_READY, WPS_PIN_DISPLAY, WPS_PIN_KEYPAD, WPS_PBC, WPS_NFC,
|
||||||
|
WPS_P2PS
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -164,15 +164,18 @@ void p2p_buf_add_device_info(struct wpabuf *buf, struct p2p_data *p2p,
|
||||||
if (peer->wps_method == WPS_PBC)
|
if (peer->wps_method == WPS_PBC)
|
||||||
methods |= WPS_CONFIG_PUSHBUTTON;
|
methods |= WPS_CONFIG_PUSHBUTTON;
|
||||||
else if (peer->wps_method == WPS_PIN_DISPLAY ||
|
else if (peer->wps_method == WPS_PIN_DISPLAY ||
|
||||||
peer->wps_method == WPS_PIN_KEYPAD)
|
peer->wps_method == WPS_PIN_KEYPAD) {
|
||||||
methods |= WPS_CONFIG_DISPLAY | WPS_CONFIG_KEYPAD;
|
methods |= WPS_CONFIG_DISPLAY | WPS_CONFIG_KEYPAD;
|
||||||
|
methods |= WPS_CONFIG_P2PS;
|
||||||
|
}
|
||||||
} else if (p2p->cfg->config_methods) {
|
} else if (p2p->cfg->config_methods) {
|
||||||
methods |= p2p->cfg->config_methods &
|
methods |= p2p->cfg->config_methods &
|
||||||
(WPS_CONFIG_PUSHBUTTON | WPS_CONFIG_DISPLAY |
|
(WPS_CONFIG_PUSHBUTTON | WPS_CONFIG_DISPLAY |
|
||||||
WPS_CONFIG_KEYPAD);
|
WPS_CONFIG_KEYPAD | WPS_CONFIG_P2PS);
|
||||||
} else {
|
} else {
|
||||||
methods |= WPS_CONFIG_PUSHBUTTON;
|
methods |= WPS_CONFIG_PUSHBUTTON;
|
||||||
methods |= WPS_CONFIG_DISPLAY | WPS_CONFIG_KEYPAD;
|
methods |= WPS_CONFIG_DISPLAY | WPS_CONFIG_KEYPAD;
|
||||||
|
methods |= WPS_CONFIG_P2PS;
|
||||||
}
|
}
|
||||||
wpabuf_put_be16(buf, methods);
|
wpabuf_put_be16(buf, methods);
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,8 @@ u16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method)
|
||||||
return DEV_PW_PUSHBUTTON;
|
return DEV_PW_PUSHBUTTON;
|
||||||
case WPS_NFC:
|
case WPS_NFC:
|
||||||
return DEV_PW_NFC_CONNECTION_HANDOVER;
|
return DEV_PW_NFC_CONNECTION_HANDOVER;
|
||||||
|
case WPS_P2PS:
|
||||||
|
return DEV_PW_P2PS_DEFAULT;
|
||||||
default:
|
default:
|
||||||
return DEV_PW_DEFAULT;
|
return DEV_PW_DEFAULT;
|
||||||
}
|
}
|
||||||
|
@ -124,6 +126,8 @@ static const char * p2p_wps_method_str(enum p2p_wps_method wps_method)
|
||||||
return "PBC";
|
return "PBC";
|
||||||
case WPS_NFC:
|
case WPS_NFC:
|
||||||
return "NFC";
|
return "NFC";
|
||||||
|
case WPS_P2PS:
|
||||||
|
return "P2PS";
|
||||||
default:
|
default:
|
||||||
return "??";
|
return "??";
|
||||||
}
|
}
|
||||||
|
@ -218,6 +222,8 @@ int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev)
|
||||||
config_method = WPS_CONFIG_DISPLAY;
|
config_method = WPS_CONFIG_DISPLAY;
|
||||||
else if (dev->wps_method == WPS_PBC)
|
else if (dev->wps_method == WPS_PBC)
|
||||||
config_method = WPS_CONFIG_PUSHBUTTON;
|
config_method = WPS_CONFIG_PUSHBUTTON;
|
||||||
|
else if (dev->wps_method == WPS_P2PS)
|
||||||
|
config_method = WPS_CONFIG_P2PS;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
return p2p_prov_disc_req(p2p, dev->info.p2p_device_addr,
|
return p2p_prov_disc_req(p2p, dev->info.p2p_device_addr,
|
||||||
|
@ -743,6 +749,16 @@ void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case DEV_PW_P2PS_DEFAULT:
|
||||||
|
p2p_dbg(p2p, "Peer using P2PS pin");
|
||||||
|
if (dev->wps_method != WPS_P2PS) {
|
||||||
|
p2p_dbg(p2p,
|
||||||
|
"We have wps_method=%s -> incompatible",
|
||||||
|
p2p_wps_method_str(dev->wps_method));
|
||||||
|
status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (msg.dev_password_id &&
|
if (msg.dev_password_id &&
|
||||||
msg.dev_password_id == dev->oob_pw_id) {
|
msg.dev_password_id == dev->oob_pw_id) {
|
||||||
|
@ -1102,6 +1118,15 @@ void p2p_process_go_neg_resp(struct p2p_data *p2p, const u8 *sa,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case DEV_PW_P2PS_DEFAULT:
|
||||||
|
p2p_dbg(p2p, "P2P: Peer using P2PS default pin");
|
||||||
|
if (dev->wps_method != WPS_P2PS) {
|
||||||
|
p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
|
||||||
|
p2p_wps_method_str(dev->wps_method));
|
||||||
|
status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (msg.dev_password_id &&
|
if (msg.dev_password_id &&
|
||||||
msg.dev_password_id == dev->oob_pw_id) {
|
msg.dev_password_id == dev->oob_pw_id) {
|
||||||
|
|
|
@ -535,6 +535,9 @@ u16 wps_config_methods_str2bin(const char *str)
|
||||||
#ifdef CONFIG_WPS_NFC
|
#ifdef CONFIG_WPS_NFC
|
||||||
methods |= WPS_CONFIG_NFC_INTERFACE;
|
methods |= WPS_CONFIG_NFC_INTERFACE;
|
||||||
#endif /* CONFIG_WPS_NFC */
|
#endif /* CONFIG_WPS_NFC */
|
||||||
|
#ifdef CONFIG_P2P
|
||||||
|
methods |= WPS_CONFIG_P2PS;
|
||||||
|
#endif /* CONFIG_P2P */
|
||||||
} else {
|
} else {
|
||||||
if (os_strstr(str, "ethernet"))
|
if (os_strstr(str, "ethernet"))
|
||||||
methods |= WPS_CONFIG_ETHERNET;
|
methods |= WPS_CONFIG_ETHERNET;
|
||||||
|
@ -560,6 +563,8 @@ u16 wps_config_methods_str2bin(const char *str)
|
||||||
methods |= WPS_CONFIG_VIRT_PUSHBUTTON;
|
methods |= WPS_CONFIG_VIRT_PUSHBUTTON;
|
||||||
if (os_strstr(str, "physical_push_button"))
|
if (os_strstr(str, "physical_push_button"))
|
||||||
methods |= WPS_CONFIG_PHY_PUSHBUTTON;
|
methods |= WPS_CONFIG_PHY_PUSHBUTTON;
|
||||||
|
if (os_strstr(str, "p2ps"))
|
||||||
|
methods |= WPS_CONFIG_P2PS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return methods;
|
return methods;
|
||||||
|
|
|
@ -154,7 +154,8 @@ enum wps_dev_password_id {
|
||||||
DEV_PW_REKEY = 0x0003,
|
DEV_PW_REKEY = 0x0003,
|
||||||
DEV_PW_PUSHBUTTON = 0x0004,
|
DEV_PW_PUSHBUTTON = 0x0004,
|
||||||
DEV_PW_REGISTRAR_SPECIFIED = 0x0005,
|
DEV_PW_REGISTRAR_SPECIFIED = 0x0005,
|
||||||
DEV_PW_NFC_CONNECTION_HANDOVER = 0x0007
|
DEV_PW_NFC_CONNECTION_HANDOVER = 0x0007,
|
||||||
|
DEV_PW_P2PS_DEFAULT = 0x0008
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Message Type */
|
/* Message Type */
|
||||||
|
@ -244,6 +245,7 @@ enum wps_error_indication {
|
||||||
#define WPS_CONFIG_KEYPAD 0x0100
|
#define WPS_CONFIG_KEYPAD 0x0100
|
||||||
#define WPS_CONFIG_VIRT_PUSHBUTTON 0x0280
|
#define WPS_CONFIG_VIRT_PUSHBUTTON 0x0280
|
||||||
#define WPS_CONFIG_PHY_PUSHBUTTON 0x0480
|
#define WPS_CONFIG_PHY_PUSHBUTTON 0x0480
|
||||||
|
#define WPS_CONFIG_P2PS 0x1000
|
||||||
#define WPS_CONFIG_VIRT_DISPLAY 0x2008
|
#define WPS_CONFIG_VIRT_DISPLAY 0x2008
|
||||||
#define WPS_CONFIG_PHY_DISPLAY 0x4008
|
#define WPS_CONFIG_PHY_DISPLAY 0x4008
|
||||||
|
|
||||||
|
|
|
@ -2578,6 +2578,7 @@ static enum wps_process_res wps_process_m1(struct wps_data *wps,
|
||||||
|
|
||||||
if (wps->dev_pw_id < 0x10 &&
|
if (wps->dev_pw_id < 0x10 &&
|
||||||
wps->dev_pw_id != DEV_PW_DEFAULT &&
|
wps->dev_pw_id != DEV_PW_DEFAULT &&
|
||||||
|
wps->dev_pw_id != DEV_PW_P2PS_DEFAULT &&
|
||||||
wps->dev_pw_id != DEV_PW_USER_SPECIFIED &&
|
wps->dev_pw_id != DEV_PW_USER_SPECIFIED &&
|
||||||
wps->dev_pw_id != DEV_PW_MACHINE_SPECIFIED &&
|
wps->dev_pw_id != DEV_PW_MACHINE_SPECIFIED &&
|
||||||
wps->dev_pw_id != DEV_PW_REGISTRAR_SPECIFIED &&
|
wps->dev_pw_id != DEV_PW_REGISTRAR_SPECIFIED &&
|
||||||
|
|
|
@ -4567,7 +4567,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
||||||
int pd;
|
int pd;
|
||||||
int ht40, vht;
|
int ht40, vht;
|
||||||
|
|
||||||
/* <addr> <"pbc" | "pin" | PIN> [label|display|keypad]
|
/* <addr> <"pbc" | "pin" | PIN> [label|display|keypad|p2ps]
|
||||||
* [persistent|persistent=<network id>]
|
* [persistent|persistent=<network id>]
|
||||||
* [join] [auth] [go_intent=<0..15>] [freq=<in MHz>] [provdisc]
|
* [join] [auth] [go_intent=<0..15>] [freq=<in MHz>] [provdisc]
|
||||||
* [ht40] [vht] */
|
* [ht40] [vht] */
|
||||||
|
@ -4631,6 +4631,8 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
|
||||||
*pos++ = '\0';
|
*pos++ = '\0';
|
||||||
if (os_strncmp(pos, "display", 7) == 0)
|
if (os_strncmp(pos, "display", 7) == 0)
|
||||||
wps_method = WPS_PIN_DISPLAY;
|
wps_method = WPS_PIN_DISPLAY;
|
||||||
|
else if (os_strncmp(pos, "p2ps", 4) == 0)
|
||||||
|
wps_method = WPS_P2PS;
|
||||||
}
|
}
|
||||||
if (!wps_pin_str_valid(pin)) {
|
if (!wps_pin_str_valid(pin)) {
|
||||||
os_memcpy(buf, "FAIL-INVALID-PIN\n", 17);
|
os_memcpy(buf, "FAIL-INVALID-PIN\n", 17);
|
||||||
|
|
|
@ -1268,6 +1268,8 @@ static void wpas_start_wps_enrollee(struct wpa_supplicant *wpa_s,
|
||||||
#endif /* CONFIG_WPS_NFC */
|
#endif /* CONFIG_WPS_NFC */
|
||||||
} else {
|
} else {
|
||||||
u16 dev_pw_id = DEV_PW_DEFAULT;
|
u16 dev_pw_id = DEV_PW_DEFAULT;
|
||||||
|
if (wpa_s->p2p_wps_method == WPS_P2PS)
|
||||||
|
dev_pw_id = DEV_PW_P2PS_DEFAULT;
|
||||||
if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD)
|
if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD)
|
||||||
dev_pw_id = DEV_PW_REGISTRAR_SPECIFIED;
|
dev_pw_id = DEV_PW_REGISTRAR_SPECIFIED;
|
||||||
wpas_wps_start_pin(wpa_s, res->peer_interface_addr,
|
wpas_wps_start_pin(wpa_s, res->peer_interface_addr,
|
||||||
|
|
Loading…
Reference in a new issue