]>
git.saurik.com Git - apple/xnu.git/blob - bsd/netinet6/route6.c
   2  * Copyright (c) 2000-2020 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  30  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 
  31  * All rights reserved. 
  33  * Redistribution and use in source and binary forms, with or without 
  34  * modification, are permitted provided that the following conditions 
  36  * 1. Redistributions of source code must retain the above copyright 
  37  *    notice, this list of conditions and the following disclaimer. 
  38  * 2. Redistributions in binary form must reproduce the above copyright 
  39  *    notice, this list of conditions and the following disclaimer in the 
  40  *    documentation and/or other materials provided with the distribution. 
  41  * 3. Neither the name of the project nor the names of its contributors 
  42  *    may be used to endorse or promote products derived from this software 
  43  *    without specific prior written permission. 
  45  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 
  46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 
  49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  58 #include <sys/param.h> 
  59 #include <sys/mcache.h> 
  61 #include <sys/socket.h> 
  62 #include <sys/queue.h> 
  63 #include <kern/debug.h> 
  67 #include <net/route.h> 
  69 #include <netinet/in.h> 
  70 #include <netinet6/in6_var.h> 
  71 #include <netinet/ip6.h> 
  72 #include <netinet6/ip6_var.h> 
  74 #include <netinet/icmp6.h> 
  77 route6_input(struct mbuf 
**mp
, int *offp
, int proto
) 
  80         struct ip6_hdr 
*ip6 
= NULL
; 
  82         struct ip6_rthdr 
*rh 
= NULL
; 
  83         int off 
= *offp
, rhlen 
= 0; 
  85         struct ip6aux 
*ip6a 
= NULL
; 
  87         ip6a 
= ip6_findaux(m
); 
  89                 /* XXX reject home-address option before rthdr */ 
  90                 if (ip6a
->ip6a_flags 
& IP6A_SWAP
) { 
  91                         ip6stat
.ip6s_badoptions
++; 
 100         IP6_EXTHDR_CHECK(m
, off
, sizeof(*rh
), return IPPROTO_DONE
); 
 102         /* Expect 32-bit aligned data pointer on strict-align platforms */ 
 103         MBUF_STRICT_DATA_ALIGNMENT_CHECK_32(m
); 
 105         ip6 
= mtod(m
, struct ip6_hdr 
*); 
 106         rh 
= (struct ip6_rthdr 
*)((caddr_t
)ip6 
+ off
); 
 108         switch (rh
->ip6r_type
) { 
 110                 /* unknown routing type */ 
 111                 if (rh
->ip6r_segleft 
== 0) { 
 112                         rhlen 
= (rh
->ip6r_len 
+ 1) << 3; 
 113                         break;  /* Final dst. Just ignore the header. */ 
 115                 ip6stat
.ip6s_badoptions
++; 
 116                 icmp6_error(m
, ICMP6_PARAM_PROB
, ICMP6_PARAMPROB_HEADER
, 
 117                     (int)((caddr_t
)&rh
->ip6r_type 
- (caddr_t
)ip6
));