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