Lines Matching refs:skb
60 * It MUST NOT touch skb->h.
65 bool (*func)(struct sk_buff *skb, int offset);
74 static bool ip6_tlvopt_unknown(struct sk_buff *skb, int optoff,
88 switch ((skb_network_header(skb)[optoff] & 0xC0) >> 6) {
99 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr))
103 icmpv6_param_prob(skb, ICMPV6_UNK_OPTION, optoff);
108 kfree_skb(skb);
115 struct sk_buff *skb,
118 int len = (skb_transport_header(skb)[1] + 1) << 3;
119 const unsigned char *nh = skb_network_header(skb);
120 int off = skb_network_header_len(skb);
131 if (skb_transport_offset(skb) + len > skb_headlen(skb))
181 if (curr->func(skb, off) == false)
187 !ip6_tlvopt_unknown(skb, off, disallow_unknowns))
199 kfree_skb(skb);
208 static bool ipv6_dest_hao(struct sk_buff *skb, int optoff)
211 struct inet6_skb_parm *opt = IP6CB(skb);
212 struct ipv6hdr *ipv6h = ipv6_hdr(skb);
222 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + optoff);
236 ret = xfrm6_input_addr(skb, (xfrm_address_t *)&ipv6h->daddr,
241 if (skb_cloned(skb)) {
242 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
246 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) +
248 ipv6h = ipv6_hdr(skb);
251 if (skb->ip_summed == CHECKSUM_COMPLETE)
252 skb->ip_summed = CHECKSUM_NONE;
256 if (skb->tstamp == 0)
257 __net_timestamp(skb);
262 kfree_skb(skb);
277 static int ipv6_destopt_rcv(struct sk_buff *skb)
279 struct inet6_dev *idev = __in6_dev_get(skb->dev);
280 struct inet6_skb_parm *opt = IP6CB(skb);
284 struct dst_entry *dst = skb_dst(skb);
285 struct net *net = dev_net(skb->dev);
288 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) ||
289 !pskb_may_pull(skb, (skb_transport_offset(skb) +
290 ((skb_transport_header(skb)[1] + 1) << 3)))) {
294 kfree_skb(skb);
298 extlen = (skb_transport_header(skb)[1] + 1) << 3;
302 opt->lastopt = opt->dst1 = skb_network_header_len(skb);
307 if (ip6_parse_tlv(tlvprocdestopt_lst, skb,
309 skb->transport_header += extlen;
310 opt = IP6CB(skb);
323 static void seg6_update_csum(struct sk_buff *skb)
333 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
342 /* update skb csum with diff resulting from seg_left decrement */
344 update_csum_diff4(skb, from, to);
348 update_csum_diff16(skb, (__be32 *)(&ipv6_hdr(skb)->daddr),
352 static int ipv6_srh_rcv(struct sk_buff *skb)
354 struct inet6_skb_parm *opt = IP6CB(skb);
355 struct net *net = dev_net(skb->dev);
361 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
363 idev = __in6_dev_get(skb->dev);
370 kfree_skb(skb);
375 if (!seg6_hmac_validate_skb(skb)) {
376 kfree_skb(skb);
386 skb_postpull_rcsum(skb, skb_network_header(skb),
387 skb_network_header_len(skb));
389 if (!pskb_pull(skb, offset)) {
390 kfree_skb(skb);
393 skb_postpull_rcsum(skb, skb_transport_header(skb),
396 skb_reset_network_header(skb);
397 skb_reset_transport_header(skb);
398 skb->encapsulation = 0;
400 __skb_tunnel_rx(skb, skb->dev, net);
402 netif_rx(skb);
406 opt->srcrt = skb_network_header_len(skb);
408 skb->transport_header += (hdr->hdrlen + 1) << 3;
409 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
416 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
418 skb_network_header(skb)));
422 if (skb_cloned(skb)) {
423 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
424 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
426 kfree_skb(skb);
431 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
436 skb_push(skb, sizeof(struct ipv6hdr));
438 if (skb->ip_summed == CHECKSUM_COMPLETE)
439 seg6_update_csum(skb);
441 ipv6_hdr(skb)->daddr = *addr;
443 skb_dst_drop(skb);
445 ip6_route_input(skb);
447 if (skb_dst(skb)->error) {
448 dst_input(skb);
452 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) {
453 if (ipv6_hdr(skb)->hop_limit <= 1) {
455 icmpv6_send(skb, ICMPV6_TIME_EXCEED,
457 kfree_skb(skb);
460 ipv6_hdr(skb)->hop_limit--;
462 skb_pull(skb, sizeof(struct ipv6hdr));
466 dst_input(skb);
471 static int ipv6_rpl_srh_rcv(struct sk_buff *skb)
474 struct inet6_skb_parm *opt = IP6CB(skb);
475 struct net *net = dev_net(skb->dev);
485 idev = __in6_dev_get(skb->dev);
492 kfree_skb(skb);
497 hdr = (struct ipv6_rpl_sr_hdr *)skb_transport_header(skb);
503 skb_postpull_rcsum(skb, skb_network_header(skb),
504 skb_network_header_len(skb));
506 if (!pskb_pull(skb, offset)) {
507 kfree_skb(skb);
510 skb_postpull_rcsum(skb, skb_transport_header(skb),
513 skb_reset_network_header(skb);
514 skb_reset_transport_header(skb);
515 skb->encapsulation = 0;
517 __skb_tunnel_rx(skb, skb->dev, net);
519 netif_rx(skb);
523 opt->srcrt = skb_network_header_len(skb);
525 skb->transport_header += (hdr->hdrlen + 1) << 3;
526 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
531 if (!pskb_may_pull(skb, sizeof(*hdr))) {
532 kfree_skb(skb);
543 kfree_skb(skb);
549 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
551 skb_network_header(skb)));
555 if (!pskb_may_pull(skb, ipv6_rpl_srh_size(n, hdr->cmpri,
557 kfree_skb(skb);
566 kfree_skb(skb);
571 ipv6_rpl_srh_decompress(ohdr, hdr, &ipv6_hdr(skb)->daddr, n);
574 if ((ipv6_addr_type(&ipv6_hdr(skb)->daddr) & IPV6_ADDR_MULTICAST) ||
576 kfree_skb(skb);
583 icmpv6_send(skb, ICMPV6_PARAMPROB, 0, 0);
584 kfree_skb(skb);
589 addr = ipv6_hdr(skb)->daddr;
590 ipv6_hdr(skb)->daddr = ohdr->rpl_segaddr[i];
593 ipv6_rpl_srh_compress(chdr, ohdr, &ipv6_hdr(skb)->daddr, n);
595 oldhdr = ipv6_hdr(skb);
597 skb_pull(skb, ((hdr->hdrlen + 1) << 3));
598 skb_postpull_rcsum(skb, oldhdr,
601 if (pskb_expand_head(skb, sizeof(struct ipv6hdr) + ((chdr->hdrlen + 1) << 3), 0,
603 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_OUTDISCARDS);
604 kfree_skb(skb);
609 oldhdr = ipv6_hdr(skb);
611 skb_push(skb, ((chdr->hdrlen + 1) << 3) + sizeof(struct ipv6hdr));
612 skb_reset_network_header(skb);
613 skb_mac_header_rebuild(skb);
614 skb_set_transport_header(skb, sizeof(struct ipv6hdr));
616 memmove(ipv6_hdr(skb), oldhdr, sizeof(struct ipv6hdr));
617 memcpy(skb_transport_header(skb), chdr, (chdr->hdrlen + 1) << 3);
619 ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
620 skb_postpush_rcsum(skb, ipv6_hdr(skb),
625 skb_dst_drop(skb);
627 ip6_route_input(skb);
629 if (skb_dst(skb)->error) {
630 dst_input(skb);
634 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) {
635 if (ipv6_hdr(skb)->hop_limit <= 1) {
637 icmpv6_send(skb, ICMPV6_TIME_EXCEED,
639 kfree_skb(skb);
642 ipv6_hdr(skb)->hop_limit--;
644 skb_pull(skb, sizeof(struct ipv6hdr));
648 dst_input(skb);
658 static int ipv6_rthdr_rcv(struct sk_buff *skb)
660 struct inet6_dev *idev = __in6_dev_get(skb->dev);
661 struct inet6_skb_parm *opt = IP6CB(skb);
667 struct net *net = dev_net(skb->dev);
670 idev = __in6_dev_get(skb->dev);
674 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) ||
675 !pskb_may_pull(skb, (skb_transport_offset(skb) +
676 ((skb_transport_header(skb)[1] + 1) << 3)))) {
678 kfree_skb(skb);
682 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb);
684 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) ||
685 skb->pkt_type != PACKET_HOST) {
687 kfree_skb(skb);
694 return ipv6_srh_rcv(skb);
697 return ipv6_rpl_srh_rcv(skb);
713 kfree_skb(skb);
722 opt->lastopt = opt->srcrt = skb_network_header_len(skb);
723 skb->transport_header += (hdr->hdrlen + 1) << 3;
726 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
738 kfree_skb(skb);
756 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
758 skb_network_header(skb)));
765 if (skb_cloned(skb)) {
767 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
768 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
770 kfree_skb(skb);
773 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb);
776 if (skb->ip_summed == CHECKSUM_COMPLETE)
777 skb->ip_summed = CHECKSUM_NONE;
788 if (xfrm6_input_addr(skb, (xfrm_address_t *)addr,
789 (xfrm_address_t *)&ipv6_hdr(skb)->saddr,
792 kfree_skb(skb);
795 if (!ipv6_chk_home_addr(dev_net(skb_dst(skb)->dev), addr)) {
797 kfree_skb(skb);
808 kfree_skb(skb);
813 *addr = ipv6_hdr(skb)->daddr;
814 ipv6_hdr(skb)->daddr = daddr;
816 skb_dst_drop(skb);
817 ip6_route_input(skb);
818 if (skb_dst(skb)->error) {
819 skb_push(skb, skb->data - skb_network_header(skb));
820 dst_input(skb);
824 if (skb_dst(skb)->dev->flags&IFF_LOOPBACK) {
825 if (ipv6_hdr(skb)->hop_limit <= 1) {
827 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
829 kfree_skb(skb);
832 ipv6_hdr(skb)->hop_limit--;
836 skb_push(skb, skb->data - skb_network_header(skb));
837 dst_input(skb);
842 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
843 (&hdr->type) - skb_network_header(skb));
899 * Note: we cannot rely on skb_dst(skb) before we assign it in ip6_route_input().
901 static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb)
903 return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev);
906 static inline struct net *ipv6_skb_net(struct sk_buff *skb)
908 return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev);
913 static bool ipv6_hop_ra(struct sk_buff *skb, int optoff)
915 const unsigned char *nh = skb_network_header(skb);
918 IP6CB(skb)->flags |= IP6SKB_ROUTERALERT;
919 memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra));
924 kfree_skb(skb);
930 static bool ipv6_hop_jumbo(struct sk_buff *skb, int optoff)
932 const unsigned char *nh = skb_network_header(skb);
933 struct inet6_dev *idev = __in6_dev_get_safely(skb->dev);
934 struct net *net = ipv6_skb_net(skb);
947 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2);
950 if (ipv6_hdr(skb)->payload_len) {
952 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff);
956 if (pkt_len > skb->len - sizeof(struct ipv6hdr)) {
961 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr)))
964 IP6CB(skb)->flags |= IP6SKB_JUMBOGRAM;
968 kfree_skb(skb);
974 static bool ipv6_hop_calipso(struct sk_buff *skb, int optoff)
976 const unsigned char *nh = skb_network_header(skb);
984 if (!calipso_validate(skb, nh + optoff))
990 kfree_skb(skb);
1010 int ipv6_parse_hopopts(struct sk_buff *skb)
1012 struct inet6_skb_parm *opt = IP6CB(skb);
1013 struct net *net = dev_net(skb->dev);
1017 * skb_network_header(skb) is equal to skb->data, and
1018 * skb_network_header_len(skb) is always equal to
1022 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + 8) ||
1023 !pskb_may_pull(skb, (sizeof(struct ipv6hdr) +
1024 ((skb_transport_header(skb)[1] + 1) << 3)))) {
1026 kfree_skb(skb);
1030 extlen = (skb_transport_header(skb)[1] + 1) << 3;
1035 if (ip6_parse_tlv(tlvprochopopt_lst, skb,
1037 skb->transport_header += extlen;
1038 opt = IP6CB(skb);
1048 * "build" functions work when skb is filled from head to tail (datagram)
1055 static void ipv6_push_rthdr0(struct sk_buff *skb, u8 *proto,
1064 phdr = skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3);
1080 static void ipv6_push_rthdr4(struct sk_buff *skb, u8 *proto,
1090 sr_phdr = skb_push(skb, plen);
1113 if (skb->dev)
1114 net = dev_net(skb->dev);
1115 else if (skb->sk)
1116 net = sock_net(skb->sk);
1129 static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto,
1137 ipv6_push_rthdr0(skb, proto, opt, addr_p, saddr);
1140 ipv6_push_rthdr4(skb, proto, opt, addr_p, saddr);
1147 static void ipv6_push_exthdr(struct sk_buff *skb, u8 *proto, u8 type, struct ipv6_opt_hdr *opt)
1149 struct ipv6_opt_hdr *h = skb_push(skb, ipv6_optlen(opt));
1156 void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
1161 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr, saddr);
1167 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt);
1170 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt);
1173 void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto)
1176 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst1opt);