diff options
Diffstat (limited to 'net/ipv6/exthdrs.c')
-rw-r--r-- | net/ipv6/exthdrs.c | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index fc3a961fc5ba..c82d4d49f71f 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -427,18 +427,6 @@ looped_back: | |||
427 | } | 427 | } |
428 | 428 | ||
429 | switch (hdr->type) { | 429 | switch (hdr->type) { |
430 | case IPV6_SRCRT_TYPE_0: | ||
431 | if (accept_source_route <= 0) | ||
432 | goto unknown_rh; | ||
433 | if (hdr->hdrlen & 0x01) { | ||
434 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | ||
435 | IPSTATS_MIB_INHDRERRORS); | ||
436 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | ||
437 | ((&hdr->hdrlen) - | ||
438 | skb_network_header(skb))); | ||
439 | return -1; | ||
440 | } | ||
441 | break; | ||
442 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 430 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
443 | case IPV6_SRCRT_TYPE_2: | 431 | case IPV6_SRCRT_TYPE_2: |
444 | if (accept_source_route < 0) | 432 | if (accept_source_route < 0) |
@@ -576,72 +564,6 @@ void __init ipv6_rthdr_init(void) | |||
576 | printk(KERN_ERR "ipv6_rthdr_init: Could not register protocol\n"); | 564 | printk(KERN_ERR "ipv6_rthdr_init: Could not register protocol\n"); |
577 | }; | 565 | }; |
578 | 566 | ||
579 | /* | ||
580 | This function inverts received rthdr. | ||
581 | NOTE: specs allow to make it automatically only if | ||
582 | packet authenticated. | ||
583 | |||
584 | I will not discuss it here (though, I am really pissed off at | ||
585 | this stupid requirement making rthdr idea useless) | ||
586 | |||
587 | Actually, it creates severe problems for us. | ||
588 | Embryonic requests has no associated sockets, | ||
589 | so that user have no control over it and | ||
590 | cannot not only to set reply options, but | ||
591 | even to know, that someone wants to connect | ||
592 | without success. :-( | ||
593 | |||
594 | For now we need to test the engine, so that I created | ||
595 | temporary (or permanent) backdoor. | ||
596 | If listening socket set IPV6_RTHDR to 2, then we invert header. | ||
597 | --ANK (980729) | ||
598 | */ | ||
599 | |||
600 | struct ipv6_txoptions * | ||
601 | ipv6_invert_rthdr(struct sock *sk, struct ipv6_rt_hdr *hdr) | ||
602 | { | ||
603 | /* Received rthdr: | ||
604 | |||
605 | [ H1 -> H2 -> ... H_prev ] daddr=ME | ||
606 | |||
607 | Inverted result: | ||
608 | [ H_prev -> ... -> H1 ] daddr =sender | ||
609 | |||
610 | Note, that IP output engine will rewrite this rthdr | ||
611 | by rotating it left by one addr. | ||
612 | */ | ||
613 | |||
614 | int n, i; | ||
615 | struct rt0_hdr *rthdr = (struct rt0_hdr*)hdr; | ||
616 | struct rt0_hdr *irthdr; | ||
617 | struct ipv6_txoptions *opt; | ||
618 | int hdrlen = ipv6_optlen(hdr); | ||
619 | |||
620 | if (hdr->segments_left || | ||
621 | hdr->type != IPV6_SRCRT_TYPE_0 || | ||
622 | hdr->hdrlen & 0x01) | ||
623 | return NULL; | ||
624 | |||
625 | n = hdr->hdrlen >> 1; | ||
626 | opt = sock_kmalloc(sk, sizeof(*opt) + hdrlen, GFP_ATOMIC); | ||
627 | if (opt == NULL) | ||
628 | return NULL; | ||
629 | memset(opt, 0, sizeof(*opt)); | ||
630 | opt->tot_len = sizeof(*opt) + hdrlen; | ||
631 | opt->srcrt = (void*)(opt+1); | ||
632 | opt->opt_nflen = hdrlen; | ||
633 | |||
634 | memcpy(opt->srcrt, hdr, sizeof(*hdr)); | ||
635 | irthdr = (struct rt0_hdr*)opt->srcrt; | ||
636 | irthdr->reserved = 0; | ||
637 | opt->srcrt->segments_left = n; | ||
638 | for (i=0; i<n; i++) | ||
639 | memcpy(irthdr->addr+i, rthdr->addr+(n-1-i), 16); | ||
640 | return opt; | ||
641 | } | ||
642 | |||
643 | EXPORT_SYMBOL_GPL(ipv6_invert_rthdr); | ||
644 | |||
645 | /********************************** | 567 | /********************************** |
646 | Hop-by-hop options. | 568 | Hop-by-hop options. |
647 | **********************************/ | 569 | **********************************/ |