1 From f58a0b03873fd3aa9568c11af198f997ed2208cc Mon Sep 17 00:00:00 2001
2 From: Marek Lindner <mareklindner@neomailbox.ch>
3 Date: Sat, 7 May 2016 19:54:17 +0800
4 Subject: [PATCH 6/6] batman-adv: initialize ELP orig address on secondary
7 This fix prevents nodes to wrongly create a 00:00:00:00:00:00 originator
8 which can potentially interfere with the rest of the neighbor statistics.
10 Fixes: a4b88af77e28 ("batman-adv: ELP - adding basic infrastructure")
11 Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
13 net/batman-adv/bat_v.c | 10 ++++++++++
14 net/batman-adv/bat_v_elp.c | 31 ++++++++++++++++++++++---------
15 net/batman-adv/bat_v_elp.h | 2 ++
16 3 files changed, 34 insertions(+), 9 deletions(-)
18 diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
19 index 2bcb29b..0caca2f 100644
20 --- a/net/batman-adv/bat_v.c
21 +++ b/net/batman-adv/bat_v.c
24 static void batadv_v_iface_activate(struct batadv_hard_iface *hard_iface)
26 + struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
27 + struct batadv_hard_iface *primary_if;
29 + primary_if = batadv_primary_if_get_selected(bat_priv);
32 + batadv_v_elp_iface_activate(primary_if, hard_iface);
33 + batadv_hardif_put(primary_if);
36 /* B.A.T.M.A.N. V does not use any queuing mechanism, therefore it can
37 * set the interface as ACTIVE right away, without any risk of race
39 diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
40 index 3844e7e..df42eb1 100644
41 --- a/net/batman-adv/bat_v_elp.c
42 +++ b/net/batman-adv/bat_v_elp.c
43 @@ -377,6 +377,27 @@ void batadv_v_elp_iface_disable(struct batadv_hard_iface *hard_iface)
47 + * batadv_v_elp_iface_activate - update the ELP buffer belonging to the given
49 + * @primary_iface: the new primary interface
50 + * @hard_iface: interface holding the to-be-updated buffer
52 +void batadv_v_elp_iface_activate(struct batadv_hard_iface *primary_iface,
53 + struct batadv_hard_iface *hard_iface)
55 + struct batadv_elp_packet *elp_packet;
56 + struct sk_buff *skb;
58 + if (!hard_iface->bat_v.elp_skb)
61 + skb = hard_iface->bat_v.elp_skb;
62 + elp_packet = (struct batadv_elp_packet *)skb->data;
63 + ether_addr_copy(elp_packet->orig,
64 + primary_iface->net_dev->dev_addr);
68 * batadv_v_elp_primary_iface_set - change internal data to reflect the new
70 * @primary_iface: the new primary interface
71 @@ -384,8 +405,6 @@ void batadv_v_elp_iface_disable(struct batadv_hard_iface *hard_iface)
72 void batadv_v_elp_primary_iface_set(struct batadv_hard_iface *primary_iface)
74 struct batadv_hard_iface *hard_iface;
75 - struct batadv_elp_packet *elp_packet;
76 - struct sk_buff *skb;
78 /* update orig field of every elp iface belonging to this mesh */
80 @@ -393,13 +412,7 @@ void batadv_v_elp_primary_iface_set(struct batadv_hard_iface *primary_iface)
81 if (primary_iface->soft_iface != hard_iface->soft_iface)
84 - if (!hard_iface->bat_v.elp_skb)
87 - skb = hard_iface->bat_v.elp_skb;
88 - elp_packet = (struct batadv_elp_packet *)skb->data;
89 - ether_addr_copy(elp_packet->orig,
90 - primary_iface->net_dev->dev_addr);
91 + batadv_v_elp_iface_activate(primary_iface, hard_iface);
95 diff --git a/net/batman-adv/bat_v_elp.h b/net/batman-adv/bat_v_elp.h
96 index e95f1bc..cc130b2 100644
97 --- a/net/batman-adv/bat_v_elp.h
98 +++ b/net/batman-adv/bat_v_elp.h
99 @@ -25,6 +25,8 @@ struct work_struct;
101 int batadv_v_elp_iface_enable(struct batadv_hard_iface *hard_iface);
102 void batadv_v_elp_iface_disable(struct batadv_hard_iface *hard_iface);
103 +void batadv_v_elp_iface_activate(struct batadv_hard_iface *primary_iface,
104 + struct batadv_hard_iface *hard_iface);
105 void batadv_v_elp_primary_iface_set(struct batadv_hard_iface *primary_iface);
106 int batadv_v_elp_packet_recv(struct sk_buff *skb,
107 struct batadv_hard_iface *if_incoming);