@@ -388,7 +388,8 @@ static void pr_get_ntb_capabilities(struct pr_data *pr,
}
-static int pr_derive_dira(struct pr_data *pr, struct pr_dira *dira)
+static int pr_derive_dira(struct pr_data *pr, const u8 *src_addr,
+ struct pr_dira *dira)
{
u8 nonce[DEVICE_IDENTITY_NONCE_LEN];
u8 tag[DEVICE_MAX_HASH_LEN];
@@ -417,7 +418,7 @@ static int pr_derive_dira(struct pr_data *pr, struct pr_dira *dira)
* Nonce))
*/
os_memcpy(data, "DIR", DIR_STR_LEN);
- os_memcpy(&data[DIR_STR_LEN], pr->cfg->dev_addr, ETH_ALEN);
+ os_memcpy(&data[DIR_STR_LEN], src_addr, ETH_ALEN);
os_memcpy(&data[DIR_STR_LEN + ETH_ALEN], nonce,
DEVICE_IDENTITY_NONCE_LEN);
@@ -745,7 +746,7 @@ static void pr_buf_add_dira(struct wpabuf *buf, const struct pr_dira *dira)
}
-struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr)
+struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr, const u8 *src_addr)
{
u32 ie_type;
struct wpabuf *buf, *buf2;
@@ -773,7 +774,7 @@ struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr)
pr_buf_add_ntb_capa_info(buf, &ntb_caps);
}
- if (!pr_derive_dira(pr, &dira))
+ if (!pr_derive_dira(pr, src_addr, &dira))
pr_buf_add_dira(buf, &dira);
ie_type = (OUI_WFA << 8) | PR_OUI_TYPE;
@@ -1684,7 +1685,7 @@ static int pr_prepare_pasn_pr_elem(struct pr_data *pr, struct wpabuf *extra_ies,
pr_buf_add_operation_mode(buf, &op_mode);
/* PR Device Identity Resolution attribute */
- if (!pr_derive_dira(pr, &dira))
+ if (!pr_derive_dira(pr, pr->cfg->dev_addr, &dira))
pr_buf_add_dira(buf, &dira);
ie_type = (OUI_WFA << 8) | PR_OUI_TYPE;
@@ -655,7 +655,7 @@ void pr_add_dev_ik(struct pr_data *pr, const u8 *dik, const char *password,
void pr_set_peer_credentials(struct pr_data *pr, const u8 *addr,
const u8 *pmk, size_t pmk_len,
const char *password);
-struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr);
+struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr, const u8 *src_addr);
void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
const u8 *peer_addr, unsigned int freq);
int pr_ensure_oob_peer(struct pr_data *pr, const u8 *addr, int freq);
@@ -4521,7 +4521,9 @@ int wpas_nan_publish(struct wpa_supplicant *wpa_s, const char *service_name,
elems = wpas_p2p_usd_elems(wpa_s, service_name);
addr = wpa_s->global->p2p_dev_addr;
} else if (params->proximity_ranging) {
- elems = wpas_pr_usd_elems(wpa_s);
+ const u8 *src = params->forced_addr ?
+ params->forced_addr : wpa_s->own_addr;
+ elems = wpas_pr_usd_elems(wpa_s, src);
}
if (params->forced_addr) {
@@ -4687,7 +4689,9 @@ int wpas_nan_subscribe(struct wpa_supplicant *wpa_s,
elems = wpas_p2p_usd_elems(wpa_s, service_name);
addr = wpa_s->global->p2p_dev_addr;
} else if (params->proximity_ranging) {
- elems = wpas_pr_usd_elems(wpa_s);
+ const u8 *src = params->forced_addr ?
+ params->forced_addr : wpa_s->own_addr;
+ elems = wpas_pr_usd_elems(wpa_s, src);
}
if (params->forced_addr) {
@@ -602,12 +602,13 @@ static void wpas_pr_pasn_clear_keys(void *ctx, const u8 *own_addr,
}
-struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s)
+struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s,
+ const u8 *src_addr)
{
if (!wpa_s->global->pr)
return NULL;
- return pr_prepare_usd_elems(wpa_s->global->pr);
+ return pr_prepare_usd_elems(wpa_s->global->pr, src_addr);
}
@@ -23,7 +23,8 @@ void wpas_pr_clear_dev_iks(struct wpa_supplicant *wpa_s);
void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s, const u8 *dik,
const char *password, const u8 *pmk, size_t pmk_len,
bool own);
-struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s);
+struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s,
+ const u8 *src_addr);
void wpas_pr_process_usd_elems(struct wpa_supplicant *wpa_s, const u8 *buf,
u16 buf_len, const u8 *peer_addr,
unsigned int freq);
@@ -82,7 +83,8 @@ static inline void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s,
{
}
-static inline struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s)
+static inline struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s,
+ const u8 *src_addr)
{
return NULL;
}