2  * Copyright (c) 2000-2013 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@ 
  29 /*      $FreeBSD: src/sys/net/if_stf.c,v 1.1.2.6 2001/07/24 19:10:18 brooks Exp $       */ 
  30 /*      $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */ 
  33  * Copyright (C) 2000 WIDE Project. 
  34  * All rights reserved. 
  36  * Redistribution and use in source and binary forms, with or without 
  37  * modification, are permitted provided that the following conditions 
  39  * 1. Redistributions of source code must retain the above copyright 
  40  *    notice, this list of conditions and the following disclaimer. 
  41  * 2. Redistributions in binary form must reproduce the above copyright 
  42  *    notice, this list of conditions and the following disclaimer in the 
  43  *    documentation and/or other materials provided with the distribution. 
  44  * 3. Neither the name of the project nor the names of its contributors 
  45  *    may be used to endorse or promote products derived from this software 
  46  *    without specific prior written permission. 
  48  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 
  49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 
  52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  61  * NOTICE: This file was modified by SPARTA, Inc. in 2006 to introduce 
  62  * support for mandatory and extensible security protections.  This notice 
  63  * is included in support of clause 2.2 (b) of the Apple Public License, 
  68  * 6to4 interface, based on RFC3056. 
  70  * 6to4 interface is NOT capable of link-layer (I mean, IPv4) multicasting. 
  71  * There is no address mapping defined from IPv6 multicast address to IPv4 
  72  * address.  Therefore, we do not have IFF_MULTICAST on the interface. 
  74  * Due to the lack of address mapping for link-local addresses, we cannot 
  75  * throw packets toward link-local addresses (fe80::x).  Also, we cannot throw 
  76  * packets to link-local multicast addresses (ff02::x). 
  78  * Here are interesting symptoms due to the lack of link-local address: 
  80  * Unicast routing exchange: 
  81  * - RIPng: Impossible.  Uses link-local multicast packet toward ff02::9, 
  82  *   and link-local addresses as nexthop. 
  83  * - OSPFv6: Impossible.  OSPFv6 assumes that there's link-local address 
  84  *   assigned to the link, and makes use of them.  Also, HELLO packets use 
  85  *   link-local multicast addresses (ff02::5 and ff02::6). 
  86  * - BGP4+: Maybe.  You can only use global address as nexthop, and global 
  87  *   address as TCP endpoint address. 
  89  * Multicast routing protocols: 
  90  * - PIM: Hello packet cannot be used to discover adjacent PIM routers. 
  91  *   Adjacent PIM routers must be configured manually (is it really spec-wise 
  92  *   correct thing to do?). 
  95  * - Redirects cannot be used due to the lack of link-local address. 
  97  * stf interface does not have, and will not need, a link-local address.   
  98  * It seems to have no real benefit and does not help the above symptoms much. 
  99  * Even if we assign link-locals to interface, we cannot really 
 100  * use link-local unicast/multicast on top of 6to4 cloud (since there's no 
 101  * encapsulation defined for link-local address), and the above analysis does 
 102  * not change.  RFC3056 does not mandate the assignment of link-local address 
 105  * 6to4 interface has security issues.  Refer to 
 106  * http://playground.iijlab.net/i-d/draft-itojun-ipv6-transition-abuse-00.txt 
 107  * for details.  The code tries to filter out some of malicious packets. 
 108  * Note that there is no way to be 100% secure. 
 111 #include <sys/param.h> 
 112 #include <sys/systm.h> 
 113 #include <sys/socket.h> 
 114 #include <sys/sockio.h> 
 115 #include <sys/mbuf.h> 
 116 #include <sys/errno.h> 
 117 #include <sys/protosw.h> 
 118 #include <sys/kernel.h> 
 119 #include <sys/syslog.h> 
 121 #include <sys/malloc.h> 
 123 #include <kern/locks.h> 
 126 #include <net/route.h> 
 127 #include <net/if_types.h> 
 129 #include <netinet/in.h> 
 130 #include <netinet/in_systm.h> 
 131 #include <netinet/ip.h> 
 132 #include <netinet/ip_var.h> 
 133 #include <netinet/in_var.h> 
 135 #include <netinet/ip6.h> 
 136 #include <netinet6/ip6_var.h> 
 137 #include <netinet6/in6_var.h> 
 138 #include <netinet/ip_ecn.h> 
 140 #include <netinet/ip_encap.h> 
 141 #include <net/kpi_interface.h> 
 142 #include <net/kpi_protocol.h> 
 145 #include <net/net_osdep.h> 
 150 #include <security/mac_framework.h> 
 153 #define GET_V4(x) ((const struct in_addr *)(const void *)(&(x)->s6_addr16[1]))  
 155 static lck_grp_t 
*stf_mtx_grp
; 
 158         ifnet_t                         sc_if
;     /* common area */ 
 159         u_int32_t                               sc_protocol_family
; /* dlil protocol attached */ 
 161                 struct route  __sc_ro4
; 
 162                 struct route_in6 __sc_ro6
; /* just for safety */ 
 164 #define sc_ro   __sc_ro46.__sc_ro4 
 165         decl_lck_mtx_data(, sc_ro_mtx
); 
 166         const struct encaptab 
*encap_cookie
; 
 167         bpf_tap_mode            tap_mode
; 
 168         bpf_packet_func         tap_callback
; 
 171 void stfattach (void); 
 173 static int ip_stf_ttl 
= 40; 
 174 static int stf_init_done
; 
 176 static void in_stf_input(struct mbuf 
*, int); 
 177 static void stfinit(void); 
 179 static struct protosw in_stf_protosw 
= 
 182         .pr_protocol 
=          IPPROTO_IPV6
, 
 183         .pr_flags 
=             PR_ATOMIC
|PR_ADDR
, 
 184         .pr_input 
=             in_stf_input
, 
 185         .pr_ctloutput 
=         rip_ctloutput
, 
 186         .pr_usrreqs 
=           &rip_usrreqs
, 
 187         .pr_unlock 
=            rip_unlock
, 
 190 static int stf_encapcheck(const struct mbuf 
*, int, int, void *); 
 191 static struct in6_ifaddr 
*stf_getsrcifa6(struct ifnet 
*); 
 192 int stf_pre_output(struct ifnet 
*, protocol_family_t
, struct mbuf 
**, 
 193         const struct sockaddr 
*, void *, char *, char *); 
 194 static int stf_checkaddr4(struct stf_softc 
*, const struct in_addr 
*, 
 196 static int stf_checkaddr6(struct stf_softc 
*, struct in6_addr 
*, 
 198 static void stf_rtrequest(int, struct rtentry 
*, struct sockaddr 
*); 
 199 static errno_t 
stf_ioctl(ifnet_t ifp
, u_long cmd
, void *data
); 
 200 static errno_t 
stf_output(ifnet_t ifp
, mbuf_t m
); 
 205         if (!stf_init_done
) { 
 206                 stf_mtx_grp 
= lck_grp_alloc_init("stf", LCK_GRP_ATTR_NULL
); 
 212  * gif_input is the input handler for IP and IPv6 attached to gif 
 216         __unused ifnet_t        ifp
, 
 217         protocol_family_t       protocol_family
, 
 219         __unused 
char           *frame_header
) 
 221         if (proto_input(protocol_family
, m
) != 0) 
 232         protocol_family_t                                               protocol_family
, 
 233         __unused 
const struct ifnet_demux_desc  
*demux_array
, 
 234         __unused u_int32_t                                              demux_count
) 
 236         /* Only one protocol may be attached at a time */ 
 237         struct stf_softc
* stf 
= ifnet_softc(ifp
); 
 238         if (stf
->sc_protocol_family 
== 0) 
 239                 stf
->sc_protocol_family 
= protocol_family
; 
 241                 printf("stf_add_proto: stf already has a proto\n"); 
 251         protocol_family_t       protocol_family
) 
 253         if (((struct stf_softc
*)ifnet_softc(ifp
))->sc_protocol_family 
== protocol_family
) 
 254                 ((struct stf_softc
*)ifnet_softc(ifp
))->sc_protocol_family 
= 0; 
 262         protocol_family_t       protocol_family
) 
 264     struct ifnet_attach_proto_param     reg
; 
 267     if (protocol_family 
!= PF_INET6
) 
 268         return EPROTONOSUPPORT
; 
 270         bzero(®
, sizeof(reg
)); 
 271     reg
.input 
= stf_media_input
; 
 272     reg
.pre_output 
= stf_pre_output
; 
 274     stat 
= ifnet_attach_protocol(ifp
, protocol_family
, ®
); 
 275     if (stat 
&& stat 
!= EEXIST
) { 
 276         printf("stf_attach_proto_family can't attach interface fam=%d\n", 
 287         __unused 
char                   *frame_ptr
, 
 288         protocol_family_t               
*protocol_family
) 
 290         struct stf_softc
* stf 
= ifnet_softc(ifp
); 
 291         *protocol_family 
= stf
->sc_protocol_family
; 
 299         bpf_packet_func callback
) 
 301         struct stf_softc        
*sc 
= ifnet_softc(ifp
); 
 304         sc
->tap_callback 
= callback
; 
 312         struct stf_softc 
*sc
; 
 314         const struct encaptab 
*p
; 
 315         struct ifnet_init_params        stf_init
; 
 319         error 
= proto_register_plumber(PF_INET6
, APPLE_IF_FAM_STF
, 
 320                                                                    stf_attach_inet6
, NULL
); 
 322                 printf("proto_register_plumber failed for AF_INET6 error=%d\n", error
); 
 324         sc 
= _MALLOC(sizeof(struct stf_softc
), M_DEVBUF
, M_WAITOK 
| M_ZERO
); 
 326                 printf("stf softc attach failed\n" ); 
 330         p 
= encap_attach_func(AF_INET
, IPPROTO_IPV6
, stf_encapcheck
, 
 331             &in_stf_protosw
, sc
); 
 333                 printf("sftattach encap_attach_func failed\n"); 
 337         sc
->encap_cookie 
= p
; 
 338         lck_mtx_init(&sc
->sc_ro_mtx
, stf_mtx_grp
, LCK_ATTR_NULL
); 
 340         bzero(&stf_init
, sizeof(stf_init
)); 
 341         stf_init
.name 
= "stf"; 
 343         stf_init
.type 
= IFT_STF
; 
 344         stf_init
.family 
= IFNET_FAMILY_STF
; 
 345         stf_init
.output 
= stf_output
; 
 346         stf_init
.demux 
= stf_demux
; 
 347         stf_init
.add_proto 
= stf_add_proto
; 
 348         stf_init
.del_proto 
= stf_del_proto
; 
 350         stf_init
.ioctl 
= stf_ioctl
; 
 351         stf_init
.set_bpf_tap 
= stf_set_bpf_tap
; 
 353         error 
= ifnet_allocate(&stf_init
, &sc
->sc_if
); 
 355                 printf("stfattach, ifnet_allocate failed - %d\n", error
); 
 356                 encap_detach(sc
->encap_cookie
); 
 357                 lck_mtx_destroy(&sc
->sc_ro_mtx
, stf_mtx_grp
); 
 361         ifnet_set_mtu(sc
->sc_if
, IPV6_MMTU
); 
 362         ifnet_set_flags(sc
->sc_if
, 0, 0xffff); /* clear all flags */ 
 364         /* turn off ingress filter */ 
 365         ifnet_set_flags(sc
->sc_if
, IFF_LINK2
, IFF_LINK2
); 
 369         mac_ifnet_label_init(&sc
->sc_if
); 
 372         error 
= ifnet_attach(sc
->sc_if
, NULL
); 
 374                 printf("stfattach: ifnet_attach returned error=%d\n", error
); 
 375                 encap_detach(sc
->encap_cookie
); 
 376                 ifnet_release(sc
->sc_if
); 
 377                 lck_mtx_destroy(&sc
->sc_ro_mtx
, stf_mtx_grp
); 
 382         bpfattach(sc
->sc_if
, DLT_NULL
, sizeof(u_int
)); 
 389         const struct mbuf 
*m
, 
 395         struct in6_ifaddr 
*ia6
; 
 396         struct stf_softc 
*sc
; 
 399         sc 
= (struct stf_softc 
*)arg
; 
 403         if ((ifnet_flags(sc
->sc_if
) & IFF_UP
) == 0) 
 406         /* IFF_LINK0 means "no decapsulation" */ 
 407         if ((ifnet_flags(sc
->sc_if
) & IFF_LINK0
) != 0) 
 410         if (proto 
!= IPPROTO_IPV6
) 
 413         mbuf_copydata((struct mbuf 
*)(size_t)m
, 0, sizeof(ip
), &ip
); 
 418         ia6 
= stf_getsrcifa6(sc
->sc_if
); 
 423          * check if IPv4 dst matches the IPv4 address derived from the 
 424          * local 6to4 address. 
 425          * success on: dst = 10.1.1.1, ia6->ia_addr = 2002:0a01:0101:... 
 427         IFA_LOCK(&ia6
->ia_ifa
); 
 428         if (bcmp(GET_V4(&ia6
->ia_addr
.sin6_addr
), &ip
.ip_dst
, 
 429             sizeof(ip
.ip_dst
)) != 0) { 
 430                 IFA_UNLOCK(&ia6
->ia_ifa
); 
 431                 IFA_REMREF(&ia6
->ia_ifa
); 
 435          * check if IPv4 src matches the IPv4 address derived from the 
 436          * local 6to4 address masked by prefixmask. 
 437          * success on: src = 10.1.1.1, ia6->ia_addr = 2002:0a00:.../24 
 438          * fail on: src = 10.1.1.1, ia6->ia_addr = 2002:0b00:.../24 
 440         bzero(&a
, sizeof(a
)); 
 441         a
.s_addr 
= GET_V4(&ia6
->ia_addr
.sin6_addr
)->s_addr
; 
 442         a
.s_addr 
&= GET_V4(&ia6
->ia_prefixmask
.sin6_addr
)->s_addr
; 
 444         b
.s_addr 
&= GET_V4(&ia6
->ia_prefixmask
.sin6_addr
)->s_addr
; 
 445         if (a
.s_addr 
!= b
.s_addr
) { 
 446                 IFA_UNLOCK(&ia6
->ia_ifa
); 
 447                 IFA_REMREF(&ia6
->ia_ifa
); 
 450         /* stf interface makes single side match only */ 
 451         IFA_UNLOCK(&ia6
->ia_ifa
); 
 452         IFA_REMREF(&ia6
->ia_ifa
); 
 456 static struct in6_ifaddr 
* 
 457 stf_getsrcifa6(struct ifnet 
*ifp
) 
 460         struct in_ifaddr 
*ia4
; 
 461         struct sockaddr_in6 
*sin6
; 
 464         ifnet_lock_shared(ifp
); 
 465         for (ia 
= ifp
->if_addrlist
.tqh_first
; ia
; ia 
= ia
->ifa_list
.tqe_next
) { 
 467                 if (ia
->ifa_addr 
== NULL
) { 
 471                 if (ia
->ifa_addr
->sa_family 
!= AF_INET6
) { 
 475                 sin6 
= (struct sockaddr_in6 
*)(void *)ia
->ifa_addr
; 
 476                 if (!IN6_IS_ADDR_6TO4(&sin6
->sin6_addr
)) { 
 480                 bcopy(GET_V4(&sin6
->sin6_addr
), &in
, sizeof(in
)); 
 482                 lck_rw_lock_shared(in_ifaddr_rwlock
); 
 483                 for (ia4 
= TAILQ_FIRST(&in_ifaddrhead
); 
 485                      ia4 
= TAILQ_NEXT(ia4
, ia_link
)) 
 487                         IFA_LOCK(&ia4
->ia_ifa
); 
 488                         if (ia4
->ia_addr
.sin_addr
.s_addr 
== in
.s_addr
) { 
 489                                 IFA_UNLOCK(&ia4
->ia_ifa
); 
 492                         IFA_UNLOCK(&ia4
->ia_ifa
); 
 494                 lck_rw_done(in_ifaddr_rwlock
); 
 498                 IFA_ADDREF(ia
);         /* for caller */ 
 499                 ifnet_lock_done(ifp
); 
 500                 return ((struct in6_ifaddr 
*)ia
); 
 502         ifnet_lock_done(ifp
); 
 510         __unused protocol_family_t  protocol_family
, 
 512         const struct sockaddr   
*dst
, 
 513         __unused 
void *route
, 
 514         __unused 
char *desk_linkaddr
, 
 515         __unused 
char *frame_type
) 
 517         struct mbuf 
*m 
= *m0
; 
 518         struct stf_softc 
*sc
; 
 519         const struct sockaddr_in6 
*dst6
; 
 520         const struct in_addr 
*in4
; 
 524         struct in6_ifaddr 
*ia6
; 
 525         struct sockaddr_in      
*dst4
; 
 526         struct ip_out_args ipoa 
= 
 527             { IFSCOPE_NONE
, { 0 }, IPOAF_SELECT_SRCIF
, 0 }; 
 530         sc 
= ifnet_softc(ifp
); 
 531         dst6 
= (const struct sockaddr_in6 
*)(const void *)dst
; 
 534         if ((ifnet_flags(ifp
) & IFF_UP
) == 0) { 
 535                 printf("stf: IFF_DOWN\n"); 
 540          * If we don't have an ip4 address that match my inner ip6 address, 
 541          * we shouldn't generate output.  Without this check, we'll end up 
 542          * using wrong IPv4 source. 
 544         ia6 
= stf_getsrcifa6(ifp
); 
 549         if (mbuf_len(m
) < sizeof(*ip6
)) { 
 550                 m 
= m_pullup(m
, sizeof(*ip6
)); 
 552                         *m0 
= NULL
; /* makes sure this won't be double freed */ 
 553                         IFA_REMREF(&ia6
->ia_ifa
); 
 557         ip6 
= mtod(m
, struct ip6_hdr 
*); 
 558         tos 
= (ntohl(ip6
->ip6_flow
) >> 20) & 0xff; 
 561          * Pickup the right outer dst addr from the list of candidates. 
 562          * ip6_dst has priority as it may be able to give us shorter IPv4 hops. 
 564         if (IN6_IS_ADDR_6TO4(&ip6
->ip6_dst
)) 
 565                 in4 
= GET_V4(&ip6
->ip6_dst
); 
 566         else if (IN6_IS_ADDR_6TO4(&dst6
->sin6_addr
)) 
 567                 in4 
= GET_V4(&dst6
->sin6_addr
); 
 569                 IFA_REMREF(&ia6
->ia_ifa
); 
 574                 /* We need to prepend the address family as a four byte field. */ 
 575                 u_int32_t af 
= AF_INET6
; 
 577                 bpf_tap_out(ifp
, 0, m
, &af
, sizeof(af
)); 
 580         M_PREPEND(m
, sizeof(struct ip
), M_DONTWAIT
, 1); 
 581         if (m 
&& mbuf_len(m
) < sizeof(struct ip
)) 
 582                 m 
= m_pullup(m
, sizeof(struct ip
)); 
 585                 IFA_REMREF(&ia6
->ia_ifa
); 
 588         ip 
= mtod(m
, struct ip 
*); 
 590         bzero(ip
, sizeof(*ip
)); 
 592         IFA_LOCK_SPIN(&ia6
->ia_ifa
); 
 593         bcopy(GET_V4(&((struct sockaddr_in6 
*)&ia6
->ia_addr
)->sin6_addr
), 
 594             &ip
->ip_src
, sizeof(ip
->ip_src
)); 
 595         IFA_UNLOCK(&ia6
->ia_ifa
); 
 596         bcopy(in4
, &ip
->ip_dst
, sizeof(ip
->ip_dst
)); 
 597         ip
->ip_p 
= IPPROTO_IPV6
; 
 598         ip
->ip_ttl 
= ip_stf_ttl
; 
 599         ip
->ip_len 
= m
->m_pkthdr
.len
;   /*host order*/ 
 600         if (ifp
->if_flags 
& IFF_LINK1
) 
 601                 ip_ecn_ingress(ECN_NORMAL
, &ip
->ip_tos
, &tos
); 
 603                 ip_ecn_ingress(ECN_NOCARE
, &ip
->ip_tos
, &tos
); 
 605         lck_mtx_lock(&sc
->sc_ro_mtx
); 
 606         dst4 
= (struct sockaddr_in 
*)(void *)&sc
->sc_ro
.ro_dst
; 
 607         if (ROUTE_UNUSABLE(&sc
->sc_ro
) || dst4
->sin_family 
!= AF_INET 
|| 
 608             bcmp(&dst4
->sin_addr
, &ip
->ip_dst
, sizeof(ip
->ip_dst
)) != 0) { 
 609                 ROUTE_RELEASE(&sc
->sc_ro
); 
 610                 /* cache route doesn't match: always the case during the first use */ 
 611                 dst4
->sin_family 
= AF_INET
; 
 612                 dst4
->sin_len 
= sizeof(struct sockaddr_in
); 
 613                 bcopy(&ip
->ip_dst
, &dst4
->sin_addr
, sizeof(dst4
->sin_addr
)); 
 616         result 
= ip_output(m
, NULL
, &sc
->sc_ro
, IP_OUTARGS
, NULL
, &ipoa
); 
 617         lck_mtx_unlock(&sc
->sc_ro_mtx
); 
 619         /* Assumption: ip_output will free mbuf on errors */ 
 620         /* All the output processing is done here, don't let stf_output be called */ 
 622                 result 
= EJUSTRETURN
; 
 624         IFA_REMREF(&ia6
->ia_ifa
); 
 629         __unused ifnet_t        ifp
, 
 632         /* All processing is done in stf_pre_output 
 633          * this shouldn't be called as the pre_output returns "EJUSTRETURN" 
 640         struct stf_softc 
*sc
, 
 641         const struct in_addr 
*in
, 
 642         struct ifnet 
*inifp
)    /* incoming interface */ 
 644         struct in_ifaddr 
*ia4
; 
 647          * reject packets with the following address: 
 648          * 224.0.0.0/4 0.0.0.0/8 127.0.0.0/8 255.0.0.0/8 
 650         if (IN_MULTICAST(ntohl(in
->s_addr
))) 
 652         switch ((ntohl(in
->s_addr
) & 0xff000000) >> 24) { 
 653         case 0: case 127: case 255: 
 658          * reject packets with broadcast 
 660         lck_rw_lock_shared(in_ifaddr_rwlock
); 
 661         for (ia4 
= TAILQ_FIRST(&in_ifaddrhead
); 
 663              ia4 
= TAILQ_NEXT(ia4
, ia_link
)) 
 665                 IFA_LOCK(&ia4
->ia_ifa
); 
 666                 if ((ia4
->ia_ifa
.ifa_ifp
->if_flags 
& IFF_BROADCAST
) == 0) { 
 667                         IFA_UNLOCK(&ia4
->ia_ifa
); 
 670                 if (in
->s_addr 
== ia4
->ia_broadaddr
.sin_addr
.s_addr
) { 
 671                         IFA_UNLOCK(&ia4
->ia_ifa
); 
 672                         lck_rw_done(in_ifaddr_rwlock
); 
 675                 IFA_UNLOCK(&ia4
->ia_ifa
); 
 677         lck_rw_done(in_ifaddr_rwlock
); 
 680          * perform ingress filter 
 682         if (sc 
&& (ifnet_flags(sc
->sc_if
) & IFF_LINK2
) == 0 && inifp
) { 
 683                 struct sockaddr_in sin
; 
 686                 bzero(&sin
, sizeof(sin
)); 
 687                 sin
.sin_family 
= AF_INET
; 
 688                 sin
.sin_len 
= sizeof(struct sockaddr_in
); 
 690                 rt 
= rtalloc1((struct sockaddr 
*)&sin
, 0, 0); 
 693                 if (rt 
== NULL 
|| rt
->rt_ifp 
!= inifp
) { 
 695                         log(LOG_WARNING
, "%s: packet from 0x%x dropped " 
 696                             "due to ingress filter\n", if_name(sc
->sc_if
), 
 697                             (u_int32_t
)ntohl(sin
.sin_addr
.s_addr
)); 
 714         struct stf_softc 
*sc
, 
 715         struct in6_addr 
*in6
, 
 716         struct ifnet 
*inifp
)    /* incoming interface */ 
 719          * check 6to4 addresses 
 721         if (IN6_IS_ADDR_6TO4(in6
)) 
 722                 return stf_checkaddr4(sc
, GET_V4(in6
), inifp
); 
 725          * reject anything that look suspicious.  the test is implemented 
 726          * in ip6_input too, but we check here as well to 
 727          * (1) reject bad packets earlier, and 
 728          * (2) to be safe against future ip6_input change. 
 730         if (IN6_IS_ADDR_V4COMPAT(in6
) || IN6_IS_ADDR_V4MAPPED(in6
)) 
 741         struct stf_softc 
*sc
; 
 747         struct ifnet_stat_increment_param       stats
; 
 749         ip 
= mtod(m
, struct ip 
*); 
 752         if (proto 
!= IPPROTO_IPV6
) { 
 757         ip 
= mtod(m
, struct ip 
*); 
 759         sc 
= (struct stf_softc 
*)encap_getarg(m
); 
 761         if (sc 
== NULL 
|| (ifnet_flags(sc
->sc_if
) & IFF_UP
) == 0) { 
 769         mac_mbuf_label_associate_ifnet(ifp
, m
); 
 773          * perform sanity check against outer src/dst. 
 774          * for source, perform ingress filter as well. 
 776         if (stf_checkaddr4(sc
, &ip
->ip_dst
, NULL
) < 0 || 
 777             stf_checkaddr4(sc
, &ip
->ip_src
, m
->m_pkthdr
.rcvif
) < 0) { 
 783         mbuf_copydata(m
, off
, sizeof(ip6
), &ip6
); 
 786          * perform sanity check against inner src/dst. 
 787          * for source, perform ingress filter as well. 
 789         if (stf_checkaddr6(sc
, &ip6
.ip6_dst
, NULL
) < 0 || 
 790             stf_checkaddr6(sc
, &ip6
.ip6_src
, m
->m_pkthdr
.rcvif
) < 0) { 
 795         itos 
= (ntohl(ip6
.ip6_flow
) >> 20) & 0xff; 
 796         if ((ifnet_flags(ifp
) & IFF_LINK1
) != 0) 
 797                 ip_ecn_egress(ECN_NORMAL
, &otos
, &itos
); 
 799                 ip_ecn_egress(ECN_NOCARE
, &otos
, &itos
); 
 800         ip6
.ip6_flow 
&= ~htonl(0xff << 20); 
 801         ip6
.ip6_flow 
|= htonl((u_int32_t
)itos 
<< 20); 
 803         m
->m_pkthdr
.rcvif 
= ifp
; 
 804         mbuf_pkthdr_setheader(m
, mbuf_data(m
)); 
 808                 /* We need to prepend the address family as a four byte field. */ 
 809                 u_int32_t af 
= AF_INET6
; 
 810                 bpf_tap_in(ifp
, 0, m
, &af
, sizeof(af
)); 
 814          * Put the packet to the network layer input queue according to the 
 815          * specified address family. 
 816          * See net/if_gif.c for possible issues with packet processing 
 817          * reorder due to extra queueing. 
 819         bzero(&stats
, sizeof(stats
)); 
 820         stats
.packets_in 
= 1; 
 821         stats
.bytes_in 
= mbuf_pkthdr_len(m
); 
 822         mbuf_pkthdr_setrcvif(m
, ifp
); 
 823         ifnet_input(ifp
, m
, &stats
); 
 832         __unused 
struct sockaddr 
*sa
) 
 835                 RT_LOCK_ASSERT_HELD(rt
); 
 836                 rt
->rt_rmx
.rmx_mtu 
= IPV6_MMTU
; 
 848         struct sockaddr_in6 
*sin6
; 
 854                 ifa 
= (struct ifaddr 
*)data
; 
 856                         error 
= EAFNOSUPPORT
; 
 860                 if (ifa
->ifa_addr
->sa_family 
!= AF_INET6
) { 
 862                         error 
= EAFNOSUPPORT
; 
 865                 sin6 
= (struct sockaddr_in6 
*)(void *)ifa
->ifa_addr
; 
 866                 if (IN6_IS_ADDR_6TO4(&sin6
->sin6_addr
)) { 
 867                         if ( !(ifnet_flags( ifp 
) & IFF_UP
) ) { 
 868                                 /* do this only if the interface is not already up */ 
 869                                 ifa
->ifa_rtrequest 
= stf_rtrequest
; 
 871                                 ifnet_set_flags(ifp
, IFF_UP
, IFF_UP
); 
 879                 IFA_LOCK_ASSERT_NOTHELD(ifa
); 
 884                 ifr 
= (struct ifreq 
*)data
; 
 885                 if (ifr 
&& ifr
->ifr_addr
.sa_family 
== AF_INET6
) 
 888                         error 
= EAFNOSUPPORT
;