Update to OONF 0.12.2 + coverity fix
[feed/routing.git] / batman-adv / patches / 0001-batman-adv-Add-lower-layer-header-length-to-headroom.patch
1 batman-adv: Add lower layer header length to headroom
2
3 The maximum of hard_header_len and needed_headroom of all slave interfaces
4 of a batman-adv device must be used to define the batman-adv device
5 headroom/header_len. This is required to avoid too small headroom problems
6 when these slave devices try to send the encapsulated packet.
7
8 The batman-adv therefore uses:
9
10 needed_headroom = max(0, dev[0].needed_headroom, ...,
11 dev[n].needed_headroom)
12 hard_header_len = max(ETH_HLEN, dev[0].hard_header_len, ...,
13 dev[n].hard_header_len) + ETH_HLEN +
14 max(sizeof(batadv_*cast_packet))
15
16 Signed-off-by: Sven Eckelmann <sven@narfation.org>
17 ---
18 net/batman-adv/hard-interface.c | 33 +++++++++++++++++++++++++++++++++
19 net/batman-adv/soft-interface.c | 2 +-
20 2 files changed, 34 insertions(+), 1 deletion(-)
21
22 diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
23 index f4a15d2e5eaf..a501aae1077b 100644
24 --- a/net/batman-adv/hard-interface.c
25 +++ b/net/batman-adv/hard-interface.c
26 @@ -252,12 +252,45 @@ static void batadv_check_known_mac_addr(const struct net_device *net_dev)
27 rcu_read_unlock();
28 }
29
30 +/**
31 + * batadv_hardif_recalc_headroom() - Recalculate skbuff headroom parameters
32 + * @soft_iface: netdev struct of the mesh interface
33 + */
34 +static void batadv_hardif_recalc_headroom(struct net_device *soft_iface)
35 +{
36 + const struct batadv_hard_iface *hard_iface;
37 + unsigned short hard_header_len = ETH_HLEN;
38 + unsigned short needed_headroom = 0;
39 +
40 + rcu_read_lock();
41 + list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
42 + if ((hard_iface->if_status != BATADV_IF_ACTIVE) &&
43 + (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED))
44 + continue;
45 +
46 + if (hard_iface->soft_iface != soft_iface)
47 + continue;
48 +
49 + hard_header_len = max_t(unsigned short, hard_header_len,
50 + hard_iface->net_dev->hard_header_len);
51 +
52 + needed_headroom = max_t(unsigned short, needed_headroom,
53 + hard_iface->net_dev->needed_headroom);
54 + }
55 + rcu_read_unlock();
56 +
57 + soft_iface->needed_headroom = needed_headroom;
58 + soft_iface->hard_header_len = hard_header_len + batadv_max_header_len();
59 +}
60 +
61 int batadv_hardif_min_mtu(struct net_device *soft_iface)
62 {
63 struct batadv_priv *bat_priv = netdev_priv(soft_iface);
64 const struct batadv_hard_iface *hard_iface;
65 int min_mtu = INT_MAX;
66
67 + batadv_hardif_recalc_headroom(soft_iface);
68 +
69 rcu_read_lock();
70 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
71 if ((hard_iface->if_status != BATADV_IF_ACTIVE) &&
72 diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
73 index 36b23f31df2a..b4c110791203 100644
74 --- a/net/batman-adv/soft-interface.c
75 +++ b/net/batman-adv/soft-interface.c
76 @@ -948,7 +948,7 @@ static void batadv_softif_init_early(struct net_device *dev)
77 */
78 dev->mtu = ETH_DATA_LEN;
79 /* reserve more space in the skbuff for our header */
80 - dev->hard_header_len = batadv_max_header_len();
81 + dev->hard_header_len = ETH_HLEN + batadv_max_header_len();
82
83 /* generate random address */
84 eth_hw_addr_random(dev);
85 --
86 2.5.0
87
88