~linuxhackerman/iwd

66e9d4fca9a6a95d2dcfc0596a25da6a2b1df64d — Andrew Zaborowski 1 year, 3 months ago 8c1bf53
wscutil: Add wsc_build_beacon

For consistency also update wsc_build_probe_response to use the same
__builtin_popcount based rf_bands check.
2 files changed, 49 insertions(+), 1 deletions(-)

M src/wscutil.c
M src/wscutil.h
M src/wscutil.c => src/wscutil.c +48 -1
@@ 2138,6 2138,53 @@ static void build_credential(struct wsc_attr_builder *builder,
	l_free(data);
}

uint8_t *wsc_build_beacon(const struct wsc_beacon *beacon, size_t *out_len)
{
	struct wsc_attr_builder *builder;
	uint8_t *ret;

	builder = wsc_attr_builder_new(512);
	build_version(builder, 0x10);
	build_wsc_state(builder, beacon->state);

	if (beacon->ap_setup_locked)
		build_ap_setup_locked(builder, true);

	if (beacon->selected_registrar) {
		build_selected_registrar(builder, true);
		build_device_password_id(builder, beacon->device_password_id);
		build_selected_registrar_configuration_methods(builder,
					beacon->selected_reg_config_methods);
	}

	/* These two "should be provided" if dual-band */
	if (__builtin_popcount(beacon->rf_bands) > 1) {
		if (beacon->selected_registrar)
			build_uuid_e(builder, beacon->uuid_e);

		build_rf_bands(builder, beacon->rf_bands);
	}

	if (!beacon->version2)
		goto done;

	START_WFA_VENDOR_EXTENSION();

	if (!util_mem_is_zero(beacon->authorized_macs, 6))
		wfa_build_authorized_macs(builder, beacon->authorized_macs);

	if (beacon->reg_config_methods) {
		wsc_attr_builder_put_u8(builder,
			WSC_WFA_EXTENSION_REGISTRAR_CONFIGRATION_METHODS);
		wsc_attr_builder_put_u8(builder, 2);
		wsc_attr_builder_put_u16(builder, beacon->reg_config_methods);
	}

done:
	ret = wsc_attr_builder_free(builder, false, out_len);
	return ret;
}

uint8_t *wsc_build_probe_request(const struct wsc_probe_request *probe_request,
							size_t *out_len)
{


@@ 2210,7 2257,7 @@ uint8_t *wsc_build_probe_response(
	build_device_name(builder, probe_response->device_name);
	build_configuration_methods(builder, probe_response->config_methods);

	if (probe_response->rf_bands & (probe_response->rf_bands - 1))
	if (__builtin_popcount(probe_response->rf_bands) > 1)
		build_rf_bands(builder, probe_response->rf_bands);

	if (!probe_response->version2)

M src/wscutil.h => src/wscutil.h +1 -0
@@ 604,6 604,7 @@ int wsc_parse_wsc_done(const uint8_t *pdu, uint32_t len, struct wsc_done *out);

uint8_t *wsc_build_credential(const struct wsc_credential *in, size_t *out_len);

uint8_t *wsc_build_beacon(const struct wsc_beacon *beacon, size_t *out_len);
uint8_t *wsc_build_probe_request(const struct wsc_probe_request *probe_request,
				size_t *out_len);
uint8_t *wsc_build_probe_response(