diff options
author | Shmulik Ladkani <shmulik@metanetworks.com> | 2019-04-29 16:39:30 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-05-01 13:28:34 -0400 |
commit | d2f0c961148f65bc73eda72b9fa3a4e80973cb49 (patch) | |
tree | 99de723ffe2f3a3222dad7f850ce0c3aaea8a0ce /net | |
parent | 2dcb003314032c6efb13a065ffae60d164b2dd35 (diff) | |
download | linux-d2f0c961148f65bc73eda72b9fa3a4e80973cb49.tar.gz linux-d2f0c961148f65bc73eda72b9fa3a4e80973cb49.tar.bz2 linux-d2f0c961148f65bc73eda72b9fa3a4e80973cb49.zip |
ipv4: ip_do_fragment: Preserve skb_iif during fragmentation
Previously, during fragmentation after forwarding, skb->skb_iif isn't
preserved, i.e. 'ip_copy_metadata' does not copy skb_iif from given
'from' skb.
As a result, ip_do_fragment's creates fragments with zero skb_iif,
leading to inconsistent behavior.
Assume for example an eBPF program attached at tc egress (post
forwarding) that examines __sk_buff->ingress_ifindex:
- the correct iif is observed if forwarding path does not involve
fragmentation/refragmentation
- a bogus iif is observed if forwarding path involves
fragmentation/refragmentatiom
Fix, by preserving skb_iif during 'ip_copy_metadata'.
Signed-off-by: Shmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/ip_output.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index c80188875f39..e8bb2e85c5a4 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -519,6 +519,7 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) to->pkt_type = from->pkt_type; to->priority = from->priority; to->protocol = from->protocol; + to->skb_iif = from->skb_iif; skb_dst_drop(to); skb_dst_copy(to, from); to->dev = from->dev; |