Hi Steffen:

I'm looking at the function xfrm_input near the end where it deals
with transport mode packets:

                err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || 
async);
                if (xfrm_gro) {
                        if (skb->sp)
                                skb->sp->olen = 0;
                        skb_dst_drop(skb);
                        gro_cells_receive(&gro_cells, skb);
                        return err;
                }

This looks wrong because in transport mode, transport_finish is
well within its rights to consume and free the skb.  For example,
IPv4 transport_finish eventually calls xfrm4_rcv_encap_finish which
does:

        if (!skb_dst(skb)) {
                const struct iphdr *iph = ip_hdr(skb);

                if (ip_route_input_noref(skb, iph->daddr, iph->saddr,
                                         iph->tos, skb->dev))
                        goto drop;
        }
        return dst_input(skb);
drop:
        kfree_skb(skb);
        return NET_RX_DROP;

Whichever path it takes the skb is either gone or belongs to someone
else.

So why is xfrm_input in the xfrm_gro case trying to reinject the
skb into the network stack?

Cheers,
-- 
Email: Herbert Xu <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

Reply via email to