]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/if_dummy.c
xnu-1504.3.12.tar.gz
[apple/xnu.git] / bsd / net / if_dummy.c
index 7079e75d5c4af45fb2677543614b772b08f6fd7e..68dac9c9d979ed2851f037c677530696612566b2 100644 (file)
@@ -1,16 +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@
- * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * @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
@@ -20,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
@@ -80,7 +83,6 @@
 
 #include <net/if.h>
 #include <net/if_types.h>
-#include <net/netisr.h>
 #include <net/route.h>
 #include <net/bpf.h>
 
 #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"
 
-static int dummyioctl __P((struct ifnet *, u_long, caddr_t));
-int dummyoutput __P((struct ifnet *, register struct mbuf *, struct sockaddr *,
-       register struct rtentry *));
-static void dummyrtrequest __P((int, struct rtentry *, struct sockaddr *));
+static int dummyioctl(struct ifnet *, u_long, caddr_t);
+int dummyoutput(struct ifnet *, register struct mbuf *, struct sockaddr *,
+       register struct rtentry *);
+static void dummyrtrequest(int, struct rtentry *, struct sockaddr *);
 
-static void dummyattach __P((void *));
+static void dummyattach(void *);
 PSEUDO_SET(dummyattach, if_dummy);
 
 #if TINY_DUMMYMTU
@@ -174,9 +171,6 @@ dummyoutput(ifp, m, dst, rt)
        struct sockaddr *dst;
        register struct rtentry *rt;
 {
-       int s, isr;
-       register struct ifqueue *ifq = 0;
-
        if ((m->m_flags & M_PKTHDR) == 0)
                panic("dummyoutput no HDR");
 #if NBPFILTER > 0
@@ -189,92 +183,27 @@ 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;
-       switch (dst->sa_family) {
-
-#if INET
-       case AF_INET:
-               ifq = &ipintrq;
-               isr = NETISR_IP;
-               break;
-#endif
-#if IPX
-       case AF_IPX:
-               ifq = &ipxintrq;
-               isr = NETISR_IPX;
-               break;
-#endif
-#if INET6
-       case AF_INET6:
-               ifq = &ip6intrq;
-               isr = NETISR_IPV6;
-               break;
-#endif
-#if NS
-       case AF_NS:
-               ifq = &nsintrq;
-               isr = NETISR_NS;
-               break;
-#endif
-#if ISO
-       case AF_ISO:
-               ifq = &clnlintrq;
-               isr = NETISR_ISO;
-               break;
-#endif
-#if NETATALK
-       case AF_APPLETALK:
-               ifq = &atintrq2;
-               isr = NETISR_ATALK;
-               break;
-#endif NETATALK
-       default:
-               printf("%s: can't handle af%d\n",
-                      if_name(ifp), dst->sa_family);
-               m_freem(m);
-               return (EAFNOSUPPORT);
-       }
-       s = splimp();
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-               splx(s);
-               return (ENOBUFS);
-       }
-       IF_ENQUEUE(ifq, m);
-       schednetisr(isr);
+       proto_inject(dst->sa_family, m);
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
-       splx(s);
        return (0);
 }
 
@@ -285,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
@@ -314,7 +244,7 @@ dummyioctl(ifp, cmd, data)
        switch (cmd) {
 
        case SIOCSIFADDR:
-               ifp->if_flags |= IFF_UP | IFF_RUNNING;
+               ifnet_set_flags(ifp, IFF_UP | IFF_RUNNING, IFF_UP | IFF_RUNNING);
                ifa = (struct ifaddr *)data;
                ifa->ifa_rtrequest = dummyrtrequest;
                /*