Lines Matching refs:skb
64 static bool ip6_tlvopt_unknown(struct sk_buff *skb, int optoff,
78 switch ((skb_network_header(skb)[optoff] & 0xC0) >> 6) {
89 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr))
93 icmpv6_param_prob_reason(skb, ICMPV6_UNK_OPTION, optoff,
99 kfree_skb_reason(skb, SKB_DROP_REASON_UNHANDLED_PROTO);
103 static bool ipv6_hop_ra(struct sk_buff *skb, int optoff);
104 static bool ipv6_hop_ioam(struct sk_buff *skb, int optoff);
105 static bool ipv6_hop_jumbo(struct sk_buff *skb, int optoff);
106 static bool ipv6_hop_calipso(struct sk_buff *skb, int optoff);
108 static bool ipv6_dest_hao(struct sk_buff *skb, int optoff);
114 struct sk_buff *skb,
117 int len = (skb_transport_header(skb)[1] + 1) << 3;
118 const unsigned char *nh = skb_network_header(skb);
119 int off = skb_network_header_len(skb);
174 if (!ipv6_hop_ra(skb, off))
178 if (!ipv6_hop_ioam(skb, off))
181 nh = skb_network_header(skb);
184 if (!ipv6_hop_jumbo(skb, off))
188 if (!ipv6_hop_calipso(skb, off))
192 if (!ip6_tlvopt_unknown(skb, off,
201 if (!ipv6_dest_hao(skb, off))
206 if (!ip6_tlvopt_unknown(skb, off,
221 kfree_skb_reason(skb, SKB_DROP_REASON_IP_INHDR);
230 static bool ipv6_dest_hao(struct sk_buff *skb, int optoff)
233 struct inet6_skb_parm *opt = IP6CB(skb);
234 struct ipv6hdr *ipv6h = ipv6_hdr(skb);
245 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + optoff);
261 ret = xfrm6_input_addr(skb, (xfrm_address_t *)&ipv6h->daddr,
268 if (skb_cloned(skb)) {
269 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
273 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) +
275 ipv6h = ipv6_hdr(skb);
278 if (skb->ip_summed == CHECKSUM_COMPLETE)
279 skb->ip_summed = CHECKSUM_NONE;
283 if (skb->tstamp == 0)
284 __net_timestamp(skb);
289 kfree_skb_reason(skb, reason);
294 static int ipv6_destopt_rcv(struct sk_buff *skb)
296 struct inet6_dev *idev = __in6_dev_get(skb->dev);
297 struct inet6_skb_parm *opt = IP6CB(skb);
301 struct dst_entry *dst = skb_dst(skb);
302 struct net *net = dev_net(skb->dev);
305 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) ||
306 !pskb_may_pull(skb, (skb_transport_offset(skb) +
307 ((skb_transport_header(skb)[1] + 1) << 3)))) {
311 kfree_skb(skb);
315 extlen = (skb_transport_header(skb)[1] + 1) << 3;
319 opt->lastopt = opt->dst1 = skb_network_header_len(skb);
324 if (ip6_parse_tlv(false, skb, net->ipv6.sysctl.max_dst_opts_cnt)) {
325 skb->transport_header += extlen;
326 opt = IP6CB(skb);
339 static void seg6_update_csum(struct sk_buff *skb)
349 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
358 /* update skb csum with diff resulting from seg_left decrement */
360 update_csum_diff4(skb, from, to);
364 update_csum_diff16(skb, (__be32 *)(&ipv6_hdr(skb)->daddr),
368 static int ipv6_srh_rcv(struct sk_buff *skb)
370 struct inet6_skb_parm *opt = IP6CB(skb);
371 struct net *net = dev_net(skb->dev);
377 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
379 idev = __in6_dev_get(skb->dev);
386 kfree_skb(skb);
391 if (!seg6_hmac_validate_skb(skb)) {
392 kfree_skb(skb);
402 skb_postpull_rcsum(skb, skb_network_header(skb),
403 skb_network_header_len(skb));
404 skb_pull(skb, offset);
405 skb_postpull_rcsum(skb, skb_transport_header(skb),
408 skb_reset_network_header(skb);
409 skb_reset_transport_header(skb);
410 skb->encapsulation = 0;
412 skb->protocol = htons(ETH_P_IP);
413 __skb_tunnel_rx(skb, skb->dev, net);
415 netif_rx(skb);
419 opt->srcrt = skb_network_header_len(skb);
421 skb->transport_header += (hdr->hdrlen + 1) << 3;
422 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
429 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
431 skb_network_header(skb)));
435 if (skb_cloned(skb)) {
436 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
437 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
439 kfree_skb(skb);
443 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
449 skb_push(skb, sizeof(struct ipv6hdr));
451 if (skb->ip_summed == CHECKSUM_COMPLETE)
452 seg6_update_csum(skb);
454 ipv6_hdr(skb)->daddr = *addr;
456 ip6_route_input(skb);
458 if (skb_dst(skb)->error) {
459 dst_input(skb);
463 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) {
464 if (ipv6_hdr(skb)->hop_limit <= 1) {
466 icmpv6_send(skb, ICMPV6_TIME_EXCEED,
468 kfree_skb(skb);
471 ipv6_hdr(skb)->hop_limit--;
473 skb_pull(skb, sizeof(struct ipv6hdr));
477 dst_input(skb);
482 static int ipv6_rpl_srh_rcv(struct sk_buff *skb)
485 struct inet6_skb_parm *opt = IP6CB(skb);
486 struct net *net = dev_net(skb->dev);
495 idev = __in6_dev_get(skb->dev);
502 kfree_skb(skb);
507 hdr = (struct ipv6_rpl_sr_hdr *)skb_transport_header(skb);
513 skb_postpull_rcsum(skb, skb_network_header(skb),
514 skb_network_header_len(skb));
515 skb_pull(skb, offset);
516 skb_postpull_rcsum(skb, skb_transport_header(skb),
519 skb_reset_network_header(skb);
520 skb_reset_transport_header(skb);
521 skb->encapsulation = 0;
523 __skb_tunnel_rx(skb, skb->dev, net);
525 netif_rx(skb);
529 opt->srcrt = skb_network_header_len(skb);
531 skb->transport_header += (hdr->hdrlen + 1) << 3;
532 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
544 kfree_skb(skb);
550 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
552 skb_network_header(skb)));
561 kfree_skb(skb);
566 ipv6_rpl_srh_decompress(ohdr, hdr, &ipv6_hdr(skb)->daddr, n);
570 kfree_skb(skb);
577 icmpv6_send(skb, ICMPV6_PARAMPROB, 0, 0);
578 kfree_skb(skb);
583 swap(ipv6_hdr(skb)->daddr, ohdr->rpl_segaddr[i]);
585 ipv6_rpl_srh_compress(chdr, ohdr, &ipv6_hdr(skb)->daddr, n);
587 oldhdr = ipv6_hdr(skb);
589 skb_pull(skb, ((hdr->hdrlen + 1) << 3));
590 skb_postpull_rcsum(skb, oldhdr,
593 if (pskb_expand_head(skb, sizeof(struct ipv6hdr) + ((chdr->hdrlen + 1) << 3), 0,
595 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_OUTDISCARDS);
596 kfree_skb(skb);
601 oldhdr = ipv6_hdr(skb);
603 skb_push(skb, ((chdr->hdrlen + 1) << 3) + sizeof(struct ipv6hdr));
604 skb_reset_network_header(skb);
605 skb_mac_header_rebuild(skb);
606 skb_set_transport_header(skb, sizeof(struct ipv6hdr));
608 memmove(ipv6_hdr(skb), oldhdr, sizeof(struct ipv6hdr));
609 memcpy(skb_transport_header(skb), chdr, (chdr->hdrlen + 1) << 3);
611 ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
612 skb_postpush_rcsum(skb, ipv6_hdr(skb),
617 ip6_route_input(skb);
619 if (skb_dst(skb)->error) {
620 dst_input(skb);
624 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) {
625 if (ipv6_hdr(skb)->hop_limit <= 1) {
627 icmpv6_send(skb, ICMPV6_TIME_EXCEED,
629 kfree_skb(skb);
632 ipv6_hdr(skb)->hop_limit--;
634 skb_pull(skb, sizeof(struct ipv6hdr));
638 dst_input(skb);
648 static int ipv6_rthdr_rcv(struct sk_buff *skb)
650 struct inet6_dev *idev = __in6_dev_get(skb->dev);
651 struct inet6_skb_parm *opt = IP6CB(skb);
656 struct net *net = dev_net(skb->dev);
662 if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) ||
663 !pskb_may_pull(skb, (skb_transport_offset(skb) +
664 ((skb_transport_header(skb)[1] + 1) << 3)))) {
666 kfree_skb(skb);
670 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb);
672 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) ||
673 skb->pkt_type != PACKET_HOST) {
675 kfree_skb(skb);
682 return ipv6_srh_rcv(skb);
685 return ipv6_rpl_srh_rcv(skb);
701 kfree_skb(skb);
710 opt->lastopt = opt->srcrt = skb_network_header_len(skb);
711 skb->transport_header += (hdr->hdrlen + 1) << 3;
714 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
726 kfree_skb(skb);
744 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
746 skb_network_header(skb)));
753 if (skb_cloned(skb)) {
755 if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
756 __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
758 kfree_skb(skb);
761 hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb);
764 if (skb->ip_summed == CHECKSUM_COMPLETE)
765 skb->ip_summed = CHECKSUM_NONE;
776 if (xfrm6_input_addr(skb, (xfrm_address_t *)addr,
777 (xfrm_address_t *)&ipv6_hdr(skb)->saddr,
780 kfree_skb(skb);
783 if (!ipv6_chk_home_addr(dev_net(skb_dst(skb)->dev), addr)) {
785 kfree_skb(skb);
796 kfree_skb(skb);
800 swap(*addr, ipv6_hdr(skb)->daddr);
802 ip6_route_input(skb);
803 if (skb_dst(skb)->error) {
804 skb_push(skb, skb->data - skb_network_header(skb));
805 dst_input(skb);
809 if (skb_dst(skb)->dev->flags&IFF_LOOPBACK) {
810 if (ipv6_hdr(skb)->hop_limit <= 1) {
812 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
814 kfree_skb(skb);
817 ipv6_hdr(skb)->hop_limit--;
821 skb_push(skb, skb->data - skb_network_header(skb));
822 dst_input(skb);
827 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
828 (&hdr->type) - skb_network_header(skb));
884 * Note: we cannot rely on skb_dst(skb) before we assign it in ip6_route_input().
886 static inline struct net *ipv6_skb_net(struct sk_buff *skb)
888 return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev);
893 static bool ipv6_hop_ra(struct sk_buff *skb, int optoff)
895 const unsigned char *nh = skb_network_header(skb);
898 IP6CB(skb)->flags |= IP6SKB_ROUTERALERT;
899 memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra));
904 kfree_skb_reason(skb, SKB_DROP_REASON_IP_INHDR);
910 static bool ipv6_hop_ioam(struct sk_buff *skb, int optoff)
921 if (!__in6_dev_get(skb->dev)->cnf.ioam6_enabled)
925 hdr = (struct ioam6_hdr *)(skb_network_header(skb) + optoff);
941 ns = ioam6_namespace(ipv6_skb_net(skb), trace->namespace_id);
945 if (!skb_valid_dst(skb))
946 ip6_route_input(skb);
949 if (skb_ensure_writable(skb, optoff + 2 + hdr->opt_len))
953 trace = (struct ioam6_trace_hdr *)(skb_network_header(skb)
956 ioam6_fill_trace_data(skb, ns, trace, true);
966 kfree_skb_reason(skb, SKB_DROP_REASON_IP_INHDR);
972 static bool ipv6_hop_jumbo(struct sk_buff *skb, int optoff)
974 const unsigned char *nh = skb_network_header(skb);
987 icmpv6_param_prob_reason(skb, ICMPV6_HDR_FIELD, optoff + 2,
991 if (ipv6_hdr(skb)->payload_len) {
992 icmpv6_param_prob_reason(skb, ICMPV6_HDR_FIELD, optoff,
997 if (pkt_len > skb->len - sizeof(struct ipv6hdr)) {
1002 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr)))
1005 IP6CB(skb)->flags |= IP6SKB_JUMBOGRAM;
1009 kfree_skb_reason(skb, reason);
1015 static bool ipv6_hop_calipso(struct sk_buff *skb, int optoff)
1017 const unsigned char *nh = skb_network_header(skb);
1025 if (!calipso_validate(skb, nh + optoff))
1031 kfree_skb_reason(skb, SKB_DROP_REASON_IP_INHDR);
1035 int ipv6_parse_hopopts(struct sk_buff *skb)
1037 struct inet6_skb_parm *opt = IP6CB(skb);
1038 struct net *net = dev_net(skb->dev);
1042 * skb_network_header(skb) is equal to skb->data, and
1043 * skb_network_header_len(skb) is always equal to
1047 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + 8) ||
1048 !pskb_may_pull(skb, (sizeof(struct ipv6hdr) +
1049 ((skb_transport_header(skb)[1] + 1) << 3)))) {
1051 kfree_skb(skb);
1055 extlen = (skb_transport_header(skb)[1] + 1) << 3;
1060 if (ip6_parse_tlv(true, skb, net->ipv6.sysctl.max_hbh_opts_cnt)) {
1061 skb->transport_header += extlen;
1062 opt = IP6CB(skb);
1072 * "build" functions work when skb is filled from head to tail (datagram)
1079 static void ipv6_push_rthdr0(struct sk_buff *skb, u8 *proto,
1088 phdr = skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3);
1104 static void ipv6_push_rthdr4(struct sk_buff *skb, u8 *proto,
1114 sr_phdr = skb_push(skb, plen);
1137 if (skb->dev)
1138 net = dev_net(skb->dev);
1139 else if (skb->sk)
1140 net = sock_net(skb->sk);
1153 static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto,
1161 ipv6_push_rthdr0(skb, proto, opt, addr_p, saddr);
1164 ipv6_push_rthdr4(skb, proto, opt, addr_p, saddr);
1171 static void ipv6_push_exthdr(struct sk_buff *skb, u8 *proto, u8 type, struct ipv6_opt_hdr *opt)
1173 struct ipv6_opt_hdr *h = skb_push(skb, ipv6_optlen(opt));
1180 void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
1185 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr, saddr);
1191 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt);
1194 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt);
1197 void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto)
1200 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst1opt);