@@ -13,7 +13,6 @@ export CONFIG_BATCTL_BISECT=n
BINARY_NAME = batctl
obj-y += bat-hosts.o
-obj-y += debugfs.o
obj-y += debug.o
obj-y += functions.o
obj-y += genl.o
@@ -58,7 +57,6 @@ $(eval $(call add_command,mcast_flags,y))
$(eval $(call add_command,multicast_fanout,y))
$(eval $(call add_command,multicast_forceflood,y))
$(eval $(call add_command,multicast_mode,y))
-$(eval $(call add_command,nc_nodes,y))
$(eval $(call add_command,neighbors,y))
$(eval $(call add_command,network_coding,y))
$(eval $(call add_command,orig_interval,y))
@@ -18,11 +18,11 @@ settings.
How does it work ?
==================
-batctl uses the debugfs/batman_adv/bat0/socket device provided by the B.A.T.M.A.N.
-advanced kernel module to inject custom icmp packets into the data flow. That's why
-ping and traceroute work almost like their IP based counterparts. Tcpdump was
-designed because B.A.T.M.A.N. advanced encapsulates all traffic within batman
-packets, so that the normal tcpdump would not recognize the packets.
+batctl uses the raw packet sockets to inject custom icmp packets into the data
+flow. That's why ping and traceroute work almost like their IP based
+counterparts. Tcpdump was designed because B.A.T.M.A.N. advanced encapsulates
+all traffic within batman packets, so that the normal tcpdump would not
+recognize the packets.
The bat-hosts file
@@ -102,8 +102,6 @@ static int netlink_print_bla_backbone(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_backbonetable = {
- .debugfs_name = DEBUG_BACKBONETABLE,
- .header_lines = 2,
.netlink_fn = netlink_print_bla_backbone,
};
@@ -107,8 +107,6 @@ static int netlink_print_bla_claim(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_claimtable = {
- .debugfs_name = DEBUG_CLAIMTABLE,
- .header_lines = 2,
.netlink_fn = netlink_print_bla_claim,
};
@@ -123,8 +123,6 @@ static int netlink_print_dat_cache(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_dat_cache = {
- .debugfs_name = DEBUG_DAT_CACHE,
- .header_lines = 2,
.netlink_fn = netlink_print_dat_cache,
};
@@ -13,7 +13,6 @@
#include <errno.h>
#include "debug.h"
-#include "debugfs.h"
#include "functions.h"
#include "netlink.h"
#include "sys.h"
@@ -47,8 +46,6 @@ int handle_debug_table(struct state *state, int argc, char **argv)
{
struct debug_table_data *debug_table = state->cmd->arg;
int optchar, read_opt = USE_BAT_HOSTS;
- char full_path[MAX_PATH+1];
- char *debugfs_mnt;
char *orig_iface = NULL;
float orig_timeout = 0.0f;
float watch_interval = 1;
@@ -147,25 +144,7 @@ int handle_debug_table(struct state *state, int argc, char **argv)
return EXIT_FAILURE;
}
- debugfs_mnt = debugfs_mount(NULL);
- if (!debugfs_mnt) {
- fprintf(stderr, "Error - can't mount or find debugfs\n");
- return EXIT_FAILURE;
- }
-
- if (debug_table->netlink_fn) {
- err = debug_table->netlink_fn(state , orig_iface, read_opt,
- orig_timeout, watch_interval);
- if (err != -EOPNOTSUPP)
- return err;
- }
-
- if (orig_iface)
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/", orig_iface, full_path, sizeof(full_path));
- else
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/", state->mesh_iface, full_path, sizeof(full_path));
-
- return read_file(full_path, debug_table->debugfs_name,
- read_opt, orig_timeout, watch_interval,
- debug_table->header_lines);
+ err = debug_table->netlink_fn(state , orig_iface, read_opt,
+ orig_timeout, watch_interval);
+ return err;
}
@@ -12,18 +12,7 @@
#include <stddef.h>
#include "main.h"
-#define DEBUG_BATIF_PATH_FMT "%s/batman_adv/%s"
-#define DEBUG_TRANSTABLE_GLOBAL "transtable_global"
-#define DEBUG_BACKBONETABLE "bla_backbone_table"
-#define DEBUG_CLAIMTABLE "bla_claim_table"
-#define DEBUG_DAT_CACHE "dat_cache"
-#define DEBUG_NC_NODES "nc_nodes"
-#define DEBUG_MCAST_FLAGS "mcast_flags"
-#define DEBUG_ROUTING_ALGOS "routing_algos"
-
struct debug_table_data {
- const char *debugfs_name;
- size_t header_lines;
int (*netlink_fn)(struct state *state, char *hard_iface, int read_opt,
float orig_timeout, float watch_interval);
unsigned int option_unicast_only:1;
deleted file mode 100644
@@ -1,140 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2009 Clark Williams <williams@redhat.com>
- * Copyright (C) 2009 Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
- *
- * License-Filename: LICENSES/preferred/GPL-2.0
- */
-
-#include "debugfs.h"
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/mount.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-
-#ifndef DEBUGFS_MAGIC
-#define DEBUGFS_MAGIC 0x64626720
-#endif
-
-static int debugfs_premounted;
-static char debugfs_mountpoint[MAX_PATH+1];
-
-static const char *debugfs_find_mountpoint(void);
-static int debugfs_valid_mountpoint(const char *debugfs);
-
-static const char *debugfs_known_mountpoints[] = {
- "/sys/kernel/debug/",
- "/debug/",
- NULL,
-};
-
-/* construct a full path to a debugfs element */
-int debugfs_make_path(const char *fmt, const char *mesh_iface, char *buffer,
- int size)
-{
- if (strlen(debugfs_mountpoint) == 0) {
- buffer[0] = '\0';
- return -1;
- }
-
- return snprintf(buffer, size, fmt, debugfs_mountpoint, mesh_iface);
-}
-
-static int debugfs_found;
-
-/* find the path to the mounted debugfs */
-static const char *debugfs_find_mountpoint(void)
-{
- const char **ptr;
- char type[100];
- FILE *fp;
-
- if (debugfs_found)
- return (const char *)debugfs_mountpoint;
-
- ptr = debugfs_known_mountpoints;
- while (*ptr) {
- if (debugfs_valid_mountpoint(*ptr) == 0) {
- debugfs_found = 1;
- strncpy(debugfs_mountpoint, *ptr,
- sizeof(debugfs_mountpoint));
- debugfs_mountpoint[sizeof(debugfs_mountpoint) - 1] = 0;
- return debugfs_mountpoint;
- }
- ptr++;
- }
-
- /* give up and parse /proc/mounts */
- fp = fopen("/proc/mounts", "r");
- if (fp == NULL) {
- perror("Error - can't open /proc/mounts for read");
- return NULL;
- }
-
- while (fscanf(fp, "%*s %"
- STR(MAX_PATH)
- "s %99s %*s %*d %*d\n",
- debugfs_mountpoint, type) == 2) {
- if (strcmp(type, "debugfs") == 0)
- break;
- }
- fclose(fp);
-
- if (strcmp(type, "debugfs") != 0)
- return NULL;
-
- debugfs_found = 1;
-
- return debugfs_mountpoint;
-}
-
-/* verify that a mountpoint is actually a debugfs instance */
-
-static int debugfs_valid_mountpoint(const char *debugfs)
-{
- struct statfs st_fs;
-
- if (statfs(debugfs, &st_fs) < 0)
- return -ENOENT;
- else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
- return -ENOENT;
-
- return 0;
-}
-
-
-int debugfs_valid_entry(const char *path)
-{
- struct stat st;
-
- if (stat(path, &st))
- return -errno;
-
- return 0;
-}
-
-/* mount the debugfs somewhere if it's not mounted */
-
-char *debugfs_mount(const char *mountpoint)
-{
- /* see if it's already mounted */
- if (debugfs_find_mountpoint()) {
- debugfs_premounted = 1;
- return debugfs_mountpoint;
- }
-
- /* if not mounted and no argument */
- if (mountpoint == NULL)
- mountpoint = "/sys/kernel/debug";
-
- if (mount(NULL, mountpoint, "debugfs", 0, NULL) < 0)
- return NULL;
-
- /* save the mountpoint */
- strncpy(debugfs_mountpoint, mountpoint, sizeof(debugfs_mountpoint));
- debugfs_mountpoint[sizeof(debugfs_mountpoint) - 1] = '\0';
- debugfs_found = 1;
-
- return debugfs_mountpoint;
-}
deleted file mode 100644
@@ -1,25 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2009 Clark Williams <williams@redhat.com>
- * Copyright (C) 2009 Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
- *
- * License-Filename: LICENSES/preferred/GPL-2.0
- */
-
-#ifndef __DEBUGFS_H__
-#define __DEBUGFS_H__
-
-#ifndef MAX_PATH
-# define MAX_PATH 256
-#endif
-
-#ifndef STR
-# define _STR(x) #x
-# define STR(x) _STR(x)
-#endif
-
-extern int debugfs_valid_entry(const char *path);
-extern char *debugfs_mount(const char *mountpoint);
-extern int debugfs_make_path(const char *fmt, const char *mesh_iface,
- char *buffer, int size);
-
-#endif /* __DEBUGFS_H__ */
@@ -43,7 +43,6 @@
#include "bat-hosts.h"
#include "sys.h"
#include "debug.h"
-#include "debugfs.h"
#include "netlink.h"
#define PATH_BUFF_LEN 400
@@ -140,14 +139,6 @@ static void file_open_problem_dbg(const char *dir, const char *full_path)
fprintf(stderr, "Consult the README if you wish to learn more about compiling options into batman-adv.\n");
}
-static int str_is_mcast_addr(char *addr)
-{
- struct ether_addr *mac_addr = ether_aton(addr);
-
- return !mac_addr ? 0 :
- mac_addr->ether_addr_octet[0] & 0x01;
-}
-
static bool ether_addr_valid(const uint8_t *addr)
{
/* no multicast address */
@@ -171,67 +162,28 @@ static void print_inv_bool(char *line)
printf("%s", line);
}
-int read_file(const char *dir, const char *fname, int read_opt,
- float orig_timeout, float watch_interval, size_t header_lines)
+int read_file(const char *dir, const char *fname, int read_opt)
{
- struct ether_addr *mac_addr;
- struct bat_host *bat_host;
int res = EXIT_FAILURE;
- float last_seen;
- char full_path[500], *buff_ptr, *space_ptr, extra_char;
+ char full_path[500];
size_t len = 0;
FILE *fp = NULL;
- size_t line;
-
- if (read_opt & USE_BAT_HOSTS)
- bat_hosts_init(read_opt);
snprintf(full_path, sizeof(full_path), "%s%s", dir, fname);
-open:
- line = 0;
fp = fopen(full_path, "r");
-
if (!fp) {
if (!(read_opt & SILENCE_ERRORS))
file_open_problem_dbg(dir, full_path);
- goto out;
+ return res;
}
- if (read_opt & CLR_CONT_READ)
- /* clear screen, set cursor back to 0,0 */
- printf("\033[2J\033[0;0f");
-
-read:
while (getline(&line_ptr, &len, fp) != -1) {
- if (line++ < header_lines && read_opt & SKIP_HEADER)
- continue;
-
/* the buffer will be handled elsewhere */
if (read_opt & USE_READ_BUFF)
break;
- /* skip timed out originators */
- if (read_opt & NO_OLD_ORIGS)
- if (sscanf(line_ptr, "%*s %f", &last_seen)
- && (last_seen > orig_timeout))
- continue;
-
- /* translation table: skip multicast */
- if (line > header_lines &&
- read_opt & UNICAST_ONLY &&
- strlen(line_ptr) > strlen(" * xx:xx:xx:") &&
- str_is_mcast_addr(line_ptr+3))
- continue;
-
- /* translation table: skip unicast */
- if (line > header_lines &&
- read_opt & MULTICAST_ONLY &&
- strlen(line_ptr) > strlen(" * xx:xx:xx:") &&
- !str_is_mcast_addr(line_ptr+3))
- continue;
-
if (!(read_opt & USE_BAT_HOSTS)) {
if (read_opt & INVERSE_BOOL)
print_inv_bool(line_ptr);
@@ -241,81 +193,13 @@ int read_file(const char *dir, const char *fname, int read_opt,
continue;
}
- /* replace mac addresses with bat host names */
- buff_ptr = line_ptr;
-
- while ((space_ptr = strchr(buff_ptr, ' ')) != NULL) {
-
- *space_ptr = '\0';
- extra_char = '\0';
-
- if (strlen(buff_ptr) == ETH_STR_LEN + 1) {
- extra_char = buff_ptr[ETH_STR_LEN];
- switch (extra_char) {
- case ',':
- case ')':
- buff_ptr[ETH_STR_LEN] = '\0';
- break;
- default:
- extra_char = '\0';
- break;
- }
- }
-
- if (strlen(buff_ptr) != ETH_STR_LEN)
- goto print_plain_buff;
-
- mac_addr = ether_aton(buff_ptr);
-
- if (!mac_addr)
- goto print_plain_buff;
-
- bat_host = bat_hosts_find_by_mac((char *)mac_addr);
-
- if (!bat_host)
- goto print_plain_buff;
-
- /* keep table format */
- printf("%17s", bat_host->name);
-
- goto written;
-
-print_plain_buff:
- printf("%s", buff_ptr);
-
-written:
- if (extra_char != '\0')
- printf("%c", extra_char);
-
- printf(" ");
- buff_ptr = space_ptr + 1;
- }
-
- printf("%s", buff_ptr);
- }
-
- if (read_opt & CONT_READ) {
- usleep(1000000 * watch_interval);
- goto read;
- }
-
- if (read_opt & CLR_CONT_READ) {
- if (fp)
- fclose(fp);
- usleep(1000000 * watch_interval);
- goto open;
+ printf("%s", line_ptr);
}
if (line_ptr)
res = EXIT_SUCCESS;
-out:
- if (fp)
- fclose(fp);
-
- if (read_opt & USE_BAT_HOSTS)
- bat_hosts_free();
-
+ fclose(fp);
return res;
}
@@ -391,7 +275,7 @@ int get_algoname(const char *mesh_iface, char *algoname, size_t algoname_len)
}
snprintf(path_buff, PATH_BUFF_LEN, SYS_ROUTING_ALGO_FMT, mesh_iface);
- ret = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS, 0, 0, 0);
+ ret = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS);
if (ret != EXIT_SUCCESS) {
ret = -ENOENT;
goto free_path_buf;
@@ -1129,7 +1013,7 @@ static int check_mesh_iface_ownership_sysfs(struct state *state,
/* check if this device actually belongs to the mesh interface */
snprintf(path_buff, sizeof(path_buff), SYS_MESH_IFACE_FMT, hard_iface);
- res = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS, 0, 0, 0);
+ res = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS);
if (res != EXIT_SUCCESS) {
fprintf(stderr, "Error - the directory '%s' could not be read: %s\n",
path_buff, strerror(errno));
@@ -43,8 +43,7 @@ char *ether_ntoa_long(const struct ether_addr *addr);
char *get_name_by_macaddr(struct ether_addr *mac_addr, int read_opt);
char *get_name_by_macstr(char *mac_str, int read_opt);
int file_exists(const char *fpath);
-int read_file(const char *dir, const char *path, int read_opt,
- float orig_timeout, float watch_interval, size_t header_lines);
+int read_file(const char *dir, const char *path, int read_opt);
int write_file(const char *dir, const char *fname, const char *arg1,
const char *arg2);
struct ether_addr *translate_mac(const char *mesh_iface,
@@ -145,8 +145,6 @@ static int netlink_print_gateways(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_gateways = {
- .debugfs_name = "gateways",
- .header_lines = 1,
.netlink_fn = netlink_print_gateways,
};
@@ -266,7 +266,7 @@ static int gw_read_setting(struct state *state, const char *path_buff)
return EXIT_SUCCESS;
/* fallback to sysfs */
- res = read_file(path_buff, SYS_GW_MODE, USE_READ_BUFF, 0, 0, 0);
+ res = read_file(path_buff, SYS_GW_MODE, USE_READ_BUFF);
if (res != EXIT_SUCCESS)
goto out;
@@ -285,10 +285,10 @@ static int gw_read_setting(struct state *state, const char *path_buff)
switch (gw_mode) {
case BATADV_GW_MODE_CLIENT:
- res = read_file(path_buff, SYS_GW_SEL, USE_READ_BUFF, 0, 0, 0);
+ res = read_file(path_buff, SYS_GW_SEL, USE_READ_BUFF);
break;
case BATADV_GW_MODE_SERVER:
- res = read_file(path_buff, SYS_GW_BW, USE_READ_BUFF, 0, 0, 0);
+ res = read_file(path_buff, SYS_GW_BW, USE_READ_BUFF);
break;
default:
printf("off\n");
@@ -28,7 +28,6 @@
#include "batadv_packet.h"
#include "debug.h"
-#include "debugfs.h"
#include "functions.h"
#include "list.h"
#include "netlink.h"
@@ -168,8 +168,7 @@ static int print_interfaces_rtnl_parse(struct nl_msg *msg, void *arg)
if (!status) {
snprintf(path_buff, sizeof(path_buff), SYS_IFACE_STATUS_FMT,
ifname);
- ret = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS,
- 0, 0, 0);
+ ret = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS);
if (ret != EXIT_SUCCESS)
status = "<error reading status>\n";
else
@@ -96,7 +96,7 @@ static int log_level_read_setting(struct state *state, const char *path_buff)
if (res >= 0)
return EXIT_SUCCESS;
- res = read_file(path_buff, SYS_LOG_LEVEL, USE_READ_BUFF, 0, 0, 0);
+ res = read_file(path_buff, SYS_LOG_LEVEL, USE_READ_BUFF);
if (res != EXIT_SUCCESS)
return res;
@@ -123,7 +123,7 @@ static void version(void)
printf("batctl %s [batman-adv: ", SOURCE_VERSION);
- ret = read_file("", module_ver_path, USE_READ_BUFF | SILENCE_ERRORS, 0, 0, 0);
+ ret = read_file("", module_ver_path, USE_READ_BUFF | SILENCE_ERRORS);
if ((line_ptr) && (line_ptr[strlen(line_ptr) - 1] == '\n'))
line_ptr[strlen(line_ptr) - 1] = '\0';
@@ -241,9 +241,7 @@ Example 3: 16 or 0x0F
.I \fBdebug tables:
.IP
The batman-adv kernel module comes with a variety of debug tables containing various information about the state of the mesh
-seen by each individual node. These tables are exported via debugfs and easily accessible via batctl. You will need debugfs
-support compiled into your kernel and preferably have mounted the debugfs to a well-known mountpoint. If debugfs is not
-mounted batctl will attempt to do this step for you.
+seen by each individual node.
All of the debug tables support the following options:
.RS 10
@@ -290,9 +288,6 @@ List of debug tables:
\- dat_cache|dc (compile time option)
.RE
.RS 10
-\- nc_nodes|nn (compile time option)
-.RE
-.RS 10
\- mcast_flags|mf (compile time option)
.RE
.RE
@@ -154,8 +154,6 @@ static int netlink_print_mcast_flags(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_mcast_flags = {
- .debugfs_name = DEBUG_MCAST_FLAGS,
- .header_lines = 6,
.netlink_fn = netlink_print_mcast_flags,
};
deleted file mode 100644
@@ -1,18 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2009-2020 B.A.T.M.A.N. contributors:
- *
- * Marek Lindner <mareklindner@neomailbox.ch>
- *
- * License-Filename: LICENSES/preferred/GPL-2.0
- */
-
-#include "debug.h"
-#include "main.h"
-
-static struct debug_table_data batctl_debug_table_nc_nodes = {
- .debugfs_name = DEBUG_NC_NODES,
- .header_lines = 0,
-};
-
-COMMAND_NAMED(DEBUGTABLE, nc_nodes, "nn", handle_debug_table,
- COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_nc_nodes, "");
@@ -118,8 +118,6 @@ static int netlink_print_neighbors(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_neighbors = {
- .debugfs_name = "neighbors",
- .header_lines = 2,
.netlink_fn = netlink_print_neighbors,
};
@@ -196,8 +196,6 @@ static int netlink_print_originators(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_originators = {
- .debugfs_name = "originators",
- .header_lines = 2,
.netlink_fn = netlink_print_originators,
.option_timeout_interval = 1,
.option_orig_iface = 1,
@@ -19,7 +19,6 @@
#include "batadv_packet.h"
#include "batman_adv.h"
#include "debug.h"
-#include "debugfs.h"
#include "functions.h"
#include "main.h"
#include "netlink.h"
@@ -133,28 +132,11 @@ static int netlink_print_routing_algos(void)
return last_err;
}
-static int debug_print_routing_algos(void)
-{
- char full_path[MAX_PATH+1];
- char *debugfs_mnt;
-
- debugfs_mnt = debugfs_mount(NULL);
- if (!debugfs_mnt) {
- fprintf(stderr, "Error - can't mount or find debugfs\n");
- return -1;
- }
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT, "", full_path, sizeof(full_path));
- return read_file(full_path, DEBUG_ROUTING_ALGOS, 0, 0, 0, 0);
-}
-
static int print_routing_algos(void)
{
int err;
err = netlink_print_routing_algos();
- if (err == -EOPNOTSUPP)
- err = debug_print_routing_algos();
return err;
}
@@ -303,7 +285,7 @@ static int routing_algo(struct state *state __maybe_unused, int argc, char **arg
print_ra_interfaces();
- res = read_file("", SYS_SELECTED_RA_PATH, USE_READ_BUFF, 0, 0, 0);
+ res = read_file("", SYS_SELECTED_RA_PATH, USE_READ_BUFF);
if (res != EXIT_SUCCESS)
return EXIT_FAILURE;
@@ -208,7 +208,7 @@ static int sys_read_setting(struct state *state, const char *path_buff,
if (state->cmd->flags & COMMAND_FLAG_INVERSE)
read_opt |= INVERSE_BOOL;
- res = read_file(path_buff, sysfs_name, read_opt, 0, 0, 0);
+ res = read_file(path_buff, sysfs_name, read_opt);
}
return res;
@@ -32,7 +32,6 @@
#include "functions.h"
#include "genl.h"
#include "netlink.h"
-#include "debugfs.h"
static struct ether_addr *dst_mac;
static char *tp_mesh_iface;
@@ -136,8 +136,6 @@ static int netlink_print_transglobal(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_transglobal = {
- .debugfs_name = "transtable_global",
- .header_lines = 2,
.netlink_fn = netlink_print_transglobal,
.option_unicast_only = 1,
.option_multicast_only = 1,
@@ -132,8 +132,6 @@ static int netlink_print_translocal(struct state *state, char *orig_iface,
}
static struct debug_table_data batctl_debug_table_translocal = {
- .debugfs_name = "transtable_local",
- .header_lines = 2,
.netlink_fn = netlink_print_translocal,
.option_unicast_only = 1,
.option_multicast_only = 1,