hostapd: add ubus method for requesting link measurements
Add a ubus method to request link-measurements from connected STAs.
In addition to the STAs address, the used and maximum transmit power can
be provided by the external process for the link-measurement. If they
are not provided, 0 is used as the default value.
Signed-off-by: David Bauer <mail@david-bauer.net>
(cherry picked from commit 965aa33a18)
			
			
This commit is contained in:
		| @@ -1248,6 +1248,70 @@ hostapd_rrm_beacon_req(struct ubus_context *ctx, struct ubus_object *obj, | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | enum { | ||||||
|  | 	LM_REQ_ADDR, | ||||||
|  | 	LM_REQ_TX_POWER_USED, | ||||||
|  | 	LM_REQ_TX_POWER_MAX, | ||||||
|  | 	__LM_REQ_MAX, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static const struct blobmsg_policy lm_req_policy[__LM_REQ_MAX] = { | ||||||
|  | 	[LM_REQ_ADDR] = { "addr", BLOBMSG_TYPE_STRING }, | ||||||
|  | 	[LM_REQ_TX_POWER_USED] = { "tx-power-used", BLOBMSG_TYPE_INT32 }, | ||||||
|  | 	[LM_REQ_TX_POWER_MAX] = { "tx-power-max", BLOBMSG_TYPE_INT32 }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | hostapd_rrm_lm_req(struct ubus_context *ctx, struct ubus_object *obj, | ||||||
|  | 		   struct ubus_request_data *ureq, const char *method, | ||||||
|  | 		   struct blob_attr *msg) | ||||||
|  | { | ||||||
|  | 	struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj); | ||||||
|  | 	struct blob_attr *tb[__LM_REQ_MAX]; | ||||||
|  | 	struct wpabuf *buf; | ||||||
|  | 	u8 addr[ETH_ALEN]; | ||||||
|  | 	int ret; | ||||||
|  | 	int8_t txp_used, txp_max; | ||||||
|  |  | ||||||
|  | 	txp_used = 0; | ||||||
|  | 	txp_max = 0; | ||||||
|  |  | ||||||
|  | 	blobmsg_parse(lm_req_policy, __LM_REQ_MAX, tb, blob_data(msg), blob_len(msg)); | ||||||
|  |  | ||||||
|  | 	if (!tb[LM_REQ_ADDR]) | ||||||
|  | 		return UBUS_STATUS_INVALID_ARGUMENT; | ||||||
|  |  | ||||||
|  | 	if (tb[LM_REQ_TX_POWER_USED]) | ||||||
|  | 		txp_used = (int8_t) blobmsg_get_u32(tb[LM_REQ_TX_POWER_USED]); | ||||||
|  |  | ||||||
|  | 	if (tb[LM_REQ_TX_POWER_MAX]) | ||||||
|  | 		txp_max = (int8_t) blobmsg_get_u32(tb[LM_REQ_TX_POWER_MAX]); | ||||||
|  |  | ||||||
|  | 	if (hwaddr_aton(blobmsg_data(tb[LM_REQ_ADDR]), addr)) | ||||||
|  | 		return UBUS_STATUS_INVALID_ARGUMENT; | ||||||
|  |  | ||||||
|  | 	buf = wpabuf_alloc(5); | ||||||
|  | 	if (!buf) | ||||||
|  | 		return UBUS_STATUS_UNKNOWN_ERROR; | ||||||
|  |  | ||||||
|  | 	wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT); | ||||||
|  | 	wpabuf_put_u8(buf, WLAN_RRM_LINK_MEASUREMENT_REQUEST); | ||||||
|  | 	wpabuf_put_u8(buf, 1); | ||||||
|  | 	/* TX-Power used */ | ||||||
|  | 	wpabuf_put_u8(buf, txp_used); | ||||||
|  | 	/* Max TX Power */ | ||||||
|  | 	wpabuf_put_u8(buf, txp_max); | ||||||
|  |  | ||||||
|  | 	ret = hostapd_drv_send_action(hapd, hapd->iface->freq, 0, addr, | ||||||
|  | 				      wpabuf_head(buf), wpabuf_len(buf)); | ||||||
|  |  | ||||||
|  | 	wpabuf_free(buf); | ||||||
|  | 	if (ret < 0) | ||||||
|  | 		return -ret; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef CONFIG_WNM_AP | #ifdef CONFIG_WNM_AP | ||||||
|  |  | ||||||
| @@ -1441,6 +1505,7 @@ static const struct ubus_method bss_methods[] = { | |||||||
| 	UBUS_METHOD_NOARG("rrm_nr_list", hostapd_rrm_nr_list), | 	UBUS_METHOD_NOARG("rrm_nr_list", hostapd_rrm_nr_list), | ||||||
| 	UBUS_METHOD("rrm_nr_set", hostapd_rrm_nr_set, nr_set_policy), | 	UBUS_METHOD("rrm_nr_set", hostapd_rrm_nr_set, nr_set_policy), | ||||||
| 	UBUS_METHOD("rrm_beacon_req", hostapd_rrm_beacon_req, beacon_req_policy), | 	UBUS_METHOD("rrm_beacon_req", hostapd_rrm_beacon_req, beacon_req_policy), | ||||||
|  | 	UBUS_METHOD("link_measurement_req", hostapd_rrm_lm_req, lm_req_policy), | ||||||
| #ifdef CONFIG_WNM_AP | #ifdef CONFIG_WNM_AP | ||||||
| 	UBUS_METHOD("wnm_disassoc_imminent", hostapd_wnm_disassoc_imminent, wnm_disassoc_policy), | 	UBUS_METHOD("wnm_disassoc_imminent", hostapd_wnm_disassoc_imminent, wnm_disassoc_policy), | ||||||
| 	UBUS_METHOD("bss_transition_request", hostapd_bss_transition_request, bss_tr_policy), | 	UBUS_METHOD("bss_transition_request", hostapd_bss_transition_request, bss_tr_policy), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 David Bauer
					David Bauer