WNM: Fix BSS Transition Management Request processing
The WNM-Sleep Mode handler took over WNM Action frame processing without addressing the previously implemented WNM handler. Fix this by moving the BSs Transition Management processing into wnm_sta.c to share a single handler function for WNM Action frames. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
		
							parent
							
								
									a38fdf1c69
								
							
						
					
					
						commit
						27c77751f7
					
				
					 2 changed files with 37 additions and 51 deletions
				
			
		|  | @ -2283,50 +2283,6 @@ static void wpa_supplicant_event_unprot_disassoc(struct wpa_supplicant *wpa_s, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void wnm_action_rx(struct wpa_supplicant *wpa_s, struct rx_action *rx) |  | ||||||
| { |  | ||||||
| 	u8 action, mode; |  | ||||||
| 	const u8 *pos, *end; |  | ||||||
| 
 |  | ||||||
| 	if (rx->data == NULL || rx->len == 0) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	pos = rx->data; |  | ||||||
| 	end = pos + rx->len; |  | ||||||
| 	action = *pos++; |  | ||||||
| 
 |  | ||||||
| 	wpa_printf(MSG_DEBUG, "WNM: RX action %u from " MACSTR, |  | ||||||
| 		   action, MAC2STR(rx->sa)); |  | ||||||
| 	switch (action) { |  | ||||||
| 	case WNM_BSS_TRANS_MGMT_REQ: |  | ||||||
| 		if (pos + 5 > end) |  | ||||||
| 			break; |  | ||||||
| 		wpa_printf(MSG_DEBUG, "WNM: BSS Transition Management " |  | ||||||
| 			   "Request: dialog_token=%u request_mode=0x%x " |  | ||||||
| 			   "disassoc_timer=%u validity_interval=%u", |  | ||||||
| 			   pos[0], pos[1], WPA_GET_LE16(pos + 2), pos[4]); |  | ||||||
| 		mode = pos[1]; |  | ||||||
| 		pos += 5; |  | ||||||
| 		if (mode & 0x08) |  | ||||||
| 			pos += 12; /* BSS Termination Duration */ |  | ||||||
| 		if (mode & 0x10) { |  | ||||||
| 			char url[256]; |  | ||||||
| 			if (pos + 1 > end || pos + 1 + pos[0] > end) { |  | ||||||
| 				wpa_printf(MSG_DEBUG, "WNM: Invalid BSS " |  | ||||||
| 					   "Transition Management Request " |  | ||||||
| 					   "(URL)"); |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 			os_memcpy(url, pos + 1, pos[0]); |  | ||||||
| 			url[pos[0]] = '\0'; |  | ||||||
| 			wpa_msg(wpa_s, MSG_INFO, "WNM: ESS Disassociation " |  | ||||||
| 				"Imminent - session_info_url=%s", url); |  | ||||||
| 		} |  | ||||||
| 		break; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void wpa_supplicant_event(void *ctx, enum wpa_event_type event, | void wpa_supplicant_event(void *ctx, enum wpa_event_type event, | ||||||
| 			  union wpa_event_data *data) | 			  union wpa_event_data *data) | ||||||
| { | { | ||||||
|  | @ -2729,10 +2685,6 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, | ||||||
| 				 data->rx_action.freq) == 0) | 				 data->rx_action.freq) == 0) | ||||||
| 			break; | 			break; | ||||||
| #endif /* CONFIG_GAS */ | #endif /* CONFIG_GAS */ | ||||||
| 		if (data->rx_action.category == WLAN_ACTION_WNM) { |  | ||||||
| 			wnm_action_rx(wpa_s, &data->rx_action); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| #ifdef CONFIG_TDLS | #ifdef CONFIG_TDLS | ||||||
| 		if (data->rx_action.category == WLAN_ACTION_PUBLIC && | 		if (data->rx_action.category == WLAN_ACTION_PUBLIC && | ||||||
| 		    data->rx_action.len >= 4 && | 		    data->rx_action.len >= 4 && | ||||||
|  |  | ||||||
|  | @ -296,11 +296,45 @@ static void ieee802_11_rx_wnmsleep_resp(struct wpa_supplicant *wpa_s, | ||||||
| void ieee802_11_rx_wnm_action(struct wpa_supplicant *wpa_s, | void ieee802_11_rx_wnm_action(struct wpa_supplicant *wpa_s, | ||||||
| 			      struct rx_action *action) | 			      struct rx_action *action) | ||||||
| { | { | ||||||
| 	u8 *pos = (u8 *) action->data; /* point to action field */ | 	const u8 *pos, *end; | ||||||
| 	u8 act = *pos++; | 	u8 act, mode; | ||||||
| 	/* u8 dialog_token = *pos++; */ | 
 | ||||||
|  | 	if (action->data == NULL || action->len == 0) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	pos = action->data; | ||||||
|  | 	end = pos + action->len; | ||||||
|  | 	act = *pos++; | ||||||
|  | 
 | ||||||
|  | 	wpa_printf(MSG_DEBUG, "WNM: RX action %u from " MACSTR, | ||||||
|  | 		   act, MAC2STR(action->sa)); | ||||||
| 
 | 
 | ||||||
| 	switch (act) { | 	switch (act) { | ||||||
|  | 	case WNM_BSS_TRANS_MGMT_REQ: | ||||||
|  | 		if (pos + 5 > end) | ||||||
|  | 			break; | ||||||
|  | 		wpa_printf(MSG_DEBUG, "WNM: BSS Transition Management " | ||||||
|  | 			   "Request: dialog_token=%u request_mode=0x%x " | ||||||
|  | 			   "disassoc_timer=%u validity_interval=%u", | ||||||
|  | 			   pos[0], pos[1], WPA_GET_LE16(pos + 2), pos[4]); | ||||||
|  | 		mode = pos[1]; | ||||||
|  | 		pos += 5; | ||||||
|  | 		if (mode & 0x08) | ||||||
|  | 			pos += 12; /* BSS Termination Duration */ | ||||||
|  | 		if (mode & 0x10) { | ||||||
|  | 			char url[256]; | ||||||
|  | 			if (pos + 1 > end || pos + 1 + pos[0] > end) { | ||||||
|  | 				wpa_printf(MSG_DEBUG, "WNM: Invalid BSS " | ||||||
|  | 					   "Transition Management Request " | ||||||
|  | 					   "(URL)"); | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			os_memcpy(url, pos + 1, pos[0]); | ||||||
|  | 			url[pos[0]] = '\0'; | ||||||
|  | 			wpa_msg(wpa_s, MSG_INFO, "WNM: ESS Disassociation " | ||||||
|  | 				"Imminent - session_info_url=%s", url); | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
| 	case WNM_SLEEP_MODE_RESP: | 	case WNM_SLEEP_MODE_RESP: | ||||||
| 		ieee802_11_rx_wnmsleep_resp(wpa_s, action->data, action->len); | 		ieee802_11_rx_wnmsleep_resp(wpa_s, action->data, action->len); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jouni Malinen
						Jouni Malinen