elems->p2p2_ie = pos;
elems->p2p2_ie_len = elen;
break;
+ case PR_OUI_TYPE:
+ /* Wi-Fi Alliance - Proximity Ranging element */
+ elems->proximity_ranging = pos;
+ elems->proximity_ranging_len = elen;
+ break;
default:
wpa_printf(MSG_MSGDUMP, "Unknown WFA "
"information element ignored "
const u8 *rsnxe_override;
const u8 *rsn_selection;
const u8 *wfa_capab;
+ const u8 *proximity_ranging;
u8 ssid_len;
u8 supp_rates_len;
size_t rsnxe_override_len;
size_t rsn_selection_len;
u8 wfa_capab_len;
+ size_t proximity_ranging_len;
struct mb_ies_info mb_ies;
return ret;
}
+
+int pr_pasn_auth_rx(struct pr_data *pr, const struct ieee80211_mgmt *mgmt,
+ size_t len, int freq)
+{
+ struct pr_device *dev;
+ u16 auth_alg;
+
+ dev = pr_get_device(pr, mgmt->sa);
+ if (!dev) {
+ wpa_printf(MSG_INFO, "PR: Peer not found " MACSTR,
+ MAC2STR(mgmt->sa));
+ return -1;
+ }
+
+ if (!ether_addr_equal(mgmt->da, pr->cfg->dev_addr)) {
+ wpa_printf(MSG_INFO, "PR PASN: Not our frame");
+ return -1;
+ }
+
+ if (len < offsetof(struct ieee80211_mgmt, u.auth.variable))
+ return -1;
+
+ auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
+ if (auth_alg != WLAN_AUTH_PASN) {
+ wpa_printf(MSG_INFO,
+ "PR: Unexpected Authentication frame, auth_alg=%d",
+ auth_alg);
+ return -1;
+ }
+
+ return 0;
+}
+
#endif /* CONFIG_PASN */
int forced_pr_freq);
int pr_pasn_auth_tx_status(struct pr_data *pr, const u8 *data, size_t data_len,
bool acked);
+int pr_pasn_auth_rx(struct pr_data *pr, const struct ieee80211_mgmt *mgmt,
+ size_t len, int freq);
#endif /* PROXIMITY_RANGING_H */
const struct ieee80211_mgmt *mgmt, size_t len,
int freq)
{
-#ifdef CONFIG_P2P
struct ieee802_11_elems elems;
size_t auth_length;
return -2;
}
+#ifdef CONFIG_P2P
if (elems.p2p2_ie && elems.p2p2_ie_len)
return wpas_p2p_pasn_auth_rx(wpa_s, mgmt, len, freq);
#endif /* CONFIG_P2P */
+#ifdef CONFIG_PR
+ if (elems.proximity_ranging && elems.proximity_ranging_len)
+ return wpas_pr_pasn_auth_rx(wpa_s, mgmt, len, freq);
+#endif /* CONFIG_PR */
return wpas_pasn_auth_rx(wpa_s, mgmt, len);
}
#include "utils/common.h"
#include "utils/eloop.h"
+#include "common/ieee802_11_defs.h"
#include "common/proximity_ranging.h"
#include "p2p/p2p.h"
#include "wpa_supplicant_i.h"
return pr_pasn_auth_tx_status(pr, data, data_len, acked);
}
+
+int wpas_pr_pasn_auth_rx(struct wpa_supplicant *wpa_s,
+ const struct ieee80211_mgmt *mgmt, size_t len,
+ int freq)
+{
+ struct pr_data *pr = wpa_s->global->pr;
+
+ if (!pr)
+ return -2;
+ return pr_pasn_auth_rx(pr, mgmt, len, freq);
+}
+
#endif /* CONFIG_PASN */
int forced_pr_freq);
int wpas_pr_pasn_auth_tx_status(struct wpa_supplicant *wpa_s, const u8 *data,
size_t data_len, bool acked);
+int wpas_pr_pasn_auth_rx(struct wpa_supplicant *wpa_s,
+ const struct ieee80211_mgmt *mgmt, size_t len,
+ int freq);
#else /* CONFIG_PR */
return 0;
}
+static inline int wpas_pr_pasn_auth_rx(struct wpa_supplicant *wpa_s,
+ const struct ieee80211_mgmt *mgmt,
+ size_t len, int freq)
+{
+ return 0;
+}
+
#endif /* CONFIG_PR */
#endif /* PR_SUPPLICANT_H */