| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Matthias Schiffer <mschiffer@universe-factory.net> |
| Date: Tue, 23 Jan 2018 10:59:49 +0100 |
| Subject: batman-adv: fix packet checksum in receive path |
| |
| From: Matthias Schiffer <mschiffer@universe-factory.net> |
| |
| [ Upstream commit abd6360591d3f8259f41c34e31ac4826dfe621b8 ] |
| |
| eth_type_trans() internally calls skb_pull(), which does not adjust the |
| skb checksum; skb_postpull_rcsum() is necessary to avoid log spam of the |
| form "bat0: hw csum failure" when packets with CHECKSUM_COMPLETE are |
| received. |
| |
| Note that in usual setups, packets don't reach batman-adv with |
| CHECKSUM_COMPLETE (I assume NICs bail out of checksumming when they see |
| batadv's ethtype?), which is why the log messages do not occur on every |
| system using batman-adv. I could reproduce this issue by stacking |
| batman-adv on top of a VXLAN interface. |
| |
| Fixes: c6c8fea29769 ("net: Add batman-adv meshing protocol") |
| Tested-by: Maximilian Wilhelm <max@sdn.clinic> |
| Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net> |
| Signed-off-by: Sven Eckelmann <sven@narfation.org> |
| Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/batman-adv/soft-interface.c | 8 +------- |
| 1 file changed, 1 insertion(+), 7 deletions(-) |
| |
| --- a/net/batman-adv/soft-interface.c |
| +++ b/net/batman-adv/soft-interface.c |
| @@ -448,13 +448,7 @@ void batadv_interface_rx(struct net_devi |
| |
| /* skb->dev & skb->pkt_type are set here */ |
| skb->protocol = eth_type_trans(skb, soft_iface); |
| - |
| - /* should not be necessary anymore as we use skb_pull_rcsum() |
| - * TODO: please verify this and remove this TODO |
| - * -- Dec 21st 2009, Simon Wunderlich |
| - */ |
| - |
| - /* skb->ip_summed = CHECKSUM_UNNECESSARY; */ |
| + skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); |
| |
| batadv_inc_counter(bat_priv, BATADV_CNT_RX); |
| batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES, |