Lines Matching refs:skb

14 static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
17 int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
20 u16 mac_offset = skb->mac_header;
21 __be16 protocol = skb->protocol;
22 u16 mac_len = skb->mac_len;
25 if (!skb->encapsulation)
31 if (unlikely(!pskb_may_pull(skb, tnl_hlen)))
34 /* setup inner skb. */
35 skb->encapsulation = 0;
36 SKB_GSO_CB(skb)->encap_level = 0;
37 __skb_pull(skb, tnl_hlen);
38 skb_reset_mac_header(skb);
39 skb_set_network_header(skb, skb_inner_network_offset(skb));
40 skb->mac_len = skb_inner_network_offset(skb);
41 skb->protocol = skb->inner_protocol;
43 need_csum = !!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE_CSUM);
44 need_recompute_csum = skb->csum_not_inet;
45 skb->encap_hdr_csum = need_csum;
47 features &= skb->dev->hw_enc_features;
50 segs = skb_mac_gso_segment(skb, features);
52 skb_gso_error_unwind(skb, protocol, tnl_hlen, mac_offset,
59 outer_hlen = skb_tnl_header_len(skb);
61 skb = segs;
67 if (skb->ip_summed == CHECKSUM_PARTIAL) {
68 skb_reset_inner_headers(skb);
69 skb->encapsulation = 1;
72 skb->mac_len = mac_len;
73 skb->protocol = protocol;
75 __skb_push(skb, outer_hlen);
76 skb_reset_mac_header(skb);
77 skb_set_network_header(skb, mac_len);
78 skb_set_transport_header(skb, gre_offset);
83 greh = (struct gre_base_hdr *)skb_transport_header(skb);
86 if (gso_partial && skb_is_gso(skb)) {
93 partial_adj = skb->len + skb_headroom(skb) -
94 SKB_GSO_CB(skb)->data_offset -
95 skb_shinfo(skb)->gso_size;
102 if (need_recompute_csum && !skb_is_gso(skb)) {
105 csum = skb_checksum(skb, gre_offset,
106 skb->len - gre_offset, 0);
109 *pcsum = gso_make_checksum(skb, 0);
111 } while ((skb = skb->next));
117 struct sk_buff *skb)
128 if (NAPI_GRO_CB(skb)->encap_mark)
131 NAPI_GRO_CB(skb)->encap_mark = 1;
133 off = skb_gro_offset(skb);
135 greh = skb_gro_header_fast(skb, off);
136 if (skb_gro_header_hard(skb, hlen)) {
137 greh = skb_gro_header_slow(skb, hlen, off);
156 if ((greh->flags & GRE_CSUM) && NAPI_GRO_CB(skb)->is_fou)
175 if (skb_gro_header_hard(skb, hlen)) {
176 greh = skb_gro_header_slow(skb, hlen, off);
182 if ((greh->flags & GRE_CSUM) && !NAPI_GRO_CB(skb)->flush) {
183 if (skb_gro_checksum_simple_validate(skb))
186 skb_gro_checksum_try_convert(skb, IPPROTO_GRE,
220 skb_gro_pull(skb, grehlen);
222 /* Adjusted NAPI_GRO_CB(skb)->csum after skb_gro_pull()*/
223 skb_gro_postpull_rcsum(skb, greh, grehlen);
225 pp = call_gro_receive(ptype->callbacks.gro_receive, head, skb);
231 skb_gro_flush_final(skb, pp, flush);
236 static int gre_gro_complete(struct sk_buff *skb, int nhoff)
238 struct gre_base_hdr *greh = (struct gre_base_hdr *)(skb->data + nhoff);
244 skb->encapsulation = 1;
245 skb_shinfo(skb)->gso_type = SKB_GSO_GRE;
257 err = ptype->callbacks.gro_complete(skb, nhoff + grehlen);
261 skb_set_inner_mac_header(skb, nhoff + grehlen);