[B.A.T.M.A.N.] [PATCH v4 5/5] batman-adv: Avoid sysfs name collision for netns moves

2016-06-10 Thread Sven Eckelmann
The kobject_put is only removing the sysfs entry and corresponding entries
when its reference counter becomes zero. This tends to lead to collisions
when a device is moved between two different network namespaces because
some of the sysfs files have to be removed first and then added again to
the already moved sysfs entry.

WARNING: CPU: 0 PID: 290 at lib/kobject.c:240 
kobject_add_internal+0x5ec/0x8a0
kobject_add_internal failed for batman_adv with -EEXIST, don't try to 
register things with the same name in the same directory.

But the caller of kobject_put can already remove the sysfs entry before it
does the kobject_put. This removal is done even when the reference counter
is not yet zero and thus avoids the problem.

Signed-off-by: Sven Eckelmann 
---
v4:
 - rebase on top of current master
 - avoid deletes of vlan->kobj when it is a pointer to bat_priv->mesh_obj
   (happens for untagged vlan and can cause some kernfs warnings)
v3:
 - rebased on top of current master to fix conflicts with newest patches
v2:
 - rebased on top of current master to fix conflicts with newest patches
---
 net/batman-adv/sysfs.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
index 8528959..4e06cb7 100644
--- a/net/batman-adv/sysfs.c
+++ b/net/batman-adv/sysfs.c
@@ -713,6 +713,8 @@ rem_attr:
for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
 
+   kobject_uevent(bat_priv->mesh_obj, KOBJ_REMOVE);
+   kobject_del(bat_priv->mesh_obj);
kobject_put(bat_priv->mesh_obj);
bat_priv->mesh_obj = NULL;
 out:
@@ -727,6 +729,8 @@ void batadv_sysfs_del_meshif(struct net_device *dev)
for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
 
+   kobject_uevent(bat_priv->mesh_obj, KOBJ_REMOVE);
+   kobject_del(bat_priv->mesh_obj);
kobject_put(bat_priv->mesh_obj);
bat_priv->mesh_obj = NULL;
 }
@@ -782,6 +786,10 @@ rem_attr:
for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr)
sysfs_remove_file(vlan->kobj, &((*bat_attr)->attr));
 
+   if (vlan->kobj != bat_priv->mesh_obj) {
+   kobject_uevent(vlan->kobj, KOBJ_REMOVE);
+   kobject_del(vlan->kobj);
+   }
kobject_put(vlan->kobj);
vlan->kobj = NULL;
 out:
@@ -801,6 +809,10 @@ void batadv_sysfs_del_vlan(struct batadv_priv *bat_priv,
for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr)
sysfs_remove_file(vlan->kobj, &((*bat_attr)->attr));
 
+   if (vlan->kobj != bat_priv->mesh_obj) {
+   kobject_uevent(vlan->kobj, KOBJ_REMOVE);
+   kobject_del(vlan->kobj);
+   }
kobject_put(vlan->kobj);
vlan->kobj = NULL;
 }
@@ -1103,6 +1115,8 @@ out:
 
 void batadv_sysfs_del_hardif(struct kobject **hardif_obj)
 {
+   kobject_uevent(*hardif_obj, KOBJ_REMOVE);
+   kobject_del(*hardif_obj);
kobject_put(*hardif_obj);
*hardif_obj = NULL;
 }
-- 
2.8.1



[B.A.T.M.A.N.] [PATCH v4 4/5] batman-adv: Revert "postpone sysfs removal when unregistering"

2016-06-10 Thread Sven Eckelmann
Postponing the removal of the interface breaks the expected behavior of
NETDEV_UNREGISTER and NETDEV_PRE_TYPE_CHANGE. This is especially
problematic when an interface is removed and added in quick succession.

This reverts commit a33c882c1069 ("batman-adv: postpone sysfs removal when
unregistering").

Signed-off-by: Sven Eckelmann 
---
v4:
 - rebase on top of current master
v3:
 - rebased on top of current master to fix conflicts with newest patches
v2:
 - rebased on top of current master to fix conflicts with newest patches
 - adjust commit message to use 12-char commit id + commit subject to
   reference
   reverted commit
---
 net/batman-adv/hard-interface.c | 26 +++-
 net/batman-adv/soft-interface.c | 44 -
 net/batman-adv/types.h  |  4 
 3 files changed, 16 insertions(+), 58 deletions(-)

diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index 1f90808..714af8e 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -35,7 +35,6 @@
 #include 
 #include 
 #include 
-#include 
 
 #include "bat_v.h"
 #include "bridge_loop_avoidance.h"
@@ -625,25 +624,6 @@ out:
batadv_hardif_put(primary_if);
 }
 
-/**
- * batadv_hardif_remove_interface_finish - cleans up the remains of a hardif
- * @work: work queue item
- *
- * Free the parts of the hard interface which can not be removed under
- * rtnl lock (to prevent deadlock situations).
- */
-static void batadv_hardif_remove_interface_finish(struct work_struct *work)
-{
-   struct batadv_hard_iface *hard_iface;
-
-   hard_iface = container_of(work, struct batadv_hard_iface,
- cleanup_work);
-
-   batadv_debugfs_del_hardif(hard_iface);
-   batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
-   batadv_hardif_put(hard_iface);
-}
-
 static struct batadv_hard_iface *
 batadv_hardif_add_interface(struct net_device *net_dev)
 {
@@ -676,8 +656,6 @@ batadv_hardif_add_interface(struct net_device *net_dev)
 
INIT_LIST_HEAD(&hard_iface->list);
INIT_HLIST_HEAD(&hard_iface->neigh_list);
-   INIT_WORK(&hard_iface->cleanup_work,
- batadv_hardif_remove_interface_finish);
 
spin_lock_init(&hard_iface->neigh_list_lock);
 
@@ -719,7 +697,9 @@ static void batadv_hardif_remove_interface(struct 
batadv_hard_iface *hard_iface)
return;
 
hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
-   queue_work(batadv_event_workqueue, &hard_iface->cleanup_work);
+   batadv_debugfs_del_hardif(hard_iface);
+   batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
+   batadv_hardif_put(hard_iface);
 }
 
 void batadv_hardif_remove_interfaces(void)
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index 7527c06..216ac03 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -39,6 +39,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -46,7 +47,6 @@
 #include 
 #include 
 #include 
-#include 
 
 #include "bat_algo.h"
 #include "bridge_loop_avoidance.h"
@@ -747,34 +747,6 @@ static void batadv_set_lockdep_class(struct net_device 
*dev)
 }
 
 /**
- * batadv_softif_destroy_finish - cleans up the remains of a softif
- * @work: work queue item
- *
- * Free the parts of the soft interface which can not be removed under
- * rtnl lock (to prevent deadlock situations).
- */
-static void batadv_softif_destroy_finish(struct work_struct *work)
-{
-   struct batadv_softif_vlan *vlan;
-   struct batadv_priv *bat_priv;
-   struct net_device *soft_iface;
-
-   bat_priv = container_of(work, struct batadv_priv,
-   cleanup_work);
-   soft_iface = bat_priv->soft_iface;
-
-   /* 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_netdev(soft_iface);
-}
-
-/**
  * batadv_softif_init_late - late stage initialization of soft interface
  * @dev: registered network device to modify
  *
@@ -791,7 +763,6 @@ static int batadv_softif_init_late(struct net_device *dev)
 
bat_priv = netdev_priv(dev);
bat_priv->soft_iface = dev;
-   INIT_WORK(&bat_priv->cleanup_work, batadv_softif_destroy_finish);
 
/* batadv_interface_stats() needs to be available as soon as
 * register_netdevice() has been called
@@ -1028,8 +999,19 @@ struct net_device *batadv_softif_create(struct net *net, 
const char *name)
 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 = bat

[B.A.T.M.A.N.] [PATCH v4 3/5] batman-adv: Modify mesh_iface outside sysfs context

2016-06-10 Thread Sven Eckelmann
The legacy sysfs interface to modify interfaces belonging to batman-adv
is run inside a region holding s_lock. And to add a net_device, it has
to also get the rtnl_lock. This is exactly the other way around than in
other virtual net_devices and conflicts with netdevice notifier which
executes inside rtnl_lock.

The inverted lock situation is currently solved by executing the removal
of netdevices via workqueue. The workqueue isn't executed inside
rtnl_lock and thus can independently get the s_lock and the rtnl_lock.

But this workaround fails when the netdevice notifier creates events in
quick succession and the earlier triggered removal of a net_device isn't
processed in the workqueue before the adding of the new netdevice (with
same name) event is issued.

Instead the legacy sysfs interface store events have to be enqueued in
a workqueue to loose the s_lock. The worker is then free to get the
required locks and the deadlock is avoided.

Signed-off-by: Sven Eckelmann 
---
v4:
 - rebase on top of current master
v3:
 - rebased on top of current master to fix conflicts with newest patches
v2:
 - rebased on top of current master to fix conflicts with newest patches
---
 net/batman-adv/sysfs.c | 107 +
 net/batman-adv/types.h |  13 ++
 2 files changed, 94 insertions(+), 26 deletions(-)

diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
index fe9ca94..8528959 100644
--- a/net/batman-adv/sysfs.c
+++ b/net/batman-adv/sysfs.c
@@ -37,6 +37,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "bridge_loop_avoidance.h"
 #include "distributed-arp-table.h"
@@ -828,31 +829,31 @@ static ssize_t batadv_show_mesh_iface(struct kobject 
*kobj,
return length;
 }
 
-static ssize_t batadv_store_mesh_iface(struct kobject *kobj,
-  struct attribute *attr, char *buff,
-  size_t count)
+/**
+ * batadv_store_mesh_iface_finish - store new hardif mesh_iface state
+ * @net_dev: netdevice to add/remove to/from batman-adv soft-interface
+ * @ifname: name of soft-interface to modify
+ *
+ * Changes the parts of the hard+soft interface which can not be modified under
+ * sysfs lock (to prevent deadlock situations).
+ *
+ * Return: 0 on success, 0 < on failure
+ */
+static int batadv_store_mesh_iface_finish(struct net_device *net_dev,
+ char ifname[IFNAMSIZ])
 {
-   struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
struct net *net = dev_net(net_dev);
struct batadv_hard_iface *hard_iface;
-   int status_tmp = -1;
-   int ret = count;
+   int status_tmp;
+   int ret = 0;
+
+   ASSERT_RTNL();
 
hard_iface = batadv_hardif_get_by_netdev(net_dev);
if (!hard_iface)
-   return count;
-
-   if (buff[count - 1] == '\n')
-   buff[count - 1] = '\0';
-
-   if (strlen(buff) >= IFNAMSIZ) {
-   pr_err("Invalid parameter for 'mesh_iface' setting received: 
interface name too long '%s'\n",
-  buff);
-   batadv_hardif_put(hard_iface);
-   return -EINVAL;
-   }
+   return 0;
 
-   if (strncmp(buff, "none", 4) == 0)
+   if (strncmp(ifname, "none", 4) == 0)
status_tmp = BATADV_IF_NOT_IN_USE;
else
status_tmp = BATADV_IF_I_WANT_YOU;
@@ -861,15 +862,13 @@ static ssize_t batadv_store_mesh_iface(struct kobject 
*kobj,
goto out;
 
if ((hard_iface->soft_iface) &&
-   (strncmp(hard_iface->soft_iface->name, buff, IFNAMSIZ) == 0))
+   (strncmp(hard_iface->soft_iface->name, ifname, IFNAMSIZ) == 0))
goto out;
 
-   rtnl_lock();
-
if (status_tmp == BATADV_IF_NOT_IN_USE) {
batadv_hardif_disable_interface(hard_iface,
BATADV_IF_CLEANUP_AUTO);
-   goto unlock;
+   goto out;
}
 
/* if the interface already is in use */
@@ -877,15 +876,71 @@ static ssize_t batadv_store_mesh_iface(struct kobject 
*kobj,
batadv_hardif_disable_interface(hard_iface,
BATADV_IF_CLEANUP_AUTO);
 
-   ret = batadv_hardif_enable_interface(hard_iface, net, buff);
-
-unlock:
-   rtnl_unlock();
+   ret = batadv_hardif_enable_interface(hard_iface, net, ifname);
 out:
batadv_hardif_put(hard_iface);
return ret;
 }
 
+/**
+ * batadv_store_mesh_iface_work - store new hardif mesh_iface state
+ * @work: work queue item
+ *
+ * Changes the parts of the hard+soft interface which can not be modified under
+ * sysfs lock (to prevent deadlock situations).
+ */
+static void batadv_store_mesh_iface_work(struct work_struct *work)
+{
+   struct batadv_store_mesh_work *store_work;
+   int ret;
+
+   store_work = container_of(work, struct batadv_store_mesh_wo

[B.A.T.M.A.N.] [PATCH v4 1/5] batman-adv: Define module rtnl link name

2016-06-10 Thread Sven Eckelmann
The batman-adv module can automatically be loaded when operations over the
rtnl link are triggered. This requires only the correct rtnl link name in
the module header.

Signed-off-by: Sven Eckelmann 
---
v4:
 - rebase on top of current master
v3:
 - rebased on top of current master to fix conflicts with newest patches
v2:
 - rebased on top of current master to fix conflicts with newest patches
---
 net/batman-adv/main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c
index fe4c5e2..f61479b 100644
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -638,3 +638,4 @@ MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
 MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
 MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
 MODULE_VERSION(BATADV_SOURCE_VERSION);
+MODULE_ALIAS_RTNL_LINK("batadv");
-- 
2.8.1



[B.A.T.M.A.N.] [PATCH v4 2/5] batman-adv: Use rtnl link in device creation example

2016-06-10 Thread Sven Eckelmann
The standard kernel API to add new virtual interfaces and attach other
interfaces to it is rtnl-link. batman-adv supports it since v3.10. This
functionality should be used instead of the legacy batman-adv-only sysfs
interface.

Signed-off-by: Sven Eckelmann 
---
v4:
 - rebase on top of current master
v3:
 - rebased on top of current master to fix conflicts with newest patches
v2:
 - rebased on top of current master to fix conflicts with newest patches
---
 Documentation/networking/batman-adv.txt | 17 +++--
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/Documentation/networking/batman-adv.txt 
b/Documentation/networking/batman-adv.txt
index 1b5e7a7..8a8d3d9 100644
--- a/Documentation/networking/batman-adv.txt
+++ b/Documentation/networking/batman-adv.txt
@@ -43,10 +43,15 @@ new interfaces to verify the compatibility. There is no  
need  to
 reload the module if you plug your USB wifi adapter into your ma-
 chine after batman advanced was initially loaded.
 
-To activate a  given  interface  simply  write  "bat0"  into  its
-"mesh_iface" file inside the batman_adv subfolder:
+The batman-adv soft-interface can be created using  the  iproute2
+tool "ip"
 
-# echo bat0 > /sys/class/net/eth0/batman_adv/mesh_iface
+# ip link add name bat0 type batadv
+
+To  activate a  given  interface  simply  attach it to the "bat0"
+interface
+
+# ip link set dev eth0 master bat0
 
 Repeat  this step for all interfaces you wish to add.  Now batman
 starts using/broadcasting on this/these interface(s).
@@ -56,10 +61,10 @@ By reading the "iface_status" file you can check its status:
 # cat /sys/class/net/eth0/batman_adv/iface_status
 # active
 
-To deactivate an interface you have  to  write  "none"  into  its
-"mesh_iface" file:
+To  deactivate  an  interface  you  have   to  detach it from the
+"bat0" interface:
 
-# echo none > /sys/class/net/eth0/batman_adv/mesh_iface
+# ip link set dev eth0 nomaster
 
 
 All  mesh  wide  settings  can be found in batman's own interface
-- 
2.8.1



[B.A.T.M.A.N.] [PATCH] batman-adv: Don't propagate negative dev_queue_xmit return values

2016-06-10 Thread Sven Eckelmann
batadv_send_skb_packet used by batadv_send_skb_to_orig and its return value
is given directly to callers of batadv_send_skb_packet.

batadv_send_skb_to_orig
-> batadv_send_unicast_skb
   -> batadv_send_skb_packet
  -> dev_queue_xmit

These callers of batadv_send_skb_to_orig expect that the skb isn't consumed
when they receive a -1. But dev_queue_xmit may still have consumed it and
still returned -1. Thus the free for the skb would be called twice.

Fixes: e3b8acbff9c8 ("batman-adv: return netdev status in the TX path")
Signed-off-by: Sven Eckelmann 
---
Antonio, this is not really tested. Could you please review it and tell me
if I may have missed something.

 net/batman-adv/send.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c
index 49836da..d76ccb2 100644
--- a/net/batman-adv/send.c
+++ b/net/batman-adv/send.c
@@ -72,6 +72,7 @@ int batadv_send_skb_packet(struct sk_buff *skb,
 {
struct batadv_priv *bat_priv;
struct ethhdr *ethhdr;
+   int ret;
 
bat_priv = netdev_priv(hard_iface->soft_iface);
 
@@ -109,8 +110,15 @@ int batadv_send_skb_packet(struct sk_buff *skb,
/* dev_queue_xmit() returns a negative result on error.  However on
 * congestion and traffic shaping, it drops and returns NET_XMIT_DROP
 * (which is > 0). This will not be treated as an error.
+*
+* a negative value cannot be returned because it could be interepreted
+* as not consumed skb by callers of batadv_send_skb_to_orig.
 */
-   return dev_queue_xmit(skb);
+   ret = dev_queue_xmit(skb);
+   if (ret < 0)
+   ret = NET_XMIT_DROP;
+
+   return ret;
 send_skb_err:
kfree_skb(skb);
return NET_XMIT_DROP;
-- 
2.8.1



[B.A.T.M.A.N.] [PATCH next] batman-adv: Avoid skb free for batadv_send_skb_to_orig < -1

2016-06-10 Thread Sven Eckelmann
The tp_meter code frees the skb when the batadv_send_skb_to_orig returns <
0. But the batadv_send_skb_to_orig only defines -1 as return code for
failed submits with still valid skbs.

Fixes: 98d7a766b645 ("batman-adv: throughput meter implementation")
Signed-off-by: Sven Eckelmann 
---
Interesting because a patch was submitted to net next to remove NET_XMIT_POLICED
and return -EINPROGRESS instead.

I will maybe later send more patches because the current way of handling
DROPPED/free'd skb/not-freed skb is quite confusing.

 net/batman-adv/tp_meter.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index ed99afb..bf6bffb 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -615,7 +615,7 @@ static int batadv_tp_send_msg(struct batadv_tp_vars 
*tp_vars, const u8 *src,
batadv_tp_fill_prerandom(tp_vars, data, data_len);
 
r = batadv_send_skb_to_orig(skb, orig_node, NULL);
-   if (r < 0)
+   if (r == -1)
kfree_skb(skb);
 
if (r == NET_XMIT_SUCCESS)


[B.A.T.M.A.N.] [PATCH next] batman-adv: Free tp_meter ack skb when it was not consumed

2016-06-10 Thread Sven Eckelmann
batadv_send_skb_to_orig can return -1 to signal that the skb was not
consumed. tp_meter has then to free the skb to avoid a memory leak.

Fixes: 98d7a766b645 ("batman-adv: throughput meter implementation")
Signed-off-by: Sven Eckelmann 
---
Antonio, this is not really tested. Could you please review it and tell me
if I may have missed something.

 net/batman-adv/tp_meter.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index bf6bffb..2333777 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -1206,6 +1206,9 @@ static int batadv_tp_send_ack(struct batadv_priv 
*bat_priv, const u8 *dst,
 
/* send the ack */
r = batadv_send_skb_to_orig(skb, orig_node, NULL);
+   if (r == -1)
+   kfree_skb(skb);
+
if (unlikely(r < 0) || (r == NET_XMIT_DROP)) {
ret = BATADV_TP_REASON_DST_UNREACHABLE;
goto out;


Re: [B.A.T.M.A.N.] [PATCH v5 0/6] Optimizations for setups running dat and bla

2016-06-10 Thread Sven Eckelmann
On Friday 10 June 2016 13:10:58 Andreas Pape wrote:
> This patchset introduces optimizations for batman-adv in setups having several
> gateways into a common (switched) Ethernet backbone network especially if dat
> is additionally enabled.
> 
> Using the current implementation with bla and dat enabled, several problems
> can be observed in a real setup:
> 1. Multiplication of ARP replies from dat enabled gateways and dat enabled
> mesh nodes leading to an "ARP reply storm" in the common backbone network.
> 2. In rare corner cases bla does not fully prevent looping of unicast frames
> in the direction Backbone --> mesh --> backbone and looping of multicast
> frames in the direction mesh --> backbone --> mesh.
> The latter can lead to temporary confusion in the switched backbone resulting
> in packet loss and communication timeouts.
> 
> The observed problems are solved by introduction of additional rules for the
> dat handling, bla packet forwarding and bla claiming/unclaiming of clients.
> 
> v5:
>  - changed function name to batadv_bla_check_claim
>  - put added include file in alphabetical order
>  - added check to exclude ip address 0.0.0.0 from snooping

Doesn't seem to apply:

$ git describe 
v2016.2-50-g3ce003c
$ git am ~/bundle-11-datbla.mbox
Applying: batman-adv: prevent multiple ARP replies sent by gateways if dat 
enbled
error: patch failed: net/batman-adv/distributed-arp-table.c:43
error: net/batman-adv/distributed-arp-table.c: patch does not apply
Patch failed at 0001 batman-adv: prevent multiple ARP replies sent by 
gateways if dat enbled
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

Btw. there seems to be an "a" missing in "enabled" of the Subject
of the first patch :)

Kind regards,
Sven

signature.asc
Description: This is a digitally signed message part.


[B.A.T.M.A.N.] [PATCH v5 4/6] batman-adv: drop unicast packets from other backbone gw

2016-06-10 Thread Andreas Pape
Additional dropping of unicast packets received from another backbone gw of
the same backbone network before being forwarded to the same backbone again
is necessary. It was observed in a test setup that in rare cases these
frames lead to looping unicast traffic backbone->mesh->backbone.

Signed-off-by: Andreas Pape 
---
 net/batman-adv/routing.c |   25 ++---
 1 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
index e3857ed..667e2cd 100644
--- a/net/batman-adv/routing.c
+++ b/net/batman-adv/routing.c
@@ -861,14 +861,16 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
struct batadv_unicast_packet *unicast_packet;
struct batadv_unicast_4addr_packet *unicast_4addr_packet;
-   u8 *orig_addr;
-   struct batadv_orig_node *orig_node = NULL;
+   u8 *orig_addr, *orig_addr_gw;
+   struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
int check, hdr_size = sizeof(*unicast_packet);
enum batadv_subtype subtype;
-   bool is4addr;
+   bool is4addr, is_gw;
+   struct ethhdr *ethhdr;

unicast_packet = (struct batadv_unicast_packet *)skb->data;
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
+   ethhdr = eth_hdr(skb);

is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
/* the caller function should have already pulled 2 bytes */
@@ -891,6 +893,23 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,

/* packet for me */
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
+   /* If this is a unicast packet from another backgone gw,
+* drop it.
+*/
+   orig_addr_gw = ethhdr->h_source;
+   orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw);
+   if (orig_node_gw) {
+   is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw,
+ hdr_size);
+   batadv_orig_node_put(orig_node_gw);
+   if (is_gw) {
+   batadv_dbg(BATADV_DBG_BLA, bat_priv,
+  "Dropped unicast pkt received from 
another backbone gw %pM.\n",
+  orig_addr_gw);
+   return NET_RX_DROP;
+   }
+   }
+
if (is4addr) {
subtype = unicast_4addr_packet->subtype;
batadv_dat_inc_counter(bat_priv, subtype);
--
1.7.0.4



..
PHOENIX CONTACT ELECTRONICS GmbH

Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
___
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren, jegliche anderweitige Verwendung sowie die unbefugte 
Weitergabe dieser Mail ist nicht gestattet.

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and destroy this e-mail. Any unauthorized 
copying, disclosure, distribution or other use of the material or parts thereof 
is strictly forbidden.
___


[B.A.T.M.A.N.] [PATCH v5 5/6] batman-adv: changed debug messages for easier bla debugging

2016-06-10 Thread Andreas Pape
Some of the bla debug messages are extended and additional messages are
added for easier bla debugging. Some debug messages introduced with the
dat changes in prior patches of this patch series have been changed to
be more compliant to other existing debug messages.

Acked-by: Simon Wunderlich 
Signed-off-by: Andreas Pape 
---
 net/batman-adv/bridge_loop_avoidance.c |   18 ++
 net/batman-adv/routing.c   |2 +-
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/net/batman-adv/bridge_loop_avoidance.c 
b/net/batman-adv/bridge_loop_avoidance.c
index cd2d74b..2ccce6e 100644
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -715,8 +715,8 @@ static void batadv_bla_add_claim(struct batadv_priv 
*bat_priv,
goto claim_free_ref;

batadv_dbg(BATADV_DBG_BLA, bat_priv,
-  "bla_add_claim(): changing ownership for %pM, vid 
%d\n",
-  mac, BATADV_PRINT_VID(vid));
+  "bla_add_claim(): changing ownership for %pM, vid %d 
to gw %pM\n",
+  mac, BATADV_PRINT_VID(vid), backbone_gw->orig);

spin_lock_bh(&claim->backbone_gw->crc_lock);
claim->backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
@@ -1240,10 +1240,13 @@ static void batadv_bla_purge_claims(struct batadv_priv 
*bat_priv,
continue;

batadv_dbg(BATADV_DBG_BLA, bat_priv,
-  "bla_purge_claims(): %pM, vid %d, time 
out\n",
+  "bla_purge_claims(): timed out.\n");
+
+purge_now:
+   batadv_dbg(BATADV_DBG_BLA, bat_priv,
+  "bla_purge_claims(): %pM, vid %d\n",
   claim->addr, claim->vid);

-purge_now:
batadv_handle_unclaim(bat_priv, primary_if,
  claim->backbone_gw->orig,
  claim->addr, claim->vid);
@@ -1787,6 +1790,13 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct 
sk_buff *skb,
/* possible optimization: race for a claim */
/* No claim exists yet, claim it for us!
 */
+
+   batadv_dbg(BATADV_DBG_BLA, bat_priv,
+  "bla_rx(): Unclaimed MAC %pM found. Claim it. Local: 
%s\n",
+  ethhdr->h_source,
+  batadv_is_my_client(bat_priv,
+  ethhdr->h_source, vid) ?
+  "yes" : "no");
batadv_handle_claim(bat_priv, primary_if,
primary_if->net_dev->dev_addr,
ethhdr->h_source, vid);
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
index 667e2cd..7eeae86 100644
--- a/net/batman-adv/routing.c
+++ b/net/batman-adv/routing.c
@@ -904,7 +904,7 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
batadv_orig_node_put(orig_node_gw);
if (is_gw) {
batadv_dbg(BATADV_DBG_BLA, bat_priv,
-  "Dropped unicast pkt received from 
another backbone gw %pM.\n",
+  "recv_unicast_packet(): Dropped 
unicast pkt received from another backbone gw %pM.\n",
   orig_addr_gw);
return NET_RX_DROP;
}
--
1.7.0.4



..
PHOENIX CONTACT ELECTRONICS GmbH

Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
___
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren, jegliche anderweitige Verwendung sowie die unbefugte 
Weitergabe dieser Mail ist nicht gestattet.

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and destroy this e-mail. Any unauthorized 
copying, disclosure, distribution or other use of the material or parts thereof 
is strictly forbidden.
___


[B.A.T.M.A.N.] [PATCH v5 6/6] batman-adv: handle race condition for claims between gateways

2016-06-10 Thread Andreas Pape
Consider the following situation which has been found in a test setup:
Gateway B has claimed client C and gateway A has the same backbone
network as B. C sends a broad- or multicast to B and directly after
this packet decides to send another packet to A due to a better TQ
value. B will forward the broad-/multicast into the backbone as it is
the responsible gw and after that A will claim C as it has been
chosen by C as the best gateway. If it now happens that A claims C
before it has received the broad-/multicast forwarded by B (due to
backbone topology or due to some delay in B when forwarding the
packet) we get a critical situation: in the current code A will
immediately unclaim C when receiving the multicast due to the
roaming client scenario although the position of C has not changed
in the mesh. If this happens the multi-/broadcast forwarded by B
will be sent back into the mesh by A and we have looping packets
until one of the gateways claims C again.
In order to prevent this, unclaiming of a client due to the roaming
client scenario is only done after a certain time is expired after
the last claim of the client. 100 ms are used here, which should be
slow enough for big backbones and slow gateways but fast enough not
to break the roaming client use case.

Acked-by: Simon Wunderlich 
Signed-off-by: Andreas Pape 
---
 net/batman-adv/bridge_loop_avoidance.c |   20 
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/net/batman-adv/bridge_loop_avoidance.c 
b/net/batman-adv/bridge_loop_avoidance.c
index 2ccce6e..4c3b294 100644
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -1904,10 +1904,22 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct 
sk_buff *skb,
/* if yes, the client has roamed and we have
 * to unclaim it.
 */
-   batadv_handle_unclaim(bat_priv, primary_if,
- primary_if->net_dev->dev_addr,
- ethhdr->h_source, vid);
-   goto allow;
+   if (batadv_has_timed_out(claim->lasttime, 100)) {
+   /* only unclaim if the last claim entry is
+* older than 100 ms to make sure we really
+* have a roaming client here.
+*/
+   batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_tx(): Roaming 
client %pM detected. Unclaim it.\n",
+  ethhdr->h_source);
+   batadv_handle_unclaim(bat_priv, primary_if,
+ primary_if->net_dev->dev_addr,
+ ethhdr->h_source, vid);
+   goto allow;
+   } else {
+   batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_tx(): Race 
for claim %pM detected. Drop packet.\n",
+  ethhdr->h_source);
+   goto handled;
+   }
}

/* check if it is a multicast/broadcast frame */
--
1.7.0.4



..
PHOENIX CONTACT ELECTRONICS GmbH

Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
___
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren, jegliche anderweitige Verwendung sowie die unbefugte 
Weitergabe dieser Mail ist nicht gestattet.

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and destroy this e-mail. Any unauthorized 
copying, disclosure, distribution or other use of the material or parts thereof 
is strictly forbidden.
___


[B.A.T.M.A.N.] [PATCH v5 3/6] batman-adv: prevent duplication of ARP replies when DAT is used

2016-06-10 Thread Andreas Pape
If none of the backbone gateways in a bla setup has already knowledge of
the mac address searched for in an incoming ARP request from the backbone
an address resolution via the DHT of DAT is started. The gateway can send
several ARP requests to different DHT nodes and therefore can get several
replies. This patch assures that not all of the possible ARP replies are
returned to the backbone by checking the local DAT cache of the gateway.
If there is an entry in the local cache the gateway has already learned
the requested address and there is no need to forward the additional reply
to the backbone.
Furthermore it is checked if this gateway has claimed the source of the ARP
reply and only forwards it to the backbone if it has claimed the source or
if there is no claim at all.

Signed-off-by: Andreas Pape 
---
 net/batman-adv/distributed-arp-table.c |   32 
 1 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/net/batman-adv/distributed-arp-table.c 
b/net/batman-adv/distributed-arp-table.c
index 998a4b8..e7b054a 100644
--- a/net/batman-adv/distributed-arp-table.c
+++ b/net/batman-adv/distributed-arp-table.c
@@ -1244,6 +1244,7 @@ bool batadv_dat_snoop_incoming_arp_reply(struct 
batadv_priv *bat_priv,
__be32 ip_src, ip_dst;
u8 *hw_src, *hw_dst;
bool dropped = false;
+   struct batadv_dat_entry *dat_entry = NULL;
unsigned short vid;

if (!atomic_read(&bat_priv->distributed_arp_table))
@@ -1263,12 +1264,41 @@ bool batadv_dat_snoop_incoming_arp_reply(struct 
batadv_priv *bat_priv,
hw_dst = batadv_arp_hw_dst(skb, hdr_size);
ip_dst = batadv_arp_ip_dst(skb, hdr_size);

+   /* If ip_dst is already in cache and has the right mac address,
+* drop this frame if this ARP reply is destined for us because it's
+* most probably an ARP reply generated by another node of the DHT.
+* We have most probably received already a reply earlier. Delivering
+* this frame would lead to doubled receive of an ARP reply.
+*/
+   dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_src, vid);
+   if ((dat_entry) && (batadv_compare_eth(hw_src, dat_entry->mac_addr))) {
+   batadv_dbg(BATADV_DBG_DAT, bat_priv, "Doubled ARP reply 
removed: ARP MSG = [src: %pM-%pI4 dst: %pM-%pI4]; dat_entry: %pM-%pI4\n",
+  hw_src, &ip_src, hw_dst, &ip_dst,
+  dat_entry->mac_addr, &dat_entry->ip);
+   dropped = true;
+   goto out;
+   }
+
/* Update our internal cache with both the IP addresses the node got
 * within the ARP reply
 */
batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid);
batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid);

+   /* If BLA is enabled, only forward ARP replies if we have claimed the
+* source of the ARP reply or if no one else of the same backbone has
+* already claimed that client. This prevents that different gateways
+* to the same backbone all forward the ARP reply leading to multiple
+* replies in the backbone.
+*/
+   if (!batadv_bla_check_claim(bat_priv, hw_src, vid)) {
+   batadv_dbg(BATADV_DBG_DAT, bat_priv,
+  "Device %pM claimed by another backbone gw. Drop ARP 
reply.\n",
+  hw_src);
+   dropped = true;
+   goto out;
+   }
+
/* if this REPLY is directed to a client of mine, let's deliver the
 * packet to the interface
 */
@@ -1281,6 +1311,8 @@ bool batadv_dat_snoop_incoming_arp_reply(struct 
batadv_priv *bat_priv,
 out:
if (dropped)
kfree_skb(skb);
+   if (dat_entry)
+   batadv_dat_entry_put(dat_entry);
/* if dropped == false -> deliver to the interface */
return dropped;
 }
--
1.7.0.4



..
PHOENIX CONTACT ELECTRONICS GmbH

Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
___
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren, jegliche anderweitige Verwendung sowie die unbefugte 
Weitergabe dieser Mail ist nicht gestattet.

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and destr

[B.A.T.M.A.N.] [PATCH v5 2/6] batman-adv: speed up dat by snooping received ip traffic

2016-06-10 Thread Andreas Pape
Speeding up dat address lookup is achieved by snooping all incoming ip
traffic. This especially increases the propability in bla setups that
a gateway into a common backbone network already has a fitting dat entry
to answer incoming ARP requests directly coming from the backbone
network thus further reducing ARP traffic in the mesh.

Signed-off-by: Andreas Pape 
---
 net/batman-adv/distributed-arp-table.c |   55 
 net/batman-adv/distributed-arp-table.h |9 +-
 net/batman-adv/soft-interface.c|3 ++
 3 files changed, 66 insertions(+), 1 deletions(-)

diff --git a/net/batman-adv/distributed-arp-table.c 
b/net/batman-adv/distributed-arp-table.c
index b752f8d..998a4b8 100644
--- a/net/batman-adv/distributed-arp-table.c
+++ b/net/batman-adv/distributed-arp-table.c
@@ -27,6 +27,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -362,6 +363,60 @@ out:
batadv_dat_entry_put(dat_entry);
 }

+/**
+ * batadv_dat_entry_check - check and update a dat entry
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: socket buffer
+ * @vid: VLAN identifier
+ *
+ * snoops incoming socket buffer for dat cache updates, if dat is enabled.
+ * Can be called from other modules.
+ */
+void batadv_dat_entry_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
+   unsigned short vid)
+{
+   struct vlan_ethhdr *vhdr = NULL, tmp_vhdr;
+   struct ethhdr *ethhdr = NULL;
+   struct iphdr *iphdr = NULL, tmp_iphdr;
+
+   if (!atomic_read(&bat_priv->distributed_arp_table))
+   return;
+
+   ethhdr = eth_hdr(skb);
+
+   switch (ntohs(ethhdr->h_proto)) {
+   case ETH_P_IP:
+   iphdr = skb_header_pointer(skb, ETH_HLEN, sizeof(tmp_iphdr),
+  &tmp_iphdr);
+   break;
+   case ETH_P_8021Q:
+   vhdr = skb_header_pointer(skb, 0, sizeof(tmp_vhdr),
+ &tmp_vhdr);
+   if (!vhdr)
+   return;
+   if (ntohs(vhdr->h_vlan_encapsulated_proto) != ETH_P_IP)
+   return;
+   iphdr = skb_header_pointer(skb, sizeof(tmp_vhdr),
+  sizeof(tmp_iphdr),
+  &tmp_iphdr);
+   break;
+   }
+
+   if (!iphdr)
+   return;
+   /* don't add source address 0.0.0.0, which can occur during
+* dhcp discover or request.
+*/
+   if (ntohl(iphdr->saddr) == 0)
+   return;
+
+   batadv_dbg(BATADV_DBG_DAT, bat_priv,
+  "Snooped IP address: %pI4 %pM (vid: %d)\n",
+  &iphdr->saddr, ethhdr->h_source,
+  BATADV_PRINT_VID(vid));
+   batadv_dat_entry_add(bat_priv, iphdr->saddr, ethhdr->h_source, vid);
+}
+
 #ifdef CONFIG_BATMAN_ADV_DEBUG

 /**
diff --git a/net/batman-adv/distributed-arp-table.h 
b/net/batman-adv/distributed-arp-table.h
index 813ecea..cf1b93c 100644
--- a/net/batman-adv/distributed-arp-table.h
+++ b/net/batman-adv/distributed-arp-table.h
@@ -80,7 +80,8 @@ 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);
-
+void batadv_dat_entry_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
+   unsigned short vid);
 /**
  * batadv_dat_inc_counter - increment the correct DAT packet counter
  * @bat_priv: the bat priv with all the soft interface information
@@ -173,6 +174,12 @@ static inline void batadv_dat_inc_counter(struct 
batadv_priv *bat_priv,
 {
 }

+static inline
+void batadv_dat_entry_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
+   unsigned short vid)
+{
+}
+
 #endif /* CONFIG_BATMAN_ADV_DAT */

 #endif /* _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ */
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index 81665b1..a86748f 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -442,6 +442,9 @@ void batadv_interface_rx(struct net_device *soft_iface,
goto dropped;
}

+   /* Snoop incoming traffic for dat update */
+   batadv_dat_entry_check(bat_priv, skb, vid);
+
/* skb->dev & skb->pkt_type are set here */
skb->protocol = eth_type_trans(skb, soft_iface);

--
1.7.0.4



..
PHOENIX CONTACT ELECTRONICS GmbH

Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
__

[B.A.T.M.A.N.] [PATCH v5 1/6] batman-adv: prevent multiple ARP replies sent by gateways if dat enbled

2016-06-10 Thread Andreas Pape
If dat is enabled it must be made sure that only the backbone gw which has
claimed the remote destination for the ARP request answers the ARP request
directly if the MAC address is known due to the local dat table. This
prevents multiple ARP replies in a common backbone if more than one
gateway already knows the remote mac searched for in the ARP request.

Signed-off-by: Andreas Pape 
---
 net/batman-adv/bridge_loop_avoidance.c |   49 
 net/batman-adv/bridge_loop_avoidance.h |   11 +++
 net/batman-adv/distributed-arp-table.c |   15 ++
 3 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/net/batman-adv/bridge_loop_avoidance.c 
b/net/batman-adv/bridge_loop_avoidance.c
index 748a9ea..cd2d74b 100644
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -2045,3 +2045,52 @@ out:
batadv_hardif_put(primary_if);
return 0;
 }
+
+#ifdef CONFIG_BATMAN_ADV_DAT
+/**
+ * batadv_bla_check_claim - check if address is claimed
+ *
+ * @bat_priv: the bat priv with all the soft interface information
+ * @addr: mac address of which the claim status is checked
+ * @vid: the VLAN ID
+ *
+ * addr is checked if this address is claimed by the local device itself.
+ *
+ * Return: true if bla is disabled or the mac is claimed by the device,
+ * false if the device addr is already claimed by another gateway
+ */
+bool batadv_bla_check_claim(struct batadv_priv *bat_priv,
+   u8 *addr, unsigned short vid)
+{
+   struct batadv_bla_claim search_claim;
+   struct batadv_bla_claim *claim = NULL;
+   struct batadv_hard_iface *primary_if = NULL;
+   bool ret = true;
+
+   if (!atomic_read(&bat_priv->bridge_loop_avoidance))
+   return ret;
+
+   primary_if = batadv_primary_if_get_selected(bat_priv);
+   if (!primary_if)
+   return ret;
+
+   /* First look if the mac address is claimed */
+   ether_addr_copy(search_claim.addr, addr);
+   search_claim.vid = vid;
+
+   claim = batadv_claim_hash_find(bat_priv, &search_claim);
+
+   /* If there is a claim and we are not owner of the claim,
+* return false.
+*/
+   if (claim) {
+   if (!batadv_compare_eth(claim->backbone_gw->orig,
+   primary_if->net_dev->dev_addr))
+   ret = false;
+   batadv_claim_put(claim);
+   }
+
+   batadv_hardif_put(primary_if);
+   return ret;
+}
+#endif
diff --git a/net/batman-adv/bridge_loop_avoidance.h 
b/net/batman-adv/bridge_loop_avoidance.h
index 0f01dae..9dddebc 100644
--- a/net/batman-adv/bridge_loop_avoidance.h
+++ b/net/batman-adv/bridge_loop_avoidance.h
@@ -47,6 +47,10 @@ void batadv_bla_update_orig_address(struct batadv_priv 
*bat_priv,
 void batadv_bla_status_update(struct net_device *net_dev);
 int batadv_bla_init(struct batadv_priv *bat_priv);
 void batadv_bla_free(struct batadv_priv *bat_priv);
+#ifdef CONFIG_BATMAN_ADV_DAT
+bool batadv_bla_check_claim(struct batadv_priv *bat_priv, u8 *addr,
+   unsigned short vid);
+#endif

 #define BATADV_BLA_CRC_INIT0
 #else /* ifdef CONFIG_BATMAN_ADV_BLA */
@@ -112,6 +116,13 @@ static inline void batadv_bla_free(struct batadv_priv 
*bat_priv)
 {
 }

+static inline
+bool batadv_bla_check_claim(struct batadv_priv *bat_priv, u8 *addr,
+   unsigned short vid)
+{
+   return true;
+}
+
 #endif /* ifdef CONFIG_BATMAN_ADV_BLA */

 #endif /* ifndef _NET_BATMAN_ADV_BLA_H_ */
diff --git a/net/batman-adv/distributed-arp-table.c 
b/net/batman-adv/distributed-arp-table.c
index 278800a..b752f8d 100644
--- a/net/batman-adv/distributed-arp-table.c
+++ b/net/batman-adv/distributed-arp-table.c
@@ -43,6 +43,7 @@
 #include 
 #include 

+#include "bridge_loop_avoidance.h"
 #include "hard-interface.h"
 #include "hash.h"
 #include "originator.h"
@@ -1003,6 +1004,20 @@ bool batadv_dat_snoop_outgoing_arp_request(struct 
batadv_priv *bat_priv,
goto out;
}

+   /* If BLA is enabled, only send ARP replies if we have claimed
+* the destination for the ARP request or if no one else of
+* the backbone gws belonging to our backbone has claimed the
+* destination.
+*/
+   if (!batadv_bla_check_claim(bat_priv,
+   dat_entry->mac_addr, vid)) {
+   batadv_dbg(BATADV_DBG_DAT, bat_priv,
+  "Device %pM claimed by another backbone gw. 
Don't send ARP reply!",
+  dat_entry->mac_addr);
+   ret = true;
+   goto out;
+   }
+
skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src,
 bat_priv->soft_iface, ip_dst, hw_src,
  

[B.A.T.M.A.N.] [PATCH v5 0/6] Optimizations for setups running dat and bla

2016-06-10 Thread Andreas Pape
This patchset introduces optimizations for batman-adv in setups having several
gateways into a common (switched) Ethernet backbone network especially if dat
is additionally enabled.

Using the current implementation with bla and dat enabled, several problems
can be observed in a real setup:
1. Multiplication of ARP replies from dat enabled gateways and dat enabled
mesh nodes leading to an "ARP reply storm" in the common backbone network.
2. In rare corner cases bla does not fully prevent looping of unicast frames
in the direction Backbone --> mesh --> backbone and looping of multicast
frames in the direction mesh --> backbone --> mesh.
The latter can lead to temporary confusion in the switched backbone resulting
in packet loss and communication timeouts.

The observed problems are solved by introduction of additional rules for the
dat handling, bla packet forwarding and bla claiming/unclaiming of clients.

v5:
 - changed function name to batadv_bla_check_claim
 - put added include file in alphabetical order
 - added check to exclude ip address 0.0.0.0 from snooping

v4:
 - removed unnecessary include in soft-interface.c
 - solved issue with double-use and refcounting of pointers in routing.c

v3:

 - rebased patchset
 - moved snooping of ip addresses for dat speed up into separate function
 - removed "patch of a patch"
 - removed automatic claiming during check of a claim
 - fixed issues of the patchset not being compiled due to chosen batman
options

Kind regards,
Andreas

Andreas Pape (6):
  batman-adv: prevent multiple ARP replies sent by gateways if dat
enbled
  batman-adv: speed up dat by snooping received ip traffic
  batman-adv: prevent duplication of ARP replies when DAT is used
  batman-adv: drop unicast packets from other backbone gw
  batman-adv: changed debug messages for easier bla debugging
  batman-adv: handle race condition for claims between gateways

 net/batman-adv/bridge_loop_avoidance.c |   87 ---
 net/batman-adv/bridge_loop_avoidance.h |   11 
 net/batman-adv/distributed-arp-table.c |  102 
 net/batman-adv/distributed-arp-table.h |9 +++-
 net/batman-adv/routing.c   |   25 +++-
 net/batman-adv/soft-interface.c|3 +
 6 files changed, 225 insertions(+), 12 deletions(-)



..
PHOENIX CONTACT ELECTRONICS GmbH

Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
___
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren, jegliche anderweitige Verwendung sowie die unbefugte 
Weitergabe dieser Mail ist nicht gestattet.

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and destroy this e-mail. Any unauthorized 
copying, disclosure, distribution or other use of the material or parts thereof 
is strictly forbidden.
___


Re: [B.A.T.M.A.N.] How to compile BATMAN V against linux backports cfg80211

2016-06-10 Thread Sven Eckelmann
On Thursday 09 June 2016 15:44:03 Harms, Hannes wrote:
[...]
> But unfortunately now batctl always says that the mesh is not activated 
> (no interface),
> which is obviously wrong. Maybe  I made somewhere a mistake while 
> porting the code.
> 
> Can you guess what goes wrong?

I don't even know what code you've ported. Was it batman-adv 2016.2? Maybe you
are using an really old version and ran in an already fixed bug [1] which made
it impossible to add down interfaces and later use them in B.A.T.M.A.N. V. Or
there is something else because there is no "mesh is not activated" or "no
interface" error in batctl/batman-adv and so I have to guess what you may
have meant and what you have tried to execute.

Kind regards,
Sven

[1] https://www.open-mesh.org/issues/248


signature.asc
Description: This is a digitally signed message part.