| From d27cd1cfb2ec4db0db759a3e864e4b257acc89be Mon Sep 17 00:00:00 2001 |
| From: Taehee Yoo <ap420073@gmail.com> |
| Date: Sun, 22 Dec 2019 11:27:08 +0000 |
| Subject: [PATCH] hsr: reset network header when supervision frame is created |
| |
| commit 3ed0a1d563903bdb4b4c36c58c4d9c1bcb23a6e6 upstream. |
| |
| The supervision frame is L2 frame. |
| When supervision frame is created, hsr module doesn't set network header. |
| If tap routine is enabled, dev_queue_xmit_nit() is called and it checks |
| network_header. If network_header pointer wasn't set(or invalid), |
| it resets network_header and warns. |
| In order to avoid unnecessary warning message, resetting network_header |
| is needed. |
| |
| Test commands: |
| ip netns add nst |
| ip link add veth0 type veth peer name veth1 |
| ip link add veth2 type veth peer name veth3 |
| ip link set veth1 netns nst |
| ip link set veth3 netns nst |
| ip link set veth0 up |
| ip link set veth2 up |
| ip link add hsr0 type hsr slave1 veth0 slave2 veth2 |
| ip a a 192.168.100.1/24 dev hsr0 |
| ip link set hsr0 up |
| ip netns exec nst ip link set veth1 up |
| ip netns exec nst ip link set veth3 up |
| ip netns exec nst ip link add hsr1 type hsr slave1 veth1 slave2 veth3 |
| ip netns exec nst ip a a 192.168.100.2/24 dev hsr1 |
| ip netns exec nst ip link set hsr1 up |
| tcpdump -nei veth0 |
| |
| Splat looks like: |
| [ 175.852292][ C3] protocol 88fb is buggy, dev veth0 |
| |
| Fixes: f421436a591d ("net/hsr: Add support for the High-availability Seamless Redundancy protocol (HSRv0)") |
| Signed-off-by: Taehee Yoo <ap420073@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c |
| index d372de629816..acda3aa994c2 100644 |
| --- a/net/hsr/hsr_device.c |
| +++ b/net/hsr/hsr_device.c |
| @@ -272,6 +272,8 @@ static void send_hsr_supervision_frame(struct hsr_port *master, |
| skb->dev->dev_addr, skb->len) <= 0) |
| goto out; |
| skb_reset_mac_header(skb); |
| + skb_reset_network_header(skb); |
| + skb_reset_transport_header(skb); |
| |
| if (hsr_ver > 0) { |
| hsr_tag = skb_put(skb, sizeof(struct hsr_tag)); |
| -- |
| 2.7.4 |
| |