]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netat/drv_dep.c
xnu-792.17.14.tar.gz
[apple/xnu.git] / bsd / netat / drv_dep.c
index 8cb5e1483e575d893bdff5aacc1b1e40c8912de6..5fb70325a7c0795d3a485348dc076e3f6987c09c 100644 (file)
@@ -1,16 +1,19 @@
 /*
  * Copyright (c) 2000 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 1994 Apple Computer, Inc.
@@ -71,6 +74,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 */
@@ -89,6 +94,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;
@@ -117,6 +123,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. */
@@ -211,7 +220,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++;
        }
@@ -219,44 +230,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 */
@@ -268,7 +265,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 */
@@ -278,13 +275,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 
@@ -294,9 +293,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);
 
@@ -324,7 +323,7 @@ next:
                                    llc_header->protocol[4]);
 #endif
                            m_freem(m);
-                           continue; /* was EAFNOSUPPORT */
+                           return; /* was EAFNOSUPPORT */
                          }
                        }
                        MCHTYPE(m, MSG_DATA); /* set the mbuf type */
@@ -345,7 +344,5 @@ next:
 #endif
                        m_freem(m);
                }
-             }
        }
-       goto next;
-} /* atalkintr */
+}