You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'batadv-next-for-davem-20160704' of git://git.open-mesh.org/linux-merge
Simon Wunderlich says: ==================== This feature patchset includes the following changes: - Cleanup work by Markus Pargmann and Sven Eckelmann (six patches) - Initial Netlink support by Matthias Schiffer (two patches) - Throughput Meter implementation by Antonio Quartulli, a kernel-space traffic generator to estimate link speeds. This feature is useful on low-end WiFi APs where running iperf or netperf from userspace gives wrong results due to heavy userspace/kernelspace overhead. (two patches) - API clean-up work by Antonio Quartulli (one patch) ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -2297,6 +2297,7 @@ S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-class-net-batman-adv
|
||||
F: Documentation/ABI/testing/sysfs-class-net-mesh
|
||||
F: Documentation/networking/batman-adv.txt
|
||||
F: include/uapi/linux/batman_adv.h
|
||||
F: net/batman-adv/
|
||||
|
||||
BAYCOM/HDLCDRV DRIVERS FOR AX.25
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
/* Copyright (C) 2016 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Matthias Schiffer
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_LINUX_BATMAN_ADV_H_
|
||||
#define _UAPI_LINUX_BATMAN_ADV_H_
|
||||
|
||||
#define BATADV_NL_NAME "batadv"
|
||||
|
||||
#define BATADV_NL_MCAST_GROUP_TPMETER "tpmeter"
|
||||
|
||||
/**
|
||||
* enum batadv_nl_attrs - batman-adv netlink attributes
|
||||
*
|
||||
* @BATADV_ATTR_UNSPEC: unspecified attribute to catch errors
|
||||
* @BATADV_ATTR_VERSION: batman-adv version string
|
||||
* @BATADV_ATTR_ALGO_NAME: name of routing algorithm
|
||||
* @BATADV_ATTR_MESH_IFINDEX: index of the batman-adv interface
|
||||
* @BATADV_ATTR_MESH_IFNAME: name of the batman-adv interface
|
||||
* @BATADV_ATTR_MESH_ADDRESS: mac address of the batman-adv interface
|
||||
* @BATADV_ATTR_HARD_IFINDEX: index of the non-batman-adv interface
|
||||
* @BATADV_ATTR_HARD_IFNAME: name of the non-batman-adv interface
|
||||
* @BATADV_ATTR_HARD_ADDRESS: mac address of the non-batman-adv interface
|
||||
* @BATADV_ATTR_ORIG_ADDRESS: originator mac address
|
||||
* @BATADV_ATTR_TPMETER_RESULT: result of run (see batadv_tp_meter_status)
|
||||
* @BATADV_ATTR_TPMETER_TEST_TIME: time (msec) the run took
|
||||
* @BATADV_ATTR_TPMETER_BYTES: amount of acked bytes during run
|
||||
* @BATADV_ATTR_TPMETER_COOKIE: session cookie to match tp_meter session
|
||||
* @BATADV_ATTR_PAD: attribute used for padding for 64-bit alignment
|
||||
* @__BATADV_ATTR_AFTER_LAST: internal use
|
||||
* @NUM_BATADV_ATTR: total number of batadv_nl_attrs available
|
||||
* @BATADV_ATTR_MAX: highest attribute number currently defined
|
||||
*/
|
||||
enum batadv_nl_attrs {
|
||||
BATADV_ATTR_UNSPEC,
|
||||
BATADV_ATTR_VERSION,
|
||||
BATADV_ATTR_ALGO_NAME,
|
||||
BATADV_ATTR_MESH_IFINDEX,
|
||||
BATADV_ATTR_MESH_IFNAME,
|
||||
BATADV_ATTR_MESH_ADDRESS,
|
||||
BATADV_ATTR_HARD_IFINDEX,
|
||||
BATADV_ATTR_HARD_IFNAME,
|
||||
BATADV_ATTR_HARD_ADDRESS,
|
||||
BATADV_ATTR_ORIG_ADDRESS,
|
||||
BATADV_ATTR_TPMETER_RESULT,
|
||||
BATADV_ATTR_TPMETER_TEST_TIME,
|
||||
BATADV_ATTR_TPMETER_BYTES,
|
||||
BATADV_ATTR_TPMETER_COOKIE,
|
||||
BATADV_ATTR_PAD,
|
||||
/* add attributes above here, update the policy in netlink.c */
|
||||
__BATADV_ATTR_AFTER_LAST,
|
||||
NUM_BATADV_ATTR = __BATADV_ATTR_AFTER_LAST,
|
||||
BATADV_ATTR_MAX = __BATADV_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum batadv_nl_commands - supported batman-adv netlink commands
|
||||
*
|
||||
* @BATADV_CMD_UNSPEC: unspecified command to catch errors
|
||||
* @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv device
|
||||
* @BATADV_CMD_TP_METER: Start a tp meter session
|
||||
* @BATADV_CMD_TP_METER_CANCEL: Cancel a tp meter session
|
||||
* @__BATADV_CMD_AFTER_LAST: internal use
|
||||
* @BATADV_CMD_MAX: highest used command number
|
||||
*/
|
||||
enum batadv_nl_commands {
|
||||
BATADV_CMD_UNSPEC,
|
||||
BATADV_CMD_GET_MESH_INFO,
|
||||
BATADV_CMD_TP_METER,
|
||||
BATADV_CMD_TP_METER_CANCEL,
|
||||
/* add new commands above here */
|
||||
__BATADV_CMD_AFTER_LAST,
|
||||
BATADV_CMD_MAX = __BATADV_CMD_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum batadv_tp_meter_reason - reason of a tp meter test run stop
|
||||
* @BATADV_TP_REASON_COMPLETE: sender finished tp run
|
||||
* @BATADV_TP_REASON_CANCEL: sender was stopped during run
|
||||
* @BATADV_TP_REASON_DST_UNREACHABLE: receiver could not be reached or didn't
|
||||
* answer
|
||||
* @BATADV_TP_REASON_RESEND_LIMIT: (unused) sender retry reached limit
|
||||
* @BATADV_TP_REASON_ALREADY_ONGOING: test to or from the same node already
|
||||
* ongoing
|
||||
* @BATADV_TP_REASON_MEMORY_ERROR: test was stopped due to low memory
|
||||
* @BATADV_TP_REASON_CANT_SEND: failed to send via outgoing interface
|
||||
* @BATADV_TP_REASON_TOO_MANY: too many ongoing sessions
|
||||
*/
|
||||
enum batadv_tp_meter_reason {
|
||||
BATADV_TP_REASON_COMPLETE = 3,
|
||||
BATADV_TP_REASON_CANCEL = 4,
|
||||
/* error status >= 128 */
|
||||
BATADV_TP_REASON_DST_UNREACHABLE = 128,
|
||||
BATADV_TP_REASON_RESEND_LIMIT = 129,
|
||||
BATADV_TP_REASON_ALREADY_ONGOING = 130,
|
||||
BATADV_TP_REASON_MEMORY_ERROR = 131,
|
||||
BATADV_TP_REASON_CANT_SEND = 132,
|
||||
BATADV_TP_REASON_TOO_MANY = 133,
|
||||
};
|
||||
|
||||
#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */
|
||||
@@ -17,6 +17,7 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_BATMAN_ADV) += batman-adv.o
|
||||
batman-adv-y += bat_algo.o
|
||||
batman-adv-y += bat_iv_ogm.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_elp.o
|
||||
@@ -31,12 +32,16 @@ batman-adv-y += gateway_common.o
|
||||
batman-adv-y += hard-interface.o
|
||||
batman-adv-y += hash.o
|
||||
batman-adv-y += icmp_socket.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_DEBUG) += log.o
|
||||
batman-adv-y += main.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_MCAST) += multicast.o
|
||||
batman-adv-y += netlink.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_NC) += network-coding.o
|
||||
batman-adv-y += originator.o
|
||||
batman-adv-y += routing.o
|
||||
batman-adv-y += send.o
|
||||
batman-adv-y += soft-interface.o
|
||||
batman-adv-y += sysfs.o
|
||||
batman-adv-y += tp_meter.o
|
||||
batman-adv-y += translation-table.o
|
||||
batman-adv-y += tvlv.o
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
/* Copyright (C) 2007-2016 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner, Simon Wunderlich
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
|
||||
char batadv_routing_algo[20] = "BATMAN_IV";
|
||||
static struct hlist_head batadv_algo_list;
|
||||
|
||||
/**
|
||||
* batadv_algo_init - Initialize batman-adv algorithm management data structures
|
||||
*/
|
||||
void batadv_algo_init(void)
|
||||
{
|
||||
INIT_HLIST_HEAD(&batadv_algo_list);
|
||||
}
|
||||
|
||||
static struct batadv_algo_ops *batadv_algo_get(char *name)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
|
||||
|
||||
hlist_for_each_entry(bat_algo_ops_tmp, &batadv_algo_list, list) {
|
||||
if (strcmp(bat_algo_ops_tmp->name, name) != 0)
|
||||
continue;
|
||||
|
||||
bat_algo_ops = bat_algo_ops_tmp;
|
||||
break;
|
||||
}
|
||||
|
||||
return bat_algo_ops;
|
||||
}
|
||||
|
||||
int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops_tmp;
|
||||
|
||||
bat_algo_ops_tmp = batadv_algo_get(bat_algo_ops->name);
|
||||
if (bat_algo_ops_tmp) {
|
||||
pr_info("Trying to register already registered routing algorithm: %s\n",
|
||||
bat_algo_ops->name);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
/* all algorithms must implement all ops (for now) */
|
||||
if (!bat_algo_ops->iface.enable ||
|
||||
!bat_algo_ops->iface.disable ||
|
||||
!bat_algo_ops->iface.update_mac ||
|
||||
!bat_algo_ops->iface.primary_set ||
|
||||
!bat_algo_ops->neigh.cmp ||
|
||||
!bat_algo_ops->neigh.is_similar_or_better) {
|
||||
pr_info("Routing algo '%s' does not implement required ops\n",
|
||||
bat_algo_ops->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
INIT_HLIST_NODE(&bat_algo_ops->list);
|
||||
hlist_add_head(&bat_algo_ops->list, &batadv_algo_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops;
|
||||
|
||||
bat_algo_ops = batadv_algo_get(name);
|
||||
if (!bat_algo_ops)
|
||||
return -EINVAL;
|
||||
|
||||
bat_priv->algo_ops = bat_algo_ops;
|
||||
|
||||
return 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;
|
||||
}
|
||||
|
||||
static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
|
||||
{
|
||||
struct batadv_algo_ops *bat_algo_ops;
|
||||
char *algo_name = (char *)val;
|
||||
size_t name_len = strlen(algo_name);
|
||||
|
||||
if (name_len > 0 && algo_name[name_len - 1] == '\n')
|
||||
algo_name[name_len - 1] = '\0';
|
||||
|
||||
bat_algo_ops = batadv_algo_get(algo_name);
|
||||
if (!bat_algo_ops) {
|
||||
pr_err("Routing algorithm '%s' is not supported\n", algo_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return param_set_copystring(algo_name, kp);
|
||||
}
|
||||
|
||||
static const struct kernel_param_ops batadv_param_ops_ra = {
|
||||
.set = batadv_param_set_ra,
|
||||
.get = param_get_string,
|
||||
};
|
||||
|
||||
static struct kparam_string batadv_param_string_ra = {
|
||||
.maxlen = sizeof(batadv_routing_algo),
|
||||
.string = batadv_routing_algo,
|
||||
};
|
||||
|
||||
module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
|
||||
0644);
|
||||
@@ -20,35 +20,16 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
int batadv_iv_init(void);
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_BATMAN_V
|
||||
struct seq_file;
|
||||
|
||||
int batadv_v_init(void);
|
||||
void batadv_v_hardif_init(struct batadv_hard_iface *hardif);
|
||||
int batadv_v_mesh_init(struct batadv_priv *bat_priv);
|
||||
void batadv_v_mesh_free(struct batadv_priv *bat_priv);
|
||||
extern char batadv_routing_algo[];
|
||||
extern struct list_head batadv_hardif_list;
|
||||
|
||||
#else
|
||||
|
||||
static inline int batadv_v_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_v_hardif_init(struct batadv_hard_iface *hardif)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int batadv_v_mesh_init(struct batadv_priv *bat_priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_v_mesh_free(struct batadv_priv *bat_priv)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BATMAN_ADV_BATMAN_V */
|
||||
void batadv_algo_init(void);
|
||||
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);
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_BAT_ALGO_H_ */
|
||||
|
||||
+24
-16
@@ -15,7 +15,7 @@
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "bat_iv_ogm.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
@@ -31,8 +31,8 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
@@ -49,15 +49,18 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "bitarray.h"
|
||||
#include "hard-interface.h"
|
||||
#include "hash.h"
|
||||
#include "log.h"
|
||||
#include "network-coding.h"
|
||||
#include "originator.h"
|
||||
#include "packet.h"
|
||||
#include "routing.h"
|
||||
#include "send.h"
|
||||
#include "translation-table.h"
|
||||
#include "tvlv.h"
|
||||
|
||||
static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work);
|
||||
|
||||
@@ -1850,8 +1853,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
||||
/* did we receive a B.A.T.M.A.N. IV OGM packet on an interface
|
||||
* that does not have B.A.T.M.A.N. IV enabled ?
|
||||
*/
|
||||
if (bat_priv->bat_algo_ops->bat_iface_enable !=
|
||||
batadv_iv_ogm_iface_enable)
|
||||
if (bat_priv->algo_ops->iface.enable != batadv_iv_ogm_iface_enable)
|
||||
return NET_RX_DROP;
|
||||
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
|
||||
@@ -2117,18 +2119,24 @@ static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
|
||||
|
||||
static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
|
||||
.name = "BATMAN_IV",
|
||||
.bat_iface_activate = batadv_iv_iface_activate,
|
||||
.bat_iface_enable = batadv_iv_ogm_iface_enable,
|
||||
.bat_iface_disable = batadv_iv_ogm_iface_disable,
|
||||
.bat_iface_update_mac = batadv_iv_ogm_iface_update_mac,
|
||||
.bat_primary_iface_set = batadv_iv_ogm_primary_iface_set,
|
||||
.bat_neigh_cmp = batadv_iv_ogm_neigh_cmp,
|
||||
.bat_neigh_is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
|
||||
.bat_neigh_print = batadv_iv_neigh_print,
|
||||
.bat_orig_print = batadv_iv_ogm_orig_print,
|
||||
.bat_orig_free = batadv_iv_ogm_orig_free,
|
||||
.bat_orig_add_if = batadv_iv_ogm_orig_add_if,
|
||||
.bat_orig_del_if = batadv_iv_ogm_orig_del_if,
|
||||
.iface = {
|
||||
.activate = batadv_iv_iface_activate,
|
||||
.enable = batadv_iv_ogm_iface_enable,
|
||||
.disable = batadv_iv_ogm_iface_disable,
|
||||
.update_mac = batadv_iv_ogm_iface_update_mac,
|
||||
.primary_set = batadv_iv_ogm_primary_iface_set,
|
||||
},
|
||||
.neigh = {
|
||||
.cmp = batadv_iv_ogm_neigh_cmp,
|
||||
.is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
|
||||
.print = batadv_iv_neigh_print,
|
||||
},
|
||||
.orig = {
|
||||
.print = batadv_iv_ogm_orig_print,
|
||||
.free = batadv_iv_ogm_orig_free,
|
||||
.add_if = batadv_iv_ogm_orig_add_if,
|
||||
.del_if = batadv_iv_ogm_orig_del_if,
|
||||
},
|
||||
};
|
||||
|
||||
int __init batadv_iv_init(void)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/* Copyright (C) 2007-2016 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner, Simon Wunderlich
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _BATMAN_ADV_BATADV_IV_OGM_H_
|
||||
#define _BATMAN_ADV_BATADV_IV_OGM_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
int batadv_iv_init(void);
|
||||
|
||||
#endif /* _BATMAN_ADV_BATADV_IV_OGM_H_ */
|
||||
+18
-11
@@ -15,7 +15,7 @@
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "bat_v.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "bat_v_elp.h"
|
||||
#include "bat_v_ogm.h"
|
||||
#include "hard-interface.h"
|
||||
@@ -321,16 +322,22 @@ err_ifinfo1:
|
||||
|
||||
static struct batadv_algo_ops batadv_batman_v __read_mostly = {
|
||||
.name = "BATMAN_V",
|
||||
.bat_iface_activate = batadv_v_iface_activate,
|
||||
.bat_iface_enable = batadv_v_iface_enable,
|
||||
.bat_iface_disable = batadv_v_iface_disable,
|
||||
.bat_iface_update_mac = batadv_v_iface_update_mac,
|
||||
.bat_primary_iface_set = batadv_v_primary_iface_set,
|
||||
.bat_hardif_neigh_init = batadv_v_hardif_neigh_init,
|
||||
.bat_orig_print = batadv_v_orig_print,
|
||||
.bat_neigh_cmp = batadv_v_neigh_cmp,
|
||||
.bat_neigh_is_similar_or_better = batadv_v_neigh_is_sob,
|
||||
.bat_neigh_print = batadv_v_neigh_print,
|
||||
.iface = {
|
||||
.activate = batadv_v_iface_activate,
|
||||
.enable = batadv_v_iface_enable,
|
||||
.disable = batadv_v_iface_disable,
|
||||
.update_mac = batadv_v_iface_update_mac,
|
||||
.primary_set = batadv_v_primary_iface_set,
|
||||
},
|
||||
.neigh = {
|
||||
.hardif_init = batadv_v_hardif_neigh_init,
|
||||
.cmp = batadv_v_neigh_cmp,
|
||||
.is_similar_or_better = batadv_v_neigh_is_sob,
|
||||
.print = batadv_v_neigh_print,
|
||||
},
|
||||
.orig = {
|
||||
.print = batadv_v_orig_print,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/* Copyright (C) 2011-2016 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Marek Lindner, Linus Lüssing
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _NET_BATMAN_ADV_BAT_V_H_
|
||||
#define _NET_BATMAN_ADV_BAT_V_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_BATMAN_V
|
||||
|
||||
int batadv_v_init(void);
|
||||
void batadv_v_hardif_init(struct batadv_hard_iface *hardif);
|
||||
int batadv_v_mesh_init(struct batadv_priv *bat_priv);
|
||||
void batadv_v_mesh_free(struct batadv_priv *bat_priv);
|
||||
|
||||
#else
|
||||
|
||||
static inline int batadv_v_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_v_hardif_init(struct batadv_hard_iface *hardif)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int batadv_v_mesh_init(struct batadv_priv *bat_priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_v_mesh_free(struct batadv_priv *bat_priv)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BATMAN_ADV_BATMAN_V */
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_BAT_V_H_ */
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "bat_algo.h"
|
||||
#include "bat_v_ogm.h"
|
||||
#include "hard-interface.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "packet.h"
|
||||
#include "routing.h"
|
||||
@@ -503,7 +504,7 @@ int batadv_v_elp_packet_recv(struct sk_buff *skb,
|
||||
/* did we receive a B.A.T.M.A.N. V ELP packet on an interface
|
||||
* that does not have B.A.T.M.A.N. V ELP enabled ?
|
||||
*/
|
||||
if (strcmp(bat_priv->bat_algo_ops->name, "BATMAN_V") != 0)
|
||||
if (strcmp(bat_priv->algo_ops->name, "BATMAN_V") != 0)
|
||||
return NET_RX_DROP;
|
||||
|
||||
elp_packet = (struct batadv_elp_packet *)skb->data;
|
||||
|
||||
@@ -15,11 +15,11 @@
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#ifndef _NET_BATMAN_ADV_BAT_V_ELP_H_
|
||||
#define _NET_BATMAN_ADV_BAT_V_ELP_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
struct sk_buff;
|
||||
struct work_struct;
|
||||
|
||||
|
||||
@@ -39,13 +39,16 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "hard-interface.h"
|
||||
#include "hash.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "packet.h"
|
||||
#include "routing.h"
|
||||
#include "send.h"
|
||||
#include "translation-table.h"
|
||||
#include "tvlv.h"
|
||||
|
||||
/**
|
||||
* batadv_v_ogm_orig_get - retrieve and possibly create an originator node
|
||||
@@ -751,7 +754,7 @@ int batadv_v_ogm_packet_recv(struct sk_buff *skb,
|
||||
/* did we receive a OGM2 packet on an interface that does not have
|
||||
* B.A.T.M.A.N. V enabled ?
|
||||
*/
|
||||
if (strcmp(bat_priv->bat_algo_ops->name, "BATMAN_V") != 0)
|
||||
if (strcmp(bat_priv->algo_ops->name, "BATMAN_V") != 0)
|
||||
return NET_RX_DROP;
|
||||
|
||||
if (!batadv_check_management_packet(skb, if_incoming, BATADV_OGM2_HLEN))
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
#ifndef _BATMAN_ADV_BATADV_V_OGM_H_
|
||||
#define _BATMAN_ADV_BATADV_V_OGM_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct batadv_hard_iface;
|
||||
struct batadv_priv;
|
||||
struct sk_buff;
|
||||
|
||||
int batadv_v_ogm_init(struct batadv_priv *bat_priv);
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
|
||||
#include "log.h"
|
||||
|
||||
/* shift the packet array by n places. */
|
||||
static void batadv_bitmap_shift_left(unsigned long *seq_bits, s32 n)
|
||||
{
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
|
||||
#include "hard-interface.h"
|
||||
#include "hash.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "packet.h"
|
||||
#include "sysfs.h"
|
||||
|
||||
+2
-215
@@ -18,36 +18,26 @@
|
||||
#include "debugfs.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/sched.h> /* for linux/wait.h */
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/wait.h>
|
||||
#include <stdarg.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"
|
||||
@@ -55,209 +45,6 @@
|
||||
|
||||
static struct dentry *batadv_debugfs;
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUG
|
||||
#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;
|
||||
}
|
||||
|
||||
int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char tmp_log_buf[256];
|
||||
|
||||
va_start(args, fmt);
|
||||
vscnprintf(tmp_log_buf, sizeof(tmp_log_buf), fmt, args);
|
||||
batadv_fdebug_log(bat_priv->debug_log, "[%10u] %s",
|
||||
jiffies_to_msecs(jiffies), tmp_log_buf);
|
||||
va_end(args);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int batadv_log_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
return -EBUSY;
|
||||
|
||||
nonseekable_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(VERIFY_WRITE, 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 unsigned int 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 POLLIN | POLLRDNORM;
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
static int batadv_debug_log_setup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
struct dentry *d;
|
||||
|
||||
if (!bat_priv->debug_dir)
|
||||
goto err;
|
||||
|
||||
bat_priv->debug_log = kzalloc(sizeof(*bat_priv->debug_log), GFP_ATOMIC);
|
||||
if (!bat_priv->debug_log)
|
||||
goto err;
|
||||
|
||||
spin_lock_init(&bat_priv->debug_log->lock);
|
||||
init_waitqueue_head(&bat_priv->debug_log->queue_wait);
|
||||
|
||||
d = debugfs_create_file("log", S_IFREG | S_IRUSR,
|
||||
bat_priv->debug_dir, bat_priv,
|
||||
&batadv_log_fops);
|
||||
if (!d)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void batadv_debug_log_cleanup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
kfree(bat_priv->debug_log);
|
||||
bat_priv->debug_log = NULL;
|
||||
}
|
||||
#else /* CONFIG_BATMAN_ADV_DEBUG */
|
||||
static int batadv_debug_log_setup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void batadv_debug_log_cleanup(struct batadv_priv *bat_priv)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int batadv_algorithms_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, batadv_algo_seq_print_text, NULL);
|
||||
|
||||
@@ -45,9 +45,11 @@
|
||||
|
||||
#include "hard-interface.h"
|
||||
#include "hash.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "send.h"
|
||||
#include "translation-table.h"
|
||||
#include "tvlv.h"
|
||||
|
||||
static void batadv_dat_purge(struct work_struct *work);
|
||||
|
||||
|
||||
@@ -433,11 +433,12 @@ err:
|
||||
* @orig_node: final destination of the created fragments
|
||||
* @neigh_node: next-hop of the created fragments
|
||||
*
|
||||
* Return: true on success, false otherwise.
|
||||
* Return: the netdev tx status or -1 in case of error.
|
||||
* When -1 is returned the skb is not consumed.
|
||||
*/
|
||||
bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node,
|
||||
struct batadv_neigh_node *neigh_node)
|
||||
int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node,
|
||||
struct batadv_neigh_node *neigh_node)
|
||||
{
|
||||
struct batadv_priv *bat_priv;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
@@ -446,7 +447,7 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
unsigned int mtu = neigh_node->if_incoming->net_dev->mtu;
|
||||
unsigned int header_size = sizeof(frag_header);
|
||||
unsigned int max_fragment_size, max_packet_size;
|
||||
bool ret = false;
|
||||
int ret = -1;
|
||||
|
||||
/* To avoid merge and refragmentation at next-hops we never send
|
||||
* fragments larger than BATADV_FRAG_MAX_FRAG_SIZE
|
||||
@@ -457,12 +458,12 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
|
||||
/* Don't even try to fragment, if we need more than 16 fragments */
|
||||
if (skb->len > max_packet_size)
|
||||
goto out_err;
|
||||
goto out;
|
||||
|
||||
bat_priv = orig_node->bat_priv;
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
if (!primary_if)
|
||||
goto out_err;
|
||||
goto out;
|
||||
|
||||
/* Create one header to be copied to all fragments */
|
||||
frag_header.packet_type = BATADV_UNICAST_FRAG;
|
||||
@@ -488,23 +489,33 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
while (skb->len > max_fragment_size) {
|
||||
skb_fragment = batadv_frag_create(skb, &frag_header, mtu);
|
||||
if (!skb_fragment)
|
||||
goto out_err;
|
||||
goto out;
|
||||
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_TX);
|
||||
batadv_add_counter(bat_priv, BATADV_CNT_FRAG_TX_BYTES,
|
||||
skb_fragment->len + ETH_HLEN);
|
||||
batadv_send_unicast_skb(skb_fragment, neigh_node);
|
||||
ret = batadv_send_unicast_skb(skb_fragment, neigh_node);
|
||||
if (ret != NET_XMIT_SUCCESS) {
|
||||
/* return -1 so that the caller can free the original
|
||||
* skb
|
||||
*/
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
frag_header.no++;
|
||||
|
||||
/* The initial check in this function should cover this case */
|
||||
if (frag_header.no == BATADV_FRAG_MAX_FRAGMENTS - 1)
|
||||
goto out_err;
|
||||
if (frag_header.no == BATADV_FRAG_MAX_FRAGMENTS - 1) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make room for the fragment header. */
|
||||
if (batadv_skb_head_push(skb, header_size) < 0 ||
|
||||
pskb_expand_head(skb, header_size + ETH_HLEN, 0, GFP_ATOMIC) < 0)
|
||||
goto out_err;
|
||||
goto out;
|
||||
|
||||
memcpy(skb->data, &frag_header, header_size);
|
||||
|
||||
@@ -512,11 +523,9 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_TX);
|
||||
batadv_add_counter(bat_priv, BATADV_CNT_FRAG_TX_BYTES,
|
||||
skb->len + ETH_HLEN);
|
||||
batadv_send_unicast_skb(skb, neigh_node);
|
||||
ret = batadv_send_unicast_skb(skb, neigh_node);
|
||||
|
||||
ret = true;
|
||||
|
||||
out_err:
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
|
||||
@@ -34,9 +34,9 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node_src);
|
||||
bool batadv_frag_skb_buffer(struct sk_buff **skb,
|
||||
struct batadv_orig_node *orig_node);
|
||||
bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node,
|
||||
struct batadv_neigh_node *neigh_node);
|
||||
int batadv_frag_send_packet(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node,
|
||||
struct batadv_neigh_node *neigh_node);
|
||||
|
||||
/**
|
||||
* batadv_frag_check_entry - check if a list of fragments has timed out
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
|
||||
#include "gateway_common.h"
|
||||
#include "hard-interface.h"
|
||||
#include "log.h"
|
||||
#include "originator.h"
|
||||
#include "packet.h"
|
||||
#include "routing.h"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user