This adds a dat_dht command to query the DHT part of DAT
in batman-adv.
Signed-off-by: Linus Lüssing <linus.luessing(a)c0d3.blue>
---
Makefile | 1 +
README.rst | 27 +++++++++-
batadv_packet.h | 4 +-
batman_adv.h | 5 ++
dat_cache.c | 2 +-
dat_dht.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++
debug.h | 1 +
man/batctl.8 | 3 ++
8 files changed, 173 insertions(+), 3 deletions(-)
create mode 100644 dat_dht.c
diff --git a/Makefile b/Makefile
index df8b7b9..94f3321 100755
--- a/Makefile
+++ b/Makefile
@@ -44,6 +44,7 @@ $(eval $(call add_command,bonding,y))
$(eval $(call add_command,bridge_loop_avoidance,y))
$(eval $(call add_command,claimtable,y))
$(eval $(call add_command,dat_cache,y))
+$(eval $(call add_command,dat_dht,y))
$(eval $(call add_command,distributed_arp_table,y))
$(eval $(call add_command,event,y))
$(eval $(call add_command,fragmentation,y))
diff --git a/README.rst b/README.rst
index 03ea5e5..97ca394 100644
--- a/README.rst
+++ b/README.rst
@@ -652,7 +652,32 @@ Usage::
Example::
- Distributed ARP Table (bat0):
+ Distributed ARP Table Cache (bat0):
+ IPv4 MAC last-seen
+ * 172.100.0.1 b6:9b:d0:ea:b1:13 0:00
+
+where
+
+IPv4:
+ is the IP address of a client in the mesh network
+MAC:
+ is the MAC address associated to that IP
+last-seen:
+ is the amount of time since last refresh of this entry
+
+
+batctl dat_dht
+=================
+
+display the local D.A.T. DHT
+
+Usage::
+
+ batctl dat_dht|dd
+
+Example::
+
+ Distributed ARP Table DHT (bat0):
IPv4 MAC last-seen
* 172.100.0.1 b6:9b:d0:ea:b1:13 0:00
diff --git a/batadv_packet.h b/batadv_packet.h
index 4ebc213..fb42e3d 100644
--- a/batadv_packet.h
+++ b/batadv_packet.h
@@ -58,13 +58,15 @@ enum batadv_packettype {
* @BATADV_P_DATA: user payload
* @BATADV_P_DAT_DHT_GET: DHT request message
* @BATADV_P_DAT_DHT_PUT: DHT store message
- * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT
+ * @BATADV_P_DAT_CACHE_REPLY: deprecated: use BATADV_P_DAT_DHT_REPLY instead
+ * @BATADV_P_DAT_DHT_REPLY: ARP reply generated by DAT
*/
enum batadv_subtype {
BATADV_P_DATA = 0x01,
BATADV_P_DAT_DHT_GET = 0x02,
BATADV_P_DAT_DHT_PUT = 0x03,
BATADV_P_DAT_CACHE_REPLY = 0x04,
+ BATADV_P_DAT_DHT_REPLY = 0x04,
};
/* this file is included by batctl which needs these defines */
diff --git a/batman_adv.h b/batman_adv.h
index 67f4636..e4bcc23 100644
--- a/batman_adv.h
+++ b/batman_adv.h
@@ -612,6 +612,11 @@ enum batadv_nl_commands {
*/
BATADV_CMD_SET_VLAN,
+ /**
+ * @BATADV_CMD_GET_DAT_DHT: Query list of DAT DHT entries
+ */
+ BATADV_CMD_GET_DAT_DHT,
+
/* add new commands above here */
/**
diff --git a/dat_cache.c b/dat_cache.c
index 4a8a082..5c947c0 100644
--- a/dat_cache.c
+++ b/dat_cache.c
@@ -106,7 +106,7 @@ static int netlink_print_dat_cache(struct state *state, char *orig_iface,
char *header;
int ret;
- ret = asprintf(&header, "Distributed ARP Table (%s):\n%s\n",
+ ret = asprintf(&header, "Distributed ARP Table Cache (%s):\n%s\n",
state->mesh_iface,
" IPv4 MAC VID last-seen");
diff --git a/dat_dht.c b/dat_dht.c
new file mode 100644
index 0000000..8c7897c
--- /dev/null
+++ b/dat_dht.c
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (C) 2009-2019 B.A.T.M.A.N. contributors:
+ *
+ * Marek Lindner <mareklindner(a)neomailbox.ch>
+ *
+ * License-Filename: LICENSES/preferred/GPL-2.0
+ */
+
+#include <arpa/inet.h>
+#include <netinet/if_ether.h>
+#include <netinet/in.h>
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/socket.h>
+
+#include "batadv_packet.h"
+#include "batman_adv.h"
+#include "bat-hosts.h"
+#include "debug.h"
+#include "functions.h"
+#include "main.h"
+#include "netlink.h"
+
+static const int dat_dht_mandatory[] = {
+ BATADV_ATTR_DAT_CACHE_IP4ADDRESS,
+ BATADV_ATTR_DAT_CACHE_HWADDRESS,
+ BATADV_ATTR_DAT_CACHE_VID,
+ BATADV_ATTR_LAST_SEEN_MSECS,
+};
+
+static int dat_dht_callback(struct nl_msg *msg, void *arg)
+{
+ int last_seen_msecs, last_seen_secs, last_seen_mins;
+ struct nlattr *attrs[BATADV_ATTR_MAX+1];
+ struct nlmsghdr *nlh = nlmsg_hdr(msg);
+ struct print_opts *opts = arg;
+ struct bat_host *bat_host;
+ struct genlmsghdr *ghdr;
+ struct in_addr in_addr;
+ uint8_t *hwaddr;
+ int16_t vid;
+ char *addr;
+
+ if (!genlmsg_valid_hdr(nlh, 0)) {
+ fputs("Received invalid data from kernel.\n", stderr);
+ exit(1);
+ }
+
+ ghdr = nlmsg_data(nlh);
+
+ if (ghdr->cmd != BATADV_CMD_GET_DAT_DHT)
+ return NL_OK;
+
+ if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
+ genlmsg_len(ghdr), batadv_netlink_policy)) {
+ fputs("Received invalid data from kernel.\n", stderr);
+ exit(1);
+ }
+
+ if (missing_mandatory_attrs(attrs, dat_dht_mandatory,
+ ARRAY_SIZE(dat_dht_mandatory))) {
+ fputs("Missing attributes from kernel\n", stderr);
+ exit(1);
+ }
+
+ in_addr.s_addr = nla_get_u32(attrs[BATADV_ATTR_DAT_CACHE_IP4ADDRESS]);
+ addr = inet_ntoa(in_addr);
+ hwaddr = nla_data(attrs[BATADV_ATTR_DAT_CACHE_HWADDRESS]);
+ vid = nla_get_u16(attrs[BATADV_ATTR_DAT_CACHE_VID]);
+
+ last_seen_msecs = nla_get_u32(attrs[BATADV_ATTR_LAST_SEEN_MSECS]);
+ last_seen_mins = last_seen_msecs / 60000;
+ last_seen_msecs = last_seen_msecs % 60000;
+ last_seen_secs = last_seen_msecs / 1000;
+
+ if (opts->read_opt & MULTICAST_ONLY && !(addr[0] & 0x01))
+ return NL_OK;
+
+ if (opts->read_opt & UNICAST_ONLY && (addr[0] & 0x01))
+ return NL_OK;
+
+ printf(" * %15s ", addr);
+
+ bat_host = bat_hosts_find_by_mac((char *)hwaddr);
+ if (!(opts->read_opt & USE_BAT_HOSTS) || !bat_host)
+ printf("%02x:%02x:%02x:%02x:%02x:%02x ",
+ hwaddr[0], hwaddr[1], hwaddr[2],
+ hwaddr[3], hwaddr[4], hwaddr[5]);
+ else
+ printf("%17s ", bat_host->name);
+
+ printf("%4i %6i:%02i\n",
+ BATADV_PRINT_VID(vid), last_seen_mins, last_seen_secs);
+
+ return NL_OK;
+}
+
+static int netlink_print_dat_dht(struct state *state, char *orig_iface,
+ int read_opts, float orig_timeout,
+ float watch_interval)
+{
+ char *header;
+ int ret;
+
+ ret = asprintf(&header, "Distributed ARP Table DHT (%s):\n%s\n",
+ state->mesh_iface,
+ " IPv4 MAC VID last-seen");
+
+ if (ret < 0)
+ return ret;
+
+ ret = netlink_print_common(state, orig_iface, read_opts,
+ orig_timeout, watch_interval, header,
+ BATADV_CMD_GET_DAT_DHT,
+ dat_dht_callback);
+
+ free(header);
+ return ret;
+}
+
+static struct debug_table_data batctl_debug_table_dat_dht = {
+ .debugfs_name = DEBUG_DAT_DHT,
+ .header_lines = 2,
+ .netlink_fn = netlink_print_dat_dht,
+};
+
+COMMAND_NAMED(DEBUGTABLE, dat_dht, "dd", handle_debug_table,
+ COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK,
+ &batctl_debug_table_dat_dht, "");
diff --git a/debug.h b/debug.h
index 3294361..e6353ab 100644
--- a/debug.h
+++ b/debug.h
@@ -17,6 +17,7 @@
#define DEBUG_BACKBONETABLE "bla_backbone_table"
#define DEBUG_CLAIMTABLE "bla_claim_table"
#define DEBUG_DAT_CACHE "dat_cache"
+#define DEBUG_DAT_DHT "dat_dht"
#define DEBUG_NC_NODES "nc_nodes"
#define DEBUG_MCAST_FLAGS "mcast_flags"
#define DEBUG_LOG "log"
diff --git a/man/batctl.8 b/man/batctl.8
index 8d7332a..fb1dd02 100644
--- a/man/batctl.8
+++ b/man/batctl.8
@@ -276,6 +276,9 @@ List of debug tables:
\- dat_cache|dc (compile time option)
.RE
.RS 10
+\- dat_dht|dd (compile time option)
+.RE
+.RS 10
\- nc_nodes|nn (compile time option)
.RE
.RS 10
--
2.20.1