Lines Matching refs:skb

40 	int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb);
102 static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol, in xfrm_rcv_cb() argument
113 ret = afinfo->callback(skb, protocol, err); in xfrm_rcv_cb()
119 struct sec_path *secpath_set(struct sk_buff *skb) in secpath_set() argument
121 struct sec_path *sp, *tmp = skb_ext_find(skb, SKB_EXT_SEC_PATH); in secpath_set()
123 sp = skb_ext_add(skb, SKB_EXT_SEC_PATH); in secpath_set()
142 int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq) in xfrm_parse_spi() argument
159 if (!pskb_may_pull(skb, sizeof(struct ip_comp_hdr))) in xfrm_parse_spi()
161 *spi = htonl(ntohs(*(__be16 *)(skb_transport_header(skb) + 2))); in xfrm_parse_spi()
168 if (!pskb_may_pull(skb, hlen)) in xfrm_parse_spi()
171 *spi = *(__be32 *)(skb_transport_header(skb) + offset); in xfrm_parse_spi()
172 *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq); in xfrm_parse_spi()
177 static int xfrm4_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm4_remove_beet_encap() argument
183 skb->protocol = htons(ETH_P_IP); in xfrm4_remove_beet_encap()
185 if (unlikely(XFRM_MODE_SKB_CB(skb)->protocol == IPPROTO_BEETPH)) { in xfrm4_remove_beet_encap()
189 if (!pskb_may_pull(skb, sizeof(*ph))) in xfrm4_remove_beet_encap()
192 ph = (struct ip_beet_phdr *)skb->data; in xfrm4_remove_beet_encap()
199 XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr; in xfrm4_remove_beet_encap()
201 if (!pskb_may_pull(skb, phlen)) in xfrm4_remove_beet_encap()
203 __skb_pull(skb, phlen); in xfrm4_remove_beet_encap()
206 skb_push(skb, sizeof(*iph)); in xfrm4_remove_beet_encap()
207 skb_reset_network_header(skb); in xfrm4_remove_beet_encap()
208 skb_mac_header_rebuild(skb); in xfrm4_remove_beet_encap()
210 xfrm4_beet_make_header(skb); in xfrm4_remove_beet_encap()
212 iph = ip_hdr(skb); in xfrm4_remove_beet_encap()
215 iph->tot_len = htons(skb->len); in xfrm4_remove_beet_encap()
219 iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl); in xfrm4_remove_beet_encap()
225 static void ipip_ecn_decapsulate(struct sk_buff *skb) in ipip_ecn_decapsulate() argument
227 struct iphdr *inner_iph = ipip_hdr(skb); in ipip_ecn_decapsulate()
229 if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos)) in ipip_ecn_decapsulate()
233 static int xfrm4_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm4_remove_tunnel_encap() argument
237 skb->protocol = htons(ETH_P_IP); in xfrm4_remove_tunnel_encap()
239 if (!pskb_may_pull(skb, sizeof(struct iphdr))) in xfrm4_remove_tunnel_encap()
242 err = skb_unclone(skb, GFP_ATOMIC); in xfrm4_remove_tunnel_encap()
247 ipv4_copy_dscp(XFRM_MODE_SKB_CB(skb)->tos, ipip_hdr(skb)); in xfrm4_remove_tunnel_encap()
249 ipip_ecn_decapsulate(skb); in xfrm4_remove_tunnel_encap()
251 skb_reset_network_header(skb); in xfrm4_remove_tunnel_encap()
252 skb_mac_header_rebuild(skb); in xfrm4_remove_tunnel_encap()
253 if (skb->mac_len) in xfrm4_remove_tunnel_encap()
254 eth_hdr(skb)->h_proto = skb->protocol; in xfrm4_remove_tunnel_encap()
262 static void ipip6_ecn_decapsulate(struct sk_buff *skb) in ipip6_ecn_decapsulate() argument
264 struct ipv6hdr *inner_iph = ipipv6_hdr(skb); in ipip6_ecn_decapsulate()
266 if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos)) in ipip6_ecn_decapsulate()
267 IP6_ECN_set_ce(skb, inner_iph); in ipip6_ecn_decapsulate()
270 static int xfrm6_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm6_remove_tunnel_encap() argument
274 skb->protocol = htons(ETH_P_IPV6); in xfrm6_remove_tunnel_encap()
276 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) in xfrm6_remove_tunnel_encap()
279 err = skb_unclone(skb, GFP_ATOMIC); in xfrm6_remove_tunnel_encap()
284 ipv6_copy_dscp(XFRM_MODE_SKB_CB(skb)->tos, ipipv6_hdr(skb)); in xfrm6_remove_tunnel_encap()
286 ipip6_ecn_decapsulate(skb); in xfrm6_remove_tunnel_encap()
288 skb_reset_network_header(skb); in xfrm6_remove_tunnel_encap()
289 skb_mac_header_rebuild(skb); in xfrm6_remove_tunnel_encap()
290 if (skb->mac_len) in xfrm6_remove_tunnel_encap()
291 eth_hdr(skb)->h_proto = skb->protocol; in xfrm6_remove_tunnel_encap()
299 static int xfrm6_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm6_remove_beet_encap() argument
305 skb->protocol = htons(ETH_P_IPV6); in xfrm6_remove_beet_encap()
307 err = skb_cow_head(skb, size + skb->mac_len); in xfrm6_remove_beet_encap()
311 __skb_push(skb, size); in xfrm6_remove_beet_encap()
312 skb_reset_network_header(skb); in xfrm6_remove_beet_encap()
313 skb_mac_header_rebuild(skb); in xfrm6_remove_beet_encap()
315 xfrm6_beet_make_header(skb); in xfrm6_remove_beet_encap()
317 ip6h = ipv6_hdr(skb); in xfrm6_remove_beet_encap()
318 ip6h->payload_len = htons(skb->len - size); in xfrm6_remove_beet_encap()
338 struct sk_buff *skb) in xfrm_inner_mode_encap_remove() argument
344 return xfrm4_remove_beet_encap(x, skb); in xfrm_inner_mode_encap_remove()
346 return xfrm6_remove_beet_encap(x, skb); in xfrm_inner_mode_encap_remove()
350 switch (XFRM_MODE_SKB_CB(skb)->protocol) { in xfrm_inner_mode_encap_remove()
352 return xfrm4_remove_tunnel_encap(x, skb); in xfrm_inner_mode_encap_remove()
354 return xfrm6_remove_tunnel_encap(x, skb); in xfrm_inner_mode_encap_remove()
364 static int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb) in xfrm_prepare_input() argument
368 xfrm4_extract_header(skb); in xfrm_prepare_input()
371 xfrm6_extract_header(skb); in xfrm_prepare_input()
378 return xfrm_inner_mode_encap_remove(x, skb); in xfrm_prepare_input()
389 static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb) in xfrm4_transport_input() argument
391 struct xfrm_offload *xo = xfrm_offload(skb); in xfrm4_transport_input()
392 int ihl = skb->data - skb_transport_header(skb); in xfrm4_transport_input()
394 if (skb->transport_header != skb->network_header) { in xfrm4_transport_input()
395 memmove(skb_transport_header(skb), in xfrm4_transport_input()
396 skb_network_header(skb), ihl); in xfrm4_transport_input()
399 skb_mac_header_was_set(skb) ? skb_mac_header_len(skb) : 0; in xfrm4_transport_input()
400 skb->network_header = skb->transport_header; in xfrm4_transport_input()
402 ip_hdr(skb)->tot_len = htons(skb->len + ihl); in xfrm4_transport_input()
403 skb_reset_transport_header(skb); in xfrm4_transport_input()
407 static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb) in xfrm6_transport_input() argument
410 struct xfrm_offload *xo = xfrm_offload(skb); in xfrm6_transport_input()
411 int ihl = skb->data - skb_transport_header(skb); in xfrm6_transport_input()
413 if (skb->transport_header != skb->network_header) { in xfrm6_transport_input()
414 memmove(skb_transport_header(skb), in xfrm6_transport_input()
415 skb_network_header(skb), ihl); in xfrm6_transport_input()
418 skb_mac_header_was_set(skb) ? skb_mac_header_len(skb) : 0; in xfrm6_transport_input()
419 skb->network_header = skb->transport_header; in xfrm6_transport_input()
421 ipv6_hdr(skb)->payload_len = htons(skb->len + ihl - in xfrm6_transport_input()
423 skb_reset_transport_header(skb); in xfrm6_transport_input()
432 struct sk_buff *skb) in xfrm_inner_mode_input() argument
437 return xfrm_prepare_input(x, skb); in xfrm_inner_mode_input()
440 return xfrm4_transport_input(x, skb); in xfrm_inner_mode_input()
442 return xfrm6_transport_input(x, skb); in xfrm_inner_mode_input()
455 int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) in xfrm_input() argument
458 struct net *net = dev_net(skb->dev); in xfrm_input()
464 u32 mark = skb->mark; in xfrm_input()
470 struct xfrm_offload *xo = xfrm_offload(skb); in xfrm_input()
474 x = xfrm_input_state(skb); in xfrm_input()
484 dev_put(skb->dev); in xfrm_input()
493 seq = XFRM_SKB_CB(skb)->seq.input.low; in xfrm_input()
499 seq = XFRM_SPI_SKB_CB(skb)->seq; in xfrm_input()
503 family = XFRM_SPI_SKB_CB(skb)->family; in xfrm_input()
512 xfrm_audit_state_icvfail(x, skb, in xfrm_input()
528 if (xfrm_parse_spi(skb, nexthdr, &spi, &seq)) { in xfrm_input()
537 family = XFRM_SPI_SKB_CB(skb)->family; in xfrm_input()
542 if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4) in xfrm_input()
543 mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4->parms.i_key); in xfrm_input()
546 if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6) in xfrm_input()
547 mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6->parms.i_key); in xfrm_input()
551 sp = secpath_set(skb); in xfrm_input()
558 if (!spi && xfrm_parse_spi(skb, nexthdr, &spi, &seq)) { in xfrm_input()
559 secpath_reset(skb); in xfrm_input()
564 daddr = (xfrm_address_t *)(skb_network_header(skb) + in xfrm_input()
565 XFRM_SPI_SKB_CB(skb)->daddroff); in xfrm_input()
567 sp = skb_sec_path(skb); in xfrm_input()
570 secpath_reset(skb); in xfrm_input()
577 secpath_reset(skb); in xfrm_input()
579 xfrm_audit_state_notfound(skb, family, spi, seq); in xfrm_input()
583 skb->mark = xfrm_smark_get(skb->mark, x); in xfrm_input()
587 skb_dst_force(skb); in xfrm_input()
588 if (!skb_dst(skb)) { in xfrm_input()
610 if (xfrm_replay_check(x, skb, seq)) { in xfrm_input()
622 if (xfrm_tunnel_check(skb, x, family)) { in xfrm_input()
629 XFRM_SKB_CB(skb)->seq.input.low = seq; in xfrm_input()
630 XFRM_SKB_CB(skb)->seq.input.hi = seq_hi; in xfrm_input()
632 dev_hold(skb->dev); in xfrm_input()
635 nexthdr = x->type_offload->input_tail(x, skb); in xfrm_input()
637 nexthdr = x->type->input(x, skb); in xfrm_input()
642 dev_put(skb->dev); in xfrm_input()
647 xfrm_audit_state_icvfail(x, skb, in xfrm_input()
658 if (xfrm_replay_recheck(x, skb, seq)) { in xfrm_input()
665 x->curlft.bytes += skb->len; in xfrm_input()
671 XFRM_MODE_SKB_CB(skb)->protocol = nexthdr; in xfrm_input()
673 if (xfrm_inner_mode_input(x, skb)) { in xfrm_input()
690 err = xfrm_parse_spi(skb, nexthdr, &spi, &seq); in xfrm_input()
698 err = xfrm_rcv_cb(skb, family, x->type->proto, 0); in xfrm_input()
702 nf_reset_ct(skb); in xfrm_input()
705 sp = skb_sec_path(skb); in xfrm_input()
708 if (skb_valid_dst(skb)) in xfrm_input()
709 skb_dst_drop(skb); in xfrm_input()
710 gro_cells_receive(&gro_cells, skb); in xfrm_input()
713 xo = xfrm_offload(skb); in xfrm_input()
721 err = afinfo->transport_finish(skb, xfrm_gro || async); in xfrm_input()
724 sp = skb_sec_path(skb); in xfrm_input()
727 if (skb_valid_dst(skb)) in xfrm_input()
728 skb_dst_drop(skb); in xfrm_input()
729 gro_cells_receive(&gro_cells, skb); in xfrm_input()
739 xfrm_rcv_cb(skb, family, x && x->type ? x->type->proto : nexthdr, -1); in xfrm_input()
740 kfree_skb(skb); in xfrm_input()
745 int xfrm_input_resume(struct sk_buff *skb, int nexthdr) in xfrm_input_resume() argument
747 return xfrm_input(skb, nexthdr, 0, -1); in xfrm_input_resume()
755 struct sk_buff *skb; in xfrm_trans_reinject() local
763 while ((skb = __skb_dequeue(&queue))) in xfrm_trans_reinject()
764 XFRM_TRANS_SKB_CB(skb)->finish(XFRM_TRANS_SKB_CB(skb)->net, in xfrm_trans_reinject()
765 NULL, skb); in xfrm_trans_reinject()
769 int xfrm_trans_queue_net(struct net *net, struct sk_buff *skb, in xfrm_trans_queue_net() argument
780 BUILD_BUG_ON(sizeof(struct xfrm_trans_cb) > sizeof(skb->cb)); in xfrm_trans_queue_net()
782 XFRM_TRANS_SKB_CB(skb)->finish = finish; in xfrm_trans_queue_net()
783 XFRM_TRANS_SKB_CB(skb)->net = net; in xfrm_trans_queue_net()
785 __skb_queue_tail(&trans->queue, skb); in xfrm_trans_queue_net()
792 int xfrm_trans_queue(struct sk_buff *skb, in xfrm_trans_queue() argument
796 return xfrm_trans_queue_net(dev_net(skb->dev), skb, finish); in xfrm_trans_queue()