]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/if_dummy.c
xnu-1504.15.3.tar.gz
[apple/xnu.git] / bsd / net / if_dummy.c
index 03a587435d8a5d83e53823489878f3db618232f5..68dac9c9d979ed2851f037c677530696612566b2 100644 (file)
@@ -1,14 +1,19 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2008 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
@@ -18,7 +23,7 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1982, 1986, 1993
 #include <netinet/ip.h>
 #endif
 
-#if IPX
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#endif
-
 #if INET6
-#ifndef INET
+#if !INET
 #include <netinet/in.h>
 #endif
 #include <netinet6/in6_var.h>
 #include <netinet/if_ether.h>
 #include <netatalk/at.h>
 #include <netatalk/at_var.h>
-#endif NETATALK
+#endif /* NETATALK */
 
 #include "bpfilter.h"
 
@@ -171,7 +171,6 @@ dummyoutput(ifp, m, dst, rt)
        struct sockaddr *dst;
        register struct rtentry *rt;
 {
-
        if ((m->m_flags & M_PKTHDR) == 0)
                panic("dummyoutput no HDR");
 #if NBPFILTER > 0
@@ -184,33 +183,21 @@ dummyoutput(ifp, m, dst, rt)
        }
 
        if (ifp->if_bpf) {
-               /*
-                * We need to prepend the address family as
-                * a four byte field.  Cons up a dummy header
-                * to pacify bpf.  This is safe because bpf
-                * will only read from the mbuf (i.e., it won't
-                * try to free it or keep a pointer a to it).
-                */
-               struct mbuf m0;
+               /* We need to prepend the address family as a four byte field. */
                u_int af = dst->sa_family;
 
-               m0.m_next = m;
-               m0.m_len = 4;
-               m0.m_data = (char *)&af;
-
-#ifdef HAVE_OLD_BPF
-               bpf_mtap(ifp, &m0);
-#else
-               bpf_mtap(ifp->if_bpf, &m0);
-#endif
+               bpf_tap_out(ifp, 0, m, &af, sizeof(af));
        }
 #endif
        m->m_pkthdr.rcvif = ifp;
 
-       if (rt && rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) {
-               m_freem(m);
-               return (rt->rt_flags & RTF_BLACKHOLE ? 0 :
-                       rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
+       if (rt != NULL) {
+               u_int32_t rt_flags = rt->rt_flags;
+               if (rt_flags & (RTF_REJECT | RTF_BLACKHOLE)) {
+                       m_freem(m);
+                       return ((rt_flags & RTF_BLACKHOLE) ? 0 :
+                           (rt_flags & RTF_HOST) ? EHOSTUNREACH : ENETUNREACH);
+               }
        }
        ifp->if_opackets++;
        ifp->if_obytes += m->m_pkthdr.len;
@@ -227,7 +214,8 @@ dummyrtrequest(cmd, rt, sa)
        struct rtentry *rt;
        struct sockaddr *sa;
 {
-       if (rt) {
+       if (rt != NULL) {
+               RT_LOCK_ASSERT_HELD(rt);
                rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu; /* for ISO */
                /*
                 * For optimal performance, the send and receive buffers