From f7daad8862855d12055110e5d54d409d2935c88c Mon Sep 17 00:00:00 2001 From: Marek Lindner Date: Fri, 28 Sep 2012 19:57:00 +0000 Subject: [PATCH] batman-adv: fix mac addr change and symmetry check More info: * fix mac addr change: https://lists.open-mesh.org/pipermail/b.a.t.m.a.n/2012-September/008026.html * symmetry check: https://lists.open-mesh.org/pipermail/b.a.t.m.a.n/2012-September/008021.html Signed-off-by: Marek Lindner git-svn-id: svn://svn.openwrt.org/openwrt/packages/net/batman-adv@33588 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- Makefile | 2 +- ...Fix-change-mac-address-of-soft-iface.patch | 45 ++++++++++++ ...ymmetry-check-route-flapping-in-mult.patch | 71 +++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 patches/0002-batman-adv-Fix-change-mac-address-of-soft-iface.patch create mode 100644 patches/0003-batman-adv-Fix-symmetry-check-route-flapping-in-mult.patch diff --git a/Makefile b/Makefile index 516e71a..5fdfae6 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ PKG_NAME:=batman-adv PKG_VERSION:=2012.3.0 BATCTL_VERSION:=2012.3.0 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_MD5SUM:=9f2d0bb2792fe0db012203d502e2085c BATCTL_MD5SUM:=fe9e6a3994539037b48afc5e3d31628c diff --git a/patches/0002-batman-adv-Fix-change-mac-address-of-soft-iface.patch b/patches/0002-batman-adv-Fix-change-mac-address-of-soft-iface.patch new file mode 100644 index 0000000..21d0959 --- /dev/null +++ b/patches/0002-batman-adv-Fix-change-mac-address-of-soft-iface.patch @@ -0,0 +1,45 @@ +From 86fa71a4985f60da5918e1f43136dae77852cdc3 Mon Sep 17 00:00:00 2001 +From: Def +Date: Thu, 20 Sep 2012 14:56:13 +0200 +Subject: [PATCH] batman-adv: Fix change mac address of soft iface. + +Into function interface_set_mac_addr, the function tt_local_add was +invoked before updating dev->dev_addr. The new MAC address was not +tagged as NoPurge. + +Signed-off-by: Def +--- + soft-interface.c | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/soft-interface.c b/soft-interface.c +index cf26e41..b762068 100644 +--- a/soft-interface.c ++++ b/soft-interface.c +@@ -100,18 +100,21 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p) + { + struct batadv_priv *bat_priv = netdev_priv(dev); + struct sockaddr *addr = p; ++ uint8_t old_addr[ETH_ALEN]; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + ++ memcpy(old_addr, dev->dev_addr, ETH_ALEN); ++ memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); ++ + /* only modify transtable if it has been initialized before */ + if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE) { +- batadv_tt_local_remove(bat_priv, dev->dev_addr, ++ batadv_tt_local_remove(bat_priv, old_addr, + "mac address changed", false); + batadv_tt_local_add(dev, addr->sa_data, BATADV_NULL_IFINDEX); + } + +- memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); + dev->addr_assign_type &= ~NET_ADDR_RANDOM; + return 0; + } +-- +1.7.9.1 + diff --git a/patches/0003-batman-adv-Fix-symmetry-check-route-flapping-in-mult.patch b/patches/0003-batman-adv-Fix-symmetry-check-route-flapping-in-mult.patch new file mode 100644 index 0000000..c36fbce --- /dev/null +++ b/patches/0003-batman-adv-Fix-symmetry-check-route-flapping-in-mult.patch @@ -0,0 +1,71 @@ +From 6c9d9eeac0fb5d6625256cd119d0a4994c63e965 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Linus=20L=C3=BCssing?= +Date: Tue, 18 Sep 2012 03:01:08 +0200 +Subject: [PATCH] batman-adv: Fix symmetry check / route flapping in multi + interface setups +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If receiving an OGM from a neighbor other than the currently selected +and if it has the same TQ then we are supposed to switch if this +neighbor provides a more symmetric link than the currently selected one. + +However this symmetry check currently is broken if the interface of the +neighbor we received the OGM from and the one of the currently selected +neighbor differ: We are currently trying to determine the symmetry of the +link towards the selected router via the link we received the OGM from +instead of just checking via the link towards the currently selected +router. + +This leads to way more route switches than necessary and can lead to +permanent route flapping in many common multi interface setups. + +This patch fixes this issue by using the right interface for this +symmetry check. + +Signed-off-by: Linus Lüssing +--- + bat_iv_ogm.c | 13 +++++++------ + 1 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c +index e877af8..469daab 100644 +--- a/bat_iv_ogm.c ++++ b/bat_iv_ogm.c +@@ -642,7 +642,8 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, + struct batadv_neigh_node *router = NULL; + struct batadv_orig_node *orig_node_tmp; + struct hlist_node *node; +- uint8_t bcast_own_sum_orig, bcast_own_sum_neigh; ++ int if_num; ++ uint8_t sum_orig, sum_neigh; + uint8_t *neigh_addr; + + batadv_dbg(BATADV_DBG_BATMAN, bat_priv, +@@ -727,17 +728,17 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, + if (router && (neigh_node->tq_avg == router->tq_avg)) { + orig_node_tmp = router->orig_node; + spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); +- bcast_own_sum_orig = +- orig_node_tmp->bcast_own_sum[if_incoming->if_num]; ++ if_num = router->if_incoming->if_num; ++ sum_orig = orig_node_tmp->bcast_own_sum[if_num]; + spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); + + orig_node_tmp = neigh_node->orig_node; + spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); +- bcast_own_sum_neigh = +- orig_node_tmp->bcast_own_sum[if_incoming->if_num]; ++ if_num = neigh_node->if_incoming->if_num; ++ sum_neigh = orig_node_tmp->bcast_own_sum[if_num]; + spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); + +- if (bcast_own_sum_orig >= bcast_own_sum_neigh) ++ if (sum_orig >= sum_neigh) + goto update_tt; + } + +-- +1.7.9.1 + -- 2.30.2