@@ -11,7 +11,6 @@ BINARY_NAME = alfred
OBJ += batadv_query.o
OBJ += batadv_querynl.o
OBJ += client.o
-OBJ += debugfs.o
OBJ += hash.o
OBJ += main.o
OBJ += netlink.o
@@ -290,7 +290,7 @@ Operations requiring special capabilities:
* bind to device
* creating the unix socket
-* accessing the debugfs filesystem
+* accessing the netlink interface
The first operation can still be executed when the admin grants the special
capability CAP_NET_RAW+CAP_NET_ADMIN to anyone executing the alfred binary.
@@ -300,11 +300,6 @@ directory which can be accessed by the user::
$ sudo setcap cap_net_admin,cap_net_raw+ep alfred
$ ./alfred -u alfred.sock -i eth0
-The user running alfred must still be in a group which is allowed to access
-/sys/kernel/debugfs to correctly choose best neighbors for communication.
-It is possible (but not recommended) to disable the neighbor
-selection/prioritization using the parameter '-b none'.
-
License
=======
@@ -22,11 +22,6 @@
#include <sys/types.h>
#include "batadv_querynl.h"
-#include "debugfs.h"
-
-#define DEBUG_BATIF_PATH_FMT "%s/batman_adv/%s"
-#define DEBUG_TRANSTABLE_GLOBAL "transtable_global"
-#define DEBUG_ORIGINATORS "originators"
static int enable_net_admin_capability(int enable)
{
@@ -135,36 +130,6 @@ int ipv4_to_mac(struct interface *interface,
return 0;
}
-static int batadv_interface_check_debugfs(const char *mesh_iface)
-{
- char full_path[MAX_PATH + 1];
- FILE *f;
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_TRANSTABLE_GLOBAL,
- mesh_iface, full_path, sizeof(full_path));
- f = fopen(full_path, "r");
- if (!f) {
- fprintf(stderr,
- "Could not find %s for interface %s. Make sure it is a valid batman-adv soft-interface\n",
- DEBUG_TRANSTABLE_GLOBAL, mesh_iface);
- return -1;
- }
- fclose(f);
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_ORIGINATORS,
- mesh_iface, full_path, sizeof(full_path));
- f = fopen(full_path, "r");
- if (!f) {
- fprintf(stderr,
- "Could not find %s for interface %s. Make sure it is a valid batman-adv soft-interface\n",
- DEBUG_ORIGINATORS, mesh_iface);
- return -1;
- }
- fclose(f);
-
- return 0;
-}
-
int batadv_interface_check(const char *mesh_iface)
{
int ret;
@@ -173,86 +138,9 @@ int batadv_interface_check(const char *mesh_iface)
ret = batadv_interface_check_netlink(mesh_iface);
enable_net_admin_capability(0);
- if (ret == -EOPNOTSUPP)
- ret = batadv_interface_check_debugfs(mesh_iface);
-
return ret;
}
-static int translate_mac_debugfs(const char *mesh_iface,
- struct hashtable_t *tg_hash)
-{
- enum {
- tg_start,
- tg_mac,
- tg_via,
- tg_originator,
- } pos;
- char full_path[MAX_PATH+1];
- struct ether_addr *mac_tmp;
- struct ether_addr mac;
- FILE *f = NULL;
- size_t len = 0;
- char *line = NULL;
- char *input, *saveptr, *token;
- int line_invalid;
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_TRANSTABLE_GLOBAL,
- mesh_iface, full_path, sizeof(full_path));
-
- f = fopen(full_path, "r");
- if (!f)
- return -EOPNOTSUPP;
-
- while (getline(&line, &len, f) != -1) {
- line_invalid = 0;
- pos = tg_start;
- input = line;
-
- while ((token = strtok_r(input, " \t", &saveptr))) {
- input = NULL;
-
- switch (pos) {
- case tg_start:
- if (strcmp(token, "*") != 0)
- line_invalid = 1;
- else
- pos = tg_mac;
- break;
- case tg_mac:
- mac_tmp = ether_aton(token);
- if (!mac_tmp) {
- line_invalid = 1;
- } else {
- memcpy(&mac, mac_tmp, sizeof(mac));
- pos = tg_via;
- }
- break;
- case tg_via:
- if (strcmp(token, "via") == 0)
- pos = tg_originator;
- break;
- case tg_originator:
- mac_tmp = ether_aton(token);
- if (!mac_tmp)
- line_invalid = 1;
- else
- tg_hash_add(tg_hash, &mac, mac_tmp);
- break;
- }
-
- if (line_invalid)
- break;
- }
- }
-
- if (f)
- fclose(f);
- free(line);
-
- return 0;
-}
-
static int tg_compare(void *d1, void *d2)
{
struct tg_entry *s1 = d1, *s2 = d2;
@@ -285,19 +173,15 @@ static int tg_choose(void *d1, int size)
struct hashtable_t *tg_hash_new(const char *mesh_iface)
{
struct hashtable_t *tg_hash;
- int ret;
tg_hash = hash_new(64, tg_compare, tg_choose);
if (!tg_hash)
return NULL;
enable_net_admin_capability(1);
- ret = translate_mac_netlink(mesh_iface, tg_hash);
+ translate_mac_netlink(mesh_iface, tg_hash);
enable_net_admin_capability(0);
- if (ret == -EOPNOTSUPP)
- translate_mac_debugfs(mesh_iface, tg_hash);
-
return tg_hash;
}
@@ -341,86 +225,6 @@ struct ether_addr *translate_mac(struct hashtable_t *tg_hash,
return &found->originator;
}
-static int get_tq_debugfs(const char *mesh_iface, struct hashtable_t *orig_hash)
-{
- enum {
- orig_mac,
- orig_lastseen,
- orig_tqstart,
- orig_tqvalue,
- } pos;
- char full_path[MAX_PATH + 1];
- struct ether_addr *mac_tmp;
- FILE *f = NULL;
- size_t len = 0;
- char *line = NULL;
- char *input, *saveptr, *token;
- int line_invalid;
- uint8_t tq;
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_ORIGINATORS,
- mesh_iface, full_path, sizeof(full_path));
-
- f = fopen(full_path, "r");
- if (!f)
- return -EOPNOTSUPP;
-
- while (getline(&line, &len, f) != -1) {
- line_invalid = 0;
- pos = orig_mac;
- input = line;
-
- while ((token = strtok_r(input, " \t", &saveptr))) {
- input = NULL;
-
- switch (pos) {
- case orig_mac:
- mac_tmp = ether_aton(token);
- if (!mac_tmp)
- line_invalid = 1;
- else
- pos = orig_lastseen;
- break;
- case orig_lastseen:
- pos = orig_tqstart;
- break;
- case orig_tqstart:
- if (strlen(token) == 0) {
- line_invalid = 1;
- break;
- } else if (token[0] != '(') {
- line_invalid = 1;
- break;
- } else if (strlen(token) == 1) {
- pos = orig_tqvalue;
- break;
- }
-
- token++;
- /* fall through */
- case orig_tqvalue:
- if (token[strlen(token) - 1] != ')') {
- line_invalid = 1;
- } else {
- token[strlen(token) - 1] = '\0';
- tq = strtol(token, NULL, 10);
- orig_hash_add(orig_hash, mac_tmp, tq);
- }
- break;
- }
-
- if (line_invalid)
- break;
- }
- }
-
- if (f)
- fclose(f);
- free(line);
-
- return 0;
-}
-
static int orig_compare(void *d1, void *d2)
{
struct orig_entry *s1 = d1, *s2 = d2;
@@ -453,19 +257,15 @@ static int orig_choose(void *d1, int size)
struct hashtable_t *orig_hash_new(const char *mesh_iface)
{
struct hashtable_t *orig_hash;
- int ret;
orig_hash = hash_new(64, orig_compare, orig_choose);
if (!orig_hash)
return NULL;
enable_net_admin_capability(1);
- ret = get_tq_netlink(mesh_iface, orig_hash);
+ get_tq_netlink(mesh_iface, orig_hash);
enable_net_admin_capability(0);
- if (ret == -EOPNOTSUPP)
- get_tq_debugfs(mesh_iface, orig_hash);
-
return orig_hash;
}
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__ */
@@ -18,7 +18,6 @@
#include <unistd.h>
#endif
#include "alfred.h"
-#include "debugfs.h"
#include "packet.h"
#include "list.h"
@@ -167,9 +166,6 @@ static struct globals *alfred_init(int argc, char *argv[])
{NULL, 0, NULL, 0},
};
- /* We need full capabilities to mount debugfs, so do that now */
- debugfs_mount(NULL);
-
ret = reduce_capabilities();
if (ret < 0)
return NULL;
@@ -8,7 +8,6 @@
# batadv-vis build
BINARY_NAME = batadv-vis
-OBJ += debugfs.o
OBJ += netlink.o
OBJ += vis.o
MANPAGE = man/batadv-vis.8
deleted file mode 120000
@@ -1 +0,0 @@
-../debugfs.c
\ No newline at end of file
deleted file mode 120000
@@ -1 +0,0 @@
-../debugfs.h
\ No newline at end of file
@@ -26,7 +26,6 @@
#include "batman_adv.h"
#include "netlink.h"
-#include "debugfs.h"
#define IFACE_STATUS_LEN 256
@@ -78,25 +77,6 @@ static char *mac_to_str(uint8_t *mac)
return macstr;
}
-static uint8_t *str_to_mac(char *str)
-{
- static uint8_t mac[ETH_ALEN];
- int ret;
-
- if (!str)
- return NULL;
-
- ret = sscanf(str,
- "%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX",
- &mac[0], &mac[1], &mac[2],
- &mac[3], &mac[4], &mac[5]);
-
- if (ret != 6)
- return NULL;
-
- return mac;
-}
-
static int get_if_mac(char *ifname, uint8_t *mac)
{
struct ifreq ifr;
@@ -274,7 +254,7 @@ static int parse_transtable_local_netlink_cb(struct nl_msg *msg, void *arg)
return NL_OK;
}
-static int parse_transtable_local_netlink(struct globals *globals)
+static int parse_transtable_local(struct globals *globals)
{
struct vis_netlink_opts opts = {
.globals = globals,
@@ -294,69 +274,6 @@ static int parse_transtable_local_netlink(struct globals *globals)
return 0;
}
-static int parse_transtable_local_debugfs(struct globals *globals)
-{
- char *fbuf;
- char *lptr, *tptr;
- char *temp1, *temp2;
- int lnum, tnum;
- uint8_t *mac;
- struct vis_list_entry *v_entry;
- char path[1024];
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" "transtable_local", globals->interface, path, sizeof(path));
- path[sizeof(path) - 1] = 0;
-
- fbuf = read_file(path);
- if (!fbuf)
- return -1;
-
- for (lptr = fbuf, lnum = 0; ; lptr = NULL, lnum++) {
- lptr = strtok_r(lptr, "\n", &temp1);
- if (!lptr)
- break;
-
- if (lnum < 1)
- continue;
-
- for (tptr = lptr, tnum = 0;; tptr = NULL, tnum++) {
- tptr = strtok_r(tptr, "\t ", &temp2);
- if (!tptr)
- break;
- if (tnum == 1) {
- v_entry = malloc(sizeof(*v_entry));
- if (!v_entry)
- continue;
-
- mac = str_to_mac(tptr);
- if (!mac) {
- free(v_entry);
- continue;
- }
-
- memcpy(v_entry->v.mac, mac, ETH_ALEN);
- v_entry->v.ifindex = 255;
- v_entry->v.qual = 0;
- list_add_tail(&v_entry->list, &globals->entry_list);
- }
- }
- }
- free(fbuf);
-
- return 0;
-}
-
-static int parse_transtable_local(struct globals *globals)
-{
- int ret;
-
- ret = parse_transtable_local_netlink(globals);
- if (ret != -EOPNOTSUPP)
- return ret;
-
- return parse_transtable_local_debugfs(globals);
-}
-
static void clear_lists(struct globals *globals)
{
struct vis_list_entry *v_entry, *v_entry_safe;
@@ -693,7 +610,7 @@ static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg)
return NL_OK;
}
-static int parse_orig_list_netlink(struct globals *globals)
+static int parse_orig_list(struct globals *globals)
{
struct vis_netlink_opts opts = {
.globals = globals,
@@ -712,84 +629,6 @@ static int parse_orig_list_netlink(struct globals *globals)
return 0;
}
-static int parse_orig_list_debugfs(struct globals *globals)
-{
- char *fbuf;
- char *lptr, *tptr;
- char *temp1, *temp2;
- char *dest, *tq, *neigh, *iface;
- int lnum, tnum, ifindex, tq_val;
- uint8_t *mac;
- char path[1024];
- struct vis_list_entry *v_entry;
-
- debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" "originators", globals->interface, path, sizeof(path));
- fbuf = read_file(path);
- if (!fbuf)
- return -1;
-
- for (lptr = fbuf, lnum = 0; ; lptr = NULL, lnum++) {
- lptr = strtok_r(lptr, "\n", &temp1);
- if (!lptr)
- break;
- if (lnum < 2)
- continue;
-
- for (tptr = lptr, tnum = 0;; tptr = NULL, tnum++) {
- tptr = strtok_r(tptr, "\t []()", &temp2);
- if (!tptr)
- break;
- switch (tnum) {
- case 0: dest = tptr; break;
- case 2: tq = tptr; break;
- case 3: neigh = tptr; break;
- case 4: iface = tptr; break;
- default: break;
- }
- }
- if (tnum > 4) {
- if (strcmp(dest, neigh) == 0) {
- tq_val = strtol(tq, NULL, 10);
- if (tq_val < 1 || tq_val > 255)
- continue;
-
- mac = str_to_mac(dest);
- if (!mac)
- continue;
-
- ifindex = get_if_index_byname(globals, iface);
- if (ifindex < 0)
- continue;
-
- v_entry = malloc(sizeof(*v_entry));
- if (!v_entry)
- continue;
-
- memcpy(v_entry->v.mac, mac, ETH_ALEN);
- v_entry->v.ifindex = ifindex;
- v_entry->v.qual = tq_val;
- list_add_tail(&v_entry->list, &globals->entry_list);
-
- }
- }
-
- }
- free(fbuf);
-
- return 0;
-}
-
-static int parse_orig_list(struct globals *globals)
-{
- int ret;
-
- ret = parse_orig_list_netlink(globals);
- if (ret != -EOPNOTSUPP)
- return ret;
-
- return parse_orig_list_debugfs(globals);
-}
-
static int vis_publish_data(struct globals *globals)
{
int len, ret;
@@ -1296,8 +1135,6 @@ static struct globals *vis_init(int argc, char *argv[])
static int vis_server(struct globals *globals)
{
- debugfs_mount(NULL);
-
globals->push = (struct alfred_push_data_v0 *) globals->buf;
globals->vis_data = (struct vis_v1 *) (globals->buf + sizeof(*globals->push) + sizeof(struct alfred_data));
@@ -24,7 +24,6 @@
#define UPDATE_INTERVAL 10
#define SYS_IFACE_PATH "/sys/class/net"
-#define DEBUG_BATIF_PATH_FMT "%s/batman_adv/%s"
#define SYS_IFACE_STATUS_FMT SYS_IFACE_PATH"/%s/batman_adv/iface_status"