Browse Source

Merge pull request #1280 from FreifunkVogtland/libbatadv

libbatadv: Add common batman-adv helper functions library
Matthias Schiffer 6 years ago
parent
commit
245e0f9ecc

+ 1 - 1
package/gluon-mesh-batman-adv/Makefile

@@ -13,7 +13,7 @@ define Package/gluon-mesh-batman-adv/common
   SECTION:=gluon
   CATEGORY:=Gluon
   PROVIDES:=gluon-mesh-batman-adv
-  DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +gluon-ebtables +firewall +libiwinfo +kmod-dummy +libnl-tiny
+  DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +gluon-ebtables +firewall +libiwinfo +kmod-dummy +libnl-tiny +libbatadv
 endef
 
 define Package/gluon-mesh-batman-adv-14

+ 12 - 1
package/gluon-mesh-batman-adv/src/Makefile

@@ -20,5 +20,16 @@ endif
 CFLAGS += $(LIBNL_CFLAGS)
 LDLIBS += $(LIBNL_LDLIBS)
 
-respondd.so: respondd.c batadv-netlink.c
+ifeq ($(origin LIBBATADV_CFLAGS) $(origin LIBBATADV_LDLIBS), undefined undefined)
+  LIBBATADV_NAME ?= libbatadv
+  ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBBATADV_NAME) 2>/dev/null),)
+    $(error No $(LIBBATADV_NAME) development libraries found!)
+  endif
+  LIBBATADV_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBBATADV_NAME))
+  LIBBATADV_LDLIBS += $(shell $(PKG_CONFIG) --libs $(LIBBATADV_NAME))
+endif
+CFLAGS += $(LIBBATADV_CFLAGS)
+LDLIBS += $(LIBBATADV_LDLIBS)
+
+respondd.so: respondd.c
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -D_GNU_SOURCE -o $@ $^ $(LDLIBS) -lgluonutil -liwinfo -luci

+ 0 - 149
package/gluon-mesh-batman-adv/src/batadv-netlink.c

@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2009-2016  B.A.T.M.A.N. contributors:
- *
- * Marek Lindner <mareklindner@neomailbox.ch>, Andrew Lunn <andrew@lunn.ch>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA
- *
- */
-
-#include "batadv-netlink.h"
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <net/ethernet.h>
-#include <net/if.h>
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/ctrl.h>
-#include <net/ethernet.h>
-
-#include "batman_adv.h"
-
-#ifndef __maybe_unused
-#define __maybe_unused __attribute__((unused))
-#endif
-
-struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = {
-	[BATADV_ATTR_HARD_IFINDEX]	= { .type = NLA_U32 },
-	[BATADV_ATTR_ORIG_ADDRESS]	= { .type = NLA_UNSPEC,
-					    .minlen = ETH_ALEN,
-					    .maxlen = ETH_ALEN },
-	[BATADV_ATTR_TT_FLAGS]		= { .type = NLA_U32 },
-	[BATADV_ATTR_FLAG_BEST]		= { .type = NLA_FLAG },
-	[BATADV_ATTR_LAST_SEEN_MSECS]	= { .type = NLA_U32 },
-	[BATADV_ATTR_NEIGH_ADDRESS]	= { .type = NLA_UNSPEC,
-					    .minlen = ETH_ALEN,
-					    .maxlen = ETH_ALEN },
-	[BATADV_ATTR_TQ]		= { .type = NLA_U8 },
-	[BATADV_ATTR_ROUTER]		= { .type = NLA_UNSPEC,
-					    .minlen = ETH_ALEN,
-					    .maxlen = ETH_ALEN },
-};
-
-static int nlquery_error_cb(struct sockaddr_nl *nla __maybe_unused,
-			    struct nlmsgerr *nlerr, void *arg)
-{
-	struct batadv_nlquery_opts *query_opts = arg;
-
-	query_opts->err = nlerr->error;
-
-	return NL_STOP;
-}
-
-static int nlquery_stop_cb(struct nl_msg *msg, void *arg)
-{
-	struct nlmsghdr *nlh = nlmsg_hdr(msg);
-	struct batadv_nlquery_opts *query_opts = arg;
-	int *error = nlmsg_data(nlh);
-
-	if (*error)
-		query_opts->err = *error;
-
-	return NL_STOP;
-}
-
-int batadv_nl_query_common(const char *mesh_iface,
-			   enum batadv_nl_commands nl_cmd,
-			   nl_recvmsg_msg_cb_t callback, int flags,
-			   struct batadv_nlquery_opts *query_opts)
-{
-	struct nl_sock *sock;
-	struct nl_msg *msg;
-	struct nl_cb *cb;
-	int ifindex;
-	int family;
-	int ret;
-
-	query_opts->err = 0;
-
-	sock = nl_socket_alloc();
-	if (!sock)
-		return -ENOMEM;
-
-	ret = genl_connect(sock);
-	if (ret < 0) {
-		query_opts->err = ret;
-		goto err_free_sock;
-	}
-
-	family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
-	if (family < 0) {
-		query_opts->err = -EOPNOTSUPP;
-		goto err_free_sock;
-	}
-
-	ifindex = if_nametoindex(mesh_iface);
-	if (!ifindex) {
-		query_opts->err = -ENODEV;
-		goto err_free_sock;
-	}
-
-	cb = nl_cb_alloc(NL_CB_DEFAULT);
-	if (!cb) {
-		query_opts->err = -ENOMEM;
-		goto err_free_sock;
-	}
-
-	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, callback, query_opts);
-	nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nlquery_stop_cb, query_opts);
-	nl_cb_err(cb, NL_CB_CUSTOM, nlquery_error_cb, query_opts);
-
-	msg = nlmsg_alloc();
-	if (!msg) {
-		query_opts->err = -ENOMEM;
-		goto err_free_cb;
-	}
-
-	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, flags,
-		    nl_cmd, 1);
-
-	nla_put_u32(msg, BATADV_ATTR_MESH_IFINDEX, ifindex);
-	nl_send_auto_complete(sock, msg);
-	nlmsg_free(msg);
-
-	nl_recvmsgs(sock, cb);
-
-err_free_cb:
-	nl_cb_put(cb);
-err_free_sock:
-	nl_socket_free(sock);
-
-	return query_opts->err;
-}

+ 0 - 68
package/gluon-mesh-batman-adv/src/batadv-netlink.h

@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2009-2016  B.A.T.M.A.N. contributors:
- *
- * Marek Lindner <mareklindner@neomailbox.ch>, Andrew Lunn <andrew@lunn.ch>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA
- *
- */
-
-#ifndef _BATADV_NETLINK_H
-#define _BATADV_NETLINK_H
-
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/ctrl.h>
-#include <stddef.h>
-#include <stdbool.h>
-
-#include "batman_adv.h"
-
-struct batadv_nlquery_opts {
-	int err;
-};
-
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
-#endif
-
-#ifndef container_of
-#define container_of(ptr, type, member) __extension__ ({ \
-	const __typeof__(((type *)0)->member) *__pmember = (ptr); \
-	(type *)((char *)__pmember - offsetof(type, member)); })
-#endif
-
-int batadv_nl_query_common(const char *mesh_iface,
-			   enum batadv_nl_commands nl_cmd,
-			   nl_recvmsg_msg_cb_t callback, int flags,
-			   struct batadv_nlquery_opts *query_opts);
-
-static inline bool batadv_nl_missing_attrs(struct nlattr *attrs[],
-					   const enum batadv_nl_attrs mandatory[],
-					   size_t num)
-{
-	size_t i;
-
-	for (i = 0; i < num; i++) {
-		if (!attrs[mandatory[i]])
-			return true;
-	}
-
-	return false;
-}
-
-extern struct nla_policy batadv_netlink_policy[];
-
-#endif /* _BATADV_NETLINK_H */

+ 0 - 208
package/gluon-mesh-batman-adv/src/batman_adv.h

@@ -1,208 +0,0 @@
-/* Copyright (C) 2016 B.A.T.M.A.N. contributors:
- *
- * Matthias Schiffer
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _UAPI_LINUX_BATMAN_ADV_H_
-#define _UAPI_LINUX_BATMAN_ADV_H_
-
-#define BATADV_NL_NAME "batadv"
-
-#define BATADV_NL_MCAST_GROUP_TPMETER	"tpmeter"
-
-/**
- * enum batadv_tt_client_flags - TT client specific flags
- * @BATADV_TT_CLIENT_DEL: the client has to be deleted from the table
- * @BATADV_TT_CLIENT_ROAM: the client roamed to/from another node and the new
- *  update telling its new real location has not been received/sent yet
- * @BATADV_TT_CLIENT_WIFI: this client is connected through a wifi interface.
- *  This information is used by the "AP Isolation" feature
- * @BATADV_TT_CLIENT_ISOLA: this client is considered "isolated". This
- *  information is used by the Extended Isolation feature
- * @BATADV_TT_CLIENT_NOPURGE: this client should never be removed from the table
- * @BATADV_TT_CLIENT_NEW: this client has been added to the local table but has
- *  not been announced yet
- * @BATADV_TT_CLIENT_PENDING: this client is marked for removal but it is kept
- *  in the table for one more originator interval for consistency purposes
- * @BATADV_TT_CLIENT_TEMP: this global client has been detected to be part of
- *  the network but no nnode has already announced it
- *
- * Bits from 0 to 7 are called _remote flags_ because they are sent on the wire.
- * Bits from 8 to 15 are called _local flags_ because they are used for local
- * computations only.
- *
- * Bits from 4 to 7 - a subset of remote flags - are ensured to be in sync with
- * the other nodes in the network. To achieve this goal these flags are included
- * in the TT CRC computation.
- */
-enum batadv_tt_client_flags {
-	BATADV_TT_CLIENT_DEL     = (1 << 0),
-	BATADV_TT_CLIENT_ROAM    = (1 << 1),
-	BATADV_TT_CLIENT_WIFI    = (1 << 4),
-	BATADV_TT_CLIENT_ISOLA	 = (1 << 5),
-	BATADV_TT_CLIENT_NOPURGE = (1 << 8),
-	BATADV_TT_CLIENT_NEW     = (1 << 9),
-	BATADV_TT_CLIENT_PENDING = (1 << 10),
-	BATADV_TT_CLIENT_TEMP	 = (1 << 11),
-};
-
-/**
- * enum batadv_nl_attrs - batman-adv netlink attributes
- *
- * @BATADV_ATTR_UNSPEC: unspecified attribute to catch errors
- * @BATADV_ATTR_VERSION: batman-adv version string
- * @BATADV_ATTR_ALGO_NAME: name of routing algorithm
- * @BATADV_ATTR_MESH_IFINDEX: index of the batman-adv interface
- * @BATADV_ATTR_MESH_IFNAME: name of the batman-adv interface
- * @BATADV_ATTR_MESH_ADDRESS: mac address of the batman-adv interface
- * @BATADV_ATTR_HARD_IFINDEX: index of the non-batman-adv interface
- * @BATADV_ATTR_HARD_IFNAME: name of the non-batman-adv interface
- * @BATADV_ATTR_HARD_ADDRESS: mac address of the non-batman-adv interface
- * @BATADV_ATTR_ORIG_ADDRESS: originator mac address
- * @BATADV_ATTR_TPMETER_RESULT: result of run (see batadv_tp_meter_status)
- * @BATADV_ATTR_TPMETER_TEST_TIME: time (msec) the run took
- * @BATADV_ATTR_TPMETER_BYTES: amount of acked bytes during run
- * @BATADV_ATTR_TPMETER_COOKIE: session cookie to match tp_meter session
- * @BATADV_ATTR_PAD: attribute used for padding for 64-bit alignment
- * @BATADV_ATTR_ACTIVE: Flag indicating if the hard interface is active
- * @BATADV_ATTR_TT_ADDRESS: Client MAC address
- * @BATADV_ATTR_TT_TTVN: Translation table version
- * @BATADV_ATTR_TT_LAST_TTVN: Previous translation table version
- * @BATADV_ATTR_TT_CRC32: CRC32 over translation table
- * @BATADV_ATTR_TT_VID: VLAN ID
- * @BATADV_ATTR_TT_FLAGS: Translation table client flags
- * @BATADV_ATTR_FLAG_BEST: Flags indicating entry is the best
- * @BATADV_ATTR_LAST_SEEN_MSECS: Time in milliseconds since last seen
- * @BATADV_ATTR_NEIGH_ADDRESS: Neighbour MAC address
- * @BATADV_ATTR_TQ: TQ to neighbour
- * @BATADV_ATTR_THROUGHPUT: Estimated throughput to Neighbour
- * @BATADV_ATTR_BANDWIDTH_UP: Reported uplink bandwidth
- * @BATADV_ATTR_BANDWIDTH_DOWN: Reported downlink bandwidth
- * @BATADV_ATTR_ROUTER: Gateway router MAC address
- * @BATADV_ATTR_BLA_OWN: Flag indicating own originator
- * @BATADV_ATTR_BLA_ADDRESS: Bridge loop avoidance claim MAC address
- * @BATADV_ATTR_BLA_VID: BLA VLAN ID
- * @BATADV_ATTR_BLA_BACKBONE: BLA gateway originator MAC address
- * @BATADV_ATTR_BLA_CRC: BLA CRC
- * @__BATADV_ATTR_AFTER_LAST: internal use
- * @NUM_BATADV_ATTR: total number of batadv_nl_attrs available
- * @BATADV_ATTR_MAX: highest attribute number currently defined
- */
-enum batadv_nl_attrs {
-	BATADV_ATTR_UNSPEC,
-	BATADV_ATTR_VERSION,
-	BATADV_ATTR_ALGO_NAME,
-	BATADV_ATTR_MESH_IFINDEX,
-	BATADV_ATTR_MESH_IFNAME,
-	BATADV_ATTR_MESH_ADDRESS,
-	BATADV_ATTR_HARD_IFINDEX,
-	BATADV_ATTR_HARD_IFNAME,
-	BATADV_ATTR_HARD_ADDRESS,
-	BATADV_ATTR_ORIG_ADDRESS,
-	BATADV_ATTR_TPMETER_RESULT,
-	BATADV_ATTR_TPMETER_TEST_TIME,
-	BATADV_ATTR_TPMETER_BYTES,
-	BATADV_ATTR_TPMETER_COOKIE,
-	BATADV_ATTR_PAD,
-	BATADV_ATTR_ACTIVE,
-	BATADV_ATTR_TT_ADDRESS,
-	BATADV_ATTR_TT_TTVN,
-	BATADV_ATTR_TT_LAST_TTVN,
-	BATADV_ATTR_TT_CRC32,
-	BATADV_ATTR_TT_VID,
-	BATADV_ATTR_TT_FLAGS,
-	BATADV_ATTR_FLAG_BEST,
-	BATADV_ATTR_LAST_SEEN_MSECS,
-	BATADV_ATTR_NEIGH_ADDRESS,
-	BATADV_ATTR_TQ,
-	BATADV_ATTR_THROUGHPUT,
-	BATADV_ATTR_BANDWIDTH_UP,
-	BATADV_ATTR_BANDWIDTH_DOWN,
-	BATADV_ATTR_ROUTER,
-	BATADV_ATTR_BLA_OWN,
-	BATADV_ATTR_BLA_ADDRESS,
-	BATADV_ATTR_BLA_VID,
-	BATADV_ATTR_BLA_BACKBONE,
-	BATADV_ATTR_BLA_CRC,
-	/* add attributes above here, update the policy in netlink.c */
-	__BATADV_ATTR_AFTER_LAST,
-	NUM_BATADV_ATTR = __BATADV_ATTR_AFTER_LAST,
-	BATADV_ATTR_MAX = __BATADV_ATTR_AFTER_LAST - 1
-};
-
-/**
- * enum batadv_nl_commands - supported batman-adv netlink commands
- *
- * @BATADV_CMD_UNSPEC: unspecified command to catch errors
- * @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv device
- * @BATADV_CMD_TP_METER: Start a tp meter session
- * @BATADV_CMD_TP_METER_CANCEL: Cancel a tp meter session
- * @BATADV_CMD_GET_ROUTING_ALGOS: Query the list of routing algorithms.
- * @BATADV_CMD_GET_HARDIFS: Query list of hard interfaces
- * @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations
- * @BATADV_CMD_GET_TRANSTABLE_GLOBAL Query list of global translations
- * @BATADV_CMD_GET_ORIGINATORS: Query list of originators
- * @BATADV_CMD_GET_NEIGHBORS: Query list of neighbours
- * @BATADV_CMD_GET_GATEWAYS: Query list of gateways
- * @BATADV_CMD_GET_BLA_CLAIM: Query list of bridge loop avoidance claims
- * @BATADV_CMD_GET_BLA_BACKBONE: Query list of bridge loop avoidance backbones
- * @__BATADV_CMD_AFTER_LAST: internal use
- * @BATADV_CMD_MAX: highest used command number
- */
-enum batadv_nl_commands {
-	BATADV_CMD_UNSPEC,
-	BATADV_CMD_GET_MESH_INFO,
-	BATADV_CMD_TP_METER,
-	BATADV_CMD_TP_METER_CANCEL,
-	BATADV_CMD_GET_ROUTING_ALGOS,
-	BATADV_CMD_GET_HARDIFS,
-	BATADV_CMD_GET_TRANSTABLE_LOCAL,
-	BATADV_CMD_GET_TRANSTABLE_GLOBAL,
-	BATADV_CMD_GET_ORIGINATORS,
-	BATADV_CMD_GET_NEIGHBORS,
-	BATADV_CMD_GET_GATEWAYS,
-	BATADV_CMD_GET_BLA_CLAIM,
-	BATADV_CMD_GET_BLA_BACKBONE,
-	/* add new commands above here */
-	__BATADV_CMD_AFTER_LAST,
-	BATADV_CMD_MAX = __BATADV_CMD_AFTER_LAST - 1
-};
-
-/**
- * enum batadv_tp_meter_reason - reason of a tp meter test run stop
- * @BATADV_TP_REASON_COMPLETE: sender finished tp run
- * @BATADV_TP_REASON_CANCEL: sender was stopped during run
- * @BATADV_TP_REASON_DST_UNREACHABLE: receiver could not be reached or didn't
- *  answer
- * @BATADV_TP_REASON_RESEND_LIMIT: (unused) sender retry reached limit
- * @BATADV_TP_REASON_ALREADY_ONGOING: test to or from the same node already
- *  ongoing
- * @BATADV_TP_REASON_MEMORY_ERROR: test was stopped due to low memory
- * @BATADV_TP_REASON_CANT_SEND: failed to send via outgoing interface
- * @BATADV_TP_REASON_TOO_MANY: too many ongoing sessions
- */
-enum batadv_tp_meter_reason {
-	BATADV_TP_REASON_COMPLETE		= 3,
-	BATADV_TP_REASON_CANCEL			= 4,
-	/* error status >= 128 */
-	BATADV_TP_REASON_DST_UNREACHABLE	= 128,
-	BATADV_TP_REASON_RESEND_LIMIT		= 129,
-	BATADV_TP_REASON_ALREADY_ONGOING	= 130,
-	BATADV_TP_REASON_MEMORY_ERROR		= 131,
-	BATADV_TP_REASON_CANT_SEND		= 132,
-	BATADV_TP_REASON_TOO_MANY		= 133,
-};
-
-#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */

+ 25 - 22
package/gluon-mesh-batman-adv/src/respondd.c

@@ -51,7 +51,7 @@
 #include <linux/if_addr.h>
 #include <linux/sockios.h>
 
-#include "batadv-netlink.h"
+#include <batadv-genl.h>
 
 
 #define _STRINGIFY(s) #s
@@ -256,7 +256,8 @@ static int parse_gw_list_netlink_cb(struct nl_msg *msg, void *arg)
 	struct gw_netlink_opts *opts;
 	char addr[18];
 
-	opts = container_of(query_opts, struct gw_netlink_opts, query_opts);
+	opts = batadv_container_of(query_opts, struct gw_netlink_opts,
+				   query_opts);
 
 	if (!genlmsg_valid_hdr(nlh, 0))
 		return NL_OK;
@@ -267,11 +268,11 @@ static int parse_gw_list_netlink_cb(struct nl_msg *msg, void *arg)
 		return NL_OK;
 
 	if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
-		      genlmsg_len(ghdr), batadv_netlink_policy))
+		      genlmsg_len(ghdr), batadv_genl_policy))
 		return NL_OK;
 
-	if (batadv_nl_missing_attrs(attrs, gateways_mandatory,
-				    ARRAY_SIZE(gateways_mandatory)))
+	if (batadv_genl_missing_attrs(attrs, gateways_mandatory,
+				      BATADV_ARRAY_SIZE(gateways_mandatory)))
 		return NL_OK;
 
 	if (!attrs[BATADV_ATTR_FLAG_BEST])
@@ -301,9 +302,9 @@ static void add_gateway(struct json_object *obj) {
 		},
 	};
 
-	batadv_nl_query_common("bat0", BATADV_CMD_GET_GATEWAYS,
-			       parse_gw_list_netlink_cb, NLM_F_DUMP,
-			       &opts.query_opts);
+	batadv_genl_query("bat0", BATADV_CMD_GET_GATEWAYS,
+			  parse_gw_list_netlink_cb, NLM_F_DUMP,
+			  &opts.query_opts);
 }
 
 static inline bool ethtool_ioctl(int fd, struct ifreq *ifr, void *data) {
@@ -494,7 +495,8 @@ static int parse_clients_list_netlink_cb(struct nl_msg *msg, void *arg)
 	struct clients_netlink_opts *opts;
 	uint32_t flags;
 
-	opts = container_of(query_opts, struct clients_netlink_opts, query_opts);
+	opts = batadv_container_of(query_opts, struct clients_netlink_opts,
+				   query_opts);
 
 	if (!genlmsg_valid_hdr(nlh, 0))
 		return NL_OK;
@@ -505,11 +507,11 @@ static int parse_clients_list_netlink_cb(struct nl_msg *msg, void *arg)
 		return NL_OK;
 
 	if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
-		      genlmsg_len(ghdr), batadv_netlink_policy))
+		      genlmsg_len(ghdr), batadv_genl_policy))
 		return NL_OK;
 
-	if (batadv_nl_missing_attrs(attrs, clients_mandatory,
-				    ARRAY_SIZE(clients_mandatory)))
+	if (batadv_genl_missing_attrs(attrs, clients_mandatory,
+				      BATADV_ARRAY_SIZE(clients_mandatory)))
 		return NL_OK;
 
 	flags = nla_get_u32(attrs[BATADV_ATTR_TT_FLAGS]);
@@ -535,9 +537,9 @@ static struct json_object * get_clients(void) {
 		},
 	};
 
-	batadv_nl_query_common("bat0", BATADV_CMD_GET_TRANSTABLE_LOCAL,
-			       parse_clients_list_netlink_cb, NLM_F_DUMP,
-			       &opts.query_opts);
+	batadv_genl_query("bat0", BATADV_CMD_GET_TRANSTABLE_LOCAL,
+			  parse_clients_list_netlink_cb, NLM_F_DUMP,
+			  &opts.query_opts);
 
 	count_stations(&wifi24, &wifi5);
 
@@ -605,7 +607,8 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
 	struct neigh_netlink_opts *opts;
 	char mac1[18];
 
-	opts = container_of(query_opts, struct neigh_netlink_opts, query_opts);
+	opts = batadv_container_of(query_opts, struct neigh_netlink_opts,
+				   query_opts);
 
 	if (!genlmsg_valid_hdr(nlh, 0))
 		return NL_OK;
@@ -616,11 +619,11 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
 		return NL_OK;
 
 	if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
-		      genlmsg_len(ghdr), batadv_netlink_policy))
+		      genlmsg_len(ghdr), batadv_genl_policy))
 		return NL_OK;
 
-	if (batadv_nl_missing_attrs(attrs, parse_orig_list_mandatory,
-				    ARRAY_SIZE(parse_orig_list_mandatory)))
+	if (batadv_genl_missing_attrs(attrs, parse_orig_list_mandatory,
+				      BATADV_ARRAY_SIZE(parse_orig_list_mandatory)))
 		return NL_OK;
 
 	if (!attrs[BATADV_ATTR_FLAG_BEST])
@@ -671,9 +674,9 @@ static struct json_object * get_batadv(void) {
 	if (!opts.interfaces)
 		return NULL;
 
-	ret = batadv_nl_query_common("bat0", BATADV_CMD_GET_ORIGINATORS,
-				     parse_orig_list_netlink_cb, NLM_F_DUMP,
-				     &opts.query_opts);
+	ret = batadv_genl_query("bat0", BATADV_CMD_GET_ORIGINATORS,
+				parse_orig_list_netlink_cb, NLM_F_DUMP,
+				&opts.query_opts);
 	if (ret < 0) {
 		json_object_put(opts.interfaces);
 		return NULL;

+ 1 - 1
package/gluon-status-page-api/Makefile

@@ -14,7 +14,7 @@ define Package/gluon-status-page-api
   SECTION:=gluon
   CATEGORY:=Gluon
   TITLE:=API for gluon-status-page
-  DEPENDS:=+gluon-core +uhttpd +sse-multiplex +gluon-neighbour-info +gluon-respondd +libiwinfo +libjson-c +libnl-tiny +libubus-lua
+  DEPENDS:=+gluon-core +uhttpd +sse-multiplex +gluon-neighbour-info +gluon-respondd +libiwinfo +libjson-c +libnl-tiny +libubus-lua +libbatadv
 endef
 
 define Build/Prepare

+ 11 - 2
package/gluon-status-page-api/src/Makefile

@@ -20,10 +20,19 @@ endif
 CFLAGS_JSONC = $(shell pkg-config --cflags json-c)
 LDFLAGS_JSONC = $(shell pkg-config --libs json-c)
 
+ifeq ($(origin LIBBATADV_CFLAGS) $(origin LIBBATADV_LDLIBS), undefined undefined)
+  LIBBATADV_NAME ?= libbatadv
+  ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBBATADV_NAME) 2>/dev/null),)
+    $(error No $(LIBBATADV_NAME) development libraries found!)
+  endif
+  LIBBATADV_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBBATADV_NAME))
+  LIBBATADV_LDLIBS += $(shell $(PKG_CONFIG) --libs $(LIBBATADV_NAME))
+endif
+
 all: neighbours-batadv stations respondd.so
 
-neighbours-batadv: neighbours-batadv.c batadv-netlink.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LIBNL_CFLAGS) $(LDFLAGS) $(LDFLAGS_JSONC) $(LIBNL_LDLIBS) -Wall -o $@ $^ $(LDLIBS)
+neighbours-batadv: neighbours-batadv.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LIBNL_CFLAGS) $(LIBBATADV_CFLAGS) $(LDFLAGS) $(LDFLAGS_JSONC) $(LIBNL_LDLIBS) $(LIBBATADV_LDLIBS) -Wall -o $@ $^ $(LDLIBS)
 
 stations: stations.c
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LDFLAGS) $(LDFLAGS_JSONC) -Wall -o $@ $^ $(LDLIBS) -liwinfo

+ 0 - 145
package/gluon-status-page-api/src/batadv-netlink.c

@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2009-2016  B.A.T.M.A.N. contributors:
- *
- * Marek Lindner <mareklindner@neomailbox.ch>, Andrew Lunn <andrew@lunn.ch>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA
- *
- */
-
-#include "batadv-netlink.h"
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <net/ethernet.h>
-#include <net/if.h>
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/ctrl.h>
-#include <net/ethernet.h>
-
-#include "batman_adv.h"
-
-#ifndef __maybe_unused
-#define __maybe_unused __attribute__((unused))
-#endif
-
-struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = {
-	[BATADV_ATTR_HARD_IFINDEX]	= { .type = NLA_U32 },
-	[BATADV_ATTR_ORIG_ADDRESS]	= { .type = NLA_UNSPEC,
-					    .minlen = ETH_ALEN,
-					    .maxlen = ETH_ALEN },
-	[BATADV_ATTR_FLAG_BEST]		= { .type = NLA_FLAG },
-	[BATADV_ATTR_LAST_SEEN_MSECS]	= { .type = NLA_U32 },
-	[BATADV_ATTR_NEIGH_ADDRESS]	= { .type = NLA_UNSPEC,
-					    .minlen = ETH_ALEN,
-					    .maxlen = ETH_ALEN },
-	[BATADV_ATTR_TQ]		= { .type = NLA_U8 },
-};
-
-static int nlquery_error_cb(struct sockaddr_nl *nla __maybe_unused,
-			    struct nlmsgerr *nlerr, void *arg)
-{
-	struct batadv_nlquery_opts *query_opts = arg;
-
-	query_opts->err = nlerr->error;
-
-	return NL_STOP;
-}
-
-static int nlquery_stop_cb(struct nl_msg *msg, void *arg)
-{
-	struct nlmsghdr *nlh = nlmsg_hdr(msg);
-	struct batadv_nlquery_opts *query_opts = arg;
-	int *error = nlmsg_data(nlh);
-
-	if (*error)
-		query_opts->err = *error;
-
-	return NL_STOP;
-}
-
-int batadv_nl_query_common(const char *mesh_iface,
-			   enum batadv_nl_commands nl_cmd,
-			   nl_recvmsg_msg_cb_t callback, int flags,
-			   struct batadv_nlquery_opts *query_opts)
-{
-	struct nl_sock *sock;
-	struct nl_msg *msg;
-	struct nl_cb *cb;
-	int ifindex;
-	int family;
-	int ret;
-
-	query_opts->err = 0;
-
-	sock = nl_socket_alloc();
-	if (!sock)
-		return -ENOMEM;
-
-	ret = genl_connect(sock);
-	if (ret < 0) {
-		query_opts->err = ret;
-		goto err_free_sock;
-	}
-
-	family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
-	if (family < 0) {
-		query_opts->err = -EOPNOTSUPP;
-		goto err_free_sock;
-	}
-
-	ifindex = if_nametoindex(mesh_iface);
-	if (!ifindex) {
-		query_opts->err = -ENODEV;
-		goto err_free_sock;
-	}
-
-	cb = nl_cb_alloc(NL_CB_DEFAULT);
-	if (!cb) {
-		query_opts->err = -ENOMEM;
-		goto err_free_sock;
-	}
-
-	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, callback, query_opts);
-	nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nlquery_stop_cb, query_opts);
-	nl_cb_err(cb, NL_CB_CUSTOM, nlquery_error_cb, query_opts);
-
-	msg = nlmsg_alloc();
-	if (!msg) {
-		query_opts->err = -ENOMEM;
-		goto err_free_cb;
-	}
-
-	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, flags,
-		    nl_cmd, 1);
-
-	nla_put_u32(msg, BATADV_ATTR_MESH_IFINDEX, ifindex);
-	nl_send_auto_complete(sock, msg);
-	nlmsg_free(msg);
-
-	nl_recvmsgs(sock, cb);
-
-err_free_cb:
-	nl_cb_put(cb);
-err_free_sock:
-	nl_socket_free(sock);
-
-	return query_opts->err;
-}

+ 0 - 68
package/gluon-status-page-api/src/batadv-netlink.h

@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2009-2016  B.A.T.M.A.N. contributors:
- *
- * Marek Lindner <mareklindner@neomailbox.ch>, Andrew Lunn <andrew@lunn.ch>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA
- *
- */
-
-#ifndef _BATADV_NETLINK_H
-#define _BATADV_NETLINK_H
-
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/ctrl.h>
-#include <stddef.h>
-#include <stdbool.h>
-
-#include "batman_adv.h"
-
-struct batadv_nlquery_opts {
-	int err;
-};
-
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
-#endif
-
-#ifndef container_of
-#define container_of(ptr, type, member) __extension__ ({ \
-	const __typeof__(((type *)0)->member) *__pmember = (ptr); \
-	(type *)((char *)__pmember - offsetof(type, member)); })
-#endif
-
-int batadv_nl_query_common(const char *mesh_iface,
-			   enum batadv_nl_commands nl_cmd,
-			   nl_recvmsg_msg_cb_t callback, int flags,
-			   struct batadv_nlquery_opts *query_opts);
-
-static inline bool batadv_nl_missing_attrs(struct nlattr *attrs[],
-					   const enum batadv_nl_attrs mandatory[],
-					   size_t num)
-{
-	size_t i;
-
-	for (i = 0; i < num; i++) {
-		if (!attrs[mandatory[i]])
-			return true;
-	}
-
-	return false;
-}
-
-extern struct nla_policy batadv_netlink_policy[];
-
-#endif /* _BATADV_NETLINK_H */

+ 0 - 208
package/gluon-status-page-api/src/batman_adv.h

@@ -1,208 +0,0 @@
-/* Copyright (C) 2016 B.A.T.M.A.N. contributors:
- *
- * Matthias Schiffer
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _UAPI_LINUX_BATMAN_ADV_H_
-#define _UAPI_LINUX_BATMAN_ADV_H_
-
-#define BATADV_NL_NAME "batadv"
-
-#define BATADV_NL_MCAST_GROUP_TPMETER	"tpmeter"
-
-/**
- * enum batadv_tt_client_flags - TT client specific flags
- * @BATADV_TT_CLIENT_DEL: the client has to be deleted from the table
- * @BATADV_TT_CLIENT_ROAM: the client roamed to/from another node and the new
- *  update telling its new real location has not been received/sent yet
- * @BATADV_TT_CLIENT_WIFI: this client is connected through a wifi interface.
- *  This information is used by the "AP Isolation" feature
- * @BATADV_TT_CLIENT_ISOLA: this client is considered "isolated". This
- *  information is used by the Extended Isolation feature
- * @BATADV_TT_CLIENT_NOPURGE: this client should never be removed from the table
- * @BATADV_TT_CLIENT_NEW: this client has been added to the local table but has
- *  not been announced yet
- * @BATADV_TT_CLIENT_PENDING: this client is marked for removal but it is kept
- *  in the table for one more originator interval for consistency purposes
- * @BATADV_TT_CLIENT_TEMP: this global client has been detected to be part of
- *  the network but no nnode has already announced it
- *
- * Bits from 0 to 7 are called _remote flags_ because they are sent on the wire.
- * Bits from 8 to 15 are called _local flags_ because they are used for local
- * computations only.
- *
- * Bits from 4 to 7 - a subset of remote flags - are ensured to be in sync with
- * the other nodes in the network. To achieve this goal these flags are included
- * in the TT CRC computation.
- */
-enum batadv_tt_client_flags {
-	BATADV_TT_CLIENT_DEL     = (1 << 0),
-	BATADV_TT_CLIENT_ROAM    = (1 << 1),
-	BATADV_TT_CLIENT_WIFI    = (1 << 4),
-	BATADV_TT_CLIENT_ISOLA	 = (1 << 5),
-	BATADV_TT_CLIENT_NOPURGE = (1 << 8),
-	BATADV_TT_CLIENT_NEW     = (1 << 9),
-	BATADV_TT_CLIENT_PENDING = (1 << 10),
-	BATADV_TT_CLIENT_TEMP	 = (1 << 11),
-};
-
-/**
- * enum batadv_nl_attrs - batman-adv netlink attributes
- *
- * @BATADV_ATTR_UNSPEC: unspecified attribute to catch errors
- * @BATADV_ATTR_VERSION: batman-adv version string
- * @BATADV_ATTR_ALGO_NAME: name of routing algorithm
- * @BATADV_ATTR_MESH_IFINDEX: index of the batman-adv interface
- * @BATADV_ATTR_MESH_IFNAME: name of the batman-adv interface
- * @BATADV_ATTR_MESH_ADDRESS: mac address of the batman-adv interface
- * @BATADV_ATTR_HARD_IFINDEX: index of the non-batman-adv interface
- * @BATADV_ATTR_HARD_IFNAME: name of the non-batman-adv interface
- * @BATADV_ATTR_HARD_ADDRESS: mac address of the non-batman-adv interface
- * @BATADV_ATTR_ORIG_ADDRESS: originator mac address
- * @BATADV_ATTR_TPMETER_RESULT: result of run (see batadv_tp_meter_status)
- * @BATADV_ATTR_TPMETER_TEST_TIME: time (msec) the run took
- * @BATADV_ATTR_TPMETER_BYTES: amount of acked bytes during run
- * @BATADV_ATTR_TPMETER_COOKIE: session cookie to match tp_meter session
- * @BATADV_ATTR_PAD: attribute used for padding for 64-bit alignment
- * @BATADV_ATTR_ACTIVE: Flag indicating if the hard interface is active
- * @BATADV_ATTR_TT_ADDRESS: Client MAC address
- * @BATADV_ATTR_TT_TTVN: Translation table version
- * @BATADV_ATTR_TT_LAST_TTVN: Previous translation table version
- * @BATADV_ATTR_TT_CRC32: CRC32 over translation table
- * @BATADV_ATTR_TT_VID: VLAN ID
- * @BATADV_ATTR_TT_FLAGS: Translation table client flags
- * @BATADV_ATTR_FLAG_BEST: Flags indicating entry is the best
- * @BATADV_ATTR_LAST_SEEN_MSECS: Time in milliseconds since last seen
- * @BATADV_ATTR_NEIGH_ADDRESS: Neighbour MAC address
- * @BATADV_ATTR_TQ: TQ to neighbour
- * @BATADV_ATTR_THROUGHPUT: Estimated throughput to Neighbour
- * @BATADV_ATTR_BANDWIDTH_UP: Reported uplink bandwidth
- * @BATADV_ATTR_BANDWIDTH_DOWN: Reported downlink bandwidth
- * @BATADV_ATTR_ROUTER: Gateway router MAC address
- * @BATADV_ATTR_BLA_OWN: Flag indicating own originator
- * @BATADV_ATTR_BLA_ADDRESS: Bridge loop avoidance claim MAC address
- * @BATADV_ATTR_BLA_VID: BLA VLAN ID
- * @BATADV_ATTR_BLA_BACKBONE: BLA gateway originator MAC address
- * @BATADV_ATTR_BLA_CRC: BLA CRC
- * @__BATADV_ATTR_AFTER_LAST: internal use
- * @NUM_BATADV_ATTR: total number of batadv_nl_attrs available
- * @BATADV_ATTR_MAX: highest attribute number currently defined
- */
-enum batadv_nl_attrs {
-	BATADV_ATTR_UNSPEC,
-	BATADV_ATTR_VERSION,
-	BATADV_ATTR_ALGO_NAME,
-	BATADV_ATTR_MESH_IFINDEX,
-	BATADV_ATTR_MESH_IFNAME,
-	BATADV_ATTR_MESH_ADDRESS,
-	BATADV_ATTR_HARD_IFINDEX,
-	BATADV_ATTR_HARD_IFNAME,
-	BATADV_ATTR_HARD_ADDRESS,
-	BATADV_ATTR_ORIG_ADDRESS,
-	BATADV_ATTR_TPMETER_RESULT,
-	BATADV_ATTR_TPMETER_TEST_TIME,
-	BATADV_ATTR_TPMETER_BYTES,
-	BATADV_ATTR_TPMETER_COOKIE,
-	BATADV_ATTR_PAD,
-	BATADV_ATTR_ACTIVE,
-	BATADV_ATTR_TT_ADDRESS,
-	BATADV_ATTR_TT_TTVN,
-	BATADV_ATTR_TT_LAST_TTVN,
-	BATADV_ATTR_TT_CRC32,
-	BATADV_ATTR_TT_VID,
-	BATADV_ATTR_TT_FLAGS,
-	BATADV_ATTR_FLAG_BEST,
-	BATADV_ATTR_LAST_SEEN_MSECS,
-	BATADV_ATTR_NEIGH_ADDRESS,
-	BATADV_ATTR_TQ,
-	BATADV_ATTR_THROUGHPUT,
-	BATADV_ATTR_BANDWIDTH_UP,
-	BATADV_ATTR_BANDWIDTH_DOWN,
-	BATADV_ATTR_ROUTER,
-	BATADV_ATTR_BLA_OWN,
-	BATADV_ATTR_BLA_ADDRESS,
-	BATADV_ATTR_BLA_VID,
-	BATADV_ATTR_BLA_BACKBONE,
-	BATADV_ATTR_BLA_CRC,
-	/* add attributes above here, update the policy in netlink.c */
-	__BATADV_ATTR_AFTER_LAST,
-	NUM_BATADV_ATTR = __BATADV_ATTR_AFTER_LAST,
-	BATADV_ATTR_MAX = __BATADV_ATTR_AFTER_LAST - 1
-};
-
-/**
- * enum batadv_nl_commands - supported batman-adv netlink commands
- *
- * @BATADV_CMD_UNSPEC: unspecified command to catch errors
- * @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv device
- * @BATADV_CMD_TP_METER: Start a tp meter session
- * @BATADV_CMD_TP_METER_CANCEL: Cancel a tp meter session
- * @BATADV_CMD_GET_ROUTING_ALGOS: Query the list of routing algorithms.
- * @BATADV_CMD_GET_HARDIFS: Query list of hard interfaces
- * @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations
- * @BATADV_CMD_GET_TRANSTABLE_GLOBAL Query list of global translations
- * @BATADV_CMD_GET_ORIGINATORS: Query list of originators
- * @BATADV_CMD_GET_NEIGHBORS: Query list of neighbours
- * @BATADV_CMD_GET_GATEWAYS: Query list of gateways
- * @BATADV_CMD_GET_BLA_CLAIM: Query list of bridge loop avoidance claims
- * @BATADV_CMD_GET_BLA_BACKBONE: Query list of bridge loop avoidance backbones
- * @__BATADV_CMD_AFTER_LAST: internal use
- * @BATADV_CMD_MAX: highest used command number
- */
-enum batadv_nl_commands {
-	BATADV_CMD_UNSPEC,
-	BATADV_CMD_GET_MESH_INFO,
-	BATADV_CMD_TP_METER,
-	BATADV_CMD_TP_METER_CANCEL,
-	BATADV_CMD_GET_ROUTING_ALGOS,
-	BATADV_CMD_GET_HARDIFS,
-	BATADV_CMD_GET_TRANSTABLE_LOCAL,
-	BATADV_CMD_GET_TRANSTABLE_GLOBAL,
-	BATADV_CMD_GET_ORIGINATORS,
-	BATADV_CMD_GET_NEIGHBORS,
-	BATADV_CMD_GET_GATEWAYS,
-	BATADV_CMD_GET_BLA_CLAIM,
-	BATADV_CMD_GET_BLA_BACKBONE,
-	/* add new commands above here */
-	__BATADV_CMD_AFTER_LAST,
-	BATADV_CMD_MAX = __BATADV_CMD_AFTER_LAST - 1
-};
-
-/**
- * enum batadv_tp_meter_reason - reason of a tp meter test run stop
- * @BATADV_TP_REASON_COMPLETE: sender finished tp run
- * @BATADV_TP_REASON_CANCEL: sender was stopped during run
- * @BATADV_TP_REASON_DST_UNREACHABLE: receiver could not be reached or didn't
- *  answer
- * @BATADV_TP_REASON_RESEND_LIMIT: (unused) sender retry reached limit
- * @BATADV_TP_REASON_ALREADY_ONGOING: test to or from the same node already
- *  ongoing
- * @BATADV_TP_REASON_MEMORY_ERROR: test was stopped due to low memory
- * @BATADV_TP_REASON_CANT_SEND: failed to send via outgoing interface
- * @BATADV_TP_REASON_TOO_MANY: too many ongoing sessions
- */
-enum batadv_tp_meter_reason {
-	BATADV_TP_REASON_COMPLETE		= 3,
-	BATADV_TP_REASON_CANCEL			= 4,
-	/* error status >= 128 */
-	BATADV_TP_REASON_DST_UNREACHABLE	= 128,
-	BATADV_TP_REASON_RESEND_LIMIT		= 129,
-	BATADV_TP_REASON_ALREADY_ONGOING	= 130,
-	BATADV_TP_REASON_MEMORY_ERROR		= 131,
-	BATADV_TP_REASON_CANT_SEND		= 132,
-	BATADV_TP_REASON_TOO_MANY		= 133,
-};
-
-#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */

+ 8 - 8
package/gluon-status-page-api/src/neighbours-batadv.c

@@ -4,7 +4,7 @@
 #include <json-c/json.h>
 #include <net/if.h>
 
-#include "batadv-netlink.h"
+#include <batadv-genl.h>
 
 #define STR(x) #x
 #define XSTR(x) STR(x)
@@ -37,7 +37,7 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
   struct neigh_netlink_opts *opts;
   char mac1[18];
 
-  opts = container_of(query_opts, struct neigh_netlink_opts, query_opts);
+  opts = batadv_container_of(query_opts, struct neigh_netlink_opts, query_opts);
 
   if (!genlmsg_valid_hdr(nlh, 0))
     return NL_OK;
@@ -48,11 +48,11 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
     return NL_OK;
 
   if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
-        genlmsg_len(ghdr), batadv_netlink_policy))
+        genlmsg_len(ghdr), batadv_genl_policy))
     return NL_OK;
 
-  if (batadv_nl_missing_attrs(attrs, parse_orig_list_mandatory,
-              ARRAY_SIZE(parse_orig_list_mandatory)))
+  if (batadv_genl_missing_attrs(attrs, parse_orig_list_mandatory,
+	                        BATADV_ARRAY_SIZE(parse_orig_list_mandatory)))
     return NL_OK;
 
   if (!attrs[BATADV_ATTR_FLAG_BEST])
@@ -99,9 +99,9 @@ static json_object *neighbours(void) {
   if (!opts.obj)
     return NULL;
 
-  ret = batadv_nl_query_common("bat0", BATADV_CMD_GET_ORIGINATORS,
-                               parse_orig_list_netlink_cb, NLM_F_DUMP,
-                               &opts.query_opts);
+  ret = batadv_genl_query("bat0", BATADV_CMD_GET_ORIGINATORS,
+                          parse_orig_list_netlink_cb, NLM_F_DUMP,
+                          &opts.query_opts);
   if (ret < 0) {
     json_object_put(opts.obj);
     return NULL;

+ 69 - 0
package/libbatadv/Makefile

@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: MIT
+#
+# batman-adv helpers functions library
+#
+# Copyright (c) 2017, Sven Eckelmann <sven@narfation.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=libbatadv
+PKG_VERSION:=1
+PKG_LICENSE:=MIT
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/libbatadv
+  SECTION:=libs
+  CATEGORY:=Libraries
+  TITLE:=batman-adv helpers functions
+  DEPENDS:=+libnl-tiny
+endef
+
+
+TARGET_CFLAGS  += -flto -ffunction-sections -fdata-sections
+TARGET_LDFLAGS += -fuse-linker-plugin -Wl,--gc-sections
+
+MAKE_VARS += \
+        LIBNL_NAME="libnl-tiny" \
+        LIBNL_GENL_NAME="libnl-tiny"
+
+MAKE_ARGS += \
+	PREFIX=/usr
+
+MAKE_INSTALL_FLAGS += \
+	PREFIX=/usr
+
+define Package/libbatadv/install
+	$(INSTALL_DIR) $(1)/usr/lib
+	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libbatadv.so $(1)/usr/lib/
+endef
+
+define Build/InstallDev
+	$(INSTALL_DIR) $(1)
+	$(CP) $(PKG_INSTALL_DIR)/* $(1)/
+	$(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
+	$(CP) ./files/libbatadv.pc $(1)/usr/lib/pkgconfig/
+endef
+
+$(eval $(call BuildPackage,libbatadv))

+ 36 - 0
package/libbatadv/files/libbatadv.pc

@@ -0,0 +1,36 @@
+# SPDX-License-Identifier: MIT
+#
+# batman-adv helpers functions library
+#
+# Copyright (c) 2017, Sven Eckelmann <sven@narfation.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+prefix=/usr
+exec_prefix=/usr
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: libbatadv
+Version: 1
+Description: batman-adv helpers functions
+Requires.private: libnl-tiny
+Libs: -lbatadv
+Libs.private: 
+Cflags:

+ 120 - 0
package/libbatadv/src/Makefile

@@ -0,0 +1,120 @@
+#!/usr/bin/make -f
+# SPDX-License-Identifier: MIT
+#
+# batman-adv helpers functions library
+#
+# Copyright (c) 2017, Sven Eckelmann <sven@narfation.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+# libbatadv build
+BINARY_NAME = libbatadv.so
+OBJ += batadv-genl.o
+
+# headers to install
+HEADER += batadv-genl.h
+HEADER += batman_adv.h
+
+# libbatadv flags and options
+CFLAGS += -pedantic -Wall -W -MD -MP
+CFLAGS += -fPIC -fvisibility=hidden
+CPPFLAGS += -D_GNU_SOURCE
+LDLIBS +=
+LDFLAGS += -shared -Wl,-export-dynamic
+
+# disable verbose output
+ifneq ($(findstring $(MAKEFLAGS),s),s)
+ifndef V
+	Q_CC = @echo '   ' CC $@;
+	Q_LD = @echo '   ' LD $@;
+	export Q_CC
+	export Q_LD
+endif
+endif
+
+ifeq ($(origin PKG_CONFIG), undefined)
+  PKG_CONFIG = pkg-config
+  ifeq ($(shell which $(PKG_CONFIG) 2>/dev/null),)
+    $(error $(PKG_CONFIG) not found)
+  endif
+endif
+
+ifeq ($(origin LIBNL_CFLAGS) $(origin LIBNL_LDLIBS), undefined undefined)
+  LIBNL_NAME ?= libnl-3.0
+  ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBNL_NAME) 2>/dev/null),)
+    $(error No $(LIBNL_NAME) development libraries found!)
+  endif
+  LIBNL_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBNL_NAME))
+  LIBNL_LDLIBS +=  $(shell $(PKG_CONFIG) --libs $(LIBNL_NAME))
+endif
+CFLAGS += $(LIBNL_CFLAGS)
+LDLIBS += $(LIBNL_LDLIBS)
+
+ifeq ($(origin LIBNL_GENL_CFLAGS) $(origin LIBNL_GENL_LDLIBS), undefined undefined)
+  LIBNL_GENL_NAME ?= libnl-genl-3.0
+  ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBNL_GENL_NAME) 2>/dev/null),)
+    $(error No $(LIBNL_GENL_NAME) development libraries found!)
+  endif
+  LIBNL_GENL_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBNL_GENL_NAME))
+  LIBNL_GENL_LDLIBS += $(shell $(PKG_CONFIG) --libs $(LIBNL_GENL_NAME))
+endif
+CFLAGS += $(LIBNL_GENL_CFLAGS)
+LDLIBS += $(LIBNL_GENL_LDLIBS)
+
+# standard build tools
+CC ?= gcc
+RM ?= rm -f
+INSTALL ?= install
+MKDIR ?= mkdir -p
+COMPILE.c = $(Q_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
+LINK.o = $(Q_LD)$(CC) $(CFLAGS) $(LDFLAGS) $(TARGET_ARCH)
+
+# standard install paths
+PREFIX = /usr/local
+INCLUDEDIR = $(PREFIX)/include
+LIBDIR = $(PREFIX)/lib
+
+# default target
+all: $(BINARY_NAME)
+
+# standard build rules
+.SUFFIXES: .o .c
+.c.o:
+	$(COMPILE.c) -o $@ $<
+
+$(BINARY_NAME): $(OBJ)
+	$(LINK.o) $^ $(LDLIBS) -o $@
+
+clean:
+	$(RM) $(BINARY_NAME) $(OBJ) $(DEP)
+
+install: $(BINARY_NAME)
+	$(MKDIR) $(DESTDIR)$(LIBDIR)
+	$(MKDIR) $(DESTDIR)$(INCLUDEDIR)
+	$(INSTALL) -m 0755 $(BINARY_NAME) $(DESTDIR)$(LIBDIR)
+	$(INSTALL) -m 0644 $(HEADER) $(DESTDIR)$(INCLUDEDIR)
+
+# load dependencies
+DEP = $(OBJ:.o=.d)
+-include $(DEP)
+
+.PHONY: all clean install
+.DELETE_ON_ERROR:
+.DEFAULT_GOAL := all

+ 215 - 0
package/libbatadv/src/batadv-genl.c

@@ -0,0 +1,215 @@
+// SPDX-License-Identifier: MIT
+/* batman-adv helpers functions library
+ *
+ * Copyright (c) 2017, Sven Eckelmann <sven@narfation.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "batadv-genl.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+#include <net/ethernet.h>
+
+#include "batman_adv.h"
+
+__attribute__ ((visibility ("default")))
+struct nla_policy batadv_genl_policy[NUM_BATADV_ATTR] = {
+	[BATADV_ATTR_VERSION]		= { .type = NLA_STRING },
+	[BATADV_ATTR_ALGO_NAME]		= { .type = NLA_STRING },
+	[BATADV_ATTR_MESH_IFINDEX]	= { .type = NLA_U32 },
+	[BATADV_ATTR_MESH_IFNAME]	= { .type = NLA_STRING,
+					    .maxlen = IFNAMSIZ },
+	[BATADV_ATTR_MESH_ADDRESS]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_HARD_IFINDEX]	= { .type = NLA_U32 },
+	[BATADV_ATTR_HARD_IFNAME]	= { .type = NLA_STRING,
+					    .maxlen = IFNAMSIZ },
+	[BATADV_ATTR_HARD_ADDRESS]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_ORIG_ADDRESS]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_TPMETER_RESULT]	= { .type = NLA_U8 },
+	[BATADV_ATTR_TPMETER_TEST_TIME]	= { .type = NLA_U32 },
+	[BATADV_ATTR_TPMETER_BYTES]	= { .type = NLA_U64 },
+	[BATADV_ATTR_TPMETER_COOKIE]	= { .type = NLA_U32 },
+	[BATADV_ATTR_PAD]		= { .type = NLA_UNSPEC },
+	[BATADV_ATTR_ACTIVE]		= { .type = NLA_FLAG },
+	[BATADV_ATTR_TT_ADDRESS]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_TT_TTVN]		= { .type = NLA_U8 },
+	[BATADV_ATTR_TT_LAST_TTVN]	= { .type = NLA_U8 },
+	[BATADV_ATTR_TT_CRC32]		= { .type = NLA_U32 },
+	[BATADV_ATTR_TT_VID]		= { .type = NLA_U16 },
+	[BATADV_ATTR_TT_FLAGS]		= { .type = NLA_U32 },
+	[BATADV_ATTR_FLAG_BEST]		= { .type = NLA_FLAG },
+	[BATADV_ATTR_LAST_SEEN_MSECS]	= { .type = NLA_U32 },
+	[BATADV_ATTR_NEIGH_ADDRESS]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_TQ]		= { .type = NLA_U8 },
+	[BATADV_ATTR_THROUGHPUT]	= { .type = NLA_U32 },
+	[BATADV_ATTR_BANDWIDTH_UP]	= { .type = NLA_U32 },
+	[BATADV_ATTR_BANDWIDTH_DOWN]	= { .type = NLA_U32 },
+	[BATADV_ATTR_ROUTER]		= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_BLA_OWN]		= { .type = NLA_FLAG },
+	[BATADV_ATTR_BLA_ADDRESS]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_BLA_VID]		= { .type = NLA_U16 },
+	[BATADV_ATTR_BLA_BACKBONE]	= { .type = NLA_UNSPEC,
+					    .minlen = ETH_ALEN,
+					    .maxlen = ETH_ALEN },
+	[BATADV_ATTR_BLA_CRC]		= { .type = NLA_U16 },
+};
+
+/**
+ * nlquery_error_cb() - Store error value in &batadv_nlquery_opts->error and
+ *  stop processing
+ * @nla: netlink address of the peer
+ * @nlerr: netlink error message being processed
+ * @arg: &struct batadv_nlquery_opts given to batadv_genl_query()
+ *
+ * Return: Always NL_STOP
+ */
+static int nlquery_error_cb(struct sockaddr_nl *nla __attribute__((unused)),
+			    struct nlmsgerr *nlerr, void *arg)
+{
+	struct batadv_nlquery_opts *query_opts = arg;
+
+	query_opts->err = nlerr->error;
+
+	return NL_STOP;
+}
+
+/**
+ * nlquery_stop_cb() - Store error value in &batadv_nlquery_opts->error and
+ *  stop processing
+ * @msg: netlink message being processed
+ * @arg: &struct batadv_nlquery_opts given to batadv_genl_query()
+ *
+ * Return: Always NL_STOP
+ */
+static int nlquery_stop_cb(struct nl_msg *msg, void *arg)
+{
+	struct nlmsghdr *nlh = nlmsg_hdr(msg);
+	struct batadv_nlquery_opts *query_opts = arg;
+	int *error = nlmsg_data(nlh);
+
+	if (*error)
+		query_opts->err = *error;
+
+	return NL_STOP;
+}
+
+/**
+ * batadv_genl_query() - Start a common batman-adv generic netlink query
+ * @mesh_iface: name of the batman-adv mesh interface
+ * @nl_cmd: &enum batadv_nl_commands which should be sent to kernel
+ * @callback: receive callback for valid messages
+ * @flags: additional netlink message header flags
+ * @query_opts: pointer to &struct batadv_nlquery_opts which is used to save
+ *  the current processing state. This is given as arg to @callback
+ *
+ * Return: 0 on success or negative error value otherwise
+ */
+__attribute__ ((visibility ("default")))
+int batadv_genl_query(const char *mesh_iface, enum batadv_nl_commands nl_cmd,
+		      nl_recvmsg_msg_cb_t callback, int flags,
+		      struct batadv_nlquery_opts *query_opts)
+{
+	struct nl_sock *sock;
+	struct nl_msg *msg;
+	struct nl_cb *cb;
+	int ifindex;
+	int family;
+	int ret;
+
+	query_opts->err = 0;
+
+	sock = nl_socket_alloc();
+	if (!sock)
+		return -ENOMEM;
+
+	ret = genl_connect(sock);
+	if (ret < 0) {
+		query_opts->err = ret;
+		goto err_free_sock;
+	}
+
+	family = genl_ctrl_resolve(sock, BATADV_NL_NAME);
+	if (family < 0) {
+		query_opts->err = -EOPNOTSUPP;
+		goto err_free_sock;
+	}
+
+	ifindex = if_nametoindex(mesh_iface);
+	if (!ifindex) {
+		query_opts->err = -ENODEV;
+		goto err_free_sock;
+	}
+
+	cb = nl_cb_alloc(NL_CB_DEFAULT);
+	if (!cb) {
+		query_opts->err = -ENOMEM;
+		goto err_free_sock;
+	}
+
+	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, callback, query_opts);
+	nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nlquery_stop_cb, query_opts);
+	nl_cb_err(cb, NL_CB_CUSTOM, nlquery_error_cb, query_opts);
+
+	msg = nlmsg_alloc();
+	if (!msg) {
+		query_opts->err = -ENOMEM;
+		goto err_free_cb;
+	}
+
+	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, flags,
+		    nl_cmd, 1);
+
+	nla_put_u32(msg, BATADV_ATTR_MESH_IFINDEX, ifindex);
+	nl_send_auto_complete(sock, msg);
+	nlmsg_free(msg);
+
+	nl_recvmsgs(sock, cb);
+
+err_free_cb:
+	nl_cb_put(cb);
+err_free_sock:
+	nl_socket_free(sock);
+
+	return query_opts->err;
+}

+ 102 - 0
package/libbatadv/src/batadv-genl.h

@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: MIT */
+/* batman-adv helpers functions library
+ *
+ * Copyright (c) 2017, Sven Eckelmann <sven@narfation.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef _BATADV_GENL_H_
+#define _BATADV_GENL_H_
+
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#include "batman_adv.h"
+
+/**
+ * struct batadv_nlquery_opts - internal state for batadv_genl_query()
+ *
+ * This structure should be used as member of a struct which tracks the state
+ * for the callback. The macro batadv_container_of can be used to convert the
+ * arg pointer from batadv_nlquery_opts to the member which contains this
+ * struct.
+ */
+struct batadv_nlquery_opts {
+	/** @err: current error  */
+	int err;
+};
+
+/**
+ * BATADV_ARRAY_SIZE() - Get number of items in static array
+ * @x: array with known length
+ *
+ * Return:  number of items in array
+ */
+#ifndef BATADV_ARRAY_SIZE
+#define BATADV_ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
+#endif
+
+/**
+ * batadv_container_of() - Calculate address of object that contains address ptr
+ * @ptr: pointer to member variable
+ * @type: type of the structure containing ptr
+ * @member: name of the member variable in struct @type
+ *
+ * Return: @type pointer of object containing ptr
+ */
+#ifndef batadv_container_of
+#define batadv_container_of(ptr, type, member) __extension__ ({ \
+	const __typeof__(((type *)0)->member) *__pmember = (ptr); \
+	(type *)((char *)__pmember - offsetof(type, member)); })
+#endif
+
+/**
+ * batadv_genl_missing_attrs() - Check whether @attrs is missing mandatory
+ *  attribute
+ * @attrs: attributes which was parsed by nla_parse()
+ * @mandatory: list of required attributes
+ * @num: number of required attributes in @mandatory
+ *
+ * Return: Return true when a attribute is missing, false otherwise
+ */
+static inline bool
+batadv_genl_missing_attrs(struct nlattr *attrs[],
+			  const enum batadv_nl_attrs mandatory[], size_t num)
+{
+	size_t i;
+
+	for (i = 0; i < num; i++) {
+		if (!attrs[mandatory[i]])
+			return true;
+	}
+
+	return false;
+}
+
+extern struct nla_policy batadv_genl_policy[];
+
+int batadv_genl_query(const char *mesh_iface, enum batadv_nl_commands nl_cmd,
+		      nl_recvmsg_msg_cb_t callback, int flags,
+		      struct batadv_nlquery_opts *query_opts);
+
+#endif /* _BATADV_GENL_H_ */

+ 426 - 0
package/libbatadv/src/batman_adv.h

@@ -0,0 +1,426 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright (C) 2016-2017  B.A.T.M.A.N. contributors:
+ *
+ * Matthias Schiffer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _UAPI_LINUX_BATMAN_ADV_H_
+#define _UAPI_LINUX_BATMAN_ADV_H_
+
+#define BATADV_NL_NAME "batadv"
+
+#define BATADV_NL_MCAST_GROUP_TPMETER	"tpmeter"
+
+/**
+ * enum batadv_tt_client_flags - TT client specific flags
+ *
+ * Bits from 0 to 7 are called _remote flags_ because they are sent on the wire.
+ * Bits from 8 to 15 are called _local flags_ because they are used for local
+ * computations only.
+ *
+ * Bits from 4 to 7 - a subset of remote flags - are ensured to be in sync with
+ * the other nodes in the network. To achieve this goal these flags are included
+ * in the TT CRC computation.
+ */
+enum batadv_tt_client_flags {
+	/**
+	 * @BATADV_TT_CLIENT_DEL: the client has to be deleted from the table
+	 */
+	BATADV_TT_CLIENT_DEL     = (1 << 0),
+
+	/**
+	 * @BATADV_TT_CLIENT_ROAM: the client roamed to/from another node and
+	 * the new update telling its new real location has not been
+	 * received/sent yet
+	 */
+	BATADV_TT_CLIENT_ROAM    = (1 << 1),
+
+	/**
+	 * @BATADV_TT_CLIENT_WIFI: this client is connected through a wifi
+	 * interface. This information is used by the "AP Isolation" feature
+	 */
+	BATADV_TT_CLIENT_WIFI    = (1 << 4),
+
+	/**
+	 * @BATADV_TT_CLIENT_ISOLA: this client is considered "isolated". This
+	 * information is used by the Extended Isolation feature
+	 */
+	BATADV_TT_CLIENT_ISOLA	 = (1 << 5),
+
+	/**
+	 * @BATADV_TT_CLIENT_NOPURGE: this client should never be removed from
+	 * the table
+	 */
+	BATADV_TT_CLIENT_NOPURGE = (1 << 8),
+
+	/**
+	 * @BATADV_TT_CLIENT_NEW: this client has been added to the local table
+	 * but has not been announced yet
+	 */
+	BATADV_TT_CLIENT_NEW     = (1 << 9),
+
+	/**
+	 * @BATADV_TT_CLIENT_PENDING: this client is marked for removal but it
+	 * is kept in the table for one more originator interval for consistency
+	 * purposes
+	 */
+	BATADV_TT_CLIENT_PENDING = (1 << 10),
+
+	/**
+	 * @BATADV_TT_CLIENT_TEMP: this global client has been detected to be
+	 * part of the network but no nnode has already announced it
+	 */
+	BATADV_TT_CLIENT_TEMP	 = (1 << 11),
+};
+
+/**
+ * enum batadv_nl_attrs - batman-adv netlink attributes
+ */
+enum batadv_nl_attrs {
+	/**
+	 * @BATADV_ATTR_UNSPEC: unspecified attribute to catch errors
+	 */
+	BATADV_ATTR_UNSPEC,
+
+	/**
+	 * @BATADV_ATTR_VERSION: batman-adv version string
+	 */
+	BATADV_ATTR_VERSION,
+
+	/**
+	 * @BATADV_ATTR_ALGO_NAME: name of routing algorithm
+	 */
+	BATADV_ATTR_ALGO_NAME,
+
+	/**
+	 * @BATADV_ATTR_MESH_IFINDEX: index of the batman-adv interface
+	 */
+	BATADV_ATTR_MESH_IFINDEX,
+
+	/**
+	 * @BATADV_ATTR_MESH_IFNAME: name of the batman-adv interface
+	 */
+	BATADV_ATTR_MESH_IFNAME,
+
+	/**
+	 * @BATADV_ATTR_MESH_ADDRESS: mac address of the batman-adv interface
+	 */
+	BATADV_ATTR_MESH_ADDRESS,
+
+	/**
+	 * @BATADV_ATTR_HARD_IFINDEX: index of the non-batman-adv interface
+	 */
+	BATADV_ATTR_HARD_IFINDEX,
+
+	/**
+	 * @BATADV_ATTR_HARD_IFNAME: name of the non-batman-adv interface
+	 */
+	BATADV_ATTR_HARD_IFNAME,
+
+	/**
+	 * @BATADV_ATTR_HARD_ADDRESS: mac address of the non-batman-adv
+	 * interface
+	 */
+	BATADV_ATTR_HARD_ADDRESS,
+
+	/**
+	 * @BATADV_ATTR_ORIG_ADDRESS: originator mac address
+	 */
+	BATADV_ATTR_ORIG_ADDRESS,
+
+	/**
+	 * @BATADV_ATTR_TPMETER_RESULT: result of run (see
+	 * batadv_tp_meter_status)
+	 */
+	BATADV_ATTR_TPMETER_RESULT,
+
+	/**
+	 * @BATADV_ATTR_TPMETER_TEST_TIME: time (msec) the run took
+	 */
+	BATADV_ATTR_TPMETER_TEST_TIME,
+
+	/**
+	 * @BATADV_ATTR_TPMETER_BYTES: amount of acked bytes during run
+	 */
+	BATADV_ATTR_TPMETER_BYTES,
+
+	/**
+	 * @BATADV_ATTR_TPMETER_COOKIE: session cookie to match tp_meter session
+	 */
+	BATADV_ATTR_TPMETER_COOKIE,
+
+	/**
+	 * @BATADV_ATTR_PAD: attribute used for padding for 64-bit alignment
+	 */
+	BATADV_ATTR_PAD,
+
+	/**
+	 * @BATADV_ATTR_ACTIVE: Flag indicating if the hard interface is active
+	 */
+	BATADV_ATTR_ACTIVE,
+
+	/**
+	 * @BATADV_ATTR_TT_ADDRESS: Client MAC address
+	 */
+	BATADV_ATTR_TT_ADDRESS,
+
+	/**
+	 * @BATADV_ATTR_TT_TTVN: Translation table version
+	 */
+	BATADV_ATTR_TT_TTVN,
+
+	/**
+	 * @BATADV_ATTR_TT_LAST_TTVN: Previous translation table version
+	 */
+	BATADV_ATTR_TT_LAST_TTVN,
+
+	/**
+	 * @BATADV_ATTR_TT_CRC32: CRC32 over translation table
+	 */
+	BATADV_ATTR_TT_CRC32,
+
+	/**
+	 * @BATADV_ATTR_TT_VID: VLAN ID
+	 */
+	BATADV_ATTR_TT_VID,
+
+	/**
+	 * @BATADV_ATTR_TT_FLAGS: Translation table client flags
+	 */
+	BATADV_ATTR_TT_FLAGS,
+
+	/**
+	 * @BATADV_ATTR_FLAG_BEST: Flags indicating entry is the best
+	 */
+	BATADV_ATTR_FLAG_BEST,
+
+	/**
+	 * @BATADV_ATTR_LAST_SEEN_MSECS: Time in milliseconds since last seen
+	 */
+	BATADV_ATTR_LAST_SEEN_MSECS,
+
+	/**
+	 * @BATADV_ATTR_NEIGH_ADDRESS: Neighbour MAC address
+	 */
+	BATADV_ATTR_NEIGH_ADDRESS,
+
+	/**
+	 * @BATADV_ATTR_TQ: TQ to neighbour
+	 */
+	BATADV_ATTR_TQ,
+
+	/**
+	 * @BATADV_ATTR_THROUGHPUT: Estimated throughput to Neighbour
+	 */
+	BATADV_ATTR_THROUGHPUT,
+
+	/**
+	 * @BATADV_ATTR_BANDWIDTH_UP: Reported uplink bandwidth
+	 */
+	BATADV_ATTR_BANDWIDTH_UP,
+
+	/**
+	 * @BATADV_ATTR_BANDWIDTH_DOWN: Reported downlink bandwidth
+	 */
+	BATADV_ATTR_BANDWIDTH_DOWN,
+
+	/**
+	 * @BATADV_ATTR_ROUTER: Gateway router MAC address
+	 */
+	BATADV_ATTR_ROUTER,
+
+	/**
+	 * @BATADV_ATTR_BLA_OWN: Flag indicating own originator
+	 */
+	BATADV_ATTR_BLA_OWN,
+
+	/**
+	 * @BATADV_ATTR_BLA_ADDRESS: Bridge loop avoidance claim MAC address
+	 */
+	BATADV_ATTR_BLA_ADDRESS,
+
+	/**
+	 * @BATADV_ATTR_BLA_VID: BLA VLAN ID
+	 */
+	BATADV_ATTR_BLA_VID,
+
+	/**
+	 * @BATADV_ATTR_BLA_BACKBONE: BLA gateway originator MAC address
+	 */
+	BATADV_ATTR_BLA_BACKBONE,
+
+	/**
+	 * @BATADV_ATTR_BLA_CRC: BLA CRC
+	 */
+	BATADV_ATTR_BLA_CRC,
+
+	/* add attributes above here, update the policy in netlink.c */
+
+	/**
+	 * @__BATADV_ATTR_AFTER_LAST: internal use
+	 */
+	__BATADV_ATTR_AFTER_LAST,
+
+	/**
+	 * @NUM_BATADV_ATTR: total number of batadv_nl_attrs available
+	 */
+	NUM_BATADV_ATTR = __BATADV_ATTR_AFTER_LAST,
+
+	/**
+	 * @BATADV_ATTR_MAX: highest attribute number currently defined
+	 */
+	BATADV_ATTR_MAX = __BATADV_ATTR_AFTER_LAST - 1
+};
+
+/**
+ * enum batadv_nl_commands - supported batman-adv netlink commands
+ */
+enum batadv_nl_commands {
+	/**
+	 * @BATADV_CMD_UNSPEC: unspecified command to catch errors
+	 */
+	BATADV_CMD_UNSPEC,
+
+	/**
+	 * @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv
+	 * device
+	 */
+	BATADV_CMD_GET_MESH_INFO,
+
+	/**
+	 * @BATADV_CMD_TP_METER: Start a tp meter session
+	 */
+	BATADV_CMD_TP_METER,
+
+	/**
+	 * @BATADV_CMD_TP_METER_CANCEL: Cancel a tp meter session
+	 */
+	BATADV_CMD_TP_METER_CANCEL,
+
+	/**
+	 * @BATADV_CMD_GET_ROUTING_ALGOS: Query the list of routing algorithms.
+	 */
+	BATADV_CMD_GET_ROUTING_ALGOS,
+
+	/**
+	 * @BATADV_CMD_GET_HARDIFS: Query list of hard interfaces
+	 */
+	BATADV_CMD_GET_HARDIFS,
+
+	/**
+	 * @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations
+	 */
+	BATADV_CMD_GET_TRANSTABLE_LOCAL,
+
+	/**
+	 * @BATADV_CMD_GET_TRANSTABLE_GLOBAL: Query list of global translations
+	 */
+	BATADV_CMD_GET_TRANSTABLE_GLOBAL,
+
+	/**
+	 * @BATADV_CMD_GET_ORIGINATORS: Query list of originators
+	 */
+	BATADV_CMD_GET_ORIGINATORS,
+
+	/**
+	 * @BATADV_CMD_GET_NEIGHBORS: Query list of neighbours
+	 */
+	BATADV_CMD_GET_NEIGHBORS,
+
+	/**
+	 * @BATADV_CMD_GET_GATEWAYS: Query list of gateways
+	 */
+	BATADV_CMD_GET_GATEWAYS,
+
+	/**
+	 * @BATADV_CMD_GET_BLA_CLAIM: Query list of bridge loop avoidance claims
+	 */
+	BATADV_CMD_GET_BLA_CLAIM,
+
+	/**
+	 * @BATADV_CMD_GET_BLA_BACKBONE: Query list of bridge loop avoidance
+	 * backbones
+	 */
+	BATADV_CMD_GET_BLA_BACKBONE,
+
+	/* add new commands above here */
+
+	/**
+	 * @__BATADV_CMD_AFTER_LAST: internal use
+	 */
+	__BATADV_CMD_AFTER_LAST,
+
+	/**
+	 * @BATADV_CMD_MAX: highest used command number
+	 */
+	BATADV_CMD_MAX = __BATADV_CMD_AFTER_LAST - 1
+};
+
+/**
+ * enum batadv_tp_meter_reason - reason of a tp meter test run stop
+ */
+enum batadv_tp_meter_reason {
+	/**
+	 * @BATADV_TP_REASON_COMPLETE: sender finished tp run
+	 */
+	BATADV_TP_REASON_COMPLETE		= 3,
+
+	/**
+	 * @BATADV_TP_REASON_CANCEL: sender was stopped during run
+	 */
+	BATADV_TP_REASON_CANCEL			= 4,
+
+	/* error status >= 128 */
+
+	/**
+	 * @BATADV_TP_REASON_DST_UNREACHABLE: receiver could not be reached or
+	 * didn't answer
+	 */
+	BATADV_TP_REASON_DST_UNREACHABLE	= 128,
+
+	/**
+	 * @BATADV_TP_REASON_RESEND_LIMIT: (unused) sender retry reached limit
+	 */
+	BATADV_TP_REASON_RESEND_LIMIT		= 129,
+
+	/**
+	 * @BATADV_TP_REASON_ALREADY_ONGOING: test to or from the same node
+	 * already ongoing
+	 */
+	BATADV_TP_REASON_ALREADY_ONGOING	= 130,
+
+	/**
+	 * @BATADV_TP_REASON_MEMORY_ERROR: test was stopped due to low memory
+	 */
+	BATADV_TP_REASON_MEMORY_ERROR		= 131,
+
+	/**
+	 * @BATADV_TP_REASON_CANT_SEND: failed to send via outgoing interface
+	 */
+	BATADV_TP_REASON_CANT_SEND		= 132,
+
+	/**
+	 * @BATADV_TP_REASON_TOO_MANY: too many ongoing sessions
+	 */
+	BATADV_TP_REASON_TOO_MANY		= 133,
+};
+
+#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */