Lines Matching refs:skb
68 bool (*func)(struct sk_buff *skb, int offset);
77 static bool ip6_tlvopt_unknown(struct sk_buff *skb, int optoff, in ip6_tlvopt_unknown() argument
91 switch ((skb_network_header(skb)[optoff] & 0xC0) >> 6) { in ip6_tlvopt_unknown()
102 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) in ip6_tlvopt_unknown()
106 icmpv6_param_prob(skb, ICMPV6_UNK_OPTION, optoff); in ip6_tlvopt_unknown()
111 kfree_skb(skb); in ip6_tlvopt_unknown()
118 struct sk_buff *skb, in ip6_parse_tlv() argument
121 int len = (skb_transport_header(skb)[1] + 1) << 3; in ip6_parse_tlv()
122 const unsigned char *nh = skb_network_header(skb); in ip6_parse_tlv()
123 int off = skb_network_header_len(skb); in ip6_parse_tlv()
134 if (skb_transport_offset(skb) + len > skb_headlen(skb)) in ip6_parse_tlv()
184 if (curr->func(skb, off) == false) in ip6_parse_tlv()
190 !ip6_tlvopt_unknown(skb, off, disallow_unknowns)) in ip6_parse_tlv()
203 kfree_skb(skb); in ip6_parse_tlv()
212 static bool ipv6_dest_hao(struct sk_buff *skb, int optoff) in ipv6_dest_hao() argument
215 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_dest_hao()
216 struct ipv6hdr *ipv6h = ipv6_hdr(skb); in ipv6_dest_hao()
226 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + optoff); in ipv6_dest_hao()
240 ret = xfrm6_input_addr(skb, (xfrm_address_t *)&ipv6h->daddr, in ipv6_dest_hao()
245 if (skb_cloned(skb)) { in ipv6_dest_hao()
246 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) in ipv6_dest_hao()
250 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + in ipv6_dest_hao()
252 ipv6h = ipv6_hdr(skb); in ipv6_dest_hao()
255 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_dest_hao()
256 skb->ip_summed = CHECKSUM_NONE; in ipv6_dest_hao()
260 if (skb->tstamp == 0) in ipv6_dest_hao()
261 __net_timestamp(skb); in ipv6_dest_hao()
266 kfree_skb(skb); in ipv6_dest_hao()
281 static int ipv6_destopt_rcv(struct sk_buff *skb) in ipv6_destopt_rcv() argument
283 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ipv6_destopt_rcv()
284 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_destopt_rcv()
288 struct dst_entry *dst = skb_dst(skb); in ipv6_destopt_rcv()
289 struct net *net = dev_net(skb->dev); in ipv6_destopt_rcv()
292 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || in ipv6_destopt_rcv()
293 !pskb_may_pull(skb, (skb_transport_offset(skb) + in ipv6_destopt_rcv()
294 ((skb_transport_header(skb)[1] + 1) << 3)))) { in ipv6_destopt_rcv()
298 kfree_skb(skb); in ipv6_destopt_rcv()
302 extlen = (skb_transport_header(skb)[1] + 1) << 3; in ipv6_destopt_rcv()
306 opt->lastopt = opt->dst1 = skb_network_header_len(skb); in ipv6_destopt_rcv()
311 if (ip6_parse_tlv(tlvprocdestopt_lst, skb, in ipv6_destopt_rcv()
313 skb->transport_header += extlen; in ipv6_destopt_rcv()
314 opt = IP6CB(skb); in ipv6_destopt_rcv()
327 static void seg6_update_csum(struct sk_buff *skb) in seg6_update_csum() argument
337 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb); in seg6_update_csum()
348 update_csum_diff4(skb, from, to); in seg6_update_csum()
352 update_csum_diff16(skb, (__be32 *)(&ipv6_hdr(skb)->daddr), in seg6_update_csum()
356 static int ipv6_srh_rcv(struct sk_buff *skb) in ipv6_srh_rcv() argument
358 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_srh_rcv()
359 struct net *net = dev_net(skb->dev); in ipv6_srh_rcv()
365 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb); in ipv6_srh_rcv()
367 idev = __in6_dev_get(skb->dev); in ipv6_srh_rcv()
374 kfree_skb(skb); in ipv6_srh_rcv()
379 if (!seg6_hmac_validate_skb(skb)) { in ipv6_srh_rcv()
380 kfree_skb(skb); in ipv6_srh_rcv()
390 skb_postpull_rcsum(skb, skb_network_header(skb), in ipv6_srh_rcv()
391 skb_network_header_len(skb)); in ipv6_srh_rcv()
393 if (!pskb_pull(skb, offset)) { in ipv6_srh_rcv()
394 kfree_skb(skb); in ipv6_srh_rcv()
397 skb_postpull_rcsum(skb, skb_transport_header(skb), in ipv6_srh_rcv()
400 skb_reset_network_header(skb); in ipv6_srh_rcv()
401 skb_reset_transport_header(skb); in ipv6_srh_rcv()
402 skb->encapsulation = 0; in ipv6_srh_rcv()
404 __skb_tunnel_rx(skb, skb->dev, net); in ipv6_srh_rcv()
406 netif_rx(skb); in ipv6_srh_rcv()
410 opt->srcrt = skb_network_header_len(skb); in ipv6_srh_rcv()
412 skb->transport_header += (hdr->hdrlen + 1) << 3; in ipv6_srh_rcv()
413 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb); in ipv6_srh_rcv()
420 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, in ipv6_srh_rcv()
422 skb_network_header(skb))); in ipv6_srh_rcv()
426 if (skb_cloned(skb)) { in ipv6_srh_rcv()
427 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { in ipv6_srh_rcv()
428 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ipv6_srh_rcv()
430 kfree_skb(skb); in ipv6_srh_rcv()
435 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb); in ipv6_srh_rcv()
440 skb_push(skb, sizeof(struct ipv6hdr)); in ipv6_srh_rcv()
442 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_srh_rcv()
443 seg6_update_csum(skb); in ipv6_srh_rcv()
445 ipv6_hdr(skb)->daddr = *addr; in ipv6_srh_rcv()
447 skb_dst_drop(skb); in ipv6_srh_rcv()
449 ip6_route_input(skb); in ipv6_srh_rcv()
451 if (skb_dst(skb)->error) { in ipv6_srh_rcv()
452 dst_input(skb); in ipv6_srh_rcv()
456 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) { in ipv6_srh_rcv()
457 if (ipv6_hdr(skb)->hop_limit <= 1) { in ipv6_srh_rcv()
459 icmpv6_send(skb, ICMPV6_TIME_EXCEED, in ipv6_srh_rcv()
461 kfree_skb(skb); in ipv6_srh_rcv()
464 ipv6_hdr(skb)->hop_limit--; in ipv6_srh_rcv()
466 skb_pull(skb, sizeof(struct ipv6hdr)); in ipv6_srh_rcv()
470 dst_input(skb); in ipv6_srh_rcv()
480 static int ipv6_rthdr_rcv(struct sk_buff *skb) in ipv6_rthdr_rcv() argument
482 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ipv6_rthdr_rcv()
483 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_rthdr_rcv()
489 struct net *net = dev_net(skb->dev); in ipv6_rthdr_rcv()
492 idev = __in6_dev_get(skb->dev); in ipv6_rthdr_rcv()
496 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || in ipv6_rthdr_rcv()
497 !pskb_may_pull(skb, (skb_transport_offset(skb) + in ipv6_rthdr_rcv()
498 ((skb_transport_header(skb)[1] + 1) << 3)))) { in ipv6_rthdr_rcv()
500 kfree_skb(skb); in ipv6_rthdr_rcv()
504 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb); in ipv6_rthdr_rcv()
506 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || in ipv6_rthdr_rcv()
507 skb->pkt_type != PACKET_HOST) { in ipv6_rthdr_rcv()
509 kfree_skb(skb); in ipv6_rthdr_rcv()
515 return ipv6_srh_rcv(skb); in ipv6_rthdr_rcv()
528 kfree_skb(skb); in ipv6_rthdr_rcv()
537 opt->lastopt = opt->srcrt = skb_network_header_len(skb); in ipv6_rthdr_rcv()
538 skb->transport_header += (hdr->hdrlen + 1) << 3; in ipv6_rthdr_rcv()
541 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb); in ipv6_rthdr_rcv()
553 kfree_skb(skb); in ipv6_rthdr_rcv()
571 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, in ipv6_rthdr_rcv()
573 skb_network_header(skb))); in ipv6_rthdr_rcv()
580 if (skb_cloned(skb)) { in ipv6_rthdr_rcv()
582 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { in ipv6_rthdr_rcv()
583 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ipv6_rthdr_rcv()
585 kfree_skb(skb); in ipv6_rthdr_rcv()
588 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb); in ipv6_rthdr_rcv()
591 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_rthdr_rcv()
592 skb->ip_summed = CHECKSUM_NONE; in ipv6_rthdr_rcv()
603 if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, in ipv6_rthdr_rcv()
604 (xfrm_address_t *)&ipv6_hdr(skb)->saddr, in ipv6_rthdr_rcv()
607 kfree_skb(skb); in ipv6_rthdr_rcv()
610 if (!ipv6_chk_home_addr(dev_net(skb_dst(skb)->dev), addr)) { in ipv6_rthdr_rcv()
612 kfree_skb(skb); in ipv6_rthdr_rcv()
623 kfree_skb(skb); in ipv6_rthdr_rcv()
628 *addr = ipv6_hdr(skb)->daddr; in ipv6_rthdr_rcv()
629 ipv6_hdr(skb)->daddr = daddr; in ipv6_rthdr_rcv()
631 skb_dst_drop(skb); in ipv6_rthdr_rcv()
632 ip6_route_input(skb); in ipv6_rthdr_rcv()
633 if (skb_dst(skb)->error) { in ipv6_rthdr_rcv()
634 skb_push(skb, skb->data - skb_network_header(skb)); in ipv6_rthdr_rcv()
635 dst_input(skb); in ipv6_rthdr_rcv()
639 if (skb_dst(skb)->dev->flags&IFF_LOOPBACK) { in ipv6_rthdr_rcv()
640 if (ipv6_hdr(skb)->hop_limit <= 1) { in ipv6_rthdr_rcv()
642 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, in ipv6_rthdr_rcv()
644 kfree_skb(skb); in ipv6_rthdr_rcv()
647 ipv6_hdr(skb)->hop_limit--; in ipv6_rthdr_rcv()
651 skb_push(skb, skb->data - skb_network_header(skb)); in ipv6_rthdr_rcv()
652 dst_input(skb); in ipv6_rthdr_rcv()
657 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, in ipv6_rthdr_rcv()
658 (&hdr->type) - skb_network_header(skb)); in ipv6_rthdr_rcv()
716 static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb) in ipv6_skb_idev() argument
718 return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev); in ipv6_skb_idev()
721 static inline struct net *ipv6_skb_net(struct sk_buff *skb) in ipv6_skb_net() argument
723 return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev); in ipv6_skb_net()
728 static bool ipv6_hop_ra(struct sk_buff *skb, int optoff) in ipv6_hop_ra() argument
730 const unsigned char *nh = skb_network_header(skb); in ipv6_hop_ra()
733 IP6CB(skb)->flags |= IP6SKB_ROUTERALERT; in ipv6_hop_ra()
734 memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra)); in ipv6_hop_ra()
739 kfree_skb(skb); in ipv6_hop_ra()
745 static bool ipv6_hop_jumbo(struct sk_buff *skb, int optoff) in ipv6_hop_jumbo() argument
747 const unsigned char *nh = skb_network_header(skb); in ipv6_hop_jumbo()
748 struct inet6_dev *idev = __in6_dev_get_safely(skb->dev); in ipv6_hop_jumbo()
749 struct net *net = ipv6_skb_net(skb); in ipv6_hop_jumbo()
762 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); in ipv6_hop_jumbo()
765 if (ipv6_hdr(skb)->payload_len) { in ipv6_hop_jumbo()
767 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff); in ipv6_hop_jumbo()
771 if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { in ipv6_hop_jumbo()
776 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) in ipv6_hop_jumbo()
779 IP6CB(skb)->flags |= IP6SKB_JUMBOGRAM; in ipv6_hop_jumbo()
783 kfree_skb(skb); in ipv6_hop_jumbo()
789 static bool ipv6_hop_calipso(struct sk_buff *skb, int optoff) in ipv6_hop_calipso() argument
791 const unsigned char *nh = skb_network_header(skb); in ipv6_hop_calipso()
799 if (!calipso_validate(skb, nh + optoff)) in ipv6_hop_calipso()
805 kfree_skb(skb); in ipv6_hop_calipso()
825 int ipv6_parse_hopopts(struct sk_buff *skb) in ipv6_parse_hopopts() argument
827 struct inet6_skb_parm *opt = IP6CB(skb); in ipv6_parse_hopopts()
828 struct net *net = dev_net(skb->dev); in ipv6_parse_hopopts()
837 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + 8) || in ipv6_parse_hopopts()
838 !pskb_may_pull(skb, (sizeof(struct ipv6hdr) + in ipv6_parse_hopopts()
839 ((skb_transport_header(skb)[1] + 1) << 3)))) { in ipv6_parse_hopopts()
841 kfree_skb(skb); in ipv6_parse_hopopts()
845 extlen = (skb_transport_header(skb)[1] + 1) << 3; in ipv6_parse_hopopts()
850 if (ip6_parse_tlv(tlvprochopopt_lst, skb, in ipv6_parse_hopopts()
852 skb->transport_header += extlen; in ipv6_parse_hopopts()
853 opt = IP6CB(skb); in ipv6_parse_hopopts()
870 static void ipv6_push_rthdr0(struct sk_buff *skb, u8 *proto, in ipv6_push_rthdr0() argument
879 phdr = skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3); in ipv6_push_rthdr0()
895 static void ipv6_push_rthdr4(struct sk_buff *skb, u8 *proto, in ipv6_push_rthdr4() argument
905 sr_phdr = skb_push(skb, plen); in ipv6_push_rthdr4()
928 if (skb->dev) in ipv6_push_rthdr4()
929 net = dev_net(skb->dev); in ipv6_push_rthdr4()
930 else if (skb->sk) in ipv6_push_rthdr4()
931 net = sock_net(skb->sk); in ipv6_push_rthdr4()
944 static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto, in ipv6_push_rthdr() argument
952 ipv6_push_rthdr0(skb, proto, opt, addr_p, saddr); in ipv6_push_rthdr()
955 ipv6_push_rthdr4(skb, proto, opt, addr_p, saddr); in ipv6_push_rthdr()
962 static void ipv6_push_exthdr(struct sk_buff *skb, u8 *proto, u8 type, struct ipv6_opt_hdr *opt) in ipv6_push_exthdr() argument
964 struct ipv6_opt_hdr *h = skb_push(skb, ipv6_optlen(opt)); in ipv6_push_exthdr()
971 void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, in ipv6_push_nfrag_opts() argument
976 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr, saddr); in ipv6_push_nfrag_opts()
982 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt); in ipv6_push_nfrag_opts()
985 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt); in ipv6_push_nfrag_opts()
988 void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto) in ipv6_push_frag_opts() argument
991 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst1opt); in ipv6_push_frag_opts()