Lines Matching full:skb
33 #define indirect_call_gro_receive_l4(f2, f1, cb, head, skb) \ argument
35 unlikely(gro_recursion_inc_test(skb)) ? \
36 NAPI_GRO_CB(skb)->flush |= 1, NULL : \
37 INDIRECT_CALL_L4(cb, f2, f1, head, skb); \
40 static int ipv6_gro_pull_exthdrs(struct sk_buff *skb, int off, int proto) in ipv6_gro_pull_exthdrs() argument
56 opth = skb_gro_header(skb, off + sizeof(*opth), off); in ipv6_gro_pull_exthdrs()
62 opth = skb_gro_header(skb, off + len, off); in ipv6_gro_pull_exthdrs()
70 skb_gro_pull(skb, off - skb_gro_receive_network_offset(skb)); in ipv6_gro_pull_exthdrs()
74 static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto) in ipv6_gso_pull_exthdrs() argument
90 if (unlikely(!pskb_may_pull(skb, 8))) in ipv6_gso_pull_exthdrs()
93 opth = (void *)skb->data; in ipv6_gso_pull_exthdrs()
96 if (unlikely(!pskb_may_pull(skb, len))) in ipv6_gso_pull_exthdrs()
99 opth = (void *)skb->data; in ipv6_gso_pull_exthdrs()
101 __skb_pull(skb, len); in ipv6_gso_pull_exthdrs()
107 static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, in ipv6_gso_segment() argument
122 skb_reset_network_header(skb); in ipv6_gso_segment()
123 err = ipv6_hopopt_jumbo_remove(skb); in ipv6_gso_segment()
126 nhoff = skb_network_header(skb) - skb_mac_header(skb); in ipv6_gso_segment()
127 if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h)))) in ipv6_gso_segment()
130 encap = SKB_GSO_CB(skb)->encap_level > 0; in ipv6_gso_segment()
132 features &= skb->dev->hw_enc_features; in ipv6_gso_segment()
133 SKB_GSO_CB(skb)->encap_level += sizeof(*ipv6h); in ipv6_gso_segment()
135 ipv6h = ipv6_hdr(skb); in ipv6_gso_segment()
136 __skb_pull(skb, sizeof(*ipv6h)); in ipv6_gso_segment()
139 proto = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr); in ipv6_gso_segment()
141 if (skb->encapsulation && in ipv6_gso_segment()
142 skb_shinfo(skb)->gso_type & (SKB_GSO_IPXIP4 | SKB_GSO_IPXIP6)) in ipv6_gso_segment()
144 (skb_shinfo(skb)->gso_type & SKB_GSO_UDP); in ipv6_gso_segment()
146 udpfrag = proto == IPPROTO_UDP && !skb->encapsulation && in ipv6_gso_segment()
147 (skb_shinfo(skb)->gso_type & SKB_GSO_UDP); in ipv6_gso_segment()
151 skb_reset_transport_header(skb); in ipv6_gso_segment()
152 segs = ops->callbacks.gso_segment(skb, features); in ipv6_gso_segment()
154 skb->network_header = skb_mac_header(skb) + nhoff - skb->head; in ipv6_gso_segment()
162 for (skb = segs; skb; skb = skb->next) { in ipv6_gso_segment()
163 ipv6h = (struct ipv6hdr *)(skb_mac_header(skb) + nhoff); in ipv6_gso_segment()
164 if (gso_partial && skb_is_gso(skb)) in ipv6_gso_segment()
165 payload_len = skb_shinfo(skb)->gso_size + in ipv6_gso_segment()
166 SKB_GSO_CB(skb)->data_offset + in ipv6_gso_segment()
167 skb->head - (unsigned char *)(ipv6h + 1); in ipv6_gso_segment()
169 payload_len = skb->len - nhoff - sizeof(*ipv6h); in ipv6_gso_segment()
171 skb->network_header = (u8 *)ipv6h - skb->head; in ipv6_gso_segment()
172 skb_reset_mac_len(skb); in ipv6_gso_segment()
175 int err = ip6_find_1stfragopt(skb, &prevhdr); in ipv6_gso_segment()
182 if (skb->next) in ipv6_gso_segment()
188 skb_reset_inner_headers(skb); in ipv6_gso_segment()
221 struct sk_buff *skb) in ipv6_gro_receive() argument
233 off = skb_gro_offset(skb); in ipv6_gro_receive()
235 iph = skb_gro_header(skb, hlen, off); in ipv6_gro_receive()
239 NAPI_GRO_CB(skb)->network_offsets[NAPI_GRO_CB(skb)->encap_mark] = off; in ipv6_gro_receive()
241 flush += ntohs(iph->payload_len) != skb->len - hlen; in ipv6_gro_receive()
246 proto = ipv6_gro_pull_exthdrs(skb, hlen, proto); in ipv6_gro_receive()
252 iph = skb_gro_network_header(skb); in ipv6_gro_receive()
254 skb_gro_pull(skb, sizeof(*iph)); in ipv6_gro_receive()
257 skb_set_transport_header(skb, skb_gro_offset(skb)); in ipv6_gro_receive()
259 NAPI_GRO_CB(skb)->proto = proto; in ipv6_gro_receive()
262 nlen = skb_gro_offset(skb) - off; in ipv6_gro_receive()
295 NAPI_GRO_CB(skb)->flush |= flush; in ipv6_gro_receive()
297 skb_gro_postpull_rcsum(skb, iph, nlen); in ipv6_gro_receive()
300 ops->callbacks.gro_receive, head, skb); in ipv6_gro_receive()
303 skb_gro_flush_final(skb, pp, flush); in ipv6_gro_receive()
309 struct sk_buff *skb) in sit_ip6ip6_gro_receive() argument
313 if (NAPI_GRO_CB(skb)->encap_mark) { in sit_ip6ip6_gro_receive()
314 NAPI_GRO_CB(skb)->flush = 1; in sit_ip6ip6_gro_receive()
318 NAPI_GRO_CB(skb)->encap_mark = 1; in sit_ip6ip6_gro_receive()
320 return ipv6_gro_receive(head, skb); in sit_ip6ip6_gro_receive()
324 struct sk_buff *skb) in ip4ip6_gro_receive() argument
328 if (NAPI_GRO_CB(skb)->encap_mark) { in ip4ip6_gro_receive()
329 NAPI_GRO_CB(skb)->flush = 1; in ip4ip6_gro_receive()
333 NAPI_GRO_CB(skb)->encap_mark = 1; in ip4ip6_gro_receive()
335 return inet_gro_receive(head, skb); in ip4ip6_gro_receive()
338 INDIRECT_CALLABLE_SCOPE int ipv6_gro_complete(struct sk_buff *skb, int nhoff) in ipv6_gro_complete() argument
345 if (skb->encapsulation) { in ipv6_gro_complete()
346 skb_set_inner_protocol(skb, cpu_to_be16(ETH_P_IPV6)); in ipv6_gro_complete()
347 skb_set_inner_network_header(skb, nhoff); in ipv6_gro_complete()
350 payload_len = skb->len - nhoff - sizeof(*iph); in ipv6_gro_complete()
356 memmove(skb_mac_header(skb) - hoplen, skb_mac_header(skb), in ipv6_gro_complete()
357 skb->transport_header - skb->mac_header); in ipv6_gro_complete()
358 skb->data -= hoplen; in ipv6_gro_complete()
359 skb->len += hoplen; in ipv6_gro_complete()
360 skb->mac_header -= hoplen; in ipv6_gro_complete()
361 skb->network_header -= hoplen; in ipv6_gro_complete()
362 iph = (struct ipv6hdr *)(skb->data + nhoff); in ipv6_gro_complete()
375 iph = (struct ipv6hdr *)(skb->data + nhoff); in ipv6_gro_complete()
384 udp6_gro_complete, skb, nhoff); in ipv6_gro_complete()
390 static int sit_gro_complete(struct sk_buff *skb, int nhoff) in sit_gro_complete() argument
392 skb->encapsulation = 1; in sit_gro_complete()
393 skb_shinfo(skb)->gso_type |= SKB_GSO_IPXIP4; in sit_gro_complete()
394 return ipv6_gro_complete(skb, nhoff); in sit_gro_complete()
397 static int ip6ip6_gro_complete(struct sk_buff *skb, int nhoff) in ip6ip6_gro_complete() argument
399 skb->encapsulation = 1; in ip6ip6_gro_complete()
400 skb_shinfo(skb)->gso_type |= SKB_GSO_IPXIP6; in ip6ip6_gro_complete()
401 return ipv6_gro_complete(skb, nhoff); in ip6ip6_gro_complete()
404 static int ip4ip6_gro_complete(struct sk_buff *skb, int nhoff) in ip4ip6_gro_complete() argument
406 skb->encapsulation = 1; in ip4ip6_gro_complete()
407 skb_shinfo(skb)->gso_type |= SKB_GSO_IPXIP6; in ip4ip6_gro_complete()
408 return inet_gro_complete(skb, nhoff); in ip4ip6_gro_complete()
412 static struct sk_buff *sit_gso_segment(struct sk_buff *skb, in sit_gso_segment() argument
415 if (!(skb_shinfo(skb)->gso_type & SKB_GSO_IPXIP4)) in sit_gso_segment()
418 return ipv6_gso_segment(skb, features); in sit_gso_segment()
421 static struct sk_buff *ip4ip6_gso_segment(struct sk_buff *skb, in ip4ip6_gso_segment() argument
424 if (!(skb_shinfo(skb)->gso_type & SKB_GSO_IPXIP6)) in ip4ip6_gso_segment()
427 return inet_gso_segment(skb, features); in ip4ip6_gso_segment()
430 static struct sk_buff *ip6ip6_gso_segment(struct sk_buff *skb, in ip6ip6_gso_segment() argument
433 if (!(skb_shinfo(skb)->gso_type & SKB_GSO_IPXIP6)) in ip6ip6_gso_segment()
436 return ipv6_gso_segment(skb, features); in ip6ip6_gso_segment()