forked from Minki/linux
This cleanup patchset includes the following patches:
- bump version strings, by Simon Wunderlich - update include for min/max helpers, by Sven Eckelmann - add infrastructure and netlink functions for routing algo selection, by Sven Eckelmann (2 patches) - drop deprecated debugfs and sysfs support and obsoleted functionality, by Sven Eckelmann (3 patches) - drop unused include in fragmentation.c, by Simon Wunderlich -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAl/KWIkWHHN3QHNpbW9u d3VuZGVybGljaC5kZQAKCRChK+OYQpKeoTrTEACUImdOCWv4+NnEQfChQv6Y3i18 gJABXoOkWLfFpGBUlw/uYzFKpMEWZ0orHig9gucC+rmjNc8veWwAOugJoTPTKQJZ /4yndhM0x39vWex03rdDmyqzCEh1V1Q9VcdEuD6XbJDaK5F4jDu3NQVneOijIkN+ 5PzhlvtUlfe8csykOCOoC9Y5wy82fEhcEvuSq+Z6dU3Cb3EGHtEUtZ4orDkpnnml 7XEcn5C5+OFGlz/ikiszKumTtNK+dmGluOxoyfAzEjQHK7PoTorcXFS2YUoSWeqQ gmYZ56RBqEHjo4eqcaEgcqq5v8cTPCEMCB8UQjAffxrhloRKHRhQOysG1+OnzGA8 IQ2ARHLQCVPVraXF2ixE0D3BvjKmtMmcvZOCXwhCHDajn9jFKAh0+hnInDyv6Fp1 7eUfpHACL9EQDxKWXeQg37X2mk3hHJ+4zgZOYidahVeKbiiexe2heaHTYAbr9rIf 8hvtlgMg4AnwL3IxadrKwsbJ5t7TEPLTInf47hPvpRg7SmthDTcgso4VDwmWgB8W Tlug8/NoXXDCmDhXUpvyi9+idHe0J8xvHl/2xGC7aSsPAbuhqOuefMKr36YhXJTY vBA5Ih5ppylJ8Dzwa0TbonvQbOAinA8YTa6izKxY4e+xTPB2jz/WT2vciEZv2+ig vNIPFrLZ7OFMohCDfQ== =tNKF -----END PGP SIGNATURE----- Merge tag 'batadv-next-pullrequest-20201204' of git://git.open-mesh.org/linux-merge Simon Wunderlich says: ==================== This cleanup patchset includes the following patches: - bump version strings, by Simon Wunderlich - update include for min/max helpers, by Sven Eckelmann - add infrastructure and netlink functions for routing algo selection, by Sven Eckelmann (2 patches) - drop deprecated debugfs and sysfs support and obsoleted functionality, by Sven Eckelmann (3 patches) - drop unused include in fragmentation.c, by Simon Wunderlich * tag 'batadv-next-pullrequest-20201204' of git://git.open-mesh.org/linux-merge: batman-adv: Drop unused soft-interface.h include in fragmentation.c batman-adv: Drop legacy code for auto deleting mesh interfaces batman-adv: Drop deprecated debugfs support batman-adv: Drop deprecated sysfs support batman-adv: Allow selection of routing algorithm over rtnetlink batman-adv: Prepare infrastructure for newlink settings batman-adv: Add new include for min/max helpers batman-adv: Start new development cycle ==================== Link: https://lore.kernel.org/r/20201204154631.21063-1-sw@simonwunderlich.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
78d6bb584d
@ -1,32 +0,0 @@
|
||||
This ABI is deprecated and will be removed after 2021. It is
|
||||
replaced with the batadv generic netlink family.
|
||||
|
||||
What: /sys/class/net/<iface>/batman-adv/elp_interval
|
||||
Date: Feb 2014
|
||||
Contact: Linus Lüssing <linus.luessing@web.de>
|
||||
Description:
|
||||
Defines the interval in milliseconds in which batman
|
||||
emits probing packets for neighbor sensing (ELP).
|
||||
|
||||
What: /sys/class/net/<iface>/batman-adv/iface_status
|
||||
Date: May 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Indicates the status of <iface> as it is seen by batman.
|
||||
|
||||
What: /sys/class/net/<iface>/batman-adv/mesh_iface
|
||||
Date: May 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
The /sys/class/net/<iface>/batman-adv/mesh_iface file
|
||||
displays the batman mesh interface this <iface>
|
||||
currently is associated with.
|
||||
|
||||
What: /sys/class/net/<iface>/batman-adv/throughput_override
|
||||
Date: Feb 2014
|
||||
Contact: Antonio Quartulli <a@unstable.cc>
|
||||
description:
|
||||
Defines the throughput value to be used by B.A.T.M.A.N. V
|
||||
when estimating the link throughput using this interface.
|
||||
If the value is set to 0 then batman-adv will try to
|
||||
estimate the throughput by itself.
|
@ -1,110 +0,0 @@
|
||||
This ABI is deprecated and will be removed after 2021. It is
|
||||
replaced with the batadv generic netlink family.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/aggregated_ogms
|
||||
Date: May 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Indicates whether the batman protocol messages of the
|
||||
mesh <mesh_iface> shall be aggregated or not.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/<vlan_subdir>/ap_isolation
|
||||
Date: May 2011
|
||||
Contact: Antonio Quartulli <a@unstable.cc>
|
||||
Description:
|
||||
Indicates whether the data traffic going from a
|
||||
wireless client to another wireless client will be
|
||||
silently dropped. <vlan_subdir> is empty when referring
|
||||
to the untagged lan.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/bonding
|
||||
Date: June 2010
|
||||
Contact: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
Description:
|
||||
Indicates whether the data traffic going through the
|
||||
mesh will be sent using multiple interfaces at the
|
||||
same time (if available).
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/bridge_loop_avoidance
|
||||
Date: November 2011
|
||||
Contact: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
Description:
|
||||
Indicates whether the bridge loop avoidance feature
|
||||
is enabled. This feature detects and avoids loops
|
||||
between the mesh and devices bridged with the soft
|
||||
interface <mesh_iface>.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/fragmentation
|
||||
Date: October 2010
|
||||
Contact: Andreas Langer <an.langer@gmx.de>
|
||||
Description:
|
||||
Indicates whether the data traffic going through the
|
||||
mesh will be fragmented or silently discarded if the
|
||||
packet size exceeds the outgoing interface MTU.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/gw_bandwidth
|
||||
Date: October 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Defines the bandwidth which is propagated by this
|
||||
node if gw_mode was set to 'server'.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/gw_mode
|
||||
Date: October 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Defines the state of the gateway features. Can be
|
||||
either 'off', 'client' or 'server'.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/gw_sel_class
|
||||
Date: October 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Defines the selection criteria this node will use
|
||||
to choose a gateway if gw_mode was set to 'client'.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/hop_penalty
|
||||
Date: Oct 2010
|
||||
Contact: Linus Lüssing <linus.luessing@web.de>
|
||||
Description:
|
||||
Defines the penalty which will be applied to an
|
||||
originator message's tq-field on every hop.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/isolation_mark
|
||||
Date: Nov 2013
|
||||
Contact: Antonio Quartulli <a@unstable.cc>
|
||||
Description:
|
||||
Defines the isolation mark (and its bitmask) which
|
||||
is used to classify clients as "isolated" by the
|
||||
Extended Isolation feature.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/multicast_mode
|
||||
Date: Feb 2014
|
||||
Contact: Linus Lüssing <linus.luessing@web.de>
|
||||
Description:
|
||||
Indicates whether multicast optimizations are enabled
|
||||
or disabled. If set to zero then all nodes in the
|
||||
mesh are going to use classic flooding for any
|
||||
multicast packet with no optimizations.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/network_coding
|
||||
Date: Nov 2012
|
||||
Contact: Martin Hundeboll <martin@hundeboll.net>
|
||||
Description:
|
||||
Controls whether Network Coding (using some magic
|
||||
to send fewer wifi packets but still the same
|
||||
content) is enabled or not.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/orig_interval
|
||||
Date: May 2010
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Defines the interval in milliseconds in which batman
|
||||
sends its protocol messages.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/routing_algo
|
||||
Date: Dec 2011
|
||||
Contact: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Description:
|
||||
Defines the routing procotol this mesh instance
|
||||
uses to find the optimal paths through the mesh.
|
@ -3111,8 +3111,6 @@ Q: https://patchwork.open-mesh.org/project/batman/list/
|
||||
B: https://www.open-mesh.org/projects/batman-adv/issues
|
||||
C: irc://chat.freenode.net/batman
|
||||
T: git https://git.open-mesh.org/linux-merge.git
|
||||
F: Documentation/ABI/obsolete/sysfs-class-net-batman-adv
|
||||
F: Documentation/ABI/obsolete/sysfs-class-net-mesh
|
||||
F: Documentation/networking/batman-adv.rst
|
||||
F: include/uapi/linux/batadv_packet.h
|
||||
F: include/uapi/linux/batman_adv.h
|
||||
|
@ -675,4 +675,30 @@ enum batadv_tp_meter_reason {
|
||||
BATADV_TP_REASON_TOO_MANY = 133,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum batadv_ifla_attrs - batman-adv ifla nested attributes
|
||||
*/
|
||||
enum batadv_ifla_attrs {
|
||||
/**
|
||||
* @IFLA_BATADV_UNSPEC: unspecified attribute which is not parsed by
|
||||
* rtnetlink
|
||||
*/
|
||||
IFLA_BATADV_UNSPEC,
|
||||
|
||||
/**
|
||||
* @IFLA_BATADV_ALGO_NAME: routing algorithm (name) which should be
|
||||
* used by the newly registered batadv net_device.
|
||||
*/
|
||||
IFLA_BATADV_ALGO_NAME,
|
||||
|
||||
/* add attributes above here, update the policy in soft-interface.c */
|
||||
|
||||
/**
|
||||
* @__IFLA_BATADV_MAX: internal use
|
||||
*/
|
||||
__IFLA_BATADV_MAX,
|
||||
};
|
||||
|
||||
#define IFLA_BATADV_MAX (__IFLA_BATADV_MAX - 1)
|
||||
|
||||
#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */
|
||||
|
@ -76,37 +76,14 @@ config BATMAN_ADV_MCAST
|
||||
reduce the air overhead while improving the reliability of
|
||||
multicast messages.
|
||||
|
||||
config BATMAN_ADV_DEBUGFS
|
||||
bool "batman-adv debugfs entries"
|
||||
depends on BATMAN_ADV
|
||||
depends on DEBUG_FS
|
||||
help
|
||||
Enable this to export routing related debug tables via debugfs.
|
||||
The information for each soft-interface and used hard-interface can be
|
||||
found under batman_adv/
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config BATMAN_ADV_DEBUG
|
||||
bool "B.A.T.M.A.N. debugging"
|
||||
depends on BATMAN_ADV
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. This enables compilation of support for
|
||||
outputting debugging information to the debugfs log or tracing
|
||||
buffer. The output is controlled via the batadv netdev specific
|
||||
log_level setting.
|
||||
|
||||
config BATMAN_ADV_SYSFS
|
||||
bool "batman-adv sysfs entries"
|
||||
depends on BATMAN_ADV
|
||||
help
|
||||
Say Y here if you want to enable batman-adv device configuration and
|
||||
status interface through sysfs attributes. It is replaced by the
|
||||
batadv generic netlink family but still used by various userspace
|
||||
tools and scripts.
|
||||
|
||||
If unsure, say Y.
|
||||
outputting debugging information to the tracing buffer. The output is
|
||||
controlled via the batadv netdev specific log_level setting.
|
||||
|
||||
config BATMAN_ADV_TRACING
|
||||
bool "B.A.T.M.A.N. tracing support"
|
||||
|
@ -11,14 +11,12 @@ batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_elp.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_ogm.o
|
||||
batman-adv-y += bitarray.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_BLA) += bridge_loop_avoidance.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_DEBUGFS) += debugfs.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_DAT) += distributed-arp-table.o
|
||||
batman-adv-y += fragmentation.o
|
||||
batman-adv-y += gateway_client.o
|
||||
batman-adv-y += gateway_common.o
|
||||
batman-adv-y += hard-interface.o
|
||||
batman-adv-y += hash.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_DEBUGFS) += icmp_socket.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_DEBUG) += log.o
|
||||
batman-adv-y += main.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_MCAST) += multicast.o
|
||||
@ -28,7 +26,6 @@ batman-adv-y += originator.o
|
||||
batman-adv-y += routing.o
|
||||
batman-adv-y += send.o
|
||||
batman-adv-y += soft-interface.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_SYSFS) += sysfs.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_TRACING) += trace.o
|
||||
batman-adv-y += tp_meter.o
|
||||
batman-adv-y += translation-table.o
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
@ -34,7 +33,13 @@ void batadv_algo_init(void)
|
||||
INIT_HLIST_HEAD(&batadv_algo_list);
|
||||
}
|
||||
|
||||
static struct batadv_algo_ops *batadv_algo_get(char *name)
|
||||
/**
|
||||
* batadv_algo_get() - Search for algorithm with specific name
|
||||
* @name: algorithm name to find
|
||||
*
|
||||
* Return: Pointer to batadv_algo_ops on success, NULL otherwise
|
||||
*/
|
||||
struct batadv_algo_ops *batadv_algo_get(const char *name)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
|
||||
|
||||
@ -97,7 +102,7 @@ int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
|
||||
int batadv_algo_select(struct batadv_priv *bat_priv, const char *name)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops;
|
||||
|
||||
@ -110,29 +115,6 @@ int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
|
||||
/**
|
||||
* batadv_algo_seq_print_text() - Print the supported algorithms in a seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops;
|
||||
|
||||
seq_puts(seq, "Available routing algorithms:\n");
|
||||
|
||||
hlist_for_each_entry(bat_algo_ops, &batadv_algo_list, list) {
|
||||
seq_printf(seq, " * %s\n", bat_algo_ops->name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops;
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@ -18,9 +17,9 @@ extern char batadv_routing_algo[];
|
||||
extern struct list_head batadv_hardif_list;
|
||||
|
||||
void batadv_algo_init(void);
|
||||
struct batadv_algo_ops *batadv_algo_get(const char *name);
|
||||
int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops);
|
||||
int batadv_algo_select(struct batadv_priv *bat_priv, char *name);
|
||||
int batadv_algo_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_algo_select(struct batadv_priv *bat_priv, const char *name);
|
||||
int batadv_algo_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_BAT_ALGO_H_ */
|
||||
|
@ -32,7 +32,6 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -1780,106 +1779,6 @@ free_skb:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_iv_ogm_orig_print_neigh() - print neighbors for the originator table
|
||||
* @orig_node: the orig_node for which the neighbors are printed
|
||||
* @if_outgoing: outgoing interface for these entries
|
||||
* @seq: debugfs table seq_file struct
|
||||
*
|
||||
* Must be called while holding an rcu lock.
|
||||
*/
|
||||
static void
|
||||
batadv_iv_ogm_orig_print_neigh(struct batadv_orig_node *orig_node,
|
||||
struct batadv_hard_iface *if_outgoing,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct batadv_neigh_node *neigh_node;
|
||||
struct batadv_neigh_ifinfo *n_ifinfo;
|
||||
|
||||
hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
|
||||
n_ifinfo = batadv_neigh_ifinfo_get(neigh_node, if_outgoing);
|
||||
if (!n_ifinfo)
|
||||
continue;
|
||||
|
||||
seq_printf(seq, " %pM (%3i)",
|
||||
neigh_node->addr,
|
||||
n_ifinfo->bat_iv.tq_avg);
|
||||
|
||||
batadv_neigh_ifinfo_put(n_ifinfo);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_iv_ogm_orig_print() - print the originator table
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @seq: debugfs table seq_file struct
|
||||
* @if_outgoing: the outgoing interface for which this should be printed
|
||||
*/
|
||||
static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq,
|
||||
struct batadv_hard_iface *if_outgoing)
|
||||
{
|
||||
struct batadv_neigh_node *neigh_node;
|
||||
struct batadv_hashtable *hash = bat_priv->orig_hash;
|
||||
int last_seen_msecs, last_seen_secs;
|
||||
struct batadv_orig_node *orig_node;
|
||||
struct batadv_neigh_ifinfo *n_ifinfo;
|
||||
unsigned long last_seen_jiffies;
|
||||
struct hlist_head *head;
|
||||
int batman_count = 0;
|
||||
u32 i;
|
||||
|
||||
seq_puts(seq,
|
||||
" Originator last-seen (#/255) Nexthop [outgoingIF]: Potential nexthops ...\n");
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
|
||||
neigh_node = batadv_orig_router_get(orig_node,
|
||||
if_outgoing);
|
||||
if (!neigh_node)
|
||||
continue;
|
||||
|
||||
n_ifinfo = batadv_neigh_ifinfo_get(neigh_node,
|
||||
if_outgoing);
|
||||
if (!n_ifinfo)
|
||||
goto next;
|
||||
|
||||
if (n_ifinfo->bat_iv.tq_avg == 0)
|
||||
goto next;
|
||||
|
||||
last_seen_jiffies = jiffies - orig_node->last_seen;
|
||||
last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
|
||||
last_seen_secs = last_seen_msecs / 1000;
|
||||
last_seen_msecs = last_seen_msecs % 1000;
|
||||
|
||||
seq_printf(seq, "%pM %4i.%03is (%3i) %pM [%10s]:",
|
||||
orig_node->orig, last_seen_secs,
|
||||
last_seen_msecs, n_ifinfo->bat_iv.tq_avg,
|
||||
neigh_node->addr,
|
||||
neigh_node->if_incoming->net_dev->name);
|
||||
|
||||
batadv_iv_ogm_orig_print_neigh(orig_node, if_outgoing,
|
||||
seq);
|
||||
seq_putc(seq, '\n');
|
||||
batman_count++;
|
||||
|
||||
next:
|
||||
batadv_neigh_node_put(neigh_node);
|
||||
if (n_ifinfo)
|
||||
batadv_neigh_ifinfo_put(n_ifinfo);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
if (batman_count == 0)
|
||||
seq_puts(seq, "No batman nodes in range ...\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_iv_ogm_neigh_get_tq_avg() - Get the TQ average for a neighbour on a
|
||||
* given outgoing interface.
|
||||
@ -2109,59 +2008,6 @@ batadv_iv_ogm_orig_dump(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
cb->args[2] = sub;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_iv_hardif_neigh_print() - print a single hop neighbour node
|
||||
* @seq: neighbour table seq_file struct
|
||||
* @hardif_neigh: hardif neighbour information
|
||||
*/
|
||||
static void
|
||||
batadv_iv_hardif_neigh_print(struct seq_file *seq,
|
||||
struct batadv_hardif_neigh_node *hardif_neigh)
|
||||
{
|
||||
int last_secs, last_msecs;
|
||||
|
||||
last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000;
|
||||
last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000;
|
||||
|
||||
seq_printf(seq, " %10s %pM %4i.%03is\n",
|
||||
hardif_neigh->if_incoming->net_dev->name,
|
||||
hardif_neigh->addr, last_secs, last_msecs);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_iv_ogm_neigh_print() - print the single hop neighbour list
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @seq: neighbour table seq_file struct
|
||||
*/
|
||||
static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_hardif_neigh_node *hardif_neigh;
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
int batman_count = 0;
|
||||
|
||||
seq_puts(seq, " IF Neighbor last-seen\n");
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
|
||||
if (hard_iface->soft_iface != net_dev)
|
||||
continue;
|
||||
|
||||
hlist_for_each_entry_rcu(hardif_neigh,
|
||||
&hard_iface->neigh_list, list) {
|
||||
batadv_iv_hardif_neigh_print(seq, hardif_neigh);
|
||||
batman_count++;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (batman_count == 0)
|
||||
seq_puts(seq, "No batman nodes in range ...\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_iv_ogm_neigh_diff() - calculate tq difference of two neighbors
|
||||
* @neigh1: the first neighbor object of the comparison
|
||||
@ -2557,72 +2403,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/* fails if orig_node has no router */
|
||||
static int batadv_iv_gw_write_buffer_text(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq,
|
||||
const struct batadv_gw_node *gw_node)
|
||||
{
|
||||
struct batadv_gw_node *curr_gw;
|
||||
struct batadv_neigh_node *router;
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
int ret = -1;
|
||||
|
||||
router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
|
||||
if (!router)
|
||||
goto out;
|
||||
|
||||
router_ifinfo = batadv_neigh_ifinfo_get(router, BATADV_IF_DEFAULT);
|
||||
if (!router_ifinfo)
|
||||
goto out;
|
||||
|
||||
curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
|
||||
|
||||
seq_printf(seq, "%s %pM (%3i) %pM [%10s]: %u.%u/%u.%u MBit\n",
|
||||
(curr_gw == gw_node ? "=>" : " "),
|
||||
gw_node->orig_node->orig,
|
||||
router_ifinfo->bat_iv.tq_avg, router->addr,
|
||||
router->if_incoming->net_dev->name,
|
||||
gw_node->bandwidth_down / 10,
|
||||
gw_node->bandwidth_down % 10,
|
||||
gw_node->bandwidth_up / 10,
|
||||
gw_node->bandwidth_up % 10);
|
||||
ret = seq_has_overflowed(seq) ? -1 : 0;
|
||||
|
||||
if (curr_gw)
|
||||
batadv_gw_node_put(curr_gw);
|
||||
out:
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
||||
batadv_neigh_node_put(router);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void batadv_iv_gw_print(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct batadv_gw_node *gw_node;
|
||||
int gw_count = 0;
|
||||
|
||||
seq_puts(seq,
|
||||
" Gateway (#/255) Nexthop [outgoingIF]: advertised uplink bandwidth\n");
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(gw_node, &bat_priv->gw.gateway_list, list) {
|
||||
/* fails if orig_node has no router */
|
||||
if (batadv_iv_gw_write_buffer_text(bat_priv, seq, gw_node) < 0)
|
||||
continue;
|
||||
|
||||
gw_count++;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (gw_count == 0)
|
||||
seq_puts(seq, "No gateways in range ...\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_iv_gw_dump_entry() - Dump a gateway into a message
|
||||
* @msg: Netlink message to dump into
|
||||
@ -2747,24 +2527,15 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
|
||||
.neigh = {
|
||||
.cmp = batadv_iv_ogm_neigh_cmp,
|
||||
.is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
.print = batadv_iv_neigh_print,
|
||||
#endif
|
||||
.dump = batadv_iv_ogm_neigh_dump,
|
||||
},
|
||||
.orig = {
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
.print = batadv_iv_ogm_orig_print,
|
||||
#endif
|
||||
.dump = batadv_iv_ogm_orig_dump,
|
||||
},
|
||||
.gw = {
|
||||
.init_sel_class = batadv_iv_init_sel_class,
|
||||
.get_best_gw_node = batadv_iv_gw_get_best_gw_node,
|
||||
.is_eligible = batadv_iv_gw_is_eligible,
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
.print = batadv_iv_gw_print,
|
||||
#endif
|
||||
.dump = batadv_iv_gw_dump,
|
||||
},
|
||||
};
|
||||
|
@ -13,14 +13,13 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/stddef.h>
|
||||
@ -119,92 +118,6 @@ batadv_v_hardif_neigh_init(struct batadv_hardif_neigh_node *hardif_neigh)
|
||||
batadv_v_elp_throughput_metric_update);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_v_orig_print_neigh() - print neighbors for the originator table
|
||||
* @orig_node: the orig_node for which the neighbors are printed
|
||||
* @if_outgoing: outgoing interface for these entries
|
||||
* @seq: debugfs table seq_file struct
|
||||
*
|
||||
* Must be called while holding an rcu lock.
|
||||
*/
|
||||
static void
|
||||
batadv_v_orig_print_neigh(struct batadv_orig_node *orig_node,
|
||||
struct batadv_hard_iface *if_outgoing,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct batadv_neigh_node *neigh_node;
|
||||
struct batadv_neigh_ifinfo *n_ifinfo;
|
||||
|
||||
hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
|
||||
n_ifinfo = batadv_neigh_ifinfo_get(neigh_node, if_outgoing);
|
||||
if (!n_ifinfo)
|
||||
continue;
|
||||
|
||||
seq_printf(seq, " %pM (%9u.%1u)",
|
||||
neigh_node->addr,
|
||||
n_ifinfo->bat_v.throughput / 10,
|
||||
n_ifinfo->bat_v.throughput % 10);
|
||||
|
||||
batadv_neigh_ifinfo_put(n_ifinfo);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_v_hardif_neigh_print() - print a single ELP neighbour node
|
||||
* @seq: neighbour table seq_file struct
|
||||
* @hardif_neigh: hardif neighbour information
|
||||
*/
|
||||
static void
|
||||
batadv_v_hardif_neigh_print(struct seq_file *seq,
|
||||
struct batadv_hardif_neigh_node *hardif_neigh)
|
||||
{
|
||||
int last_secs, last_msecs;
|
||||
u32 throughput;
|
||||
|
||||
last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000;
|
||||
last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000;
|
||||
throughput = ewma_throughput_read(&hardif_neigh->bat_v.throughput);
|
||||
|
||||
seq_printf(seq, "%pM %4i.%03is (%9u.%1u) [%10s]\n",
|
||||
hardif_neigh->addr, last_secs, last_msecs, throughput / 10,
|
||||
throughput % 10, hardif_neigh->if_incoming->net_dev->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_v_neigh_print() - print the single hop neighbour list
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @seq: neighbour table seq_file struct
|
||||
*/
|
||||
static void batadv_v_neigh_print(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_hardif_neigh_node *hardif_neigh;
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
int batman_count = 0;
|
||||
|
||||
seq_puts(seq,
|
||||
" Neighbor last-seen ( throughput) [ IF]\n");
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
|
||||
if (hard_iface->soft_iface != net_dev)
|
||||
continue;
|
||||
|
||||
hlist_for_each_entry_rcu(hardif_neigh,
|
||||
&hard_iface->neigh_list, list) {
|
||||
batadv_v_hardif_neigh_print(seq, hardif_neigh);
|
||||
batman_count++;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (batman_count == 0)
|
||||
seq_puts(seq, "No batman nodes in range ...\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_v_neigh_dump_neigh() - Dump a neighbour into a message
|
||||
* @msg: Netlink message to dump into
|
||||
@ -337,75 +250,6 @@ batadv_v_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
cb->args[1] = idx;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_v_orig_print() - print the originator table
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @seq: debugfs table seq_file struct
|
||||
* @if_outgoing: the outgoing interface for which this should be printed
|
||||
*/
|
||||
static void batadv_v_orig_print(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq,
|
||||
struct batadv_hard_iface *if_outgoing)
|
||||
{
|
||||
struct batadv_neigh_node *neigh_node;
|
||||
struct batadv_hashtable *hash = bat_priv->orig_hash;
|
||||
int last_seen_msecs, last_seen_secs;
|
||||
struct batadv_orig_node *orig_node;
|
||||
struct batadv_neigh_ifinfo *n_ifinfo;
|
||||
unsigned long last_seen_jiffies;
|
||||
struct hlist_head *head;
|
||||
int batman_count = 0;
|
||||
u32 i;
|
||||
|
||||
seq_puts(seq,
|
||||
" Originator last-seen ( throughput) Nexthop [outgoingIF]: Potential nexthops ...\n");
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
|
||||
neigh_node = batadv_orig_router_get(orig_node,
|
||||
if_outgoing);
|
||||
if (!neigh_node)
|
||||
continue;
|
||||
|
||||
n_ifinfo = batadv_neigh_ifinfo_get(neigh_node,
|
||||
if_outgoing);
|
||||
if (!n_ifinfo)
|
||||
goto next;
|
||||
|
||||
last_seen_jiffies = jiffies - orig_node->last_seen;
|
||||
last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
|
||||
last_seen_secs = last_seen_msecs / 1000;
|
||||
last_seen_msecs = last_seen_msecs % 1000;
|
||||
|
||||
seq_printf(seq, "%pM %4i.%03is (%9u.%1u) %pM [%10s]:",
|
||||
orig_node->orig, last_seen_secs,
|
||||
last_seen_msecs,
|
||||
n_ifinfo->bat_v.throughput / 10,
|
||||
n_ifinfo->bat_v.throughput % 10,
|
||||
neigh_node->addr,
|
||||
neigh_node->if_incoming->net_dev->name);
|
||||
|
||||
batadv_v_orig_print_neigh(orig_node, if_outgoing, seq);
|
||||
seq_putc(seq, '\n');
|
||||
batman_count++;
|
||||
|
||||
next:
|
||||
batadv_neigh_node_put(neigh_node);
|
||||
if (n_ifinfo)
|
||||
batadv_neigh_ifinfo_put(n_ifinfo);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
if (batman_count == 0)
|
||||
seq_puts(seq, "No batman nodes in range ...\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_v_orig_dump_subentry() - Dump an originator subentry into a message
|
||||
* @msg: Netlink message to dump into
|
||||
@ -685,13 +529,6 @@ static ssize_t batadv_v_store_sel_class(struct batadv_priv *bat_priv,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t batadv_v_show_sel_class(struct batadv_priv *bat_priv, char *buff)
|
||||
{
|
||||
u32 class = atomic_read(&bat_priv->gw.sel_class);
|
||||
|
||||
return sprintf(buff, "%u.%u MBit\n", class / 10, class % 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_v_gw_throughput_get() - retrieve the GW-bandwidth for a given GW
|
||||
* @gw_node: the GW to retrieve the metric for
|
||||
@ -829,78 +666,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/* fails if orig_node has no router */
|
||||
static int batadv_v_gw_write_buffer_text(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq,
|
||||
const struct batadv_gw_node *gw_node)
|
||||
{
|
||||
struct batadv_gw_node *curr_gw;
|
||||
struct batadv_neigh_node *router;
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
int ret = -1;
|
||||
|
||||
router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
|
||||
if (!router)
|
||||
goto out;
|
||||
|
||||
router_ifinfo = batadv_neigh_ifinfo_get(router, BATADV_IF_DEFAULT);
|
||||
if (!router_ifinfo)
|
||||
goto out;
|
||||
|
||||
curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
|
||||
|
||||
seq_printf(seq, "%s %pM (%9u.%1u) %pM [%10s]: %u.%u/%u.%u MBit\n",
|
||||
(curr_gw == gw_node ? "=>" : " "),
|
||||
gw_node->orig_node->orig,
|
||||
router_ifinfo->bat_v.throughput / 10,
|
||||
router_ifinfo->bat_v.throughput % 10, router->addr,
|
||||
router->if_incoming->net_dev->name,
|
||||
gw_node->bandwidth_down / 10,
|
||||
gw_node->bandwidth_down % 10,
|
||||
gw_node->bandwidth_up / 10,
|
||||
gw_node->bandwidth_up % 10);
|
||||
ret = seq_has_overflowed(seq) ? -1 : 0;
|
||||
|
||||
if (curr_gw)
|
||||
batadv_gw_node_put(curr_gw);
|
||||
out:
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
||||
batadv_neigh_node_put(router);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_v_gw_print() - print the gateway list
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @seq: gateway table seq_file struct
|
||||
*/
|
||||
static void batadv_v_gw_print(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct batadv_gw_node *gw_node;
|
||||
int gw_count = 0;
|
||||
|
||||
seq_puts(seq,
|
||||
" Gateway ( throughput) Nexthop [outgoingIF]: advertised uplink bandwidth\n");
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(gw_node, &bat_priv->gw.gateway_list, list) {
|
||||
/* fails if orig_node has no router */
|
||||
if (batadv_v_gw_write_buffer_text(bat_priv, seq, gw_node) < 0)
|
||||
continue;
|
||||
|
||||
gw_count++;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (gw_count == 0)
|
||||
seq_puts(seq, "No gateways in range ...\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_v_gw_dump_entry() - Dump a gateway into a message
|
||||
* @msg: Netlink message to dump into
|
||||
@ -1046,26 +811,16 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
|
||||
.hardif_init = batadv_v_hardif_neigh_init,
|
||||
.cmp = batadv_v_neigh_cmp,
|
||||
.is_similar_or_better = batadv_v_neigh_is_sob,
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
.print = batadv_v_neigh_print,
|
||||
#endif
|
||||
.dump = batadv_v_neigh_dump,
|
||||
},
|
||||
.orig = {
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
.print = batadv_v_orig_print,
|
||||
#endif
|
||||
.dump = batadv_v_orig_dump,
|
||||
},
|
||||
.gw = {
|
||||
.init_sel_class = batadv_v_init_sel_class,
|
||||
.store_sel_class = batadv_v_store_sel_class,
|
||||
.show_sel_class = batadv_v_show_sel_class,
|
||||
.get_best_gw_node = batadv_v_gw_get_best_gw_node,
|
||||
.is_eligible = batadv_v_gw_is_eligible,
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
.print = batadv_v_gw_print,
|
||||
#endif
|
||||
.dump = batadv_v_gw_dump,
|
||||
},
|
||||
};
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/prandom.h>
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/prandom.h>
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -2115,69 +2114,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_bla_claim_table_seq_print_text() - print the claim table in a seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hashtable *hash = bat_priv->bla.claim_hash;
|
||||
struct batadv_bla_backbone_gw *backbone_gw;
|
||||
struct batadv_bla_claim *claim;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct hlist_head *head;
|
||||
u16 backbone_crc;
|
||||
u32 i;
|
||||
bool is_own;
|
||||
u8 *primary_addr;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
||||
primary_addr = primary_if->net_dev->dev_addr;
|
||||
seq_printf(seq,
|
||||
"Claims announced for the mesh %s (orig %pM, group id %#.4x)\n",
|
||||
net_dev->name, primary_addr,
|
||||
ntohs(bat_priv->bla.claim_dest.group));
|
||||
seq_puts(seq,
|
||||
" Client VID Originator [o] (CRC )\n");
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(claim, head, hash_entry) {
|
||||
backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
|
||||
|
||||
is_own = batadv_compare_eth(backbone_gw->orig,
|
||||
primary_addr);
|
||||
|
||||
spin_lock_bh(&backbone_gw->crc_lock);
|
||||
backbone_crc = backbone_gw->crc;
|
||||
spin_unlock_bh(&backbone_gw->crc_lock);
|
||||
seq_printf(seq, " * %pM on %5d by %pM [%c] (%#.4x)\n",
|
||||
claim->addr, batadv_print_vid(claim->vid),
|
||||
backbone_gw->orig,
|
||||
(is_own ? 'x' : ' '),
|
||||
backbone_crc);
|
||||
|
||||
batadv_backbone_gw_put(backbone_gw);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_bla_claim_dump_entry() - dump one entry of the claim table
|
||||
* to a netlink socket
|
||||
@ -2348,72 +2284,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_bla_backbone_table_seq_print_text() - print the backbone table in a
|
||||
* seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
|
||||
struct batadv_bla_backbone_gw *backbone_gw;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct hlist_head *head;
|
||||
int secs, msecs;
|
||||
u16 backbone_crc;
|
||||
u32 i;
|
||||
bool is_own;
|
||||
u8 *primary_addr;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
||||
primary_addr = primary_if->net_dev->dev_addr;
|
||||
seq_printf(seq,
|
||||
"Backbones announced for the mesh %s (orig %pM, group id %#.4x)\n",
|
||||
net_dev->name, primary_addr,
|
||||
ntohs(bat_priv->bla.claim_dest.group));
|
||||
seq_puts(seq, " Originator VID last seen (CRC )\n");
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
|
||||
msecs = jiffies_to_msecs(jiffies -
|
||||
backbone_gw->lasttime);
|
||||
secs = msecs / 1000;
|
||||
msecs = msecs % 1000;
|
||||
|
||||
is_own = batadv_compare_eth(backbone_gw->orig,
|
||||
primary_addr);
|
||||
if (is_own)
|
||||
continue;
|
||||
|
||||
spin_lock_bh(&backbone_gw->crc_lock);
|
||||
backbone_crc = backbone_gw->crc;
|
||||
spin_unlock_bh(&backbone_gw->crc_lock);
|
||||
|
||||
seq_printf(seq, " * %pM on %5d %4i.%03is (%#.4x)\n",
|
||||
backbone_gw->orig,
|
||||
batadv_print_vid(backbone_gw->vid), secs,
|
||||
msecs, backbone_crc);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_bla_backbone_dump_entry() - dump one entry of the backbone table to a
|
||||
* netlink socket
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
@ -41,10 +40,7 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node,
|
||||
int hdr_size);
|
||||
int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq,
|
||||
void *offset);
|
||||
int batadv_bla_backbone_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, u8 *orig,
|
||||
unsigned short vid);
|
||||
@ -84,18 +80,6 @@ static inline bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int batadv_bla_claim_table_seq_print_text(struct seq_file *seq,
|
||||
void *offset)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq,
|
||||
void *offset)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv,
|
||||
u8 *orig, unsigned short vid)
|
||||
{
|
||||
|
@ -1,442 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (C) 2010-2020 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner
|
||||
*/
|
||||
|
||||
#include "debugfs.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <asm/current.h>
|
||||
#include <linux/dcache.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "bridge_loop_avoidance.h"
|
||||
#include "distributed-arp-table.h"
|
||||
#include "gateway_client.h"
|
||||
#include "icmp_socket.h"
|
||||
#include "log.h"
|
||||
#include "multicast.h"
|
||||
#include "network-coding.h"
|
||||
#include "originator.h"
|
||||
#include "translation-table.h"
|
||||
|
||||
static struct dentry *batadv_debugfs;
|
||||
|
||||
/**
|
||||
* batadv_debugfs_deprecated() - Log use of deprecated batadv debugfs access
|
||||
* @file: file which was accessed
|
||||
* @alt: explanation what can be used as alternative
|
||||
*/
|
||||
void batadv_debugfs_deprecated(struct file *file, const char *alt)
|
||||
{
|
||||
struct dentry *dentry = file_dentry(file);
|
||||
const char *name = dentry->d_name.name;
|
||||
|
||||
pr_warn_ratelimited(DEPRECATED "%s (pid %d) Use of debugfs file \"%s\".\n%s",
|
||||
current->comm, task_pid_nr(current), name, alt);
|
||||
}
|
||||
|
||||
static int batadv_algorithms_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_ROUTING_ALGOS instead\n");
|
||||
return single_open(file, batadv_algo_seq_print_text, NULL);
|
||||
}
|
||||
|
||||
static int neighbors_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_NEIGHBORS instead\n");
|
||||
return single_open(file, batadv_hardif_neigh_seq_print_text, net_dev);
|
||||
}
|
||||
|
||||
static int batadv_originators_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_ORIGINATORS instead\n");
|
||||
return single_open(file, batadv_orig_seq_print_text, net_dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_originators_hardif_open() - handles debugfs output for the originator
|
||||
* table of an hard interface
|
||||
* @inode: inode pointer to debugfs file
|
||||
* @file: pointer to the seq_file
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
static int batadv_originators_hardif_open(struct inode *inode,
|
||||
struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_HARDIFS instead\n");
|
||||
return single_open(file, batadv_orig_hardif_seq_print_text, net_dev);
|
||||
}
|
||||
|
||||
static int batadv_gateways_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_GATEWAYS instead\n");
|
||||
return single_open(file, batadv_gw_client_seq_print_text, net_dev);
|
||||
}
|
||||
|
||||
static int batadv_transtable_global_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_TRANSTABLE_GLOBAL instead\n");
|
||||
return single_open(file, batadv_tt_global_seq_print_text, net_dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||
static int batadv_bla_claim_table_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_BLA_CLAIM instead\n");
|
||||
return single_open(file, batadv_bla_claim_table_seq_print_text,
|
||||
net_dev);
|
||||
}
|
||||
|
||||
static int batadv_bla_backbone_table_open(struct inode *inode,
|
||||
struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_BLA_BACKBONE instead\n");
|
||||
return single_open(file, batadv_bla_backbone_table_seq_print_text,
|
||||
net_dev);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DAT
|
||||
/**
|
||||
* batadv_dat_cache_open() - Prepare file handler for reads from dat_cache
|
||||
* @inode: inode which was opened
|
||||
* @file: file handle to be initialized
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
static int batadv_dat_cache_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_DAT_CACHE instead\n");
|
||||
return single_open(file, batadv_dat_cache_seq_print_text, net_dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int batadv_transtable_local_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_TRANSTABLE_LOCAL instead\n");
|
||||
return single_open(file, batadv_tt_local_seq_print_text, net_dev);
|
||||
}
|
||||
|
||||
struct batadv_debuginfo {
|
||||
struct attribute attr;
|
||||
const struct file_operations fops;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_NC
|
||||
static int batadv_nc_nodes_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file, "");
|
||||
return single_open(file, batadv_nc_nodes_seq_print_text, net_dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
/**
|
||||
* batadv_mcast_flags_open() - prepare file handler for reads from mcast_flags
|
||||
* @inode: inode which was opened
|
||||
* @file: file handle to be initialized
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
static int batadv_mcast_flags_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)inode->i_private;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use genl command BATADV_CMD_GET_MCAST_FLAGS instead\n");
|
||||
return single_open(file, batadv_mcast_flags_seq_print_text, net_dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define BATADV_DEBUGINFO(_name, _mode, _open) \
|
||||
struct batadv_debuginfo batadv_debuginfo_##_name = { \
|
||||
.attr = { \
|
||||
.name = __stringify(_name), \
|
||||
.mode = _mode, \
|
||||
}, \
|
||||
.fops = { \
|
||||
.owner = THIS_MODULE, \
|
||||
.open = _open, \
|
||||
.read = seq_read, \
|
||||
.llseek = seq_lseek, \
|
||||
.release = single_release, \
|
||||
}, \
|
||||
}
|
||||
|
||||
/* the following attributes are general and therefore they will be directly
|
||||
* placed in the BATADV_DEBUGFS_SUBDIR subdirectory of debugfs
|
||||
*/
|
||||
static BATADV_DEBUGINFO(routing_algos, 0444, batadv_algorithms_open);
|
||||
|
||||
static struct batadv_debuginfo *batadv_general_debuginfos[] = {
|
||||
&batadv_debuginfo_routing_algos,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* The following attributes are per soft interface */
|
||||
static BATADV_DEBUGINFO(neighbors, 0444, neighbors_open);
|
||||
static BATADV_DEBUGINFO(originators, 0444, batadv_originators_open);
|
||||
static BATADV_DEBUGINFO(gateways, 0444, batadv_gateways_open);
|
||||
static BATADV_DEBUGINFO(transtable_global, 0444, batadv_transtable_global_open);
|
||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||
static BATADV_DEBUGINFO(bla_claim_table, 0444, batadv_bla_claim_table_open);
|
||||
static BATADV_DEBUGINFO(bla_backbone_table, 0444,
|
||||
batadv_bla_backbone_table_open);
|
||||
#endif
|
||||
#ifdef CONFIG_BATMAN_ADV_DAT
|
||||
static BATADV_DEBUGINFO(dat_cache, 0444, batadv_dat_cache_open);
|
||||
#endif
|
||||
static BATADV_DEBUGINFO(transtable_local, 0444, batadv_transtable_local_open);
|
||||
#ifdef CONFIG_BATMAN_ADV_NC
|
||||
static BATADV_DEBUGINFO(nc_nodes, 0444, batadv_nc_nodes_open);
|
||||
#endif
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
static BATADV_DEBUGINFO(mcast_flags, 0444, batadv_mcast_flags_open);
|
||||
#endif
|
||||
|
||||
static struct batadv_debuginfo *batadv_mesh_debuginfos[] = {
|
||||
&batadv_debuginfo_neighbors,
|
||||
&batadv_debuginfo_originators,
|
||||
&batadv_debuginfo_gateways,
|
||||
&batadv_debuginfo_transtable_global,
|
||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||
&batadv_debuginfo_bla_claim_table,
|
||||
&batadv_debuginfo_bla_backbone_table,
|
||||
#endif
|
||||
#ifdef CONFIG_BATMAN_ADV_DAT
|
||||
&batadv_debuginfo_dat_cache,
|
||||
#endif
|
||||
&batadv_debuginfo_transtable_local,
|
||||
#ifdef CONFIG_BATMAN_ADV_NC
|
||||
&batadv_debuginfo_nc_nodes,
|
||||
#endif
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
&batadv_debuginfo_mcast_flags,
|
||||
#endif
|
||||
NULL,
|
||||
};
|
||||
|
||||
#define BATADV_HARDIF_DEBUGINFO(_name, _mode, _open) \
|
||||
struct batadv_debuginfo batadv_hardif_debuginfo_##_name = { \
|
||||
.attr = { \
|
||||
.name = __stringify(_name), \
|
||||
.mode = _mode, \
|
||||
}, \
|
||||
.fops = { \
|
||||
.owner = THIS_MODULE, \
|
||||
.open = _open, \
|
||||
.read = seq_read, \
|
||||
.llseek = seq_lseek, \
|
||||
.release = single_release, \
|
||||
}, \
|
||||
}
|
||||
|
||||
static BATADV_HARDIF_DEBUGINFO(originators, 0444,
|
||||
batadv_originators_hardif_open);
|
||||
|
||||
static struct batadv_debuginfo *batadv_hardif_debuginfos[] = {
|
||||
&batadv_hardif_debuginfo_originators,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/**
|
||||
* batadv_debugfs_init() - Initialize soft interface independent debugfs entries
|
||||
*/
|
||||
void batadv_debugfs_init(void)
|
||||
{
|
||||
struct batadv_debuginfo **bat_debug;
|
||||
|
||||
batadv_debugfs = debugfs_create_dir(BATADV_DEBUGFS_SUBDIR, NULL);
|
||||
|
||||
for (bat_debug = batadv_general_debuginfos; *bat_debug; ++bat_debug)
|
||||
debugfs_create_file(((*bat_debug)->attr).name,
|
||||
S_IFREG | ((*bat_debug)->attr).mode,
|
||||
batadv_debugfs, NULL, &(*bat_debug)->fops);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_destroy() - Remove all debugfs entries
|
||||
*/
|
||||
void batadv_debugfs_destroy(void)
|
||||
{
|
||||
debugfs_remove_recursive(batadv_debugfs);
|
||||
batadv_debugfs = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_add_hardif() - creates the base directory for a hard interface
|
||||
* in debugfs.
|
||||
* @hard_iface: hard interface which should be added.
|
||||
*/
|
||||
void batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
struct net *net = dev_net(hard_iface->net_dev);
|
||||
struct batadv_debuginfo **bat_debug;
|
||||
|
||||
if (net != &init_net)
|
||||
return;
|
||||
|
||||
hard_iface->debug_dir = debugfs_create_dir(hard_iface->net_dev->name,
|
||||
batadv_debugfs);
|
||||
|
||||
for (bat_debug = batadv_hardif_debuginfos; *bat_debug; ++bat_debug)
|
||||
debugfs_create_file(((*bat_debug)->attr).name,
|
||||
S_IFREG | ((*bat_debug)->attr).mode,
|
||||
hard_iface->debug_dir, hard_iface->net_dev,
|
||||
&(*bat_debug)->fops);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif
|
||||
* @hard_iface: hard interface which was renamed
|
||||
*/
|
||||
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
const char *name = hard_iface->net_dev->name;
|
||||
struct dentry *dir;
|
||||
|
||||
dir = hard_iface->debug_dir;
|
||||
if (!dir)
|
||||
return;
|
||||
|
||||
debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_del_hardif() - delete the base directory for a hard interface
|
||||
* in debugfs.
|
||||
* @hard_iface: hard interface which is deleted.
|
||||
*/
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
struct net *net = dev_net(hard_iface->net_dev);
|
||||
|
||||
if (net != &init_net)
|
||||
return;
|
||||
|
||||
if (batadv_debugfs) {
|
||||
debugfs_remove_recursive(hard_iface->debug_dir);
|
||||
hard_iface->debug_dir = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_add_meshif() - Initialize interface dependent debugfs entries
|
||||
* @dev: netdev struct of the soft interface
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
int batadv_debugfs_add_meshif(struct net_device *dev)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
struct batadv_debuginfo **bat_debug;
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
if (net != &init_net)
|
||||
return 0;
|
||||
|
||||
bat_priv->debug_dir = debugfs_create_dir(dev->name, batadv_debugfs);
|
||||
|
||||
batadv_socket_setup(bat_priv);
|
||||
|
||||
if (batadv_debug_log_setup(bat_priv) < 0)
|
||||
goto rem_attr;
|
||||
|
||||
for (bat_debug = batadv_mesh_debuginfos; *bat_debug; ++bat_debug)
|
||||
debugfs_create_file(((*bat_debug)->attr).name,
|
||||
S_IFREG | ((*bat_debug)->attr).mode,
|
||||
bat_priv->debug_dir, dev,
|
||||
&(*bat_debug)->fops);
|
||||
|
||||
batadv_nc_init_debugfs(bat_priv);
|
||||
|
||||
return 0;
|
||||
rem_attr:
|
||||
debugfs_remove_recursive(bat_priv->debug_dir);
|
||||
bat_priv->debug_dir = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_rename_meshif() - Fix debugfs path for renamed softif
|
||||
* @dev: net_device which was renamed
|
||||
*/
|
||||
void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
const char *name = dev->name;
|
||||
struct dentry *dir;
|
||||
|
||||
dir = bat_priv->debug_dir;
|
||||
if (!dir)
|
||||
return;
|
||||
|
||||
debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debugfs_del_meshif() - Remove interface dependent debugfs entries
|
||||
* @dev: netdev struct of the soft interface
|
||||
*/
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
if (net != &init_net)
|
||||
return;
|
||||
|
||||
batadv_debug_log_cleanup(bat_priv);
|
||||
|
||||
if (batadv_debugfs) {
|
||||
debugfs_remove_recursive(bat_priv->debug_dir);
|
||||
bat_priv->debug_dir = NULL;
|
||||
}
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (C) 2010-2020 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner
|
||||
*/
|
||||
|
||||
#ifndef _NET_BATMAN_ADV_DEBUGFS_H_
|
||||
#define _NET_BATMAN_ADV_DEBUGFS_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#define BATADV_DEBUGFS_SUBDIR "batman_adv"
|
||||
|
||||
#if IS_ENABLED(CONFIG_BATMAN_ADV_DEBUGFS)
|
||||
|
||||
void batadv_debugfs_deprecated(struct file *file, const char *alt);
|
||||
void batadv_debugfs_init(void);
|
||||
void batadv_debugfs_destroy(void);
|
||||
int batadv_debugfs_add_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_rename_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
|
||||
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface);
|
||||
|
||||
#else
|
||||
|
||||
static inline void batadv_debugfs_deprecated(struct file *file, const char *alt)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void batadv_debugfs_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void batadv_debugfs_destroy(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int batadv_debugfs_add_meshif(struct net_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void batadv_debugfs_del_meshif(struct net_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
void batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_DEBUGFS_H_ */
|
@ -26,7 +26,6 @@
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -842,60 +841,6 @@ void batadv_dat_free(struct batadv_priv *bat_priv)
|
||||
batadv_dat_hash_free(bat_priv);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_dat_cache_seq_print_text() - print the local DAT hash table
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hashtable *hash = bat_priv->dat.hash;
|
||||
struct batadv_dat_entry *dat_entry;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct hlist_head *head;
|
||||
unsigned long last_seen_jiffies;
|
||||
int last_seen_msecs, last_seen_secs, last_seen_mins;
|
||||
u32 i;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
||||
seq_printf(seq, "Distributed ARP Table (%s):\n", net_dev->name);
|
||||
seq_puts(seq,
|
||||
" IPv4 MAC VID last-seen\n");
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(dat_entry, head, hash_entry) {
|
||||
last_seen_jiffies = jiffies - dat_entry->last_update;
|
||||
last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
|
||||
last_seen_mins = last_seen_msecs / 60000;
|
||||
last_seen_msecs = last_seen_msecs % 60000;
|
||||
last_seen_secs = last_seen_msecs / 1000;
|
||||
|
||||
seq_printf(seq, " * %15pI4 %pM %4i %6i:%02i\n",
|
||||
&dat_entry->ip, dat_entry->mac_addr,
|
||||
batadv_print_vid(dat_entry->vid),
|
||||
last_seen_mins, last_seen_secs);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_dat_cache_dump_entry() - dump one entry of the DAT cache table to a
|
||||
* netlink socket
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
@ -74,7 +73,6 @@ batadv_dat_init_own_addr(struct batadv_priv *bat_priv,
|
||||
|
||||
int batadv_dat_init(struct batadv_priv *bat_priv);
|
||||
void batadv_dat_free(struct batadv_priv *bat_priv);
|
||||
int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
|
||||
/**
|
||||
|
@ -14,8 +14,8 @@
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
@ -27,7 +27,6 @@
|
||||
#include "originator.h"
|
||||
#include "routing.h"
|
||||
#include "send.h"
|
||||
#include "soft-interface.h"
|
||||
|
||||
/**
|
||||
* batadv_frag_clear_chain() - delete entries in the fragment buffer chain
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -511,44 +510,6 @@ void batadv_gw_node_free(struct batadv_priv *bat_priv)
|
||||
spin_unlock_bh(&bat_priv->gw.list_lock);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
|
||||
/**
|
||||
* batadv_gw_client_seq_print_text() - Print the gateway table in a seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hard_iface *primary_if;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
return 0;
|
||||
|
||||
seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n",
|
||||
BATADV_SOURCE_VERSION, primary_if->net_dev->name,
|
||||
primary_if->net_dev->dev_addr, net_dev->name,
|
||||
bat_priv->algo_ops->name);
|
||||
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
if (!bat_priv->algo_ops->gw.print) {
|
||||
seq_puts(seq,
|
||||
"No printing function for this routing protocol\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bat_priv->algo_ops->gw.print(bat_priv, seq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_gw_dump() - Dump gateways into a message
|
||||
* @msg: Netlink message to dump into
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
@ -31,7 +30,6 @@ void batadv_gw_node_free(struct batadv_priv *bat_priv);
|
||||
void batadv_gw_node_put(struct batadv_gw_node *gw_node);
|
||||
struct batadv_gw_node *
|
||||
batadv_gw_get_selected_gw_node(struct batadv_priv *bat_priv);
|
||||
int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
bool batadv_gw_out_of_range(struct batadv_priv *bat_priv, struct sk_buff *skb);
|
||||
enum batadv_dhcp_recipient
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
@ -31,14 +32,12 @@
|
||||
|
||||
#include "bat_v.h"
|
||||
#include "bridge_loop_avoidance.h"
|
||||
#include "debugfs.h"
|
||||
#include "distributed-arp-table.h"
|
||||
#include "gateway_client.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "send.h"
|
||||
#include "soft-interface.h"
|
||||
#include "sysfs.h"
|
||||
#include "translation-table.h"
|
||||
|
||||
/**
|
||||
@ -846,11 +845,8 @@ static size_t batadv_hardif_cnt(const struct net_device *soft_iface)
|
||||
/**
|
||||
* batadv_hardif_disable_interface() - Remove hard interface from soft interface
|
||||
* @hard_iface: hard interface to be removed
|
||||
* @autodel: whether to delete soft interface when it doesn't contain any other
|
||||
* slave interfaces
|
||||
*/
|
||||
void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
|
||||
enum batadv_hard_if_cleanup autodel)
|
||||
void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
@ -888,13 +884,9 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
|
||||
batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
|
||||
|
||||
/* nobody uses this interface anymore */
|
||||
if (batadv_hardif_cnt(hard_iface->soft_iface) <= 1) {
|
||||
if (batadv_hardif_cnt(hard_iface->soft_iface) <= 1)
|
||||
batadv_gw_check_client_stop(bat_priv);
|
||||
|
||||
if (autodel == BATADV_IF_CLEANUP_AUTO)
|
||||
batadv_softif_destroy_sysfs(hard_iface->soft_iface);
|
||||
}
|
||||
|
||||
hard_iface->soft_iface = NULL;
|
||||
batadv_hardif_put(hard_iface);
|
||||
|
||||
@ -907,7 +899,6 @@ static struct batadv_hard_iface *
|
||||
batadv_hardif_add_interface(struct net_device *net_dev)
|
||||
{
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
int ret;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
@ -920,16 +911,10 @@ batadv_hardif_add_interface(struct net_device *net_dev)
|
||||
if (!hard_iface)
|
||||
goto release_dev;
|
||||
|
||||
ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
|
||||
if (ret)
|
||||
goto free_if;
|
||||
|
||||
hard_iface->net_dev = net_dev;
|
||||
hard_iface->soft_iface = NULL;
|
||||
hard_iface->if_status = BATADV_IF_NOT_IN_USE;
|
||||
|
||||
batadv_debugfs_add_hardif(hard_iface);
|
||||
|
||||
INIT_LIST_HEAD(&hard_iface->list);
|
||||
INIT_HLIST_HEAD(&hard_iface->neigh_list);
|
||||
|
||||
@ -953,8 +938,6 @@ batadv_hardif_add_interface(struct net_device *net_dev)
|
||||
|
||||
return hard_iface;
|
||||
|
||||
free_if:
|
||||
kfree(hard_iface);
|
||||
release_dev:
|
||||
dev_put(net_dev);
|
||||
out:
|
||||
@ -967,15 +950,12 @@ static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
|
||||
|
||||
/* first deactivate interface */
|
||||
if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
|
||||
batadv_hardif_disable_interface(hard_iface,
|
||||
BATADV_IF_CLEANUP_KEEP);
|
||||
batadv_hardif_disable_interface(hard_iface);
|
||||
|
||||
if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
|
||||
return;
|
||||
|
||||
hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
|
||||
batadv_debugfs_del_hardif(hard_iface);
|
||||
batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
|
||||
batadv_hardif_put(hard_iface);
|
||||
}
|
||||
|
||||
@ -993,13 +973,9 @@ static int batadv_hard_if_event_softif(unsigned long event,
|
||||
|
||||
switch (event) {
|
||||
case NETDEV_REGISTER:
|
||||
batadv_sysfs_add_meshif(net_dev);
|
||||
bat_priv = netdev_priv(net_dev);
|
||||
batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
|
||||
break;
|
||||
case NETDEV_CHANGENAME:
|
||||
batadv_debugfs_rename_meshif(net_dev);
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_DONE;
|
||||
@ -1064,9 +1040,6 @@ static int batadv_hard_if_event(struct notifier_block *this,
|
||||
if (batadv_is_wifi_hardif(hard_iface))
|
||||
hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
|
||||
break;
|
||||
case NETDEV_CHANGENAME:
|
||||
batadv_debugfs_rename_hardif(hard_iface);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -42,12 +42,6 @@ enum batadv_hard_if_state {
|
||||
|
||||
/** @BATADV_IF_TO_BE_ACTIVATED: interface is getting activated */
|
||||
BATADV_IF_TO_BE_ACTIVATED,
|
||||
|
||||
/**
|
||||
* @BATADV_IF_I_WANT_YOU: interface is queued up (using sysfs) for being
|
||||
* added as slave interface of a batman-adv soft interface
|
||||
*/
|
||||
BATADV_IF_I_WANT_YOU,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -73,22 +67,6 @@ enum batadv_hard_if_bcast {
|
||||
BATADV_HARDIF_BCAST_DUPORIG,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum batadv_hard_if_cleanup - Cleanup modi for soft_iface after slave removal
|
||||
*/
|
||||
enum batadv_hard_if_cleanup {
|
||||
/**
|
||||
* @BATADV_IF_CLEANUP_KEEP: Don't automatically delete soft-interface
|
||||
*/
|
||||
BATADV_IF_CLEANUP_KEEP,
|
||||
|
||||
/**
|
||||
* @BATADV_IF_CLEANUP_AUTO: Delete soft-interface after last slave was
|
||||
* removed
|
||||
*/
|
||||
BATADV_IF_CLEANUP_AUTO,
|
||||
};
|
||||
|
||||
extern struct notifier_block batadv_hard_if_notifier;
|
||||
|
||||
struct net_device *batadv_get_real_netdev(struct net_device *net_device);
|
||||
@ -98,8 +76,7 @@ struct batadv_hard_iface*
|
||||
batadv_hardif_get_by_netdev(const struct net_device *net_dev);
|
||||
int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
|
||||
struct net *net, const char *iface_name);
|
||||
void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
|
||||
enum batadv_hard_if_cleanup autodel);
|
||||
void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface);
|
||||
int batadv_hardif_min_mtu(struct net_device *soft_iface);
|
||||
void batadv_update_min_mtu(struct net_device *soft_iface);
|
||||
void batadv_hardif_release(struct kref *ref);
|
||||
|
@ -1,392 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (C) 2007-2020 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner
|
||||
*/
|
||||
|
||||
#include "icmp_socket.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/eventpoll.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/sched.h> /* for linux/wait.h */
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/wait.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
|
||||
#include "debugfs.h"
|
||||
#include "hard-interface.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "send.h"
|
||||
|
||||
static struct batadv_socket_client *batadv_socket_client_hash[256];
|
||||
|
||||
static void batadv_socket_add_packet(struct batadv_socket_client *socket_client,
|
||||
struct batadv_icmp_header *icmph,
|
||||
size_t icmp_len);
|
||||
|
||||
/**
|
||||
* batadv_socket_init() - Initialize soft interface independent socket data
|
||||
*/
|
||||
void batadv_socket_init(void)
|
||||
{
|
||||
memset(batadv_socket_client_hash, 0, sizeof(batadv_socket_client_hash));
|
||||
}
|
||||
|
||||
static int batadv_socket_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
unsigned int i;
|
||||
struct batadv_socket_client *socket_client;
|
||||
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
return -EBUSY;
|
||||
|
||||
batadv_debugfs_deprecated(file, "");
|
||||
|
||||
stream_open(inode, file);
|
||||
|
||||
socket_client = kmalloc(sizeof(*socket_client), GFP_KERNEL);
|
||||
if (!socket_client) {
|
||||
module_put(THIS_MODULE);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(batadv_socket_client_hash); i++) {
|
||||
if (!batadv_socket_client_hash[i]) {
|
||||
batadv_socket_client_hash[i] = socket_client;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == ARRAY_SIZE(batadv_socket_client_hash)) {
|
||||
pr_err("Error - can't add another packet client: maximum number of clients reached\n");
|
||||
kfree(socket_client);
|
||||
module_put(THIS_MODULE);
|
||||
return -EXFULL;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&socket_client->queue_list);
|
||||
socket_client->queue_len = 0;
|
||||
socket_client->index = i;
|
||||
socket_client->bat_priv = inode->i_private;
|
||||
spin_lock_init(&socket_client->lock);
|
||||
init_waitqueue_head(&socket_client->queue_wait);
|
||||
|
||||
file->private_data = socket_client;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int batadv_socket_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct batadv_socket_client *client = file->private_data;
|
||||
struct batadv_socket_packet *packet, *tmp;
|
||||
|
||||
spin_lock_bh(&client->lock);
|
||||
|
||||
/* for all packets in the queue ... */
|
||||
list_for_each_entry_safe(packet, tmp, &client->queue_list, list) {
|
||||
list_del(&packet->list);
|
||||
kfree(packet);
|
||||
}
|
||||
|
||||
batadv_socket_client_hash[client->index] = NULL;
|
||||
spin_unlock_bh(&client->lock);
|
||||
|
||||
kfree(client);
|
||||
module_put(THIS_MODULE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t batadv_socket_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct batadv_socket_client *socket_client = file->private_data;
|
||||
struct batadv_socket_packet *socket_packet;
|
||||
size_t packet_len;
|
||||
int error;
|
||||
|
||||
if ((file->f_flags & O_NONBLOCK) && socket_client->queue_len == 0)
|
||||
return -EAGAIN;
|
||||
|
||||
if (!buf || count < sizeof(struct batadv_icmp_packet))
|
||||
return -EINVAL;
|
||||
|
||||
error = wait_event_interruptible(socket_client->queue_wait,
|
||||
socket_client->queue_len);
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
spin_lock_bh(&socket_client->lock);
|
||||
|
||||
socket_packet = list_first_entry(&socket_client->queue_list,
|
||||
struct batadv_socket_packet, list);
|
||||
list_del(&socket_packet->list);
|
||||
socket_client->queue_len--;
|
||||
|
||||
spin_unlock_bh(&socket_client->lock);
|
||||
|
||||
packet_len = min(count, socket_packet->icmp_len);
|
||||
error = copy_to_user(buf, &socket_packet->icmp_packet, packet_len);
|
||||
|
||||
kfree(socket_packet);
|
||||
|
||||
if (error)
|
||||
return -EFAULT;
|
||||
|
||||
return packet_len;
|
||||
}
|
||||
|
||||
static ssize_t batadv_socket_write(struct file *file, const char __user *buff,
|
||||
size_t len, loff_t *off)
|
||||
{
|
||||
struct batadv_socket_client *socket_client = file->private_data;
|
||||
struct batadv_priv *bat_priv = socket_client->bat_priv;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
struct sk_buff *skb;
|
||||
struct batadv_icmp_packet_rr *icmp_packet_rr;
|
||||
struct batadv_icmp_header *icmp_header;
|
||||
struct batadv_orig_node *orig_node = NULL;
|
||||
struct batadv_neigh_node *neigh_node = NULL;
|
||||
size_t packet_len = sizeof(struct batadv_icmp_packet);
|
||||
u8 *addr;
|
||||
|
||||
if (len < sizeof(struct batadv_icmp_header)) {
|
||||
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
||||
"Error - can't send packet from char device: invalid packet size\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
|
||||
if (!primary_if) {
|
||||
len = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (len >= BATADV_ICMP_MAX_PACKET_SIZE)
|
||||
packet_len = BATADV_ICMP_MAX_PACKET_SIZE;
|
||||
else
|
||||
packet_len = len;
|
||||
|
||||
skb = netdev_alloc_skb_ip_align(NULL, packet_len + ETH_HLEN);
|
||||
if (!skb) {
|
||||
len = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
skb->priority = TC_PRIO_CONTROL;
|
||||
skb_reserve(skb, ETH_HLEN);
|
||||
icmp_header = skb_put(skb, packet_len);
|
||||
|
||||
if (copy_from_user(icmp_header, buff, packet_len)) {
|
||||
len = -EFAULT;
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
if (icmp_header->packet_type != BATADV_ICMP) {
|
||||
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
||||
"Error - can't send packet from char device: got bogus packet type (expected: BAT_ICMP)\n");
|
||||
len = -EINVAL;
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
switch (icmp_header->msg_type) {
|
||||
case BATADV_ECHO_REQUEST:
|
||||
if (len < sizeof(struct batadv_icmp_packet)) {
|
||||
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
||||
"Error - can't send packet from char device: invalid packet size\n");
|
||||
len = -EINVAL;
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
|
||||
goto dst_unreach;
|
||||
|
||||
orig_node = batadv_orig_hash_find(bat_priv, icmp_header->dst);
|
||||
if (!orig_node)
|
||||
goto dst_unreach;
|
||||
|
||||
neigh_node = batadv_orig_router_get(orig_node,
|
||||
BATADV_IF_DEFAULT);
|
||||
if (!neigh_node)
|
||||
goto dst_unreach;
|
||||
|
||||
if (!neigh_node->if_incoming)
|
||||
goto dst_unreach;
|
||||
|
||||
if (neigh_node->if_incoming->if_status != BATADV_IF_ACTIVE)
|
||||
goto dst_unreach;
|
||||
|
||||
icmp_packet_rr = (struct batadv_icmp_packet_rr *)icmp_header;
|
||||
if (packet_len == sizeof(*icmp_packet_rr)) {
|
||||
addr = neigh_node->if_incoming->net_dev->dev_addr;
|
||||
ether_addr_copy(icmp_packet_rr->rr[0], addr);
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
||||
"Error - can't send packet from char device: got unknown message type\n");
|
||||
len = -EINVAL;
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
icmp_header->uid = socket_client->index;
|
||||
|
||||
if (icmp_header->version != BATADV_COMPAT_VERSION) {
|
||||
icmp_header->msg_type = BATADV_PARAMETER_PROBLEM;
|
||||
icmp_header->version = BATADV_COMPAT_VERSION;
|
||||
batadv_socket_add_packet(socket_client, icmp_header,
|
||||
packet_len);
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
ether_addr_copy(icmp_header->orig, primary_if->net_dev->dev_addr);
|
||||
|
||||
batadv_send_unicast_skb(skb, neigh_node);
|
||||
goto out;
|
||||
|
||||
dst_unreach:
|
||||
icmp_header->msg_type = BATADV_DESTINATION_UNREACHABLE;
|
||||
batadv_socket_add_packet(socket_client, icmp_header, packet_len);
|
||||
free_skb:
|
||||
kfree_skb(skb);
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
if (neigh_node)
|
||||
batadv_neigh_node_put(neigh_node);
|
||||
if (orig_node)
|
||||
batadv_orig_node_put(orig_node);
|
||||
return len;
|
||||
}
|
||||
|
||||
static __poll_t batadv_socket_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
struct batadv_socket_client *socket_client = file->private_data;
|
||||
|
||||
poll_wait(file, &socket_client->queue_wait, wait);
|
||||
|
||||
if (socket_client->queue_len > 0)
|
||||
return EPOLLIN | EPOLLRDNORM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations batadv_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = batadv_socket_open,
|
||||
.release = batadv_socket_release,
|
||||
.read = batadv_socket_read,
|
||||
.write = batadv_socket_write,
|
||||
.poll = batadv_socket_poll,
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
|
||||
/**
|
||||
* batadv_socket_setup() - Create debugfs "socket" file
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
*/
|
||||
void batadv_socket_setup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
debugfs_create_file(BATADV_ICMP_SOCKET, 0600, bat_priv->debug_dir,
|
||||
bat_priv, &batadv_fops);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_socket_add_packet() - schedule an icmp packet to be sent to
|
||||
* userspace on an icmp socket.
|
||||
* @socket_client: the socket this packet belongs to
|
||||
* @icmph: pointer to the header of the icmp packet
|
||||
* @icmp_len: total length of the icmp packet
|
||||
*/
|
||||
static void batadv_socket_add_packet(struct batadv_socket_client *socket_client,
|
||||
struct batadv_icmp_header *icmph,
|
||||
size_t icmp_len)
|
||||
{
|
||||
struct batadv_socket_packet *socket_packet;
|
||||
size_t len;
|
||||
|
||||
socket_packet = kmalloc(sizeof(*socket_packet), GFP_ATOMIC);
|
||||
|
||||
if (!socket_packet)
|
||||
return;
|
||||
|
||||
len = icmp_len;
|
||||
/* check the maximum length before filling the buffer */
|
||||
if (len > sizeof(socket_packet->icmp_packet))
|
||||
len = sizeof(socket_packet->icmp_packet);
|
||||
|
||||
INIT_LIST_HEAD(&socket_packet->list);
|
||||
memcpy(&socket_packet->icmp_packet, icmph, len);
|
||||
socket_packet->icmp_len = len;
|
||||
|
||||
spin_lock_bh(&socket_client->lock);
|
||||
|
||||
/* while waiting for the lock the socket_client could have been
|
||||
* deleted
|
||||
*/
|
||||
if (!batadv_socket_client_hash[icmph->uid]) {
|
||||
spin_unlock_bh(&socket_client->lock);
|
||||
kfree(socket_packet);
|
||||
return;
|
||||
}
|
||||
|
||||
list_add_tail(&socket_packet->list, &socket_client->queue_list);
|
||||
socket_client->queue_len++;
|
||||
|
||||
if (socket_client->queue_len > 100) {
|
||||
socket_packet = list_first_entry(&socket_client->queue_list,
|
||||
struct batadv_socket_packet,
|
||||
list);
|
||||
|
||||
list_del(&socket_packet->list);
|
||||
kfree(socket_packet);
|
||||
socket_client->queue_len--;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&socket_client->lock);
|
||||
|
||||
wake_up(&socket_client->queue_wait);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_socket_receive_packet() - schedule an icmp packet to be received
|
||||
* locally and sent to userspace.
|
||||
* @icmph: pointer to the header of the icmp packet
|
||||
* @icmp_len: total length of the icmp packet
|
||||
*/
|
||||
void batadv_socket_receive_packet(struct batadv_icmp_header *icmph,
|
||||
size_t icmp_len)
|
||||
{
|
||||
struct batadv_socket_client *hash;
|
||||
|
||||
hash = batadv_socket_client_hash[icmph->uid];
|
||||
if (hash)
|
||||
batadv_socket_add_packet(hash, icmph, icmp_len);
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (C) 2007-2020 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner
|
||||
*/
|
||||
|
||||
#ifndef _NET_BATMAN_ADV_ICMP_SOCKET_H_
|
||||
#define _NET_BATMAN_ADV_ICMP_SOCKET_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
|
||||
#define BATADV_ICMP_SOCKET "socket"
|
||||
|
||||
void batadv_socket_setup(struct batadv_priv *bat_priv);
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
|
||||
void batadv_socket_init(void);
|
||||
void batadv_socket_receive_packet(struct batadv_icmp_header *icmph,
|
||||
size_t icmp_len);
|
||||
|
||||
#else
|
||||
|
||||
static inline void batadv_socket_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
batadv_socket_receive_packet(struct batadv_icmp_header *icmph, size_t icmp_len)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_ICMP_SOCKET_H_ */
|
@ -7,214 +7,10 @@
|
||||
#include "log.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/eventpoll.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/sched.h> /* for linux/wait.h */
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/wait.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "debugfs.h"
|
||||
#include "trace.h"
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
|
||||
#define BATADV_LOG_BUFF_MASK (batadv_log_buff_len - 1)
|
||||
|
||||
static const int batadv_log_buff_len = BATADV_LOG_BUF_LEN;
|
||||
|
||||
static char *batadv_log_char_addr(struct batadv_priv_debug_log *debug_log,
|
||||
size_t idx)
|
||||
{
|
||||
return &debug_log->log_buff[idx & BATADV_LOG_BUFF_MASK];
|
||||
}
|
||||
|
||||
static void batadv_emit_log_char(struct batadv_priv_debug_log *debug_log,
|
||||
char c)
|
||||
{
|
||||
char *char_addr;
|
||||
|
||||
char_addr = batadv_log_char_addr(debug_log, debug_log->log_end);
|
||||
*char_addr = c;
|
||||
debug_log->log_end++;
|
||||
|
||||
if (debug_log->log_end - debug_log->log_start > batadv_log_buff_len)
|
||||
debug_log->log_start = debug_log->log_end - batadv_log_buff_len;
|
||||
}
|
||||
|
||||
__printf(2, 3)
|
||||
static int batadv_fdebug_log(struct batadv_priv_debug_log *debug_log,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
static char debug_log_buf[256];
|
||||
char *p;
|
||||
|
||||
if (!debug_log)
|
||||
return 0;
|
||||
|
||||
spin_lock_bh(&debug_log->lock);
|
||||
va_start(args, fmt);
|
||||
vscnprintf(debug_log_buf, sizeof(debug_log_buf), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
for (p = debug_log_buf; *p != 0; p++)
|
||||
batadv_emit_log_char(debug_log, *p);
|
||||
|
||||
spin_unlock_bh(&debug_log->lock);
|
||||
|
||||
wake_up(&debug_log->queue_wait);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int batadv_log_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
return -EBUSY;
|
||||
|
||||
batadv_debugfs_deprecated(file,
|
||||
"Use tracepoint batadv:batadv_dbg instead\n");
|
||||
|
||||
stream_open(inode, file);
|
||||
file->private_data = inode->i_private;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int batadv_log_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
module_put(THIS_MODULE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool batadv_log_empty(struct batadv_priv_debug_log *debug_log)
|
||||
{
|
||||
return !(debug_log->log_start - debug_log->log_end);
|
||||
}
|
||||
|
||||
static ssize_t batadv_log_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct batadv_priv *bat_priv = file->private_data;
|
||||
struct batadv_priv_debug_log *debug_log = bat_priv->debug_log;
|
||||
int error, i = 0;
|
||||
char *char_addr;
|
||||
char c;
|
||||
|
||||
if ((file->f_flags & O_NONBLOCK) && batadv_log_empty(debug_log))
|
||||
return -EAGAIN;
|
||||
|
||||
if (!buf)
|
||||
return -EINVAL;
|
||||
|
||||
if (count == 0)
|
||||
return 0;
|
||||
|
||||
if (!access_ok(buf, count))
|
||||
return -EFAULT;
|
||||
|
||||
error = wait_event_interruptible(debug_log->queue_wait,
|
||||
(!batadv_log_empty(debug_log)));
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
spin_lock_bh(&debug_log->lock);
|
||||
|
||||
while ((!error) && (i < count) &&
|
||||
(debug_log->log_start != debug_log->log_end)) {
|
||||
char_addr = batadv_log_char_addr(debug_log,
|
||||
debug_log->log_start);
|
||||
c = *char_addr;
|
||||
|
||||
debug_log->log_start++;
|
||||
|
||||
spin_unlock_bh(&debug_log->lock);
|
||||
|
||||
error = __put_user(c, buf);
|
||||
|
||||
spin_lock_bh(&debug_log->lock);
|
||||
|
||||
buf++;
|
||||
i++;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&debug_log->lock);
|
||||
|
||||
if (!error)
|
||||
return i;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static __poll_t batadv_log_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
struct batadv_priv *bat_priv = file->private_data;
|
||||
struct batadv_priv_debug_log *debug_log = bat_priv->debug_log;
|
||||
|
||||
poll_wait(file, &debug_log->queue_wait, wait);
|
||||
|
||||
if (!batadv_log_empty(debug_log))
|
||||
return EPOLLIN | EPOLLRDNORM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations batadv_log_fops = {
|
||||
.open = batadv_log_open,
|
||||
.release = batadv_log_release,
|
||||
.read = batadv_log_read,
|
||||
.poll = batadv_log_poll,
|
||||
.llseek = no_llseek,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
/**
|
||||
* batadv_debug_log_setup() - Initialize debug log
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
int batadv_debug_log_setup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
bat_priv->debug_log = kzalloc(sizeof(*bat_priv->debug_log), GFP_ATOMIC);
|
||||
if (!bat_priv->debug_log)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&bat_priv->debug_log->lock);
|
||||
init_waitqueue_head(&bat_priv->debug_log->queue_wait);
|
||||
|
||||
debugfs_create_file("log", 0400, bat_priv->debug_dir, bat_priv,
|
||||
&batadv_log_fops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_debug_log_cleanup() - Destroy debug log
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
*/
|
||||
void batadv_debug_log_cleanup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
kfree(bat_priv->debug_log);
|
||||
bat_priv->debug_log = NULL;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BATMAN_ADV_DEBUGFS */
|
||||
|
||||
/**
|
||||
* batadv_debug_log() - Add debug log entry
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
@ -232,11 +28,6 @@ int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...)
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
batadv_fdebug_log(bat_priv->debug_log, "[%10u] %pV",
|
||||
jiffies_to_msecs(jiffies), &vaf);
|
||||
#endif
|
||||
|
||||
trace_batadv_dbg(bat_priv, &vaf);
|
||||
|
||||
va_end(args);
|
||||
|
@ -23,12 +23,12 @@
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -44,12 +44,10 @@
|
||||
#include "bat_iv_ogm.h"
|
||||
#include "bat_v.h"
|
||||
#include "bridge_loop_avoidance.h"
|
||||
#include "debugfs.h"
|
||||
#include "distributed-arp-table.h"
|
||||
#include "gateway_client.h"
|
||||
#include "gateway_common.h"
|
||||
#include "hard-interface.h"
|
||||
#include "icmp_socket.h"
|
||||
#include "log.h"
|
||||
#include "multicast.h"
|
||||
#include "netlink.h"
|
||||
@ -113,9 +111,6 @@ static int __init batadv_init(void)
|
||||
if (!batadv_event_workqueue)
|
||||
goto err_create_wq;
|
||||
|
||||
batadv_socket_init();
|
||||
batadv_debugfs_init();
|
||||
|
||||
register_netdevice_notifier(&batadv_hard_if_notifier);
|
||||
rtnl_link_register(&batadv_link_ops);
|
||||
batadv_netlink_register();
|
||||
@ -133,7 +128,6 @@ err_create_wq:
|
||||
|
||||
static void __exit batadv_exit(void)
|
||||
{
|
||||
batadv_debugfs_destroy();
|
||||
batadv_netlink_unregister();
|
||||
rtnl_link_unregister(&batadv_link_ops);
|
||||
unregister_netdevice_notifier(&batadv_hard_if_notifier);
|
||||
@ -305,44 +299,6 @@ bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr)
|
||||
return is_my_mac;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_seq_print_text_primary_if_get() - called from debugfs table printing
|
||||
* function that requires the primary interface
|
||||
* @seq: debugfs table seq_file struct
|
||||
*
|
||||
* Return: primary interface if found or NULL otherwise.
|
||||
*/
|
||||
struct batadv_hard_iface *
|
||||
batadv_seq_print_text_primary_if_get(struct seq_file *seq)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hard_iface *primary_if;
|
||||
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
|
||||
if (!primary_if) {
|
||||
seq_printf(seq,
|
||||
"BATMAN mesh %s disabled - please specify interfaces to enable it\n",
|
||||
net_dev->name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (primary_if->if_status == BATADV_IF_ACTIVE)
|
||||
goto out;
|
||||
|
||||
seq_printf(seq,
|
||||
"BATMAN mesh %s disabled - primary interface not active\n",
|
||||
net_dev->name);
|
||||
batadv_hardif_put(primary_if);
|
||||
primary_if = NULL;
|
||||
|
||||
out:
|
||||
return primary_if;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_max_header_len() - calculate maximum encapsulation overhead for a
|
||||
* payload packet
|
||||
|
@ -13,7 +13,7 @@
|
||||
#define BATADV_DRIVER_DEVICE "batman-adv"
|
||||
|
||||
#ifndef BATADV_SOURCE_VERSION
|
||||
#define BATADV_SOURCE_VERSION "2020.4"
|
||||
#define BATADV_SOURCE_VERSION "2021.0"
|
||||
#endif
|
||||
|
||||
/* B.A.T.M.A.N. parameters */
|
||||
@ -212,7 +212,6 @@ enum batadv_uev_type {
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
@ -243,8 +242,6 @@ extern struct workqueue_struct *batadv_event_workqueue;
|
||||
int batadv_mesh_init(struct net_device *soft_iface);
|
||||
void batadv_mesh_free(struct net_device *soft_iface);
|
||||
bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr);
|
||||
struct batadv_hard_iface *
|
||||
batadv_seq_print_text_primary_if_get(struct seq_file *seq);
|
||||
int batadv_max_header_len(void);
|
||||
void batadv_skb_set_priority(struct sk_buff *skb, int offset);
|
||||
int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include <linux/printk.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -2074,116 +2073,6 @@ void batadv_mcast_init(struct batadv_priv *bat_priv)
|
||||
batadv_mcast_start_timer(bat_priv);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_mcast_flags_print_header() - print own mcast flags to debugfs table
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @seq: debugfs table seq_file struct
|
||||
*
|
||||
* Prints our own multicast flags including a more specific reason why
|
||||
* they are set, that is prints the bridge and querier state too, to
|
||||
* the debugfs table specified via @seq.
|
||||
*/
|
||||
static void batadv_mcast_flags_print_header(struct batadv_priv *bat_priv,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct batadv_mcast_mla_flags *mla_flags = &bat_priv->mcast.mla_flags;
|
||||
char querier4, querier6, shadowing4, shadowing6;
|
||||
bool bridged = mla_flags->bridged;
|
||||
u8 flags = mla_flags->tvlv_flags;
|
||||
|
||||
if (bridged) {
|
||||
querier4 = mla_flags->querier_ipv4.exists ? '.' : '4';
|
||||
querier6 = mla_flags->querier_ipv6.exists ? '.' : '6';
|
||||
shadowing4 = mla_flags->querier_ipv4.shadowing ? '4' : '.';
|
||||
shadowing6 = mla_flags->querier_ipv6.shadowing ? '6' : '.';
|
||||
} else {
|
||||
querier4 = '?';
|
||||
querier6 = '?';
|
||||
shadowing4 = '?';
|
||||
shadowing6 = '?';
|
||||
}
|
||||
|
||||
seq_printf(seq, "Multicast flags (own flags: [%c%c%c%s%s])\n",
|
||||
(flags & BATADV_MCAST_WANT_ALL_UNSNOOPABLES) ? 'U' : '.',
|
||||
(flags & BATADV_MCAST_WANT_ALL_IPV4) ? '4' : '.',
|
||||
(flags & BATADV_MCAST_WANT_ALL_IPV6) ? '6' : '.',
|
||||
!(flags & BATADV_MCAST_WANT_NO_RTR4) ? "R4" : ". ",
|
||||
!(flags & BATADV_MCAST_WANT_NO_RTR6) ? "R6" : ". ");
|
||||
seq_printf(seq, "* Bridged [U]\t\t\t\t%c\n", bridged ? 'U' : '.');
|
||||
seq_printf(seq, "* No IGMP/MLD Querier [4/6]:\t\t%c/%c\n",
|
||||
querier4, querier6);
|
||||
seq_printf(seq, "* Shadowing IGMP/MLD Querier [4/6]:\t%c/%c\n",
|
||||
shadowing4, shadowing6);
|
||||
seq_puts(seq, "-------------------------------------------\n");
|
||||
seq_printf(seq, " %-10s %s\n", "Originator", "Flags");
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_mcast_flags_seq_print_text() - print the mcast flags of other nodes
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* This prints a table of (primary) originators and their according
|
||||
* multicast flags, including (in the header) our own.
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_mcast_flags_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct batadv_hashtable *hash = bat_priv->orig_hash;
|
||||
struct batadv_orig_node *orig_node;
|
||||
struct hlist_head *head;
|
||||
u8 flags;
|
||||
u32 i;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
return 0;
|
||||
|
||||
batadv_mcast_flags_print_header(bat_priv, seq);
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
|
||||
if (!test_bit(BATADV_ORIG_CAPA_HAS_MCAST,
|
||||
&orig_node->capa_initialized))
|
||||
continue;
|
||||
|
||||
if (!test_bit(BATADV_ORIG_CAPA_HAS_MCAST,
|
||||
&orig_node->capabilities)) {
|
||||
seq_printf(seq, "%pM -\n", orig_node->orig);
|
||||
continue;
|
||||
}
|
||||
|
||||
flags = orig_node->mcast_flags;
|
||||
|
||||
seq_printf(seq, "%pM [%c%c%c%s%s]\n", orig_node->orig,
|
||||
(flags & BATADV_MCAST_WANT_ALL_UNSNOOPABLES)
|
||||
? 'U' : '.',
|
||||
(flags & BATADV_MCAST_WANT_ALL_IPV4)
|
||||
? '4' : '.',
|
||||
(flags & BATADV_MCAST_WANT_ALL_IPV6)
|
||||
? '6' : '.',
|
||||
!(flags & BATADV_MCAST_WANT_NO_RTR4)
|
||||
? "R4" : ". ",
|
||||
!(flags & BATADV_MCAST_WANT_NO_RTR6)
|
||||
? "R6" : ". ");
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_mcast_mesh_info_put() - put multicast info into a netlink message
|
||||
* @msg: buffer for the message
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
/**
|
||||
@ -56,8 +55,6 @@ int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
|
||||
void batadv_mcast_init(struct batadv_priv *bat_priv);
|
||||
|
||||
int batadv_mcast_flags_seq_print_text(struct seq_file *seq, void *offset);
|
||||
|
||||
int batadv_mcast_mesh_info_put(struct sk_buff *msg,
|
||||
struct batadv_priv *bat_priv);
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/printk.h>
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@ -30,7 +29,6 @@
|
||||
#include <linux/printk.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -39,7 +37,6 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
|
||||
#include "hard-interface.h"
|
||||
#include "hash.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
@ -1876,87 +1873,3 @@ void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
|
||||
batadv_nc_purge_paths(bat_priv, bat_priv->nc.decoding_hash, NULL);
|
||||
batadv_hash_destroy(bat_priv->nc.decoding_hash);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_nc_nodes_seq_print_text() - print the nc node information
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_nc_nodes_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hashtable *hash = bat_priv->orig_hash;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct hlist_head *head;
|
||||
struct batadv_orig_node *orig_node;
|
||||
struct batadv_nc_node *nc_node;
|
||||
int i;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
||||
/* Traverse list of originators */
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
/* For each orig_node in this bin */
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
|
||||
/* no need to print the orig node if it does not have
|
||||
* network coding neighbors
|
||||
*/
|
||||
if (list_empty(&orig_node->in_coding_list) &&
|
||||
list_empty(&orig_node->out_coding_list))
|
||||
continue;
|
||||
|
||||
seq_printf(seq, "Node: %pM\n", orig_node->orig);
|
||||
|
||||
seq_puts(seq, " Ingoing: ");
|
||||
/* For each in_nc_node to this orig_node */
|
||||
list_for_each_entry_rcu(nc_node,
|
||||
&orig_node->in_coding_list,
|
||||
list)
|
||||
seq_printf(seq, "%pM ",
|
||||
nc_node->addr);
|
||||
seq_puts(seq, "\n Outgoing: ");
|
||||
/* For out_nc_node to this orig_node */
|
||||
list_for_each_entry_rcu(nc_node,
|
||||
&orig_node->out_coding_list,
|
||||
list)
|
||||
seq_printf(seq, "%pM ",
|
||||
nc_node->addr);
|
||||
seq_puts(seq, "\n\n");
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_nc_init_debugfs() - create nc folder and related files in debugfs
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
*/
|
||||
void batadv_nc_init_debugfs(struct batadv_priv *bat_priv)
|
||||
{
|
||||
struct dentry *nc_dir;
|
||||
|
||||
nc_dir = debugfs_create_dir("nc", bat_priv->debug_dir);
|
||||
|
||||
debugfs_create_u8("min_tq", 0644, nc_dir, &bat_priv->nc.min_tq);
|
||||
|
||||
debugfs_create_u32("max_fwd_delay", 0644, nc_dir,
|
||||
&bat_priv->nc.max_fwd_delay);
|
||||
|
||||
debugfs_create_u32("max_buffer_time", 0644, nc_dir,
|
||||
&bat_priv->nc.max_buffer_time);
|
||||
}
|
||||
#endif
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
@ -38,8 +37,6 @@ void batadv_nc_skb_store_for_decoding(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb);
|
||||
void batadv_nc_skb_store_sniffed_unicast(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb);
|
||||
int batadv_nc_nodes_seq_print_text(struct seq_file *seq, void *offset);
|
||||
void batadv_nc_init_debugfs(struct batadv_priv *bat_priv);
|
||||
|
||||
#else /* ifdef CONFIG_BATMAN_ADV_NC */
|
||||
|
||||
@ -104,16 +101,6 @@ batadv_nc_skb_store_sniffed_unicast(struct batadv_priv *bat_priv,
|
||||
{
|
||||
}
|
||||
|
||||
static inline int batadv_nc_nodes_seq_print_text(struct seq_file *seq,
|
||||
void *offset)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_nc_init_debugfs(struct batadv_priv *bat_priv)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* ifdef CONFIG_BATMAN_ADV_NC */
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_NETWORK_CODING_H_ */
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -733,42 +732,6 @@ batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node,
|
||||
return batadv_neigh_node_create(orig_node, hard_iface, neigh_addr);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_hardif_neigh_seq_print_text() - print the single hop neighbour list
|
||||
* @seq: neighbour table seq_file struct
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hard_iface *primary_if;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
return 0;
|
||||
|
||||
seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n",
|
||||
BATADV_SOURCE_VERSION, primary_if->net_dev->name,
|
||||
primary_if->net_dev->dev_addr, net_dev->name,
|
||||
bat_priv->algo_ops->name);
|
||||
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
if (!bat_priv->algo_ops->neigh.print) {
|
||||
seq_puts(seq,
|
||||
"No printing function for this routing protocol\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bat_priv->algo_ops->neigh.print(bat_priv, seq);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_hardif_neigh_dump() - Dump to netlink the neighbor infos for a
|
||||
* specific outgoing interface
|
||||
@ -1382,90 +1345,6 @@ static void batadv_purge_orig(struct work_struct *work)
|
||||
msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
|
||||
/**
|
||||
* batadv_orig_seq_print_text() - Print the originator table in a seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_orig_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hard_iface *primary_if;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
return 0;
|
||||
|
||||
seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n",
|
||||
BATADV_SOURCE_VERSION, primary_if->net_dev->name,
|
||||
primary_if->net_dev->dev_addr, net_dev->name,
|
||||
bat_priv->algo_ops->name);
|
||||
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
if (!bat_priv->algo_ops->orig.print) {
|
||||
seq_puts(seq,
|
||||
"No printing function for this routing protocol\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bat_priv->algo_ops->orig.print(bat_priv, seq, BATADV_IF_DEFAULT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_orig_hardif_seq_print_text() - writes originator infos for a specific
|
||||
* outgoing interface
|
||||
* @seq: debugfs table seq_file struct
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: 0
|
||||
*/
|
||||
int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
|
||||
hard_iface = batadv_hardif_get_by_netdev(net_dev);
|
||||
|
||||
if (!hard_iface || !hard_iface->soft_iface) {
|
||||
seq_puts(seq, "Interface not known to B.A.T.M.A.N.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
if (!bat_priv->algo_ops->orig.print) {
|
||||
seq_puts(seq,
|
||||
"No printing function for this routing protocol\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (hard_iface->if_status != BATADV_IF_ACTIVE) {
|
||||
seq_puts(seq, "Interface not active\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
seq_printf(seq, "[B.A.T.M.A.N. adv %s, IF/MAC: %s/%pM (%s %s)]\n",
|
||||
BATADV_SOURCE_VERSION, hard_iface->net_dev->name,
|
||||
hard_iface->net_dev->dev_addr,
|
||||
hard_iface->soft_iface->name, bat_priv->algo_ops->name);
|
||||
|
||||
bat_priv->algo_ops->orig.print(bat_priv, seq, hard_iface);
|
||||
|
||||
out:
|
||||
if (hard_iface)
|
||||
batadv_hardif_put(hard_iface);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_orig_dump() - Dump to netlink the originator infos for a specific
|
||||
* outgoing interface
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@ -46,7 +45,6 @@ batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
|
||||
void batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo);
|
||||
|
||||
int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset);
|
||||
|
||||
struct batadv_orig_ifinfo *
|
||||
batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
|
||||
@ -56,9 +54,7 @@ batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
|
||||
struct batadv_hard_iface *if_outgoing);
|
||||
void batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo);
|
||||
|
||||
int batadv_orig_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset);
|
||||
struct batadv_orig_node_vlan *
|
||||
batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
|
||||
unsigned short vid);
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include "distributed-arp-table.h"
|
||||
#include "fragmentation.h"
|
||||
#include "hard-interface.h"
|
||||
#include "icmp_socket.h"
|
||||
#include "log.h"
|
||||
#include "network-coding.h"
|
||||
#include "originator.h"
|
||||
@ -227,15 +226,6 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
|
||||
icmph = (struct batadv_icmp_header *)skb->data;
|
||||
|
||||
switch (icmph->msg_type) {
|
||||
case BATADV_ECHO_REPLY:
|
||||
case BATADV_DESTINATION_UNREACHABLE:
|
||||
case BATADV_TTL_EXCEEDED:
|
||||
/* receive the packet */
|
||||
if (skb_linearize(skb) < 0)
|
||||
break;
|
||||
|
||||
batadv_socket_receive_packet(icmph, skb->len);
|
||||
break;
|
||||
case BATADV_ECHO_REQUEST:
|
||||
/* answer echo request (ping) */
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/socket.h>
|
||||
@ -38,12 +37,12 @@
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <net/netlink.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "bridge_loop_avoidance.h"
|
||||
#include "debugfs.h"
|
||||
#include "distributed-arp-table.h"
|
||||
#include "gateway_client.h"
|
||||
#include "hard-interface.h"
|
||||
@ -51,7 +50,6 @@
|
||||
#include "network-coding.h"
|
||||
#include "originator.h"
|
||||
#include "send.h"
|
||||
#include "sysfs.h"
|
||||
#include "translation-table.h"
|
||||
|
||||
/**
|
||||
@ -574,7 +572,6 @@ struct batadv_softif_vlan *batadv_softif_vlan_get(struct batadv_priv *bat_priv,
|
||||
int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
|
||||
{
|
||||
struct batadv_softif_vlan *vlan;
|
||||
int err;
|
||||
|
||||
spin_lock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
|
||||
@ -601,19 +598,6 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
|
||||
hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list);
|
||||
spin_unlock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
|
||||
/* batadv_sysfs_add_vlan cannot be in the spinlock section due to the
|
||||
* sleeping behavior of the sysfs functions and the fs_reclaim lock
|
||||
*/
|
||||
err = batadv_sysfs_add_vlan(bat_priv->soft_iface, vlan);
|
||||
if (err) {
|
||||
/* ref for the function */
|
||||
batadv_softif_vlan_put(vlan);
|
||||
|
||||
/* ref for the list */
|
||||
batadv_softif_vlan_put(vlan);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* add a new TT local entry. This one will be marked with the NOPURGE
|
||||
* flag
|
||||
*/
|
||||
@ -641,7 +625,6 @@ static void batadv_softif_destroy_vlan(struct batadv_priv *bat_priv,
|
||||
batadv_tt_local_remove(bat_priv, bat_priv->soft_iface->dev_addr,
|
||||
vlan->vid, "vlan interface destroyed", false);
|
||||
|
||||
batadv_sysfs_del_vlan(bat_priv, vlan);
|
||||
batadv_softif_vlan_put(vlan);
|
||||
}
|
||||
|
||||
@ -661,7 +644,6 @@ static int batadv_interface_add_vid(struct net_device *dev, __be16 proto,
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
struct batadv_softif_vlan *vlan;
|
||||
int ret;
|
||||
|
||||
/* only 802.1Q vlans are supported.
|
||||
* batman-adv does not know how to handle other types
|
||||
@ -681,17 +663,6 @@ static int batadv_interface_add_vid(struct net_device *dev, __be16 proto,
|
||||
if (!vlan)
|
||||
return batadv_softif_create_vlan(bat_priv, vid);
|
||||
|
||||
/* recreate the sysfs object if it was already destroyed (and it should
|
||||
* be since we received a kill_vid() for this vlan
|
||||
*/
|
||||
if (!vlan->kobj) {
|
||||
ret = batadv_sysfs_add_vlan(bat_priv->soft_iface, vlan);
|
||||
if (ret) {
|
||||
batadv_softif_vlan_put(vlan);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* add a new TT local entry. This one will be marked with the NOPURGE
|
||||
* flag. This must be added again, even if the vlan object already
|
||||
* exists, because the entry was deleted by kill_vid()
|
||||
@ -845,22 +816,18 @@ static int batadv_softif_init_late(struct net_device *dev)
|
||||
|
||||
batadv_nc_init_bat_priv(bat_priv);
|
||||
|
||||
ret = batadv_algo_select(bat_priv, batadv_routing_algo);
|
||||
if (ret < 0)
|
||||
goto free_bat_counters;
|
||||
|
||||
ret = batadv_debugfs_add_meshif(dev);
|
||||
if (ret < 0)
|
||||
goto free_bat_counters;
|
||||
if (!bat_priv->algo_ops) {
|
||||
ret = batadv_algo_select(bat_priv, batadv_routing_algo);
|
||||
if (ret < 0)
|
||||
goto free_bat_counters;
|
||||
}
|
||||
|
||||
ret = batadv_mesh_init(dev);
|
||||
if (ret < 0)
|
||||
goto unreg_debugfs;
|
||||
goto free_bat_counters;
|
||||
|
||||
return 0;
|
||||
|
||||
unreg_debugfs:
|
||||
batadv_debugfs_del_meshif(dev);
|
||||
free_bat_counters:
|
||||
free_percpu(bat_priv->bat_counters);
|
||||
bat_priv->bat_counters = NULL;
|
||||
@ -914,7 +881,7 @@ static int batadv_softif_slave_del(struct net_device *dev,
|
||||
if (!hard_iface || hard_iface->soft_iface != dev)
|
||||
goto out;
|
||||
|
||||
batadv_hardif_disable_interface(hard_iface, BATADV_IF_CLEANUP_KEEP);
|
||||
batadv_hardif_disable_interface(hard_iface);
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
@ -1037,7 +1004,6 @@ static const struct ethtool_ops batadv_ethtool_ops = {
|
||||
*/
|
||||
static void batadv_softif_free(struct net_device *dev)
|
||||
{
|
||||
batadv_debugfs_del_meshif(dev);
|
||||
batadv_mesh_free(dev);
|
||||
|
||||
/* some scheduled RCU callbacks need the bat_priv struct to accomplish
|
||||
@ -1073,6 +1039,59 @@ static void batadv_softif_init_early(struct net_device *dev)
|
||||
dev->ethtool_ops = &batadv_ethtool_ops;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_softif_validate() - validate configuration of new batadv link
|
||||
* @tb: IFLA_INFO_DATA netlink attributes
|
||||
* @data: enum batadv_ifla_attrs attributes
|
||||
* @extack: extended ACK report struct
|
||||
*
|
||||
* Return: 0 if successful or error otherwise.
|
||||
*/
|
||||
static int batadv_softif_validate(struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct batadv_algo_ops *algo_ops;
|
||||
|
||||
if (!data)
|
||||
return 0;
|
||||
|
||||
if (data[IFLA_BATADV_ALGO_NAME]) {
|
||||
algo_ops = batadv_algo_get(nla_data(data[IFLA_BATADV_ALGO_NAME]));
|
||||
if (!algo_ops)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_softif_newlink() - pre-initialize and register new batadv link
|
||||
* @src_net: the applicable net namespace
|
||||
* @dev: network device to register
|
||||
* @tb: IFLA_INFO_DATA netlink attributes
|
||||
* @data: enum batadv_ifla_attrs attributes
|
||||
* @extack: extended ACK report struct
|
||||
*
|
||||
* Return: 0 if successful or error otherwise.
|
||||
*/
|
||||
static int batadv_softif_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
const char *algo_name;
|
||||
int err;
|
||||
|
||||
if (data && data[IFLA_BATADV_ALGO_NAME]) {
|
||||
algo_name = nla_data(data[IFLA_BATADV_ALGO_NAME]);
|
||||
err = batadv_algo_select(bat_priv, algo_name);
|
||||
if (err)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return register_netdevice(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_softif_create() - Create and register soft interface
|
||||
* @net: the applicable net namespace
|
||||
@ -1105,28 +1124,6 @@ struct net_device *batadv_softif_create(struct net *net, const char *name)
|
||||
return soft_iface;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_softif_destroy_sysfs() - deletion of batadv_soft_interface via sysfs
|
||||
* @soft_iface: the to-be-removed batman-adv interface
|
||||
*/
|
||||
void batadv_softif_destroy_sysfs(struct net_device *soft_iface)
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(soft_iface);
|
||||
struct batadv_softif_vlan *vlan;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
/* destroy the "untagged" VLAN */
|
||||
vlan = batadv_softif_vlan_get(bat_priv, BATADV_NO_FLAGS);
|
||||
if (vlan) {
|
||||
batadv_softif_destroy_vlan(bat_priv, vlan);
|
||||
batadv_softif_vlan_put(vlan);
|
||||
}
|
||||
|
||||
batadv_sysfs_del_meshif(soft_iface);
|
||||
unregister_netdevice(soft_iface);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_softif_destroy_netlink() - deletion of batadv_soft_interface via
|
||||
* netlink
|
||||
@ -1142,8 +1139,7 @@ static void batadv_softif_destroy_netlink(struct net_device *soft_iface,
|
||||
|
||||
list_for_each_entry(hard_iface, &batadv_hardif_list, list) {
|
||||
if (hard_iface->soft_iface == soft_iface)
|
||||
batadv_hardif_disable_interface(hard_iface,
|
||||
BATADV_IF_CLEANUP_KEEP);
|
||||
batadv_hardif_disable_interface(hard_iface);
|
||||
}
|
||||
|
||||
/* destroy the "untagged" VLAN */
|
||||
@ -1153,7 +1149,6 @@ static void batadv_softif_destroy_netlink(struct net_device *soft_iface,
|
||||
batadv_softif_vlan_put(vlan);
|
||||
}
|
||||
|
||||
batadv_sysfs_del_meshif(soft_iface);
|
||||
unregister_netdevice_queue(soft_iface, head);
|
||||
}
|
||||
|
||||
@ -1171,9 +1166,17 @@ bool batadv_softif_is_valid(const struct net_device *net_dev)
|
||||
return false;
|
||||
}
|
||||
|
||||
static const struct nla_policy batadv_ifla_policy[IFLA_BATADV_MAX + 1] = {
|
||||
[IFLA_BATADV_ALGO_NAME] = { .type = NLA_NUL_STRING },
|
||||
};
|
||||
|
||||
struct rtnl_link_ops batadv_link_ops __read_mostly = {
|
||||
.kind = "batadv",
|
||||
.priv_size = sizeof(struct batadv_priv),
|
||||
.setup = batadv_softif_init_early,
|
||||
.maxtype = IFLA_BATADV_MAX,
|
||||
.policy = batadv_ifla_policy,
|
||||
.validate = batadv_softif_validate,
|
||||
.newlink = batadv_softif_newlink,
|
||||
.dellink = batadv_softif_destroy_netlink,
|
||||
};
|
||||
|
@ -20,7 +20,6 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
||||
struct sk_buff *skb, int hdr_size,
|
||||
struct batadv_orig_node *orig_node);
|
||||
struct net_device *batadv_softif_create(struct net *net, const char *name);
|
||||
void batadv_softif_destroy_sysfs(struct net_device *soft_iface);
|
||||
bool batadv_softif_is_valid(const struct net_device *net_dev);
|
||||
extern struct rtnl_link_ops batadv_link_ops;
|
||||
int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,93 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (C) 2010-2020 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner
|
||||
*/
|
||||
|
||||
#ifndef _NET_BATMAN_ADV_SYSFS_H_
|
||||
#define _NET_BATMAN_ADV_SYSFS_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define BATADV_SYSFS_IF_MESH_SUBDIR "mesh"
|
||||
#define BATADV_SYSFS_IF_BAT_SUBDIR "batman_adv"
|
||||
/**
|
||||
* BATADV_SYSFS_VLAN_SUBDIR_PREFIX - prefix of the subfolder that will be
|
||||
* created in the sysfs hierarchy for each VLAN interface. The subfolder will
|
||||
* be named "BATADV_SYSFS_VLAN_SUBDIR_PREFIX%vid".
|
||||
*/
|
||||
#define BATADV_SYSFS_VLAN_SUBDIR_PREFIX "vlan"
|
||||
|
||||
/**
|
||||
* struct batadv_attribute - sysfs export helper for batman-adv attributes
|
||||
*/
|
||||
struct batadv_attribute {
|
||||
/** @attr: sysfs attribute file */
|
||||
struct attribute attr;
|
||||
|
||||
/**
|
||||
* @show: function to export the current attribute's content to sysfs
|
||||
*/
|
||||
ssize_t (*show)(struct kobject *kobj, struct attribute *attr,
|
||||
char *buf);
|
||||
|
||||
/**
|
||||
* @store: function to load new value from character buffer and save it
|
||||
* in batman-adv attribute
|
||||
*/
|
||||
ssize_t (*store)(struct kobject *kobj, struct attribute *attr,
|
||||
char *buf, size_t count);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_SYSFS
|
||||
|
||||
int batadv_sysfs_add_meshif(struct net_device *dev);
|
||||
void batadv_sysfs_del_meshif(struct net_device *dev);
|
||||
int batadv_sysfs_add_hardif(struct kobject **hardif_obj,
|
||||
struct net_device *dev);
|
||||
void batadv_sysfs_del_hardif(struct kobject **hardif_obj);
|
||||
int batadv_sysfs_add_vlan(struct net_device *dev,
|
||||
struct batadv_softif_vlan *vlan);
|
||||
void batadv_sysfs_del_vlan(struct batadv_priv *bat_priv,
|
||||
struct batadv_softif_vlan *vlan);
|
||||
|
||||
#else
|
||||
|
||||
static inline int batadv_sysfs_add_meshif(struct net_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_sysfs_del_meshif(struct net_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int batadv_sysfs_add_hardif(struct kobject **hardif_obj,
|
||||
struct net_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_sysfs_del_hardif(struct kobject **hardif_obj)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int batadv_sysfs_add_vlan(struct net_device *dev,
|
||||
struct batadv_softif_vlan *vlan)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_sysfs_del_vlan(struct batadv_priv *bat_priv,
|
||||
struct batadv_softif_vlan *vlan)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_SYSFS_H_ */
|
@ -23,6 +23,7 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/printk.h>
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
@ -1062,84 +1061,6 @@ container_register:
|
||||
kfree(tt_data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
|
||||
/**
|
||||
* batadv_tt_local_seq_print_text() - Print the local tt table in a seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hashtable *hash = bat_priv->tt.local_hash;
|
||||
struct batadv_tt_common_entry *tt_common_entry;
|
||||
struct batadv_tt_local_entry *tt_local;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct hlist_head *head;
|
||||
u32 i;
|
||||
int last_seen_secs;
|
||||
int last_seen_msecs;
|
||||
unsigned long last_seen_jiffies;
|
||||
bool no_purge;
|
||||
u16 np_flag = BATADV_TT_CLIENT_NOPURGE;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
||||
seq_printf(seq,
|
||||
"Locally retrieved addresses (from %s) announced via TT (TTVN: %u):\n",
|
||||
net_dev->name, (u8)atomic_read(&bat_priv->tt.vn));
|
||||
seq_puts(seq,
|
||||
" Client VID Flags Last seen (CRC )\n");
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(tt_common_entry,
|
||||
head, hash_entry) {
|
||||
tt_local = container_of(tt_common_entry,
|
||||
struct batadv_tt_local_entry,
|
||||
common);
|
||||
last_seen_jiffies = jiffies - tt_local->last_seen;
|
||||
last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
|
||||
last_seen_secs = last_seen_msecs / 1000;
|
||||
last_seen_msecs = last_seen_msecs % 1000;
|
||||
|
||||
no_purge = tt_common_entry->flags & np_flag;
|
||||
seq_printf(seq,
|
||||
" * %pM %4i [%c%c%c%c%c%c] %3u.%03u (%#.8x)\n",
|
||||
tt_common_entry->addr,
|
||||
batadv_print_vid(tt_common_entry->vid),
|
||||
((tt_common_entry->flags &
|
||||
BATADV_TT_CLIENT_ROAM) ? 'R' : '.'),
|
||||
no_purge ? 'P' : '.',
|
||||
((tt_common_entry->flags &
|
||||
BATADV_TT_CLIENT_NEW) ? 'N' : '.'),
|
||||
((tt_common_entry->flags &
|
||||
BATADV_TT_CLIENT_PENDING) ? 'X' : '.'),
|
||||
((tt_common_entry->flags &
|
||||
BATADV_TT_CLIENT_WIFI) ? 'W' : '.'),
|
||||
((tt_common_entry->flags &
|
||||
BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
|
||||
no_purge ? 0 : last_seen_secs,
|
||||
no_purge ? 0 : last_seen_msecs,
|
||||
tt_local->vlan->tt.crc);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_tt_local_dump_entry() - Dump one TT local entry into a message
|
||||
* @msg :Netlink message to dump into
|
||||
@ -1879,139 +1800,6 @@ batadv_transtable_best_orig(struct batadv_priv *bat_priv,
|
||||
return best_entry;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* batadv_tt_global_print_entry() - print all orig nodes who announce the
|
||||
* address for this global entry
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @tt_global_entry: global translation table entry to be printed
|
||||
* @seq: debugfs table seq_file struct
|
||||
*
|
||||
* This function assumes the caller holds rcu_read_lock().
|
||||
*/
|
||||
static void
|
||||
batadv_tt_global_print_entry(struct batadv_priv *bat_priv,
|
||||
struct batadv_tt_global_entry *tt_global_entry,
|
||||
struct seq_file *seq)
|
||||
{
|
||||
struct batadv_tt_orig_list_entry *orig_entry, *best_entry;
|
||||
struct batadv_tt_common_entry *tt_common_entry;
|
||||
struct batadv_orig_node_vlan *vlan;
|
||||
struct hlist_head *head;
|
||||
u8 last_ttvn;
|
||||
u16 flags;
|
||||
|
||||
tt_common_entry = &tt_global_entry->common;
|
||||
flags = tt_common_entry->flags;
|
||||
|
||||
best_entry = batadv_transtable_best_orig(bat_priv, tt_global_entry);
|
||||
if (best_entry) {
|
||||
vlan = batadv_orig_node_vlan_get(best_entry->orig_node,
|
||||
tt_common_entry->vid);
|
||||
if (!vlan) {
|
||||
seq_printf(seq,
|
||||
" * Cannot retrieve VLAN %d for originator %pM\n",
|
||||
batadv_print_vid(tt_common_entry->vid),
|
||||
best_entry->orig_node->orig);
|
||||
goto print_list;
|
||||
}
|
||||
|
||||
last_ttvn = atomic_read(&best_entry->orig_node->last_ttvn);
|
||||
seq_printf(seq,
|
||||
" %c %pM %4i (%3u) via %pM (%3u) (%#.8x) [%c%c%c%c]\n",
|
||||
'*', tt_global_entry->common.addr,
|
||||
batadv_print_vid(tt_global_entry->common.vid),
|
||||
best_entry->ttvn, best_entry->orig_node->orig,
|
||||
last_ttvn, vlan->tt.crc,
|
||||
((flags & BATADV_TT_CLIENT_ROAM) ? 'R' : '.'),
|
||||
((flags & BATADV_TT_CLIENT_WIFI) ? 'W' : '.'),
|
||||
((flags & BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
|
||||
((flags & BATADV_TT_CLIENT_TEMP) ? 'T' : '.'));
|
||||
|
||||
batadv_orig_node_vlan_put(vlan);
|
||||
}
|
||||
|
||||
print_list:
|
||||
head = &tt_global_entry->orig_list;
|
||||
|
||||
hlist_for_each_entry_rcu(orig_entry, head, list) {
|
||||
if (best_entry == orig_entry)
|
||||
continue;
|
||||
|
||||
vlan = batadv_orig_node_vlan_get(orig_entry->orig_node,
|
||||
tt_common_entry->vid);
|
||||
if (!vlan) {
|
||||
seq_printf(seq,
|
||||
" + Cannot retrieve VLAN %d for originator %pM\n",
|
||||
batadv_print_vid(tt_common_entry->vid),
|
||||
orig_entry->orig_node->orig);
|
||||
continue;
|
||||
}
|
||||
|
||||
last_ttvn = atomic_read(&orig_entry->orig_node->last_ttvn);
|
||||
seq_printf(seq,
|
||||
" %c %pM %4d (%3u) via %pM (%3u) (%#.8x) [%c%c%c%c]\n",
|
||||
'+', tt_global_entry->common.addr,
|
||||
batadv_print_vid(tt_global_entry->common.vid),
|
||||
orig_entry->ttvn, orig_entry->orig_node->orig,
|
||||
last_ttvn, vlan->tt.crc,
|
||||
((flags & BATADV_TT_CLIENT_ROAM) ? 'R' : '.'),
|
||||
((flags & BATADV_TT_CLIENT_WIFI) ? 'W' : '.'),
|
||||
((flags & BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
|
||||
((flags & BATADV_TT_CLIENT_TEMP) ? 'T' : '.'));
|
||||
|
||||
batadv_orig_node_vlan_put(vlan);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_tt_global_seq_print_text() - Print the global tt table in a seq file
|
||||
* @seq: seq file to print on
|
||||
* @offset: not used
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *)seq->private;
|
||||
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||
struct batadv_hashtable *hash = bat_priv->tt.global_hash;
|
||||
struct batadv_tt_common_entry *tt_common_entry;
|
||||
struct batadv_tt_global_entry *tt_global;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
struct hlist_head *head;
|
||||
u32 i;
|
||||
|
||||
primary_if = batadv_seq_print_text_primary_if_get(seq);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
||||
seq_printf(seq,
|
||||
"Globally announced TT entries received via the mesh %s\n",
|
||||
net_dev->name);
|
||||
seq_puts(seq,
|
||||
" Client VID (TTVN) Originator (Curr TTVN) (CRC ) Flags\n");
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(tt_common_entry,
|
||||
head, hash_entry) {
|
||||
tt_global = container_of(tt_common_entry,
|
||||
struct batadv_tt_global_entry,
|
||||
common);
|
||||
batadv_tt_global_print_entry(bat_priv, tt_global, seq);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* batadv_tt_global_dump_subentry() - Dump all TT local entries into a message
|
||||
* @msg: Netlink message to dump into
|
||||
|
@ -11,7 +11,6 @@
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@ -21,8 +20,6 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
|
||||
u16 batadv_tt_local_remove(struct batadv_priv *bat_priv,
|
||||
const u8 *addr, unsigned short vid,
|
||||
const char *message, bool roaming);
|
||||
int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset);
|
||||
int batadv_tt_local_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
int batadv_tt_global_dump(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
|
||||
|
@ -21,7 +21,6 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/sched.h> /* for linux/wait.h */
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/timer.h>
|
||||
@ -187,9 +186,6 @@ struct batadv_hard_iface {
|
||||
/** @net_dev: pointer to the net_device */
|
||||
struct net_device *net_dev;
|
||||
|
||||
/** @hardif_obj: kobject of the per interface sysfs "mesh" directory */
|
||||
struct kobject *hardif_obj;
|
||||
|
||||
/** @refcount: number of contexts the object is used */
|
||||
struct kref refcount;
|
||||
|
||||
@ -222,13 +218,6 @@ struct batadv_hard_iface {
|
||||
struct batadv_hard_iface_bat_v bat_v;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
|
||||
*/
|
||||
struct dentry *debug_dir;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @neigh_list: list of unique single hop neighbors via this interface
|
||||
*/
|
||||
@ -1306,13 +1295,6 @@ struct batadv_priv_nc {
|
||||
/** @work: work queue callback item for cleanup */
|
||||
struct delayed_work work;
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/**
|
||||
* @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
|
||||
*/
|
||||
struct dentry *debug_dir;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @min_tq: only consider neighbors for encoding if neigh_tq > min_tq
|
||||
*/
|
||||
@ -1512,9 +1494,6 @@ struct batadv_softif_vlan {
|
||||
/** @vid: VLAN identifier */
|
||||
unsigned short vid;
|
||||
|
||||
/** @kobj: kobject for sysfs vlan subdirectory */
|
||||
struct kobject *kobj;
|
||||
|
||||
/** @ap_isolation: AP isolation state */
|
||||
atomic_t ap_isolation; /* boolean */
|
||||
|
||||
@ -1667,14 +1646,6 @@ struct batadv_priv {
|
||||
/** @batman_queue_left: number of remaining OGM packet slots */
|
||||
atomic_t batman_queue_left;
|
||||
|
||||
/** @mesh_obj: kobject for sysfs mesh subdirectory */
|
||||
struct kobject *mesh_obj;
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/** @debug_dir: dentry for debugfs batman-adv subdirectory */
|
||||
struct dentry *debug_dir;
|
||||
#endif
|
||||
|
||||
/** @forw_bat_list: list of aggregated OGMs that will be forwarded */
|
||||
struct hlist_head forw_bat_list;
|
||||
|
||||
@ -2234,11 +2205,6 @@ struct batadv_algo_neigh_ops {
|
||||
struct batadv_neigh_node *neigh2,
|
||||
struct batadv_hard_iface *if_outgoing2);
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/** @print: print the single hop neighbor list (optional) */
|
||||
void (*print)(struct batadv_priv *priv, struct seq_file *seq);
|
||||
#endif
|
||||
|
||||
/** @dump: dump neighbors to a netlink socket (optional) */
|
||||
void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
struct batadv_priv *priv,
|
||||
@ -2249,12 +2215,6 @@ struct batadv_algo_neigh_ops {
|
||||
* struct batadv_algo_orig_ops - mesh algorithm callbacks (originator specific)
|
||||
*/
|
||||
struct batadv_algo_orig_ops {
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/** @print: print the originator table (optional) */
|
||||
void (*print)(struct batadv_priv *priv, struct seq_file *seq,
|
||||
struct batadv_hard_iface *hard_iface);
|
||||
#endif
|
||||
|
||||
/** @dump: dump originators to a netlink socket (optional) */
|
||||
void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
struct batadv_priv *priv,
|
||||
@ -2274,10 +2234,6 @@ struct batadv_algo_gw_ops {
|
||||
*/
|
||||
ssize_t (*store_sel_class)(struct batadv_priv *bat_priv, char *buff,
|
||||
size_t count);
|
||||
|
||||
/** @show_sel_class: prints the current GW selection class (optional) */
|
||||
ssize_t (*show_sel_class)(struct batadv_priv *bat_priv, char *buff);
|
||||
|
||||
/**
|
||||
* @get_best_gw_node: select the best GW from the list of available
|
||||
* nodes (optional)
|
||||
@ -2293,11 +2249,6 @@ struct batadv_algo_gw_ops {
|
||||
struct batadv_orig_node *curr_gw_orig,
|
||||
struct batadv_orig_node *orig_node);
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
||||
/** @print: print the gateway table (optional) */
|
||||
void (*print)(struct batadv_priv *bat_priv, struct seq_file *seq);
|
||||
#endif
|
||||
|
||||
/** @dump: dump gateways to a netlink socket (optional) */
|
||||
void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
struct batadv_priv *priv);
|
||||
@ -2456,21 +2407,4 @@ enum batadv_tvlv_handler_flags {
|
||||
BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct batadv_store_mesh_work - Work queue item to detach add/del interface
|
||||
* from sysfs locks
|
||||
*/
|
||||
struct batadv_store_mesh_work {
|
||||
/**
|
||||
* @net_dev: netdevice to add/remove to/from batman-adv soft-interface
|
||||
*/
|
||||
struct net_device *net_dev;
|
||||
|
||||
/** @soft_iface_name: name of soft-interface to modify */
|
||||
char soft_iface_name[IFNAMSIZ];
|
||||
|
||||
/** @work: work queue item */
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_TYPES_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user