Skip to content

Commit

Permalink
status page: implement neighbor info for batman_v
Browse files Browse the repository at this point in the history
- add patches to fix BATMAN_V support (from ff chemnitz) for new segments
- Update patches

Co-Authored-By: Steffen Förster <[email protected]>
Co-Authored-By: Krombel <[email protected]>
  • Loading branch information
3 people committed Oct 31, 2024
1 parent dd0c221 commit 59714dd
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ return {
-- 2) human-readable key (not translatable yet)
-- 3) value suffix (optional)
attrs = {
{'tq', 'TQ', ' %'},
{'tp', 'bit/s', ''},
},
}
57 changes: 31 additions & 26 deletions package/gluon-status-page-mesh-batman-adv/src/neighbours-batadv.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,28 @@ struct neigh_netlink_opts {
struct batadv_nlquery_opts query_opts;
};

static const enum batadv_nl_attrs parse_orig_list_mandatory[] = {
BATADV_ATTR_ORIG_ADDRESS,
static const enum batadv_nl_attrs parse_neigh_list_mandatory[] = {
BATADV_ATTR_NEIGH_ADDRESS,
BATADV_ATTR_TQ,
BATADV_ATTR_THROUGHPUT,
BATADV_ATTR_HARD_IFINDEX,
BATADV_ATTR_LAST_SEEN_MSECS,
};

static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
static int parse_neigh_list_netlink_cb(struct nl_msg *msg, void *arg)
{
struct nlattr *attrs[BATADV_ATTR_MAX+1];
struct nlmsghdr *nlh = nlmsg_hdr(msg);
struct batadv_nlquery_opts *query_opts = arg;
struct genlmsghdr *ghdr;
uint8_t *orig;
uint8_t *dest;
uint8_t tq;
uint8_t *neigh;
uint32_t throughput;
uint32_t hardif;
char ifname_buf[IF_NAMESIZE], *ifname;
struct neigh_netlink_opts *opts;
char mac1[18];
char tp_str[5];
const char tp_units[] = {'k', 'M', 'G', 'T', '?'};
int tp_unit;

opts = batadv_container_of(query_opts, struct neigh_netlink_opts, query_opts);

Expand All @@ -43,41 +44,45 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)

ghdr = nlmsg_data(nlh);

if (ghdr->cmd != BATADV_CMD_GET_ORIGINATORS)
if (ghdr->cmd != BATADV_CMD_GET_NEIGHBORS)
return NL_OK;

if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
genlmsg_len(ghdr), batadv_genl_policy))
return NL_OK;

if (batadv_genl_missing_attrs(attrs, parse_orig_list_mandatory,
BATADV_ARRAY_SIZE(parse_orig_list_mandatory)))
if (batadv_genl_missing_attrs(attrs, parse_neigh_list_mandatory,
BATADV_ARRAY_SIZE(parse_neigh_list_mandatory)))
return NL_OK;

orig = nla_data(attrs[BATADV_ATTR_ORIG_ADDRESS]);
dest = nla_data(attrs[BATADV_ATTR_NEIGH_ADDRESS]);
tq = nla_get_u8(attrs[BATADV_ATTR_TQ]);
neigh = nla_data(attrs[BATADV_ATTR_NEIGH_ADDRESS]);
throughput = nla_get_u32(attrs[BATADV_ATTR_THROUGHPUT]);
hardif = nla_get_u32(attrs[BATADV_ATTR_HARD_IFINDEX]);

if (memcmp(orig, dest, 6) != 0)
return NL_OK;

ifname = if_indextoname(hardif, ifname_buf);
if (!ifname)
return NL_OK;

sprintf(mac1, "%02x:%02x:%02x:%02x:%02x:%02x",
orig[0], orig[1], orig[2], orig[3], orig[4], orig[5]);
neigh[0], neigh[1], neigh[2], neigh[3], neigh[4], neigh[5]);

struct json_object *neigh = json_object_new_object();
if (!neigh)
struct json_object *obj = json_object_new_object();
if (!obj)
return NL_OK;

json_object_object_add(neigh, "tq", json_object_new_int(tq * 100 / 255));
json_object_object_add(neigh, "ifname", json_object_new_string(ifname));
json_object_object_add(neigh, "best", json_object_new_boolean(attrs[BATADV_ATTR_FLAG_BEST]));
for (tp_unit = 0; tp_unit < 4; tp_unit++)
{
if (throughput < 1000)
break;
throughput /= 1000;
}
sprintf(tp_str, "%3u%c", throughput, tp_units[tp_unit]);

json_object_object_add(obj, "tp", json_object_new_string(tp_str));
json_object_object_add(obj, "ifname", json_object_new_string(ifname));
json_object_object_add(obj, "best", json_object_new_boolean(attrs[BATADV_ATTR_FLAG_BEST]));

json_object_object_add(opts->obj, mac1, neigh);
json_object_object_add(opts->obj, mac1, obj);

return NL_OK;
}
Expand All @@ -94,9 +99,9 @@ static json_object *neighbours(void) {
if (!opts.obj)
return NULL;

ret = batadv_genl_query("bat0", BATADV_CMD_GET_ORIGINATORS,
parse_orig_list_netlink_cb, NLM_F_DUMP,
&opts.query_opts);
ret = batadv_genl_query("bat0", BATADV_CMD_GET_NEIGHBORS,
parse_neigh_list_netlink_cb, NLM_F_DUMP,
&opts.query_opts);
if (ret < 0) {
json_object_put(opts.obj);
return NULL;
Expand Down

0 comments on commit 59714dd

Please sign in to comment.