f87ddf02f6148babd57213a736e70f8147f0643e
[feed/routing.git] / batman-adv / patches / 0006-batman-adv-initialize-ELP-orig-address-on-secondary-.patch
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
5 interfaces
6
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.
9
10 Fixes: a4b88af77e28 ("batman-adv: ELP - adding basic infrastructure")
11 Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
12 ---
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(-)
17
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
22 @@ -39,6 +39,16 @@
23
24 static void batadv_v_iface_activate(struct batadv_hard_iface *hard_iface)
25 {
26 + struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
27 + struct batadv_hard_iface *primary_if;
28 +
29 + primary_if = batadv_primary_if_get_selected(bat_priv);
30 +
31 + if (primary_if) {
32 + batadv_v_elp_iface_activate(primary_if, hard_iface);
33 + batadv_hardif_put(primary_if);
34 + }
35 +
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
38 * condition
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)
44 }
45
46 /**
47 + * batadv_v_elp_iface_activate - update the ELP buffer belonging to the given
48 + * hard-interface
49 + * @primary_iface: the new primary interface
50 + * @hard_iface: interface holding the to-be-updated buffer
51 + */
52 +void batadv_v_elp_iface_activate(struct batadv_hard_iface *primary_iface,
53 + struct batadv_hard_iface *hard_iface)
54 +{
55 + struct batadv_elp_packet *elp_packet;
56 + struct sk_buff *skb;
57 +
58 + if (!hard_iface->bat_v.elp_skb)
59 + return;
60 +
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);
65 +}
66 +
67 +/**
68 * batadv_v_elp_primary_iface_set - change internal data to reflect the new
69 * primary interface
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)
73 {
74 struct batadv_hard_iface *hard_iface;
75 - struct batadv_elp_packet *elp_packet;
76 - struct sk_buff *skb;
77
78 /* update orig field of every elp iface belonging to this mesh */
79 rcu_read_lock();
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)
82 continue;
83
84 - if (!hard_iface->bat_v.elp_skb)
85 - continue;
86 -
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);
92 }
93 rcu_read_unlock();
94 }
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;
100
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);
108 --
109 2.8.0.rc3
110