aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Zaborowski <andrew.zaborowski@intel.com>2020-04-23 18:24:29 +0200
committerDenis Kenzior <denkenz@gmail.com>2020-04-23 14:41:17 -0500
commited81fe1f4f5f3b525f3f0f0e8edd13f820dc1d8d (patch)
treea56a67b9f4cec43ab03a989a76a374a2a3762e62
parentc352714e61809fc486470cc9a4ad3e3e84811b80 (diff)
downloadiwd-ed81fe1f4f5f3b525f3f0f0e8edd13f820dc1d8d.tar.gz
wscutil: Add device type category/subcategory string api
FTR ie.h is included for @microsoft_oui
-rw-r--r--src/wscutil.c200
-rw-r--r--src/wscutil.h6
2 files changed, 206 insertions, 0 deletions
diff --git a/src/wscutil.c b/src/wscutil.c
index 4f22bd83b..cb6d47c0f 100644
--- a/src/wscutil.c
+++ b/src/wscutil.c
@@ -32,6 +32,7 @@
#include <ell/ell.h>
#include "src/util.h"
+#include "src/ie.h"
#include "src/wscutil.h"
const unsigned char wsc_wfa_oui[3] = { 0x00, 0x37, 0x2a };
@@ -2791,3 +2792,202 @@ bool wsc_pin_generate(char *pin)
return true;
}
+
+struct device_type_category_info {
+ const char *category_str;
+ unsigned int subcategory_max;
+ const char **subcategory_str;
+};
+
+/* WSC 2.0.5, Table 41 strings adapted to IWD DBus enum convention */
+struct device_type_category_info device_type_categories[] = {
+ [1] = {
+ "computer",
+ 10,
+ (const char *[]) {
+ [1] = "pc",
+ [2] = "server",
+ [3] = "media-center",
+ [4] = "ultra-mobile-pc",
+ [5] = "notebook",
+ [6] = "desktop",
+ [7] = "mobile-internet-device",
+ [8] = "netbook",
+ [9] = "tablet",
+ [10] = "ultrabook",
+ },
+ },
+ [2] = {
+ "input device",
+ 9,
+ (const char *[]) {
+ [1] = "keyboard",
+ [2] = "mouse",
+ [3] = "joystick",
+ [4] = "trackball",
+ [5] = "gaming-controller",
+ [6] = "remote",
+ [7] = "touchscreen",
+ [8] = "biometric-reader",
+ [9] = "barcode-reader",
+ },
+ },
+ [3] = {
+ "printer-scanner",
+ 5,
+ (const char *[]) {
+ [1] = "printer-print-server",
+ [2] = "scanner",
+ [3] = "fax",
+ [4] = "copier",
+ [5] = "printer-scanner-fax-copier",
+ },
+ },
+ [4] = {
+ "camera",
+ 4,
+ (const char *[]) {
+ [1] = "digital-still-camera",
+ [2] = "video-camera",
+ [3] = "web-camera",
+ [4] = "security-camera",
+ },
+ },
+ [5] = {
+ "storage",
+ 1,
+ (const char *[]) {
+ [1] = "nas",
+ },
+ },
+ [6] = {
+ "network-infrastructure",
+ 5,
+ (const char *[]) {
+ [1] = "ap",
+ [2] = "router",
+ [3] = "switch",
+ [4] = "gateway",
+ [5] = "bridge",
+ },
+ },
+ [7] = {
+ "display",
+ 4,
+ (const char *[]) {
+ [1] = "television",
+ [2] = "electronic-picture-frame",
+ [3] = "projector",
+ [4] = "monitor",
+ },
+ },
+ [8] = {
+ "multimedia-device",
+ 6,
+ (const char *[]) {
+ [1] = "dar",
+ [2] = "pvr",
+ [3] = "mcx",
+ [4] = "set-top-box",
+ [5] = "media-server-adapter-extender",
+ [6] = "portable-video-player",
+ },
+ },
+ [9] = {
+ "gaming-device",
+ 5,
+ (const char *[]) {
+ [1] = "xbox",
+ [2] = "xbox360",
+ [3] = "playstation",
+ [4] = "game-console-adapter",
+ [5] = "portable-gaming-device",
+ },
+ },
+ [10] = {
+ "telephone",
+ 5,
+ (const char *[]) {
+ [1] = "windows-mobile",
+ [2] = "single-mode-phone",
+ [3] = "dual-mode-phone",
+ [4] = "single-mode-smartphone",
+ [5] = "dual-mode-smartphone",
+ },
+ },
+ [11] = {
+ "audio-device",
+ 7,
+ (const char *[]) {
+ [1] = "audio-tuner-receiver",
+ [2] = "speakers",
+ [3] = "portable-music-player",
+ [4] = "headset",
+ [5] = "headphones",
+ [6] = "microphone",
+ [7] = "home-theater-system",
+ },
+ },
+ [12] = {
+ "docking-device",
+ 2,
+ (const char *[]) {
+ [1] = "computer-docking-station",
+ [2] = "media-kiosk",
+ },
+ },
+};
+
+bool wsc_device_type_to_dbus_str(const struct wsc_primary_device_type *val,
+ const char **category_str,
+ const char **subcategory_str)
+{
+ struct device_type_category_info *cat;
+
+ if (val->category >= L_ARRAY_SIZE(device_type_categories))
+ return false;
+
+ cat = &device_type_categories[val->category];
+
+ if (!cat->category_str)
+ return false;
+
+ if (category_str)
+ *category_str = cat->category_str;
+
+ if (!subcategory_str)
+ return true;
+
+ if (memcmp(val->oui, microsoft_oui, 3) || val->oui_type != 4)
+ *subcategory_str = NULL; /* Vendor-specific */
+ else if (val->subcategory <= cat->subcategory_max &&
+ cat->subcategory_str[val->subcategory])
+ *subcategory_str = cat->subcategory_str[val->subcategory];
+ else
+ *subcategory_str = NULL; /* Unknown */
+
+ return true;
+}
+
+bool wsc_device_type_from_subcategory_str(struct wsc_primary_device_type *out,
+ const char *subcategory_str)
+{
+ struct device_type_category_info *cat = device_type_categories;
+ unsigned int i;
+
+ for (i = 1; i < L_ARRAY_SIZE(device_type_categories); i++, cat++) {
+ unsigned int j;
+
+ for (j = 1; j <= cat->subcategory_max; j++)
+ if (!strcasecmp(subcategory_str,
+ cat->subcategory_str[j])) {
+ out->category = i;
+ memcpy(out->oui, microsoft_oui, 3);
+ out->oui_type = 4;
+ out->subcategory = j;
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/src/wscutil.h b/src/wscutil.h
index fc28a01e2..45d72fbb1 100644
--- a/src/wscutil.h
+++ b/src/wscutil.h
@@ -674,3 +674,9 @@ bool wsc_kdf(const void *kdk, void *output, size_t size);
bool wsc_pin_is_valid(const char *pin);
bool wsc_pin_is_checksum_valid(const char *pin);
bool wsc_pin_generate(char *pin);
+
+bool wsc_device_type_to_dbus_str(const struct wsc_primary_device_type *val,
+ const char **category_str,
+ const char **subcategory_str);
+bool wsc_device_type_from_subcategory_str(struct wsc_primary_device_type *out,
+ const char *subcategory_str);