lkml.org 
[lkml]   [2018]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 08/67] batman-adv: Use explicit tvlv padding for ELP packets
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit f4156f9656feac21f4de712fac94fae964c5d402 ]

    The announcement messages of batman-adv COMPAT_VERSION 15 have the
    possibility to announce additional information via a dynamic TVLV part.
    This part is optional for the ELP packets and currently not parsed by the
    Linux implementation. Still out-of-tree versions are using it to transport
    things like neighbor hashes to optimize the rebroadcast behavior.

    Since the ELP broadcast packets are smaller than the minimal ethernet
    packet, it often has to be padded. This is often done (as specified in
    RFC894) with octets of zero and thus work perfectly fine with the TVLV
    part (making it a zero length and thus empty). But not all ethernet
    compatible hardware seems to follow this advice. To avoid ambiguous
    situations when parsing the TVLV header, just force the 4 bytes (TVLV
    length + padding) after the required ELP header to zero.

    Fixes: d6f94d91f766 ("batman-adv: ELP - adding basic infrastructure")
    Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/batman-adv/bat_v_elp.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
    index e92dfedccc16..fbc132f4670e 100644
    --- a/net/batman-adv/bat_v_elp.c
    +++ b/net/batman-adv/bat_v_elp.c
    @@ -338,19 +338,21 @@ out:
    */
    int batadv_v_elp_iface_enable(struct batadv_hard_iface *hard_iface)
    {
    + static const size_t tvlv_padding = sizeof(__be32);
    struct batadv_elp_packet *elp_packet;
    unsigned char *elp_buff;
    u32 random_seqno;
    size_t size;
    int res = -ENOMEM;

    - size = ETH_HLEN + NET_IP_ALIGN + BATADV_ELP_HLEN;
    + size = ETH_HLEN + NET_IP_ALIGN + BATADV_ELP_HLEN + tvlv_padding;
    hard_iface->bat_v.elp_skb = dev_alloc_skb(size);
    if (!hard_iface->bat_v.elp_skb)
    goto out;

    skb_reserve(hard_iface->bat_v.elp_skb, ETH_HLEN + NET_IP_ALIGN);
    - elp_buff = skb_put_zero(hard_iface->bat_v.elp_skb, BATADV_ELP_HLEN);
    + elp_buff = skb_put_zero(hard_iface->bat_v.elp_skb,
    + BATADV_ELP_HLEN + tvlv_padding);
    elp_packet = (struct batadv_elp_packet *)elp_buff;

    elp_packet->packet_type = BATADV_ELP;
    --
    2.19.1


    \
     
     \ /
      Last update: 2018-12-11 16:53    [W:4.170 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site