From 4bb640ca06c08ef60f729d0603b4c8df8f580772 Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakob.olsson@iopsys.eu>
Date: Mon, 7 Apr 2025 17:01:27 +0200
Subject: [PATCH] vendor ext: parse any custom bridge passed with WSC M2 AP

---
 src/agent.h     |  3 +++
 src/agent_map.c | 18 ++++++++++++++++--
 src/config.c    |  5 ++++-
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/agent.h b/src/agent.h
index 1d7b6933b..e44fc068c 100644
--- a/src/agent.h
+++ b/src/agent.h
@@ -596,7 +596,10 @@ struct wifi_backhaul_element {
 };
 
 struct wsc_ext {
+#if VENDOR_EXTENSION
 	bool enabled;
+	char bridge[16];
+#endif
 #define VEN_IES_MAX 16
 	uint8_t num_ven_ies;
 	struct wsc_vendor_ie ven_ies[VEN_IES_MAX];
diff --git a/src/agent_map.c b/src/agent_map.c
index 6216d19a6..8931fc824 100644
--- a/src/agent_map.c
+++ b/src/agent_map.c
@@ -1928,7 +1928,8 @@ int wsc_get_exts(uint8_t *msg, uint16_t msglen, struct wsc_ext *exts)
 	uint8_t *p;
 	uint8_t *msg_end;
 #ifdef EASYMESH_VENDOR_EXT
-#define ATTR_ENABLED (0x4C) /* IOPSYS m2 vendor extension */
+#define ATTR_ENABLED (0x4C) /* provisioning of disabled APs */
+#define ATTR_BRIDGE (0x4D) /* provisioning of custom bridge */
 	const uint8_t vendor_oui[4] = {0};
 	uint32_t oui = 0;
 
@@ -1983,8 +1984,17 @@ int wsc_get_exts(uint8_t *msg, uint16_t msglen, struct wsc_ext *exts)
 					p += 1;
 					attr_len -= 1;
 
-					if (subelem == ATTR_ENABLED)
+					switch (subelem) {
+					case ATTR_ENABLED:
 						memcpy(&exts->enabled, p, len);
+						break;
+					case ATTR_BRIDGE:
+						memcpy(exts->bridge, p, len);
+						break;
+					default:
+						trace("%s: unknown subelem:%u\n", __func__, subelem);
+						break;
+					}
 
 					p += len;
 					attr_len -= len;
@@ -1997,6 +2007,10 @@ int wsc_get_exts(uint8_t *msg, uint16_t msglen, struct wsc_ext *exts)
 		p += attr_len;
 	}
 
+#ifdef EASYMESH_VENDOR_EXT
+#undef ATTR_ENABLED
+#undef ATTR_BRIDGE
+#endif
 	return 0;
 }
 
diff --git a/src/config.c b/src/config.c
index df0997f3f..5230858e4 100644
--- a/src/config.c
+++ b/src/config.c
@@ -889,7 +889,10 @@ struct netif_apcfg *uci_apply_wps_credentials(struct agent_config *cfg, char *if
 	int mfp = 0;
 
 	bridge = cfg->al_bridge;
-
+#ifdef VENDOR_EXTENSION
+	if (strlen(exts->bridge))
+		bridge = exts->bridge;
+#endif
 	/* step past br- prefix if present*/
 	if (!strncmp("br-", bridge, 3))
 		bridge += 3;
-- 
GitLab