P2P: Keep track of peer WPS vendor extensions
Make the P2P code keep track of WPS vendor extensions received from peers so they can be exposed via DBus later. Signed-off-by: Jean-Michel Bachot <jean-michelx.bachot@linux.intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
							parent
							
								
									f95cac271b
								
							
						
					
					
						commit
						6f2c060711
					
				
					 7 changed files with 63 additions and 4 deletions
				
			
		|  | @ -431,6 +431,7 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level, | |||
| 	struct p2p_device *dev; | ||||
| 	struct p2p_message msg; | ||||
| 	const u8 *p2p_dev_addr; | ||||
| 	int i; | ||||
| 
 | ||||
| 	os_memset(&msg, 0, sizeof(msg)); | ||||
| 	if (p2p_parse_ies(ies, ies_len, &msg)) { | ||||
|  | @ -522,6 +523,20 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level, | |||
| 			msg.wps_sec_dev_type_list_len; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < P2P_MAX_PEER_WPS_VENDOR_EXT; i++) { | ||||
| 		wpabuf_free(dev->info.wps_vendor_ext[i]); | ||||
| 		dev->info.wps_vendor_ext[i] = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < P2P_MAX_PEER_WPS_VENDOR_EXT; i++) { | ||||
| 		if (msg.wps_vendor_ext[i] == NULL) | ||||
| 			break; | ||||
| 		dev->info.wps_vendor_ext[i] = wpabuf_alloc_copy( | ||||
| 			msg.wps_vendor_ext[i], msg.wps_vendor_ext_len[i]); | ||||
| 		if (dev->info.wps_vendor_ext[i] == NULL) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	if (msg.capability) { | ||||
| 		dev->info.dev_capab = msg.capability[0]; | ||||
| 		dev->info.group_capab = msg.capability[1]; | ||||
|  | @ -562,6 +577,8 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level, | |||
| 
 | ||||
| static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (p2p->go_neg_peer == dev) | ||||
| 		p2p->go_neg_peer = NULL; | ||||
| 	if (p2p->invite_peer == dev) | ||||
|  | @ -573,6 +590,11 @@ static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev) | |||
| 
 | ||||
| 	p2p->cfg->dev_lost(p2p->cfg->cb_ctx, dev->info.p2p_device_addr); | ||||
| 
 | ||||
| 	for (i = 0; i < P2P_MAX_PEER_WPS_VENDOR_EXT; i++) { | ||||
| 		wpabuf_free(dev->info.wps_vendor_ext[i]); | ||||
| 		dev->info.wps_vendor_ext[i] = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	os_free(dev); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -186,6 +186,8 @@ struct p2p_peer_info { | |||
| 	 */ | ||||
| 	size_t wps_sec_dev_type_list_len; | ||||
| 
 | ||||
| #define P2P_MAX_PEER_WPS_VENDOR_EXT 10 | ||||
| 	struct wpabuf *wps_vendor_ext[P2P_MAX_PEER_WPS_VENDOR_EXT]; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -445,6 +445,8 @@ struct p2p_message { | |||
| 	const u8 *wps_pri_dev_type; | ||||
| 	const u8 *wps_sec_dev_type_list; | ||||
| 	size_t wps_sec_dev_type_list_len; | ||||
| 	const u8 *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXTENSIONS]; | ||||
| 	size_t wps_vendor_ext_len[P2P_MAX_WPS_VENDOR_EXTENSIONS]; | ||||
| 
 | ||||
| 	/* DS Parameter Set IE */ | ||||
| 	const u8 *ds_params; | ||||
|  |  | |||
|  | @ -328,6 +328,7 @@ int p2p_parse_p2p_ie(const struct wpabuf *buf, struct p2p_message *msg) | |||
| static int p2p_parse_wps_ie(const struct wpabuf *buf, struct p2p_message *msg) | ||||
| { | ||||
| 	struct wps_parse_attr attr; | ||||
| 	int i; | ||||
| 
 | ||||
| 	wpa_printf(MSG_DEBUG, "P2P: Parsing WPS IE"); | ||||
| 	if (wps_parse_msg(buf, &attr)) | ||||
|  | @ -358,6 +359,13 @@ static int p2p_parse_wps_ie(const struct wpabuf *buf, struct p2p_message *msg) | |||
| 		msg->wps_sec_dev_type_list_len = attr.sec_dev_type_list_len; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < P2P_MAX_PEER_WPS_VENDOR_EXT; i++) { | ||||
| 		if (i >= P2P_MAX_WPS_VENDOR_EXTENSIONS) | ||||
| 			break; | ||||
| 		msg->wps_vendor_ext[i] = attr.vendor_ext[i]; | ||||
| 		msg->wps_vendor_ext_len[i] = attr.vendor_ext_len[i]; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -66,6 +66,10 @@ struct wps_credential { | |||
| #define WPS_SEC_DEV_TYPE_MAX_LEN 128 | ||||
| /* maximum number of advertised WPS vendor extension attributes */ | ||||
| #define MAX_WPS_VENDOR_EXTENSIONS 10 | ||||
| /* maximum size of WPS Vendor extension attribute */ | ||||
| #define WPS_MAX_VENDOR_EXT_LEN 1024 | ||||
| /* maximum number of parsed WPS vendor extension attributes */ | ||||
| #define MAX_WPS_PARSE_VENDOR_EXT 10 | ||||
| 
 | ||||
| /**
 | ||||
|  * struct wps_device_data - WPS Device Data | ||||
|  |  | |||
|  | @ -108,12 +108,29 @@ static int wps_parse_vendor_ext(struct wps_parse_attr *attr, const u8 *pos, | |||
| 	switch (vendor_id) { | ||||
| 	case WPS_VENDOR_ID_WFA: | ||||
| 		return wps_parse_vendor_ext_wfa(attr, pos + 3, len - 3); | ||||
| 	default: | ||||
| 		wpa_printf(MSG_MSGDUMP, "WPS: Skip unknown Vendor Extension " | ||||
| 			   "(Vendor ID %u)", vendor_id); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Handle unknown vendor extensions */ | ||||
| 
 | ||||
| 	wpa_printf(MSG_MSGDUMP, "WPS: Unknown Vendor Extension (Vendor ID %u)", | ||||
| 		   vendor_id); | ||||
| 
 | ||||
| 	if (len > WPS_MAX_VENDOR_EXT_LEN) { | ||||
| 		wpa_printf(MSG_DEBUG, "WPS: Too long Vendor Extension (%u)", | ||||
| 			   len); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (attr->num_vendor_ext > MAX_WPS_PARSE_VENDOR_EXT) { | ||||
| 		wpa_printf(MSG_DEBUG, "WPS: Skipped Vendor Extension " | ||||
| 			   "attribute (max %d vendor extensions)", | ||||
| 			   MAX_WPS_PARSE_VENDOR_EXT); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	attr->vendor_ext[attr->num_vendor_ext] = pos; | ||||
| 	attr->vendor_ext_len[attr->num_vendor_ext] = len; | ||||
| 	attr->num_vendor_ext++; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -207,6 +207,10 @@ struct wps_parse_attr { | |||
| #define MAX_REQ_DEV_TYPE_COUNT 10 | ||||
| 	const u8 *req_dev_type[MAX_REQ_DEV_TYPE_COUNT]; | ||||
| 	size_t num_req_dev_type; | ||||
| 
 | ||||
| 	const u8 *vendor_ext[MAX_WPS_PARSE_VENDOR_EXT]; | ||||
| 	size_t vendor_ext_len[MAX_WPS_PARSE_VENDOR_EXT]; | ||||
| 	size_t num_vendor_ext; | ||||
| }; | ||||
| 
 | ||||
| /* wps_common.c */ | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jean-Michel Bachot
						Jean-Michel Bachot