mirror of
				https://git.kernel.org/pub/scm/network/wireless/iwd.git
				synced 2025-10-31 13:07:35 +01:00 
			
		
		
		
	ap: include PROBE_RESP attribute if required by driver
Certain drivers support/require probe response offloading which IWD did not check for or properly handle. If probe response offloading is required the probe response frame watch will not be added and instead the ATTR_PROBE_RESP will be included with START_AP. The head/tail builders were reused but slightly modified to check if the probe request frame is NULL, since it will be for use with START_AP.
This commit is contained in:
		
							parent
							
								
									06ec89d6b8
								
							
						
					
					
						commit
						bead4745ac
					
				
							
								
								
									
										25
									
								
								src/ap.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/ap.c
									
									
									
									
									
								
							| @ -699,7 +699,7 @@ static size_t ap_write_wsc_ie(struct ap_state *ap, | ||||
| 	size_t len = 0; | ||||
| 
 | ||||
| 	/* WSC IE */ | ||||
| 	if (type == MPDU_MANAGEMENT_SUBTYPE_PROBE_RESPONSE) { | ||||
| 	if (type == MPDU_MANAGEMENT_SUBTYPE_PROBE_RESPONSE && client_frame) { | ||||
| 		const uint8_t *from = client_frame->address_2; | ||||
| 		struct wsc_probe_response wsc_pr = {}; | ||||
| 		const struct mmpdu_probe_request *req = | ||||
| @ -2416,6 +2416,8 @@ static struct l_genl_msg *ap_build_cmd_start_ap(struct ap_state *ap) | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff | ||||
| 	}; | ||||
| 
 | ||||
| 	static const uint8_t zero_addr[6] = { 0 }; | ||||
| 
 | ||||
| 	for (i = 0, nl_ciphers_cnt = 0; i < 8; i++) | ||||
| 		if (ap->ciphers & (1 << i)) | ||||
| 			nl_ciphers[nl_ciphers_cnt++] = | ||||
| @ -2458,6 +2460,21 @@ static struct l_genl_msg *ap_build_cmd_start_ap(struct ap_state *ap) | ||||
| 	l_genl_msg_append_attr(cmd, NL80211_ATTR_WIPHY_FREQ, 4, &ch_freq); | ||||
| 	l_genl_msg_append_attr(cmd, NL80211_ATTR_CHANNEL_WIDTH, 4, &ch_width); | ||||
| 
 | ||||
| 	if (wiphy_supports_probe_resp_offload(wiphy)) { | ||||
| 		uint8_t probe_resp[head_len + tail_len]; | ||||
| 		uint8_t *ptr = probe_resp; | ||||
| 
 | ||||
| 		ptr += ap_build_beacon_pr_head(ap, | ||||
| 					MPDU_MANAGEMENT_SUBTYPE_PROBE_RESPONSE, | ||||
| 					zero_addr, ptr, sizeof(probe_resp)); | ||||
| 		ptr += ap_build_beacon_pr_tail(ap, | ||||
| 					MPDU_MANAGEMENT_SUBTYPE_PROBE_RESPONSE, | ||||
| 					NULL, 0, ptr); | ||||
| 
 | ||||
| 		l_genl_msg_append_attr(cmd, NL80211_ATTR_PROBE_RESP, | ||||
| 					ptr - probe_resp, probe_resp); | ||||
| 	} | ||||
| 
 | ||||
| 	if (wiphy_has_ext_feature(wiphy, | ||||
| 			NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) { | ||||
| 		l_genl_msg_append_attr(cmd, NL80211_ATTR_SOCKET_OWNER, 0, NULL); | ||||
| @ -3321,10 +3338,12 @@ struct ap_state *ap_start(struct netdev *netdev, struct l_settings *config, | ||||
| 			NULL, 0, ap_reassoc_req_cb, ap, NULL)) | ||||
| 		goto error; | ||||
| 
 | ||||
| 	if (!frame_watch_add(wdev_id, 0, 0x0000 | | ||||
| 	if (!wiphy_supports_probe_resp_offload(wiphy)) { | ||||
| 		if (!frame_watch_add(wdev_id, 0, 0x0000 | | ||||
| 				(MPDU_MANAGEMENT_SUBTYPE_PROBE_REQUEST << 4), | ||||
| 				NULL, 0, ap_probe_req_cb, ap, NULL)) | ||||
| 		goto error; | ||||
| 			goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!frame_watch_add(wdev_id, 0, 0x0000 | | ||||
| 				(MPDU_MANAGEMENT_SUBTYPE_DISASSOCIATION << 4), | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 James Prestwood
						James Prestwood