diff options
author | Jouni Malinen <j@w1.fi> | 2012-01-08 09:25:29 -0800 |
---|---|---|
committer | Jouni Malinen <j@w1.fi> | 2012-01-08 09:25:29 -0800 |
commit | 6d92fa6e9209172ae6f4aec5fb4d84ed5e27edb4 (patch) | |
tree | c0c66fcd93aa135125e37334293306b063ac0ebb /src/p2p | |
parent | 68921e24b2ef867d8b4d57192ddf1a3075c57edf (diff) | |
download | external_wpa_supplicant_8_ti-6d92fa6e9209172ae6f4aec5fb4d84ed5e27edb4.zip external_wpa_supplicant_8_ti-6d92fa6e9209172ae6f4aec5fb4d84ed5e27edb4.tar.gz external_wpa_supplicant_8_ti-6d92fa6e9209172ae6f4aec5fb4d84ed5e27edb4.tar.bz2 |
P2P: Allow Device ID to be specified for p2p_find command
dev_id=<P2P Device Addr> can now be specified as an argument to
p2p_find to request P2P find for a specific P2P device.
Signed-hostap: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'src/p2p')
-rw-r--r-- | src/p2p/p2p.c | 24 | ||||
-rw-r--r-- | src/p2p/p2p.h | 10 | ||||
-rw-r--r-- | src/p2p/p2p_i.h | 2 |
3 files changed, 26 insertions, 10 deletions
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index 001743b..e61e133 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -795,8 +795,8 @@ static void p2p_search(struct p2p_data *p2p) } if (p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, type, freq, - p2p->num_req_dev_types, p2p->req_dev_types) < 0) - { + p2p->num_req_dev_types, p2p->req_dev_types, + p2p->find_dev_id) < 0) { wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Scan request failed"); p2p_continue_find(p2p); @@ -895,7 +895,8 @@ static void p2p_free_req_dev_types(struct p2p_data *p2p) int p2p_find(struct p2p_data *p2p, unsigned int timeout, enum p2p_discovery_type type, - unsigned int num_req_dev_types, const u8 *req_dev_types) + unsigned int num_req_dev_types, const u8 *req_dev_types, + const u8 *dev_id) { int res; @@ -917,6 +918,12 @@ int p2p_find(struct p2p_data *p2p, unsigned int timeout, p2p->num_req_dev_types = num_req_dev_types; } + if (dev_id) { + os_memcpy(p2p->find_dev_id_buf, dev_id, ETH_ALEN); + p2p->find_dev_id = p2p->find_dev_id_buf; + } else + p2p->find_dev_id = NULL; + p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING; p2p_clear_timeout(p2p); p2p->cfg->stop_listen(p2p->cfg->cb_ctx); @@ -933,12 +940,12 @@ int p2p_find(struct p2p_data *p2p, unsigned int timeout, case P2P_FIND_PROGRESSIVE: res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_FULL, 0, p2p->num_req_dev_types, - p2p->req_dev_types); + p2p->req_dev_types, dev_id); break; case P2P_FIND_ONLY_SOCIAL: res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_SOCIAL, 0, p2p->num_req_dev_types, - p2p->req_dev_types); + p2p->req_dev_types, dev_id); break; default: return -1; @@ -975,7 +982,8 @@ int p2p_other_scan_completed(struct p2p_data *p2p) wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Starting pending P2P find " "now that previous scan was completed"); if (p2p_find(p2p, p2p->last_p2p_find_timeout, p2p->find_type, - p2p->num_req_dev_types, p2p->req_dev_types) < 0) + p2p->num_req_dev_types, p2p->req_dev_types, + p2p->find_dev_id) < 0) return 0; return 1; } @@ -2533,10 +2541,12 @@ void p2p_scan_res_handled(struct p2p_data *p2p) } -void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies) +void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id) { u8 *len = p2p_buf_add_ie_hdr(ies); p2p_buf_add_capability(ies, p2p->dev_capab, 0); + if (dev_id) + p2p_buf_add_device_id(ies, dev_id); if (p2p->cfg->reg_class && p2p->cfg->channel) p2p_buf_add_listen_channel(ies, p2p->cfg->country, p2p->cfg->reg_class, diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h index c9e9fd3..762499a 100644 --- a/src/p2p/p2p.h +++ b/src/p2p/p2p.h @@ -359,6 +359,7 @@ struct p2p_config { * @freq: Specific frequency (MHz) to scan or 0 for no restriction * @num_req_dev_types: Number of requested device types * @req_dev_types: Array containing requested device types + * @dev_id: Device ID to search for or %NULL to find all devices * Returns: 0 on success, -1 on failure * * This callback function is used to request a P2P scan or search @@ -382,7 +383,7 @@ struct p2p_config { */ int (*p2p_scan)(void *ctx, enum p2p_scan_type type, int freq, unsigned int num_req_dev_types, - const u8 *req_dev_types); + const u8 *req_dev_types, const u8 *dev_id); /** * send_probe_resp - Transmit a Probe Response frame @@ -809,11 +810,13 @@ enum p2p_discovery_type { * @req_dev_types: Requested device types array, must be an array * containing num_req_dev_types * WPS_DEV_TYPE_LEN bytes; %NULL if no * requested device types. + * @dev_id: Device ID to search for or %NULL to find all devices * Returns: 0 on success, -1 on failure */ int p2p_find(struct p2p_data *p2p, unsigned int timeout, enum p2p_discovery_type type, - unsigned int num_req_dev_types, const u8 *req_dev_types); + unsigned int num_req_dev_types, const u8 *req_dev_types, + const u8 *dev_id); /** * p2p_stop_find - Stop P2P Find (Device Discovery) @@ -1376,8 +1379,9 @@ int p2p_assoc_req_ie(struct p2p_data *p2p, const u8 *bssid, u8 *buf, * p2p_scan_ie - Build P2P IE for Probe Request * @p2p: P2P module context from p2p_init() * @ies: Buffer for writing P2P IE + * @dev_id: Device ID to search for or %NULL for any */ -void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies); +void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id); /** * p2p_scan_ie_buf_len - Get maximum buffer length needed for p2p_scan_ie diff --git a/src/p2p/p2p_i.h b/src/p2p/p2p_i.h index 0dc33e7..a578bb7 100644 --- a/src/p2p/p2p_i.h +++ b/src/p2p/p2p_i.h @@ -381,6 +381,8 @@ struct p2p_data { /* Requested device types for find/search */ unsigned int num_req_dev_types; u8 *req_dev_types; + u8 *find_dev_id; + u8 find_dev_id_buf[ETH_ALEN]; struct p2p_group **groups; size_t num_groups; |