[maint] batman-adv: Use explicit tvlv padding for ELP packets

Message ID 20181030111710.26217-1-sven@narfation.org (mailing list archive)
State Accepted, archived
Commit 974337ee9773c4bd0a2d5c322306cf2bea445e11
Delegated to: Simon Wunderlich
Headers
Series [maint] batman-adv: Use explicit tvlv padding for ELP packets |

Commit Message

Sven Eckelmann Oct. 30, 2018, 11:17 a.m. UTC
  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: a4b88af77e28 ("batman-adv: ELP - adding basic infrastructure")
Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
---
 net/batman-adv/bat_v_elp.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
  

Comments

Sven Eckelmann Nov. 3, 2018, 12:40 p.m. UTC | #1
On Dienstag, 30. Oktober 2018 12:17:10 CET Sven Eckelmann wrote:
> 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: a4b88af77e28 ("batman-adv: ELP - adding basic infrastructure")
> Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> ---
>  net/batman-adv/bat_v_elp.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)

Added as 974337ee9773 [1]

Kind regards,
	Sven

[1] https://git.open-mesh.org/batman-adv.git/commit/974337ee9773c4bd0a2d5c322306cf2bea445e11
  

Patch

diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
index 9f481cfd..e8090f09 100644
--- a/net/batman-adv/bat_v_elp.c
+++ b/net/batman-adv/bat_v_elp.c
@@ -352,19 +352,21 @@  static void batadv_v_elp_periodic_work(struct work_struct *work)
  */
 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;