]> git.baikalelectronics.ru Git - kernel.git/commit
net/sched: act_mirred: Pull mac prior redir to non mac_header_xmit device
authorShmulik Ladkani <sladkani@proofpoint.com>
Wed, 25 Dec 2019 08:51:01 +0000 (10:51 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 28 Dec 2019 00:35:32 +0000 (16:35 -0800)
commit96b450e72176da565fafb45916924afbbbf36a0e
tree70c0d31b107bf18fd277f6e582cf88bff57ee5a4
parent6ac4c8cf5b86febda11686e986c16daa82932354
net/sched: act_mirred: Pull mac prior redir to non mac_header_xmit device

There's no skb_pull performed when a mirred action is set at egress of a
mac device, with a target device/action that expects skb->data to point
at the network header.

As a result, either the target device is errornously given an skb with
data pointing to the mac (egress case), or the net stack receives the
skb with data pointing to the mac (ingress case).

E.g:
 # tc qdisc add dev eth9 root handle 1: prio
 # tc filter add dev eth9 parent 1: prio 9 protocol ip handle 9 basic \
   action mirred egress redirect dev tun0

 (tun0 is a tun device. result: tun0 errornously gets the eth header
  instead of the iph)

Revise the push/pull logic of tcf_mirred_act() to not rely on the
skb_at_tc_ingress() vs tcf_mirred_act_wants_ingress() comparison, as it
does not cover all "pull" cases.

Instead, calculate whether the required action on the target device
requires the data to point at the network header, and compare this to
whether skb->data points to network header - and make the push/pull
adjustments as necessary.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Shmulik Ladkani <sladkani@proofpoint.com>
Tested-by: Jamal Hadi Salim <jhs@mojatatu.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/act_mirred.c