hostapd: expose beacon reports through ubus
Subscribe to beacon reports through ubus.
Can be used for hearing map and client steering purposes.
First enable rrm:
    ubus call hostapd.wlan0 bss_mgmt_enable '{"beacon_report":True}'
Subscribe to the hostapd notifications via ubus.
Request beacon report:
    ubus call hostapd.wlan0 rrm_beacon_req
	'{"addr":"00:xx:xx:xx:xx:xx", "op_class":0, "channel":1,
	"duration":1,"mode":2,"bssid":"ff:ff:ff:ff:ff:ff", "ssid":""}'
Signed-off-by: Nick Hainke <vincent@systemli.org>
[rework identation]
Signed-off-by: David Bauer <mail@david-bauer.net>
			
			
This commit is contained in:
		| @@ -458,3 +458,15 @@ | |||||||
|  		case 'o': |  		case 'o': | ||||||
|  			params.override_driver = optarg; |  			params.override_driver = optarg; | ||||||
|  			break; |  			break; | ||||||
|  | --- a/src/ap/rrm.c | ||||||
|  | +++ b/src/ap/rrm.c | ||||||
|  | @@ -89,6 +89,9 @@ static void hostapd_handle_beacon_report | ||||||
|  |  		return; | ||||||
|  |  	wpa_msg(hapd->msg_ctx, MSG_INFO, BEACON_RESP_RX MACSTR " %u %02x %s", | ||||||
|  |  		MAC2STR(addr), token, rep_mode, report); | ||||||
|  | +	if (len < sizeof(struct rrm_measurement_beacon_report)) | ||||||
|  | +		return; | ||||||
|  | +	hostapd_ubus_notify_beacon_report(hapd, addr, token, rep_mode, (struct rrm_measurement_beacon_report*) pos, len); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |   | ||||||
|   | |||||||
| @@ -1271,3 +1271,29 @@ void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 * | |||||||
|  |  | ||||||
| 	ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1); | 	ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void hostapd_ubus_notify_beacon_report( | ||||||
|  | 	struct hostapd_data *hapd, const u8 *addr, u8 token, u8 rep_mode, | ||||||
|  | 	struct rrm_measurement_beacon_report *rep, size_t len) | ||||||
|  | { | ||||||
|  | 	if (!hapd->ubus.obj.has_subscribers) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if (!addr || !rep) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	blob_buf_init(&b, 0); | ||||||
|  | 	blobmsg_add_macaddr(&b, "address", addr); | ||||||
|  | 	blobmsg_add_u16(&b, "op-class", rep->op_class); | ||||||
|  | 	blobmsg_add_u16(&b, "channel", rep->channel); | ||||||
|  | 	blobmsg_add_u64(&b, "start-time", rep->start_time); | ||||||
|  | 	blobmsg_add_u16(&b, "duration", rep->duration); | ||||||
|  | 	blobmsg_add_u16(&b, "report-info", rep->report_info); | ||||||
|  | 	blobmsg_add_u16(&b, "rcpi", rep->rcpi); | ||||||
|  | 	blobmsg_add_u16(&b, "rsni", rep->rsni); | ||||||
|  | 	blobmsg_add_macaddr(&b, "bssid", rep->bssid); | ||||||
|  | 	blobmsg_add_u16(&b, "antenna-id", rep->antenna_id); | ||||||
|  | 	blobmsg_add_u16(&b, "parent-tsf", rep->parent_tsf); | ||||||
|  |  | ||||||
|  | 	ubus_notify(ctx, &hapd->ubus.obj, "beacon-report", b.head, -1); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ struct hostapd_ubus_request { | |||||||
| struct hostapd_iface; | struct hostapd_iface; | ||||||
| struct hostapd_data; | struct hostapd_data; | ||||||
| struct hapd_interfaces; | struct hapd_interfaces; | ||||||
|  | struct rrm_measurement_beacon_report; | ||||||
|  |  | ||||||
| #ifdef UBUS_SUPPORT | #ifdef UBUS_SUPPORT | ||||||
|  |  | ||||||
| @@ -45,6 +46,10 @@ void hostapd_ubus_free_bss(struct hostapd_data *hapd); | |||||||
|  |  | ||||||
| int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_request *req); | int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_request *req); | ||||||
| void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *mac); | void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *mac); | ||||||
|  | void hostapd_ubus_notify_beacon_report(struct hostapd_data *hapd, | ||||||
|  | 				       const u8 *addr, u8 token, u8 rep_mode, | ||||||
|  | 				       struct rrm_measurement_beacon_report *rep, | ||||||
|  | 				       size_t len); | ||||||
|  |  | ||||||
| void hostapd_ubus_add(struct hapd_interfaces *interfaces); | void hostapd_ubus_add(struct hapd_interfaces *interfaces); | ||||||
| void hostapd_ubus_free(struct hapd_interfaces *interfaces); | void hostapd_ubus_free(struct hapd_interfaces *interfaces); | ||||||
| @@ -78,6 +83,14 @@ static inline void hostapd_ubus_notify(struct hostapd_data *hapd, const char *ty | |||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static inline void hostapd_ubus_notify_beacon_report(struct hostapd_data *hapd, | ||||||
|  | 						     const u8 *addr, u8 token, | ||||||
|  | 						     u8 rep_mode, | ||||||
|  | 						     struct rrm_measurement_beacon_report *rep, | ||||||
|  | 						     size_t len) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
| static inline void hostapd_ubus_add(struct hapd_interfaces *interfaces) | static inline void hostapd_ubus_add(struct hapd_interfaces *interfaces) | ||||||
| { | { | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nick Hainke
					Nick Hainke