Merge pull request #1280 from FreifunkVogtland/libbatadv
libbatadv: Add common batman-adv helper functions library
This commit is contained in:
commit
245e0f9ecc
@ -13,7 +13,7 @@ define Package/gluon-mesh-batman-adv/common
|
|||||||
SECTION:=gluon
|
SECTION:=gluon
|
||||||
CATEGORY:=Gluon
|
CATEGORY:=Gluon
|
||||||
PROVIDES:=gluon-mesh-batman-adv
|
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
|
endef
|
||||||
|
|
||||||
define Package/gluon-mesh-batman-adv-14
|
define Package/gluon-mesh-batman-adv-14
|
||||||
|
@ -20,5 +20,16 @@ endif
|
|||||||
CFLAGS += $(LIBNL_CFLAGS)
|
CFLAGS += $(LIBNL_CFLAGS)
|
||||||
LDLIBS += $(LIBNL_LDLIBS)
|
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
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -D_GNU_SOURCE -o $@ $^ $(LDLIBS) -lgluonutil -liwinfo -luci
|
||||||
|
@ -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;
|
|
||||||
}
|
|
@ -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 */
|
|
@ -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_ */
|
|
@ -51,7 +51,7 @@
|
|||||||
#include <linux/if_addr.h>
|
#include <linux/if_addr.h>
|
||||||
#include <linux/sockios.h>
|
#include <linux/sockios.h>
|
||||||
|
|
||||||
#include "batadv-netlink.h"
|
#include <batadv-genl.h>
|
||||||
|
|
||||||
|
|
||||||
#define _STRINGIFY(s) #s
|
#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;
|
struct gw_netlink_opts *opts;
|
||||||
char addr[18];
|
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))
|
if (!genlmsg_valid_hdr(nlh, 0))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
@ -267,11 +268,11 @@ static int parse_gw_list_netlink_cb(struct nl_msg *msg, void *arg)
|
|||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
|
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;
|
return NL_OK;
|
||||||
|
|
||||||
if (batadv_nl_missing_attrs(attrs, gateways_mandatory,
|
if (batadv_genl_missing_attrs(attrs, gateways_mandatory,
|
||||||
ARRAY_SIZE(gateways_mandatory)))
|
BATADV_ARRAY_SIZE(gateways_mandatory)))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (!attrs[BATADV_ATTR_FLAG_BEST])
|
if (!attrs[BATADV_ATTR_FLAG_BEST])
|
||||||
@ -301,7 +302,7 @@ static void add_gateway(struct json_object *obj) {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
batadv_nl_query_common("bat0", BATADV_CMD_GET_GATEWAYS,
|
batadv_genl_query("bat0", BATADV_CMD_GET_GATEWAYS,
|
||||||
parse_gw_list_netlink_cb, NLM_F_DUMP,
|
parse_gw_list_netlink_cb, NLM_F_DUMP,
|
||||||
&opts.query_opts);
|
&opts.query_opts);
|
||||||
}
|
}
|
||||||
@ -494,7 +495,8 @@ static int parse_clients_list_netlink_cb(struct nl_msg *msg, void *arg)
|
|||||||
struct clients_netlink_opts *opts;
|
struct clients_netlink_opts *opts;
|
||||||
uint32_t flags;
|
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))
|
if (!genlmsg_valid_hdr(nlh, 0))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
@ -505,11 +507,11 @@ static int parse_clients_list_netlink_cb(struct nl_msg *msg, void *arg)
|
|||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
|
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;
|
return NL_OK;
|
||||||
|
|
||||||
if (batadv_nl_missing_attrs(attrs, clients_mandatory,
|
if (batadv_genl_missing_attrs(attrs, clients_mandatory,
|
||||||
ARRAY_SIZE(clients_mandatory)))
|
BATADV_ARRAY_SIZE(clients_mandatory)))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
flags = nla_get_u32(attrs[BATADV_ATTR_TT_FLAGS]);
|
flags = nla_get_u32(attrs[BATADV_ATTR_TT_FLAGS]);
|
||||||
@ -535,7 +537,7 @@ static struct json_object * get_clients(void) {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
batadv_nl_query_common("bat0", BATADV_CMD_GET_TRANSTABLE_LOCAL,
|
batadv_genl_query("bat0", BATADV_CMD_GET_TRANSTABLE_LOCAL,
|
||||||
parse_clients_list_netlink_cb, NLM_F_DUMP,
|
parse_clients_list_netlink_cb, NLM_F_DUMP,
|
||||||
&opts.query_opts);
|
&opts.query_opts);
|
||||||
|
|
||||||
@ -605,7 +607,8 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
|
|||||||
struct neigh_netlink_opts *opts;
|
struct neigh_netlink_opts *opts;
|
||||||
char mac1[18];
|
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))
|
if (!genlmsg_valid_hdr(nlh, 0))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
@ -616,11 +619,11 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
|
|||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
|
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;
|
return NL_OK;
|
||||||
|
|
||||||
if (batadv_nl_missing_attrs(attrs, parse_orig_list_mandatory,
|
if (batadv_genl_missing_attrs(attrs, parse_orig_list_mandatory,
|
||||||
ARRAY_SIZE(parse_orig_list_mandatory)))
|
BATADV_ARRAY_SIZE(parse_orig_list_mandatory)))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (!attrs[BATADV_ATTR_FLAG_BEST])
|
if (!attrs[BATADV_ATTR_FLAG_BEST])
|
||||||
@ -671,7 +674,7 @@ static struct json_object * get_batadv(void) {
|
|||||||
if (!opts.interfaces)
|
if (!opts.interfaces)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ret = batadv_nl_query_common("bat0", BATADV_CMD_GET_ORIGINATORS,
|
ret = batadv_genl_query("bat0", BATADV_CMD_GET_ORIGINATORS,
|
||||||
parse_orig_list_netlink_cb, NLM_F_DUMP,
|
parse_orig_list_netlink_cb, NLM_F_DUMP,
|
||||||
&opts.query_opts);
|
&opts.query_opts);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -14,7 +14,7 @@ define Package/gluon-status-page-api
|
|||||||
SECTION:=gluon
|
SECTION:=gluon
|
||||||
CATEGORY:=Gluon
|
CATEGORY:=Gluon
|
||||||
TITLE:=API for gluon-status-page
|
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
|
endef
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
|
@ -20,10 +20,19 @@ endif
|
|||||||
CFLAGS_JSONC = $(shell pkg-config --cflags json-c)
|
CFLAGS_JSONC = $(shell pkg-config --cflags json-c)
|
||||||
LDFLAGS_JSONC = $(shell pkg-config --libs 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
|
all: neighbours-batadv stations respondd.so
|
||||||
|
|
||||||
neighbours-batadv: neighbours-batadv.c batadv-netlink.c
|
neighbours-batadv: neighbours-batadv.c
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LIBNL_CFLAGS) $(LDFLAGS) $(LDFLAGS_JSONC) $(LIBNL_LDLIBS) -Wall -o $@ $^ $(LDLIBS)
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LIBNL_CFLAGS) $(LIBBATADV_CFLAGS) $(LDFLAGS) $(LDFLAGS_JSONC) $(LIBNL_LDLIBS) $(LIBBATADV_LDLIBS) -Wall -o $@ $^ $(LDLIBS)
|
||||||
|
|
||||||
stations: stations.c
|
stations: stations.c
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LDFLAGS) $(LDFLAGS_JSONC) -Wall -o $@ $^ $(LDLIBS) -liwinfo
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LDFLAGS) $(LDFLAGS_JSONC) -Wall -o $@ $^ $(LDLIBS) -liwinfo
|
||||||
|
@ -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;
|
|
||||||
}
|
|
@ -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 */
|
|
@ -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_ */
|
|
@ -4,7 +4,7 @@
|
|||||||
#include <json-c/json.h>
|
#include <json-c/json.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
|
||||||
#include "batadv-netlink.h"
|
#include <batadv-genl.h>
|
||||||
|
|
||||||
#define STR(x) #x
|
#define STR(x) #x
|
||||||
#define XSTR(x) STR(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;
|
struct neigh_netlink_opts *opts;
|
||||||
char mac1[18];
|
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))
|
if (!genlmsg_valid_hdr(nlh, 0))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
@ -48,11 +48,11 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
|
|||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
|
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;
|
return NL_OK;
|
||||||
|
|
||||||
if (batadv_nl_missing_attrs(attrs, parse_orig_list_mandatory,
|
if (batadv_genl_missing_attrs(attrs, parse_orig_list_mandatory,
|
||||||
ARRAY_SIZE(parse_orig_list_mandatory)))
|
BATADV_ARRAY_SIZE(parse_orig_list_mandatory)))
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
|
||||||
if (!attrs[BATADV_ATTR_FLAG_BEST])
|
if (!attrs[BATADV_ATTR_FLAG_BEST])
|
||||||
@ -99,7 +99,7 @@ static json_object *neighbours(void) {
|
|||||||
if (!opts.obj)
|
if (!opts.obj)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ret = batadv_nl_query_common("bat0", BATADV_CMD_GET_ORIGINATORS,
|
ret = batadv_genl_query("bat0", BATADV_CMD_GET_ORIGINATORS,
|
||||||
parse_orig_list_netlink_cb, NLM_F_DUMP,
|
parse_orig_list_netlink_cb, NLM_F_DUMP,
|
||||||
&opts.query_opts);
|
&opts.query_opts);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
69
package/libbatadv/Makefile
Normal file
69
package/libbatadv/Makefile
Normal file
@ -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
package/libbatadv/files/libbatadv.pc
Normal file
36
package/libbatadv/files/libbatadv.pc
Normal file
@ -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
package/libbatadv/src/Makefile
Normal file
120
package/libbatadv/src/Makefile
Normal file
@ -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
package/libbatadv/src/batadv-genl.c
Normal file
215
package/libbatadv/src/batadv-genl.c
Normal file
@ -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
package/libbatadv/src/batadv-genl.h
Normal file
102
package/libbatadv/src/batadv-genl.h
Normal file
@ -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
package/libbatadv/src/batman_adv.h
Normal file
426
package/libbatadv/src/batman_adv.h
Normal file
@ -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_ */
|
Loading…
Reference in New Issue
Block a user