From ab2602787f45480cbb28d75aa5b85923bfc33ffe Mon Sep 17 00:00:00 2001
From: nrbffs <38812627+nrbffs@users.noreply.github.com>
Date: Wed, 11 Dec 2019 14:21:49 +0100
Subject: [PATCH] radv-filter: print gateway list

---
 .../src/gluon-radv-filterd.c                  | 55 +++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/package/gluon-radv-filterd/src/gluon-radv-filterd.c b/package/gluon-radv-filterd/src/gluon-radv-filterd.c
index ed090c460..233b7b889 100644
--- a/package/gluon-radv-filterd/src/gluon-radv-filterd.c
+++ b/package/gluon-radv-filterd/src/gluon-radv-filterd.c
@@ -403,6 +403,54 @@ static void expire_routers(void) {
 	}
 }
 
+static int parse_gws_global(struct nl_msg *msg,
+			   void *arg __attribute__((unused)))
+{
+	static const enum batadv_nl_attrs mandatory[] = {
+		BATADV_ATTR_ORIG_ADDRESS,
+		BATADV_ATTR_FLAG_BEST,
+	};
+	struct nlattr *attrs[BATADV_ATTR_MAX + 1];
+	struct nlmsghdr *nlh = nlmsg_hdr(msg);
+	struct ether_addr mac_a, mac_b;
+	struct genlmsghdr *ghdr;
+	struct router *router;
+	uint8_t *addr;
+	uint8_t *best;
+
+	// parse netlink entry
+	if (!genlmsg_valid_hdr(nlh, 0))
+		return NL_OK;
+
+	ghdr = nlmsg_data(nlh);
+
+    if (ghdr->cmd != BATADV_CMD_GET_GATEWAYS) {
+        DEBUG_MSG("cmd is not BATADV_CMD_GET_GATEWAYS but %d", ghdr->cmd);
+		return NL_OK;
+    }
+
+	if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
+		      genlmsg_len(ghdr), batadv_genl_policy)) {
+        DEBUG_MSG("parsing failed");
+		return NL_OK;
+	}
+
+    if (batadv_genl_missing_attrs(attrs, mandatory, ARRAY_SIZE(mandatory))) {
+        DEBUG_MSG("missing attrs in netlink response");
+		return NL_OK;
+    }
+
+	orig = nla_data(attrs[BATADV_ATTR_ORIG_ADDRESS]);
+	best = nla_data(attrs[BATADV_ATTR_FLAG_BEST]);
+
+	MAC2ETHER(mac_a, addr);
+
+	DEBUG_MSG("Found gateway " F_MAC " (best=%d)"
+		  F_MAC_VAR(mac_a), *best);
+
+	return NL_OK;
+}
+
 static int parse_tt_global(struct nl_msg *msg,
 			   void *arg __attribute__((unused)))
 {
@@ -573,6 +621,13 @@ static void update_tqs(void) {
 			update_originators = true;
 	}
 
+	opts.err = 0;
+	ret = batadv_genl_query(G.mesh_iface,
+				BATADV_CMD_GET_GATEWAYS,
+				parse_gws_global, NLM_F_DUMP, &opts);
+	if (ret < 0)
+		fprintf(stderr, "Parsing of gateways failed\n");
+
 	// translate all router's MAC addresses to originators simultaneously
 	if (update_originators) {
 		opts.err = 0;
-- 
GitLab