All of lore.kernel.org
 help / color / mirror / Atom feed
* [B.A.T.M.A.N.] [PATCH] batctl: add dat_dht command
@ 2019-04-07 10:54 Linus Lüssing
  0 siblings, 0 replies; only message in thread
From: Linus Lüssing @ 2019-04-07 10:54 UTC (permalink / raw)
  To: b.a.t.m.a.n

This adds a dat_dht command to query the DHT part of DAT
in batman-adv.

Signed-off-by: Linus Lüssing <linus.luessing@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@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


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2019-04-07 10:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-07 10:54 [B.A.T.M.A.N.] [PATCH] batctl: add dat_dht command Linus Lüssing

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.