Lines Matching +full:trace +full:- +full:buffer +full:- +full:extension

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Extension Header handling for IPv6
16 * YOSHIFUJI Hideaki @USAGI Register inbound extension header
89 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) in ip6_tlvopt_unknown()
110 /* Parse tlv encoded option header (hop-by-hop or destination) */
125 max_count = -max_count; in ip6_parse_tlv()
132 len -= 2; in ip6_parse_tlv()
142 len--; in ip6_parse_tlv()
215 len -= optlen; in ip6_parse_tlv()
237 if (opt->dsthao) { in ipv6_dest_hao()
241 opt->dsthao = opt->dst1; in ipv6_dest_hao()
242 opt->dst1 = 0; in ipv6_dest_hao()
246 if (hao->length != 16) { in ipv6_dest_hao()
248 hao->length); in ipv6_dest_hao()
252 if (!(ipv6_addr_type(&hao->addr) & IPV6_ADDR_UNICAST)) { in ipv6_dest_hao()
254 &hao->addr); in ipv6_dest_hao()
258 ret = xfrm6_input_addr(skb, (xfrm_address_t *)&ipv6h->daddr, in ipv6_dest_hao()
259 (xfrm_address_t *)&hao->addr, IPPROTO_DSTOPTS); in ipv6_dest_hao()
273 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_dest_hao()
274 skb->ip_summed = CHECKSUM_NONE; in ipv6_dest_hao()
276 swap(ipv6h->saddr, hao->addr); in ipv6_dest_hao()
278 if (skb->tstamp == 0) in ipv6_dest_hao()
291 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ipv6_destopt_rcv()
297 struct net *net = dev_net(skb->dev); in ipv6_destopt_rcv()
303 __IP6_INC_STATS(dev_net(dst->dev), idev, in ipv6_destopt_rcv()
307 return -1; in ipv6_destopt_rcv()
311 if (extlen > net->ipv6.sysctl.max_dst_opts_len) in ipv6_destopt_rcv()
314 opt->lastopt = opt->dst1 = skb_network_header_len(skb); in ipv6_destopt_rcv()
316 dstbuf = opt->dst1; in ipv6_destopt_rcv()
319 if (ip6_parse_tlv(false, skb, net->ipv6.sysctl.max_dst_opts_cnt)) { in ipv6_destopt_rcv()
320 skb->transport_header += extlen; in ipv6_destopt_rcv()
323 opt->nhoff = dstbuf; in ipv6_destopt_rcv()
325 opt->nhoff = opt->dst1; in ipv6_destopt_rcv()
331 return -1; in ipv6_destopt_rcv()
345 addr = hdr->segments + hdr->segments_left; in seg6_update_csum()
347 hdr->segments_left++; in seg6_update_csum()
350 hdr->segments_left--; in seg6_update_csum()
359 update_csum_diff16(skb, (__be32 *)(&ipv6_hdr(skb)->daddr), in seg6_update_csum()
366 struct net *net = dev_net(skb->dev); in ipv6_srh_rcv()
374 idev = __in6_dev_get(skb->dev); in ipv6_srh_rcv()
376 accept_seg6 = net->ipv6.devconf_all->seg6_enabled; in ipv6_srh_rcv()
377 if (accept_seg6 > idev->cnf.seg6_enabled) in ipv6_srh_rcv()
378 accept_seg6 = idev->cnf.seg6_enabled; in ipv6_srh_rcv()
382 return -1; in ipv6_srh_rcv()
388 return -1; in ipv6_srh_rcv()
393 if (hdr->segments_left == 0) { in ipv6_srh_rcv()
394 if (hdr->nexthdr == NEXTHDR_IPV6 || hdr->nexthdr == NEXTHDR_IPV4) { in ipv6_srh_rcv()
395 int offset = (hdr->hdrlen + 1) << 3; in ipv6_srh_rcv()
402 return -1; in ipv6_srh_rcv()
409 skb->encapsulation = 0; in ipv6_srh_rcv()
410 if (hdr->nexthdr == NEXTHDR_IPV4) in ipv6_srh_rcv()
411 skb->protocol = htons(ETH_P_IP); in ipv6_srh_rcv()
412 __skb_tunnel_rx(skb, skb->dev, net); in ipv6_srh_rcv()
415 return -1; in ipv6_srh_rcv()
418 opt->srcrt = skb_network_header_len(skb); in ipv6_srh_rcv()
419 opt->lastopt = opt->srcrt; in ipv6_srh_rcv()
420 skb->transport_header += (hdr->hdrlen + 1) << 3; in ipv6_srh_rcv()
421 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb); in ipv6_srh_rcv()
426 if (hdr->segments_left >= (hdr->hdrlen >> 1)) { in ipv6_srh_rcv()
429 ((&hdr->segments_left) - in ipv6_srh_rcv()
431 return -1; in ipv6_srh_rcv()
439 return -1; in ipv6_srh_rcv()
445 hdr->segments_left--; in ipv6_srh_rcv()
446 addr = hdr->segments + hdr->segments_left; in ipv6_srh_rcv()
450 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_srh_rcv()
453 ipv6_hdr(skb)->daddr = *addr; in ipv6_srh_rcv()
459 if (skb_dst(skb)->error) { in ipv6_srh_rcv()
461 return -1; in ipv6_srh_rcv()
464 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) { in ipv6_srh_rcv()
465 if (ipv6_hdr(skb)->hop_limit <= 1) { in ipv6_srh_rcv()
470 return -1; in ipv6_srh_rcv()
472 ipv6_hdr(skb)->hop_limit--; in ipv6_srh_rcv()
480 return -1; in ipv6_srh_rcv()
487 struct net *net = dev_net(skb->dev); in ipv6_rpl_srh_rcv()
497 idev = __in6_dev_get(skb->dev); in ipv6_rpl_srh_rcv()
499 accept_rpl_seg = net->ipv6.devconf_all->rpl_seg_enabled; in ipv6_rpl_srh_rcv()
500 if (accept_rpl_seg > idev->cnf.rpl_seg_enabled) in ipv6_rpl_srh_rcv()
501 accept_rpl_seg = idev->cnf.rpl_seg_enabled; in ipv6_rpl_srh_rcv()
505 return -1; in ipv6_rpl_srh_rcv()
511 if (hdr->segments_left == 0) { in ipv6_rpl_srh_rcv()
512 if (hdr->nexthdr == NEXTHDR_IPV6) { in ipv6_rpl_srh_rcv()
513 int offset = (hdr->hdrlen + 1) << 3; in ipv6_rpl_srh_rcv()
520 return -1; in ipv6_rpl_srh_rcv()
527 skb->encapsulation = 0; in ipv6_rpl_srh_rcv()
529 __skb_tunnel_rx(skb, skb->dev, net); in ipv6_rpl_srh_rcv()
532 return -1; in ipv6_rpl_srh_rcv()
535 opt->srcrt = skb_network_header_len(skb); in ipv6_rpl_srh_rcv()
536 opt->lastopt = opt->srcrt; in ipv6_rpl_srh_rcv()
537 skb->transport_header += (hdr->hdrlen + 1) << 3; in ipv6_rpl_srh_rcv()
538 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb); in ipv6_rpl_srh_rcv()
545 return -1; in ipv6_rpl_srh_rcv()
548 n = (hdr->hdrlen << 3) - hdr->pad - (16 - hdr->cmpre); in ipv6_rpl_srh_rcv()
549 r = do_div(n, (16 - hdr->cmpri)); in ipv6_rpl_srh_rcv()
556 return -1; in ipv6_rpl_srh_rcv()
559 if (hdr->segments_left > n + 1) { in ipv6_rpl_srh_rcv()
562 ((&hdr->segments_left) - in ipv6_rpl_srh_rcv()
564 return -1; in ipv6_rpl_srh_rcv()
573 return -1; in ipv6_rpl_srh_rcv()
579 return -1; in ipv6_rpl_srh_rcv()
585 if (!pskb_may_pull(skb, ipv6_rpl_srh_size(n, hdr->cmpri, in ipv6_rpl_srh_rcv()
586 hdr->cmpre))) { in ipv6_rpl_srh_rcv()
588 return -1; in ipv6_rpl_srh_rcv()
591 hdr->segments_left--; in ipv6_rpl_srh_rcv()
592 i = n - hdr->segments_left; in ipv6_rpl_srh_rcv()
597 return -1; in ipv6_rpl_srh_rcv()
601 ipv6_rpl_srh_decompress(ohdr, hdr, &ipv6_hdr(skb)->daddr, n); in ipv6_rpl_srh_rcv()
602 chdr = (struct ipv6_rpl_sr_hdr *)(buf + ((ohdr->hdrlen + 1) << 3)); in ipv6_rpl_srh_rcv()
604 if ((ipv6_addr_type(&ipv6_hdr(skb)->daddr) & IPV6_ADDR_MULTICAST) || in ipv6_rpl_srh_rcv()
605 (ipv6_addr_type(&ohdr->rpl_segaddr[i]) & IPV6_ADDR_MULTICAST)) { in ipv6_rpl_srh_rcv()
608 return -1; in ipv6_rpl_srh_rcv()
611 err = ipv6_chk_rpl_srh_loop(net, ohdr->rpl_segaddr, n + 1); in ipv6_rpl_srh_rcv()
616 return -1; in ipv6_rpl_srh_rcv()
619 addr = ipv6_hdr(skb)->daddr; in ipv6_rpl_srh_rcv()
620 ipv6_hdr(skb)->daddr = ohdr->rpl_segaddr[i]; in ipv6_rpl_srh_rcv()
621 ohdr->rpl_segaddr[i] = addr; in ipv6_rpl_srh_rcv()
623 ipv6_rpl_srh_compress(chdr, ohdr, &ipv6_hdr(skb)->daddr, n); in ipv6_rpl_srh_rcv()
627 skb_pull(skb, ((hdr->hdrlen + 1) << 3)); in ipv6_rpl_srh_rcv()
629 sizeof(struct ipv6hdr) + ((hdr->hdrlen + 1) << 3)); in ipv6_rpl_srh_rcv()
630 skb_push(skb, ((chdr->hdrlen + 1) << 3) + sizeof(struct ipv6hdr)); in ipv6_rpl_srh_rcv()
636 memcpy(skb_transport_header(skb), chdr, (chdr->hdrlen + 1) << 3); in ipv6_rpl_srh_rcv()
638 ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); in ipv6_rpl_srh_rcv()
640 sizeof(struct ipv6hdr) + ((chdr->hdrlen + 1) << 3)); in ipv6_rpl_srh_rcv()
648 if (skb_dst(skb)->error) { in ipv6_rpl_srh_rcv()
650 return -1; in ipv6_rpl_srh_rcv()
653 if (skb_dst(skb)->dev->flags & IFF_LOOPBACK) { in ipv6_rpl_srh_rcv()
654 if (ipv6_hdr(skb)->hop_limit <= 1) { in ipv6_rpl_srh_rcv()
659 return -1; in ipv6_rpl_srh_rcv()
661 ipv6_hdr(skb)->hop_limit--; in ipv6_rpl_srh_rcv()
669 return -1; in ipv6_rpl_srh_rcv()
679 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ipv6_rthdr_rcv()
686 struct net *net = dev_net(skb->dev); in ipv6_rthdr_rcv()
687 int accept_source_route = net->ipv6.devconf_all->accept_source_route; in ipv6_rthdr_rcv()
689 idev = __in6_dev_get(skb->dev); in ipv6_rthdr_rcv()
690 if (idev && accept_source_route > idev->cnf.accept_source_route) in ipv6_rthdr_rcv()
691 accept_source_route = idev->cnf.accept_source_route; in ipv6_rthdr_rcv()
698 return -1; in ipv6_rthdr_rcv()
703 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || in ipv6_rthdr_rcv()
704 skb->pkt_type != PACKET_HOST) { in ipv6_rthdr_rcv()
707 return -1; in ipv6_rthdr_rcv()
710 switch (hdr->type) { in ipv6_rthdr_rcv()
722 if (hdr->segments_left == 0) { in ipv6_rthdr_rcv()
723 switch (hdr->type) { in ipv6_rthdr_rcv()
733 return -1; in ipv6_rthdr_rcv()
741 opt->lastopt = opt->srcrt = skb_network_header_len(skb); in ipv6_rthdr_rcv()
742 skb->transport_header += (hdr->hdrlen + 1) << 3; in ipv6_rthdr_rcv()
743 opt->dst0 = opt->dst1; in ipv6_rthdr_rcv()
744 opt->dst1 = 0; in ipv6_rthdr_rcv()
745 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb); in ipv6_rthdr_rcv()
749 switch (hdr->type) { in ipv6_rthdr_rcv()
755 if (hdr->hdrlen != 2 || hdr->segments_left != 1) { in ipv6_rthdr_rcv()
758 return -1; in ipv6_rthdr_rcv()
771 n = hdr->hdrlen >> 1; in ipv6_rthdr_rcv()
773 if (hdr->segments_left > n) { in ipv6_rthdr_rcv()
776 ((&hdr->segments_left) - in ipv6_rthdr_rcv()
778 return -1; in ipv6_rthdr_rcv()
790 return -1; in ipv6_rthdr_rcv()
795 if (skb->ip_summed == CHECKSUM_COMPLETE) in ipv6_rthdr_rcv()
796 skb->ip_summed = CHECKSUM_NONE; in ipv6_rthdr_rcv()
798 i = n - --hdr->segments_left; in ipv6_rthdr_rcv()
801 addr = rthdr->addr; in ipv6_rthdr_rcv()
802 addr += i - 1; in ipv6_rthdr_rcv()
804 switch (hdr->type) { in ipv6_rthdr_rcv()
808 (xfrm_address_t *)&ipv6_hdr(skb)->saddr, in ipv6_rthdr_rcv()
812 return -1; in ipv6_rthdr_rcv()
814 if (!ipv6_chk_home_addr(dev_net(skb_dst(skb)->dev), addr)) { in ipv6_rthdr_rcv()
817 return -1; in ipv6_rthdr_rcv()
828 return -1; in ipv6_rthdr_rcv()
832 *addr = ipv6_hdr(skb)->daddr; in ipv6_rthdr_rcv()
833 ipv6_hdr(skb)->daddr = daddr; in ipv6_rthdr_rcv()
837 if (skb_dst(skb)->error) { in ipv6_rthdr_rcv()
838 skb_push(skb, skb->data - skb_network_header(skb)); in ipv6_rthdr_rcv()
840 return -1; in ipv6_rthdr_rcv()
843 if (skb_dst(skb)->dev->flags&IFF_LOOPBACK) { in ipv6_rthdr_rcv()
844 if (ipv6_hdr(skb)->hop_limit <= 1) { in ipv6_rthdr_rcv()
849 return -1; in ipv6_rthdr_rcv()
851 ipv6_hdr(skb)->hop_limit--; in ipv6_rthdr_rcv()
855 skb_push(skb, skb->data - skb_network_header(skb)); in ipv6_rthdr_rcv()
857 return -1; in ipv6_rthdr_rcv()
862 (&hdr->type) - skb_network_header(skb)); in ipv6_rthdr_rcv()
863 return -1; in ipv6_rthdr_rcv()
914 Hop-by-hop options.
922 return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev); in ipv6_skb_net()
932 IP6CB(skb)->flags |= IP6SKB_ROUTERALERT; in ipv6_hop_ra()
933 memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra)); in ipv6_hop_ra()
946 struct ioam6_trace_hdr *trace; in ipv6_hop_ioam() local
950 /* Bad alignment (must be 4n-aligned) */ in ipv6_hop_ioam()
955 if (!__in6_dev_get(skb->dev)->cnf.ioam6_enabled) in ipv6_hop_ioam()
960 if (hdr->opt_len < 2) in ipv6_hop_ioam()
963 switch (hdr->type) { in ipv6_hop_ioam()
965 /* Truncated Pre-allocated Trace header */ in ipv6_hop_ioam()
966 if (hdr->opt_len < 2 + sizeof(*trace)) in ipv6_hop_ioam()
969 /* Malformed Pre-allocated Trace header */ in ipv6_hop_ioam()
970 trace = (struct ioam6_trace_hdr *)((u8 *)hdr + sizeof(*hdr)); in ipv6_hop_ioam()
971 if (hdr->opt_len < 2 + sizeof(*trace) + trace->remlen * 4) in ipv6_hop_ioam()
975 ns = ioam6_namespace(ipv6_skb_net(skb), trace->namespace_id); in ipv6_hop_ioam()
982 ioam6_fill_trace_data(skb, ns, trace); in ipv6_hop_ioam()
1001 struct inet6_dev *idev = __in6_dev_get_safely(skb->dev); in ipv6_hop_jumbo()
1018 if (ipv6_hdr(skb)->payload_len) { in ipv6_hop_jumbo()
1024 if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { in ipv6_hop_jumbo()
1032 IP6CB(skb)->flags |= IP6SKB_JUMBOGRAM; in ipv6_hop_jumbo()
1065 struct net *net = dev_net(skb->dev); in ipv6_parse_hopopts()
1069 * skb_network_header(skb) is equal to skb->data, and in ipv6_parse_hopopts()
1072 * hop-by-hop options. in ipv6_parse_hopopts()
1079 return -1; in ipv6_parse_hopopts()
1083 if (extlen > net->ipv6.sysctl.max_hbh_opts_len) in ipv6_parse_hopopts()
1086 opt->flags |= IP6SKB_HOPBYHOP; in ipv6_parse_hopopts()
1087 if (ip6_parse_tlv(true, skb, net->ipv6.sysctl.max_hbh_opts_cnt)) { in ipv6_parse_hopopts()
1088 skb->transport_header += extlen; in ipv6_parse_hopopts()
1090 opt->nhoff = sizeof(struct ipv6hdr); in ipv6_parse_hopopts()
1093 return -1; in ipv6_parse_hopopts()
1115 phdr = skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3); in ipv6_push_rthdr0()
1118 hops = ihdr->rt_hdr.hdrlen >> 1; in ipv6_push_rthdr0()
1121 memcpy(phdr->addr, ihdr->addr + 1, in ipv6_push_rthdr0()
1122 (hops - 1) * sizeof(struct in6_addr)); in ipv6_push_rthdr0()
1124 phdr->addr[hops - 1] = **addr_p; in ipv6_push_rthdr0()
1125 *addr_p = ihdr->addr; in ipv6_push_rthdr0()
1127 phdr->rt_hdr.nexthdr = *proto; in ipv6_push_rthdr0()
1139 plen = (sr_ihdr->hdrlen + 1) << 3; in ipv6_push_rthdr4()
1144 hops = sr_ihdr->first_segment + 1; in ipv6_push_rthdr4()
1145 memcpy(sr_phdr->segments + 1, sr_ihdr->segments + 1, in ipv6_push_rthdr4()
1146 (hops - 1) * sizeof(struct in6_addr)); in ipv6_push_rthdr4()
1148 sr_phdr->segments[0] = **addr_p; in ipv6_push_rthdr4()
1149 *addr_p = &sr_ihdr->segments[sr_ihdr->segments_left]; in ipv6_push_rthdr4()
1151 if (sr_ihdr->hdrlen > hops * 2) { in ipv6_push_rthdr4()
1155 tlvs_length = (sr_ihdr->hdrlen - hops * 2) << 3; in ipv6_push_rthdr4()
1164 if (skb->dev) in ipv6_push_rthdr4()
1165 net = dev_net(skb->dev); in ipv6_push_rthdr4()
1166 else if (skb->sk) in ipv6_push_rthdr4()
1167 net = sock_net(skb->sk); in ipv6_push_rthdr4()
1176 sr_phdr->nexthdr = *proto; in ipv6_push_rthdr4()
1184 switch (opt->type) { in ipv6_push_rthdr()
1203 h->nexthdr = *proto; in ipv6_push_exthdr()
1211 if (opt->srcrt) { in ipv6_push_nfrag_opts()
1212 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr, saddr); in ipv6_push_nfrag_opts()
1217 if (opt->dst0opt) in ipv6_push_nfrag_opts()
1218 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt); in ipv6_push_nfrag_opts()
1220 if (opt->hopopt) in ipv6_push_nfrag_opts()
1221 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt); in ipv6_push_nfrag_opts()
1226 if (opt->dst1opt) in ipv6_push_frag_opts()
1227 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst1opt); in ipv6_push_frag_opts()
1236 opt2 = sock_kmalloc(sk, opt->tot_len, GFP_ATOMIC); in ipv6_dup_options()
1238 long dif = (char *)opt2 - (char *)opt; in ipv6_dup_options()
1239 memcpy(opt2, opt, opt->tot_len); in ipv6_dup_options()
1240 if (opt2->hopopt) in ipv6_dup_options()
1241 *((char **)&opt2->hopopt) += dif; in ipv6_dup_options()
1242 if (opt2->dst0opt) in ipv6_dup_options()
1243 *((char **)&opt2->dst0opt) += dif; in ipv6_dup_options()
1244 if (opt2->dst1opt) in ipv6_dup_options()
1245 *((char **)&opt2->dst1opt) += dif; in ipv6_dup_options()
1246 if (opt2->srcrt) in ipv6_dup_options()
1247 *((char **)&opt2->srcrt) += dif; in ipv6_dup_options()
1248 refcount_set(&opt2->refcnt, 1); in ipv6_dup_options()
1272 * ipv6_renew_options - replace a specific ext hdr with a new one.
1277 * @newopt: new option of type @newtype to replace (user-mem)
1289 * buffer of @sk.
1300 if (newtype != IPV6_HOPOPTS && opt->hopopt) in ipv6_renew_options()
1301 tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt)); in ipv6_renew_options()
1302 if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt) in ipv6_renew_options()
1303 tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt)); in ipv6_renew_options()
1304 if (newtype != IPV6_RTHDR && opt->srcrt) in ipv6_renew_options()
1305 tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt)); in ipv6_renew_options()
1306 if (newtype != IPV6_DSTOPTS && opt->dst1opt) in ipv6_renew_options()
1307 tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt)); in ipv6_renew_options()
1319 return ERR_PTR(-ENOBUFS); in ipv6_renew_options()
1322 refcount_set(&opt2->refcnt, 1); in ipv6_renew_options()
1323 opt2->tot_len = tot_len; in ipv6_renew_options()
1326 ipv6_renew_option(IPV6_HOPOPTS, &opt2->hopopt, in ipv6_renew_options()
1327 (opt ? opt->hopopt : NULL), in ipv6_renew_options()
1329 ipv6_renew_option(IPV6_RTHDRDSTOPTS, &opt2->dst0opt, in ipv6_renew_options()
1330 (opt ? opt->dst0opt : NULL), in ipv6_renew_options()
1333 (struct ipv6_opt_hdr **)&opt2->srcrt, in ipv6_renew_options()
1334 (opt ? (struct ipv6_opt_hdr *)opt->srcrt : NULL), in ipv6_renew_options()
1336 ipv6_renew_option(IPV6_DSTOPTS, &opt2->dst1opt, in ipv6_renew_options()
1337 (opt ? opt->dst1opt : NULL), in ipv6_renew_options()
1340 opt2->opt_nflen = (opt2->hopopt ? ipv6_optlen(opt2->hopopt) : 0) + in ipv6_renew_options()
1341 (opt2->dst0opt ? ipv6_optlen(opt2->dst0opt) : 0) + in ipv6_renew_options()
1342 (opt2->srcrt ? ipv6_optlen(opt2->srcrt) : 0); in ipv6_renew_options()
1343 opt2->opt_flen = (opt2->dst1opt ? ipv6_optlen(opt2->dst1opt) : 0); in ipv6_renew_options()
1353 * --yoshfuji in ipv6_fixup_options()
1355 if (opt && opt->dst0opt && !opt->srcrt) { in ipv6_fixup_options()
1360 opt->opt_nflen -= ipv6_optlen(opt->dst0opt); in ipv6_fixup_options()
1361 opt->dst0opt = NULL; in ipv6_fixup_options()
1369 * fl6_update_dst - update flowi destination address with info given
1377 * and initial value of fl6->daddr set in orig
1383 if (!opt || !opt->srcrt) in fl6_update_dst()
1386 *orig = fl6->daddr; in fl6_update_dst()
1388 switch (opt->srcrt->type) { in fl6_update_dst()
1392 fl6->daddr = *((struct rt0_hdr *)opt->srcrt)->addr; in fl6_update_dst()
1396 struct ipv6_sr_hdr *srh = (struct ipv6_sr_hdr *)opt->srcrt; in fl6_update_dst()
1398 fl6->daddr = srh->segments[srh->segments_left]; in fl6_update_dst()