In act_mirred's ingress redirection, if the skb's dst_entry is valid when call function netif_receive_skb, the fllowing l3 stack process (ip_rcv_finish_core) will check dst_entry and skip the routing decision. Using the old dst_entry is unexpected and may discard the skb in some case. For example dst->dst_input points to dst_discard.
This patch drops the skb's dst_entry before calling netif_receive_skb so that the skb can be made routing decision like a normal ingress skb. Signed-off-by: Zhiyuan Hou <[email protected]> --- net/sched/act_mirred.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index 9ce073a05414..6108a64c0cd5 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c @@ -18,6 +18,7 @@ #include <linux/gfp.h> #include <linux/if_arp.h> #include <net/net_namespace.h> +#include <net/dst.h> #include <net/netlink.h> #include <net/pkt_sched.h> #include <net/pkt_cls.h> @@ -298,8 +299,10 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a, if (!want_ingress) err = dev_queue_xmit(skb2); - else + else { + skb_dst_drop(skb2); err = netif_receive_skb(skb2); + } if (err) { out: -- 2.21.0

