Lines Matching refs:skb

38 	int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb);
100 static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol, in xfrm_rcv_cb() argument
111 ret = afinfo->callback(skb, protocol, err); in xfrm_rcv_cb()
117 struct sec_path *secpath_set(struct sk_buff *skb) in secpath_set() argument
119 struct sec_path *sp, *tmp = skb_ext_find(skb, SKB_EXT_SEC_PATH); in secpath_set()
121 sp = skb_ext_add(skb, SKB_EXT_SEC_PATH); in secpath_set()
139 int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq) in xfrm_parse_spi() argument
156 if (!pskb_may_pull(skb, sizeof(struct ip_comp_hdr))) in xfrm_parse_spi()
158 *spi = htonl(ntohs(*(__be16 *)(skb_transport_header(skb) + 2))); in xfrm_parse_spi()
165 if (!pskb_may_pull(skb, hlen)) in xfrm_parse_spi()
168 *spi = *(__be32 *)(skb_transport_header(skb) + offset); in xfrm_parse_spi()
169 *seq = *(__be32 *)(skb_transport_header(skb) + offset_seq); in xfrm_parse_spi()
174 static int xfrm4_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm4_remove_beet_encap() argument
180 if (unlikely(XFRM_MODE_SKB_CB(skb)->protocol == IPPROTO_BEETPH)) { in xfrm4_remove_beet_encap()
184 if (!pskb_may_pull(skb, sizeof(*ph))) in xfrm4_remove_beet_encap()
187 ph = (struct ip_beet_phdr *)skb->data; in xfrm4_remove_beet_encap()
194 XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr; in xfrm4_remove_beet_encap()
196 if (!pskb_may_pull(skb, phlen)) in xfrm4_remove_beet_encap()
198 __skb_pull(skb, phlen); in xfrm4_remove_beet_encap()
201 skb_push(skb, sizeof(*iph)); in xfrm4_remove_beet_encap()
202 skb_reset_network_header(skb); in xfrm4_remove_beet_encap()
203 skb_mac_header_rebuild(skb); in xfrm4_remove_beet_encap()
205 xfrm4_beet_make_header(skb); in xfrm4_remove_beet_encap()
207 iph = ip_hdr(skb); in xfrm4_remove_beet_encap()
210 iph->tot_len = htons(skb->len); in xfrm4_remove_beet_encap()
214 iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl); in xfrm4_remove_beet_encap()
220 static void ipip_ecn_decapsulate(struct sk_buff *skb) in ipip_ecn_decapsulate() argument
222 struct iphdr *inner_iph = ipip_hdr(skb); in ipip_ecn_decapsulate()
224 if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos)) in ipip_ecn_decapsulate()
228 static int xfrm4_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm4_remove_tunnel_encap() argument
232 if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPIP) in xfrm4_remove_tunnel_encap()
235 if (!pskb_may_pull(skb, sizeof(struct iphdr))) in xfrm4_remove_tunnel_encap()
238 err = skb_unclone(skb, GFP_ATOMIC); in xfrm4_remove_tunnel_encap()
243 ipv4_copy_dscp(XFRM_MODE_SKB_CB(skb)->tos, ipip_hdr(skb)); in xfrm4_remove_tunnel_encap()
245 ipip_ecn_decapsulate(skb); in xfrm4_remove_tunnel_encap()
247 skb_reset_network_header(skb); in xfrm4_remove_tunnel_encap()
248 skb_mac_header_rebuild(skb); in xfrm4_remove_tunnel_encap()
249 if (skb->mac_len) in xfrm4_remove_tunnel_encap()
250 eth_hdr(skb)->h_proto = skb->protocol; in xfrm4_remove_tunnel_encap()
258 static void ipip6_ecn_decapsulate(struct sk_buff *skb) in ipip6_ecn_decapsulate() argument
260 struct ipv6hdr *inner_iph = ipipv6_hdr(skb); in ipip6_ecn_decapsulate()
262 if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos)) in ipip6_ecn_decapsulate()
263 IP6_ECN_set_ce(skb, inner_iph); in ipip6_ecn_decapsulate()
266 static int xfrm6_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm6_remove_tunnel_encap() argument
270 if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6) in xfrm6_remove_tunnel_encap()
272 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) in xfrm6_remove_tunnel_encap()
275 err = skb_unclone(skb, GFP_ATOMIC); in xfrm6_remove_tunnel_encap()
280 ipv6_copy_dscp(ipv6_get_dsfield(ipv6_hdr(skb)), in xfrm6_remove_tunnel_encap()
281 ipipv6_hdr(skb)); in xfrm6_remove_tunnel_encap()
283 ipip6_ecn_decapsulate(skb); in xfrm6_remove_tunnel_encap()
285 skb_reset_network_header(skb); in xfrm6_remove_tunnel_encap()
286 skb_mac_header_rebuild(skb); in xfrm6_remove_tunnel_encap()
287 if (skb->mac_len) in xfrm6_remove_tunnel_encap()
288 eth_hdr(skb)->h_proto = skb->protocol; in xfrm6_remove_tunnel_encap()
296 static int xfrm6_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb) in xfrm6_remove_beet_encap() argument
302 err = skb_cow_head(skb, size + skb->mac_len); in xfrm6_remove_beet_encap()
306 __skb_push(skb, size); in xfrm6_remove_beet_encap()
307 skb_reset_network_header(skb); in xfrm6_remove_beet_encap()
308 skb_mac_header_rebuild(skb); in xfrm6_remove_beet_encap()
310 xfrm6_beet_make_header(skb); in xfrm6_remove_beet_encap()
312 ip6h = ipv6_hdr(skb); in xfrm6_remove_beet_encap()
313 ip6h->payload_len = htons(skb->len - size); in xfrm6_remove_beet_encap()
334 struct sk_buff *skb) in xfrm_inner_mode_encap_remove() argument
339 return xfrm4_remove_beet_encap(x, skb); in xfrm_inner_mode_encap_remove()
341 return xfrm6_remove_beet_encap(x, skb); in xfrm_inner_mode_encap_remove()
345 return xfrm4_remove_tunnel_encap(x, skb); in xfrm_inner_mode_encap_remove()
347 return xfrm6_remove_tunnel_encap(x, skb); in xfrm_inner_mode_encap_remove()
355 static int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb) in xfrm_prepare_input() argument
361 xfrm4_extract_header(skb); in xfrm_prepare_input()
364 xfrm6_extract_header(skb); in xfrm_prepare_input()
372 inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol); in xfrm_prepare_input()
379 skb->protocol = htons(ETH_P_IP); in xfrm_prepare_input()
382 skb->protocol = htons(ETH_P_IPV6); in xfrm_prepare_input()
389 return xfrm_inner_mode_encap_remove(x, inner_mode, skb); in xfrm_prepare_input()
400 static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb) in xfrm4_transport_input() argument
402 int ihl = skb->data - skb_transport_header(skb); in xfrm4_transport_input()
404 if (skb->transport_header != skb->network_header) { in xfrm4_transport_input()
405 memmove(skb_transport_header(skb), in xfrm4_transport_input()
406 skb_network_header(skb), ihl); in xfrm4_transport_input()
407 skb->network_header = skb->transport_header; in xfrm4_transport_input()
409 ip_hdr(skb)->tot_len = htons(skb->len + ihl); in xfrm4_transport_input()
410 skb_reset_transport_header(skb); in xfrm4_transport_input()
414 static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb) in xfrm6_transport_input() argument
417 int ihl = skb->data - skb_transport_header(skb); in xfrm6_transport_input()
419 if (skb->transport_header != skb->network_header) { in xfrm6_transport_input()
420 memmove(skb_transport_header(skb), in xfrm6_transport_input()
421 skb_network_header(skb), ihl); in xfrm6_transport_input()
422 skb->network_header = skb->transport_header; in xfrm6_transport_input()
424 ipv6_hdr(skb)->payload_len = htons(skb->len + ihl - in xfrm6_transport_input()
426 skb_reset_transport_header(skb); in xfrm6_transport_input()
436 struct sk_buff *skb) in xfrm_inner_mode_input() argument
441 return xfrm_prepare_input(x, skb); in xfrm_inner_mode_input()
444 return xfrm4_transport_input(x, skb); in xfrm_inner_mode_input()
446 return xfrm6_transport_input(x, skb); in xfrm_inner_mode_input()
459 int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) in xfrm_input() argument
462 struct net *net = dev_net(skb->dev); in xfrm_input()
469 u32 mark = skb->mark; in xfrm_input()
475 struct xfrm_offload *xo = xfrm_offload(skb); in xfrm_input()
479 x = xfrm_input_state(skb); in xfrm_input()
489 dev_put(skb->dev); in xfrm_input()
498 seq = XFRM_SKB_CB(skb)->seq.input.low; in xfrm_input()
504 seq = XFRM_SPI_SKB_CB(skb)->seq; in xfrm_input()
508 family = XFRM_SPI_SKB_CB(skb)->family; in xfrm_input()
517 xfrm_audit_state_icvfail(x, skb, in xfrm_input()
533 if (xfrm_parse_spi(skb, nexthdr, &spi, &seq)) { in xfrm_input()
542 family = XFRM_SPI_SKB_CB(skb)->family; in xfrm_input()
547 if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4) in xfrm_input()
548 mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4->parms.i_key); in xfrm_input()
551 if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6) in xfrm_input()
552 mark = be32_to_cpu(XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6->parms.i_key); in xfrm_input()
556 sp = secpath_set(skb); in xfrm_input()
563 if (!spi && xfrm_parse_spi(skb, nexthdr, &spi, &seq)) { in xfrm_input()
564 secpath_reset(skb); in xfrm_input()
569 daddr = (xfrm_address_t *)(skb_network_header(skb) + in xfrm_input()
570 XFRM_SPI_SKB_CB(skb)->daddroff); in xfrm_input()
572 sp = skb_sec_path(skb); in xfrm_input()
575 secpath_reset(skb); in xfrm_input()
582 secpath_reset(skb); in xfrm_input()
584 xfrm_audit_state_notfound(skb, family, spi, seq); in xfrm_input()
588 skb->mark = xfrm_smark_get(skb->mark, x); in xfrm_input()
592 skb_dst_force(skb); in xfrm_input()
593 if (!skb_dst(skb)) { in xfrm_input()
615 if (xfrm_replay_check(x, skb, seq)) { in xfrm_input()
627 if (xfrm_tunnel_check(skb, x, family)) { in xfrm_input()
634 XFRM_SKB_CB(skb)->seq.input.low = seq; in xfrm_input()
635 XFRM_SKB_CB(skb)->seq.input.hi = seq_hi; in xfrm_input()
637 dev_hold(skb->dev); in xfrm_input()
640 nexthdr = x->type_offload->input_tail(x, skb); in xfrm_input()
642 nexthdr = x->type->input(x, skb); in xfrm_input()
647 dev_put(skb->dev); in xfrm_input()
652 xfrm_audit_state_icvfail(x, skb, in xfrm_input()
663 if (xfrm_replay_recheck(x, skb, seq)) { in xfrm_input()
670 x->curlft.bytes += skb->len; in xfrm_input()
675 XFRM_MODE_SKB_CB(skb)->protocol = nexthdr; in xfrm_input()
680 inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol); in xfrm_input()
687 if (xfrm_inner_mode_input(x, inner_mode, skb)) { in xfrm_input()
704 err = xfrm_parse_spi(skb, nexthdr, &spi, &seq); in xfrm_input()
712 err = xfrm_rcv_cb(skb, family, x->type->proto, 0); in xfrm_input()
716 nf_reset_ct(skb); in xfrm_input()
719 sp = skb_sec_path(skb); in xfrm_input()
722 skb_dst_drop(skb); in xfrm_input()
723 gro_cells_receive(&gro_cells, skb); in xfrm_input()
726 xo = xfrm_offload(skb); in xfrm_input()
734 err = afinfo->transport_finish(skb, xfrm_gro || async); in xfrm_input()
737 sp = skb_sec_path(skb); in xfrm_input()
740 skb_dst_drop(skb); in xfrm_input()
741 gro_cells_receive(&gro_cells, skb); in xfrm_input()
751 xfrm_rcv_cb(skb, family, x && x->type ? x->type->proto : nexthdr, -1); in xfrm_input()
752 kfree_skb(skb); in xfrm_input()
757 int xfrm_input_resume(struct sk_buff *skb, int nexthdr) in xfrm_input_resume() argument
759 return xfrm_input(skb, nexthdr, 0, -1); in xfrm_input_resume()
767 struct sk_buff *skb; in xfrm_trans_reinject() local
772 while ((skb = __skb_dequeue(&queue))) in xfrm_trans_reinject()
773 XFRM_TRANS_SKB_CB(skb)->finish(XFRM_TRANS_SKB_CB(skb)->net, in xfrm_trans_reinject()
774 NULL, skb); in xfrm_trans_reinject()
777 int xfrm_trans_queue_net(struct net *net, struct sk_buff *skb, in xfrm_trans_queue_net() argument
788 BUILD_BUG_ON(sizeof(struct xfrm_trans_cb) > sizeof(skb->cb)); in xfrm_trans_queue_net()
790 XFRM_TRANS_SKB_CB(skb)->finish = finish; in xfrm_trans_queue_net()
791 XFRM_TRANS_SKB_CB(skb)->net = net; in xfrm_trans_queue_net()
792 __skb_queue_tail(&trans->queue, skb); in xfrm_trans_queue_net()
798 int xfrm_trans_queue(struct sk_buff *skb, in xfrm_trans_queue() argument
802 return xfrm_trans_queue_net(dev_net(skb->dev), skb, finish); in xfrm_trans_queue()