diff --git a/src/wscutil.c b/src/wscutil.c index f15cd215..f5ff5d75 100644 --- a/src/wscutil.c +++ b/src/wscutil.c @@ -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) diff --git a/src/wscutil.h b/src/wscutil.h index 45d72fbb..5bb26d84 100644 --- a/src/wscutil.h +++ b/src/wscutil.h @@ -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(