| From 43e177e309d3f5ff8d7d05d7f8e5bbdb9ee996d0 Mon Sep 17 00:00:00 2001 |
| From: Taehee Yoo <ap420073@gmail.com> |
| Date: Thu, 27 Feb 2020 12:26:15 +0000 |
| Subject: [PATCH] net: rmnet: fix packet forwarding in rmnet bridge mode |
| |
| commit ad3cc31b599ea80f06b29ebdc18b3a39878a48d6 upstream. |
| |
| Packet forwarding is not working in rmnet bridge mode. |
| Because when a packet is forwarded, skb_push() for an ethernet header |
| is needed. But it doesn't call skb_push(). |
| So, the ethernet header will be lost. |
| |
| Test commands: |
| modprobe rmnet |
| ip netns add nst |
| ip netns add nst2 |
| 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 nst2 |
| |
| ip link add rmnet0 link veth0 type rmnet mux_id 1 |
| ip link set veth2 master rmnet0 |
| ip link set veth0 up |
| ip link set veth2 up |
| ip link set rmnet0 up |
| ip a a 192.168.100.1/24 dev rmnet0 |
| |
| ip netns exec nst ip link set veth1 up |
| ip netns exec nst ip a a 192.168.100.2/24 dev veth1 |
| ip netns exec nst2 ip link set veth3 up |
| ip netns exec nst2 ip a a 192.168.100.3/24 dev veth3 |
| ip netns exec nst2 ping 192.168.100.2 |
| |
| Fixes: 60d58f971c10 ("net: qualcomm: rmnet: Implement bridge mode") |
| 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/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c |
| index 074a8b326c30..29a7bfa2584d 100644 |
| --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c |
| +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c |
| @@ -159,6 +159,9 @@ static int rmnet_map_egress_handler(struct sk_buff *skb, |
| static void |
| rmnet_bridge_handler(struct sk_buff *skb, struct net_device *bridge_dev) |
| { |
| + if (skb_mac_header_was_set(skb)) |
| + skb_push(skb, skb->mac_len); |
| + |
| if (bridge_dev) { |
| skb->dev = bridge_dev; |
| dev_queue_xmit(skb); |
| -- |
| 2.7.4 |
| |