On Tue, 2017-02-07 at 10:14 +0100, Steffen Klassert wrote: > This patch adds GRO ifrastructure and callbacks for ESP on > ipv4 and ipv6. >
I am a bit confused. > > -struct xfrm_tunnel_skb_cb { > +/* > + * This structure is used if we get the packet from the gro layer. > + */ > +struct xfrm_gro_skb_cb { > union { > struct inet_skb_parm h4; > struct inet6_skb_parm h6; > - } header; > + > + struct { > + __be32 seq; > + bool skb_is_gro; > + } input; > + } gro; > +}; > + > +#define XFRM_GRO_SKB_CB(__skb) ((struct xfrm_gro_skb_cb *)&((__skb)->cb[0])) > + Then : > + > + x = xfrm_state_lookup(dev_net(skb->dev), skb->mark, > + (xfrm_address_t *)&ip_hdr(skb)->daddr, > + spi, IPPROTO_ESP, AF_INET); > + if (!x) > + goto out; > + > + XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = NULL; > + XFRM_SPI_SKB_CB(skb)->family = AF_INET; > + XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr); > + XFRM_GRO_SKB_CB(skb)->gro.input.seq = seq; > + skb->sp->xvec[skb->sp->len++] = x; > + > + /* We don't need to handle errors from xfrm_input, it does all > + * the error handling and frees the resources on error. */ > + xfrm_input(skb, IPPROTO_ESP, spi, -2); > + > + return ERR_PTR(-EINPROGRESS); > +out: > + skb_push(skb, offset); > + NAPI_GRO_CB(skb)->same_flow = 0; > + NAPI_GRO_CB(skb)->flush = 1; > + How can you mix XFRM_SPI_SKB_CB(), XFRM_GRO_SKB_CB() and NAPI_GRO_CB() at the same time on one skb ?