net: fix GSO in bpf_lwt_push_ip_encap
authorPeter Oskolkov <posk@google.com>
Tue, 5 Mar 2019 00:27:08 +0000 (16:27 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 7 Mar 2019 09:41:29 +0000 (10:41 +0100)
commitea0371f7879987cff70e21d808e3e9fea624c051
tree3e5382a16a4fe6485a32fd87b160364665e713cc
parent915905f8b1d452e70ee6d8637c3f0fb55a39691d
net: fix GSO in bpf_lwt_push_ip_encap

GSO needs inner headers and inner protocol set properly to work.

skb->inner_mac_header: skb_reset_inner_headers() assigns the current
mac header value to inner_mac_header; but it is not set at the point,
so we need to call skb_reset_inner_mac_header, otherwise gre_gso_segment
fails: it does

    int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
    ...
    if (unlikely(!pskb_may_pull(skb, tnl_hlen)))
    ...

skb->inner_protocol should also be correctly set.

Fixes: ca78801a81e0 ("bpf: handle GSO in bpf_lwt_push_encap")
Signed-off-by: Peter Oskolkov <posk@google.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
net/core/lwt_bpf.c