]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netat/drv_dep.c
xnu-792.12.6.tar.gz
[apple/xnu.git] / bsd / netat / drv_dep.c
index 96fa0d78af468e33a45fb9a2fc00a8bac2567551..acaf3da2aa5ead943a84d1c9119e42cd12078b50 100644 (file)
@@ -1,23 +1,31 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * 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.  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 
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
+ * Please see the License for the specific language governing rights and 
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
  */
 /*
  * Copyright 1994 Apple Computer, Inc.
@@ -46,9 +54,7 @@
 #include <net/if.h>
 #include <net/if_types.h>
 #include <net/if_dl.h>
-#include <net/etherdefs.h>
 #include <net/ethernet.h>
-#include <net/tokendefs.h>
 
 #include <netat/sysglue.h>
 #include <netat/appletalk.h>
@@ -70,6 +76,8 @@ static llc_header_t   snap_hdr_aarp = SNAP_HDR_AARP;
 static unsigned char snap_proto_ddp[5] = SNAP_PROTO_AT;
 static unsigned char snap_proto_aarp[5] = SNAP_PROTO_AARP;
 
+static void at_input_packet(protocol_family_t protocol, mbuf_t m);
+
 int pktsIn, pktsOut;
 
 struct ifqueue atalkintrq;     /* appletalk and aarp packet input queue */
@@ -88,6 +96,7 @@ void atalk_load()
 {
        extern int _ATsocket(), _ATgetmsg(), _ATputmsg();
        extern int _ATPsndreq(), _ATPsndrsp(), _ATPgetreq(), _ATPgetrsp();
+       extern lck_mtx_t *domain_proto_mtx;
 
        sys_ATsocket  = _ATsocket;
        sys_ATgetmsg  = _ATgetmsg;
@@ -116,6 +125,9 @@ void atalk_load()
                for 2225395
                this happens in adsp_open and is undone on ADSP_UNLINK 
 */
+       lck_mtx_unlock(domain_proto_mtx);
+       proto_register_input(PF_APPLETALK, at_input_packet, NULL);
+       lck_mtx_lock(domain_proto_mtx);
 } /* atalk_load */
 
 /* Undo everything atalk_load() did. */
@@ -189,7 +201,7 @@ int pat_output(patp, mlist, dst_addr, type)
                mlist = m->m_nextpkt;
                m->m_nextpkt = 0;
 
-               M_PREPEND(m, sizeof(llc_header_t), M_DONTWAIT)
+               M_PREPEND(m, sizeof(llc_header_t), M_DONTWAIT);
                if (m == 0) {
                        continue;
                }
@@ -210,7 +222,9 @@ int pat_output(patp, mlist, dst_addr, type)
                        kprintf("po: mlen= %d, m2len= %d\n", m->m_len, 
                                (m->m_next)->m_len);
 #endif
-               dlil_output(patp->at_dl_tag, m, NULL, &dst, 0);
+               atalk_unlock();
+               dlil_output(patp->aa_ifp, PF_APPLETALK, m, NULL, &dst, 0);
+               atalk_lock();
 
                pktsOut++;
        }
@@ -218,44 +232,30 @@ int pat_output(patp, mlist, dst_addr, type)
        return 0;
 } /* pat_output */
 
-void atalkintr()
+static void
+at_input_packet(
+       __unused protocol_family_t      protocol,
+       mbuf_t                                          m)
 {
-       struct mbuf *m, *m1, *mlist = NULL;
+       struct mbuf *m1;
        struct ifnet *ifp;
-       int s;
        llc_header_t *llc_header;
        at_ifaddr_t *ifID;
        char src[6];
        enet_header_t *enet_header;
-               
-next:
-       s = splimp();
-       IF_DEQUEUE(&atalkintrq, m);
-       splx(s);        
 
-       if (m == 0) 
-               return; 
-
-       for ( ; m ; m = mlist) {
-         mlist = m->m_nextpkt;
-#ifdef APPLETALK_DEBUG
-         /* packet chains are not yet in use on input */
-         if (mlist) kprintf("atalkintr: packet chain\n");
-#endif
-         m->m_nextpkt = 0;
-
-         if (!appletalk_inited) {
+       if (!appletalk_inited) {
                m_freem(m);
-               continue;
-         }
+               return;
+       }
 
-         if ((m->m_flags & M_PKTHDR) == 0) {
+       if ((m->m_flags & M_PKTHDR) == 0) {
 #ifdef APPLETALK_DEBUG
-                kprintf("atalkintr: no HDR on packet received");
+               kprintf("atalkintr: no HDR on packet received");
 #endif
                m_freem(m);
-               continue;
-         }
+               return;
+       }
 
          /* make sure the interface this packet was received on is configured
             for AppleTalk */
@@ -267,7 +267,7 @@ next:
          /* if we didn't find a matching interface */
          if (!ifID) {
                m_freem(m);
-               continue; /* was EAFNOSUPPORT */
+               return; /* was EAFNOSUPPORT */
          }
 
          /* make sure the entire packet header is in the current mbuf */
@@ -277,13 +277,15 @@ next:
                kprintf("atalkintr: packet too small\n");
 #endif
                m_freem(m);
-               continue;
+               return;
          }
          enet_header = mtod(m, enet_header_t *);
 
          /* Ignore multicast packets from local station */
          /* *** Note: code for IFTYPE_TOKENTALK may be needed here. *** */
-         if (ifID->aa_ifp->if_type == IFT_ETHER) {
+         if (ifID->aa_ifp->if_type == IFT_ETHER ||
+               ifID->aa_ifp->if_type == IFT_L2VLAN ||
+               ifID->aa_ifp->if_type == IFT_IEEE8023ADLAG) {
                bcopy((char *)enet_header->src, src, sizeof(src));
 
 #ifdef COMMENT  /* In order to receive packets from the Blue Box, we cannot 
@@ -293,9 +295,9 @@ next:
                    (bcmp(src, ifID->xaddr, sizeof(src)) == 0)) {
                  /* Packet rejected: think it's a local mcast. */
                  m_freem(m);
-                 continue; /* was EAFNOSUPPORT */
+                 return; /* was EAFNOSUPPORT */
                }
-#endif COMMENT
+#endif /* COMMENT */
 
                llc_header = (llc_header_t *)(enet_header+1);
 
@@ -323,7 +325,7 @@ next:
                                    llc_header->protocol[4]);
 #endif
                            m_freem(m);
-                           continue; /* was EAFNOSUPPORT */
+                           return; /* was EAFNOSUPPORT */
                          }
                        }
                        MCHTYPE(m, MSG_DATA); /* set the mbuf type */
@@ -344,7 +346,5 @@ next:
 #endif
                        m_freem(m);
                }
-             }
        }
-       goto next;
-} /* atalkintr */
+}