From 79dd14cb24b3d01e9fc61963b2d501f2ef24a2f9 Mon Sep 17 00:00:00 2001 From: Andrew Zaborowski Date: Mon, 8 Jul 2019 18:59:36 +0200 Subject: [PATCH] wscutil: Add wsc_build_p2p_attrs Add a utility for building the simplified WSC IEs used in P2P action frames and public action frames. Only three types of WSC attributes are mandatory in those frames (but different subsets are needed by different frame types) so add a single utility for building those IEs. We may need to add some more optional attributes to those IEs later. --- src/wscutil.c | 26 ++++++++++++++++++++++++++ src/wscutil.h | 10 ++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/wscutil.c b/src/wscutil.c index 0d0894a5..2806b249 100644 --- a/src/wscutil.c +++ b/src/wscutil.c @@ -2457,6 +2457,32 @@ done: return ret; } +uint8_t *wsc_build_p2p_attrs(const struct wsc_p2p_attrs *attrs, size_t *out_len) +{ + struct wsc_attr_builder *builder; + uint8_t *ret; + + builder = wsc_attr_builder_new(512); + + if (attrs->version) + build_version(builder, 0x10); + + if (attrs->device_password_id) + build_device_password_id(builder, attrs->device_password_id); + + if (attrs->config_methods) + build_configuration_methods(builder, attrs->config_methods); + + if (!attrs->version2) + goto done; + + START_WFA_VENDOR_EXTENSION(); + +done: + ret = wsc_attr_builder_free(builder, false, out_len); + return ret; +} + bool wsc_uuid_from_addr(const uint8_t addr[], uint8_t *out_uuid) { /* Reuse the NSID from WPA Supplicant for compatibility */ diff --git a/src/wscutil.h b/src/wscutil.h index 99786c76..515344b7 100644 --- a/src/wscutil.h +++ b/src/wscutil.h @@ -642,6 +642,16 @@ uint8_t *wsc_build_wsc_nack(const struct wsc_nack *nack, size_t *out_len); uint8_t *wsc_build_wsc_done(const struct wsc_done *done, size_t *out_len); +struct wsc_p2p_attrs { + bool version; + bool version2; + enum wsc_device_password_id device_password_id; + uint16_t config_methods; +}; + +uint8_t *wsc_build_p2p_attrs(const struct wsc_p2p_attrs *attrs, + size_t *out_len); + bool wsc_uuid_from_addr(const uint8_t addr[], uint8_t *out_uuid); struct wsc_session_key {