Annotation of XNU/bsd/netat/drv_dep.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * Copyright 1994 Apple Computer, Inc.
                     24:  * All Rights Reserved.
                     25:  *
                     26:  * Tuyen A. Nguyen. (December 5, 1994)
                     27:  *   Modified, March 17, 1997 by Tuyen Nguyen for MacOSX.
                     28:  */
                     29: 
                     30: #include <sys/errno.h>
                     31: #include <sys/types.h>
                     32: #include <sys/param.h>
                     33: #include <machine/spl.h>
                     34: #include <sys/systm.h>
                     35: #include <sys/kernel.h>
                     36: #include <sys/proc.h>
                     37: #include <sys/filedesc.h>
                     38: #include <sys/fcntl.h>
                     39: #include <sys/mbuf.h>
                     40: #include <sys/ioctl.h>
                     41: #include <sys/malloc.h>
                     42: #include <sys/socket.h>
                     43: #include <sys/socketvar.h>
                     44: #include <sys/sockio.h>
                     45: 
                     46: #include <net/if.h>
                     47: #include <net/if_types.h>
                     48: #include <net/if_dl.h>
                     49: #include <net/etherdefs.h>
                     50: #include <net/ethernet.h>
                     51: #include <net/tokendefs.h>
                     52: 
                     53: #include <netat/sysglue.h>
                     54: #include <netat/appletalk.h>
                     55: #include <netat/at_pcb.h>
                     56: #include <netat/at_var.h>
                     57: #include <netat/ddp.h>
                     58: #include <netat/at_aarp.h>
                     59: #include <netat/at_pat.h>
                     60: #include <netat/debug.h>
                     61: 
                     62: #define DSAP_SNAP 0xaa
                     63: 
                     64: extern void gref_init(), atp_init(), atp_link(), atp_unlink();
                     65: 
                     66: extern int adspInited;
                     67: 
                     68: static llc_header_t    snap_hdr_at = SNAP_HDR_AT;
                     69: static llc_header_t    snap_hdr_aarp = SNAP_HDR_AARP;
                     70: static unsigned char snap_proto_ddp[5] = SNAP_PROTO_AT;
                     71: static unsigned char snap_proto_aarp[5] = SNAP_PROTO_AARP;
                     72: 
                     73: int pktsIn, pktsOut;
                     74: 
                     75: struct ifqueue atalkintrq;     /* appletalk and aarp packet input queue */
                     76: 
                     77: short appletalk_inited = 0;
                     78: 
                     79: extern atlock_t 
                     80:        ddpall_lock, ddpinp_lock, arpinp_lock, refall_lock, nve_lock,
                     81:        aspall_lock, asptmo_lock, atpall_lock, atptmo_lock, atpgen_lock;
                     82: 
                     83: extern int (*sys_ATsocket )(), (*sys_ATgetmsg)(), (*sys_ATputmsg)();
                     84: extern int (*sys_ATPsndreq)(), (*sys_ATPsndrsp)();
                     85: extern int (*sys_ATPgetreq)(), (*sys_ATPgetrsp)();
                     86: 
                     87: void atalk_load()
                     88: {
                     89:        extern int _ATsocket(), _ATgetmsg(), _ATputmsg();
                     90:        extern int _ATPsndreq(), _ATPsndrsp(), _ATPgetreq(), _ATPgetrsp();
                     91: 
                     92:        sys_ATsocket  = _ATsocket;
                     93:        sys_ATgetmsg  = _ATgetmsg;
                     94:        sys_ATputmsg  = _ATputmsg;
                     95:        sys_ATPsndreq = _ATPsndreq;
                     96:        sys_ATPsndrsp = _ATPsndrsp;
                     97:        sys_ATPgetreq = _ATPgetreq;
                     98:        sys_ATPgetrsp = _ATPgetrsp;
                     99: 
                    100:        ATLOCKINIT(ddpall_lock);
                    101:        ATLOCKINIT(ddpinp_lock);
                    102:        ATLOCKINIT(arpinp_lock);
                    103:        ATLOCKINIT(refall_lock);
                    104:        ATLOCKINIT(aspall_lock);
                    105:        ATLOCKINIT(asptmo_lock);
                    106:        ATLOCKINIT(atpall_lock);
                    107:        ATLOCKINIT(atptmo_lock);
                    108:        ATLOCKINIT(atpgen_lock);
                    109:        ATLOCKINIT(nve_lock);
                    110: 
                    111:        atp_init();
                    112:        atp_link();
                    113:        adspInited = 0;
                    114: 
                    115: /*     adsp_init(); 
                    116:                for 2225395
                    117:                this happens in adsp_open and is undone on ADSP_UNLINK 
                    118: */
                    119: } /* atalk_load */
                    120: 
                    121: /* Undo everything atalk_load() did. */
                    122: void atalk_unload()  /* not currently used */
                    123: {
                    124:        extern gbuf_t *scb_resource_m;
                    125:        extern gbuf_t *atp_resource_m;
                    126: 
                    127:        sys_ATsocket  = 0;
                    128:        sys_ATgetmsg  = 0;
                    129:        sys_ATputmsg  = 0;
                    130:        sys_ATPsndreq = 0;
                    131:        sys_ATPsndrsp = 0;
                    132:        sys_ATPgetreq = 0;
                    133:        sys_ATPgetrsp = 0;
                    134: 
                    135:        atp_unlink();
                    136: 
                    137: #ifdef NOT_YET
                    138:        if (scb_resource_m) { 
                    139:                gbuf_freem(scb_resource_m);
                    140:                scb_resource_m = 0;
                    141:                scb_free_list = 0;
                    142:        }
                    143:        /* allocated in atp_trans_alloc() */
                    144:        if (atp_resource_m) {
                    145:                gbuf_freem(atp_resource_m);
                    146:                atp_resource_m = 0;
                    147:                atp_trans_free_list = 0;
                    148:        }
                    149: #endif
                    150: 
                    151:        appletalk_inited = 0;
                    152: } /* atalk_unload */
                    153: 
                    154: void appletalk_hack_start()
                    155: {
                    156:        if (!appletalk_inited) {
                    157:                atalk_load();
                    158:                atalkintrq.ifq_maxlen = IFQ_MAXLEN; 
                    159:                appletalk_inited = 1;
                    160:        }
                    161: } /* appletalk_hack_start */
                    162: 
                    163: int pat_output(patp, mlist, dst_addr, type)
                    164:        at_ifaddr_t *patp;
                    165:        struct mbuf *mlist;                     /* packet chain */
                    166:        unsigned char *dst_addr;
                    167:        int     type;
                    168: {
                    169:        struct mbuf *m, *m1;
                    170:        llc_header_t *llc_header;
                    171:        struct sockaddr dst;
                    172: 
                    173:        if (! patp->aa_ifp) {
                    174:                for (m = mlist; m; m = mlist) {
                    175:                        mlist = m->m_nextpkt;
                    176:                        m->m_nextpkt = 0;
                    177:                        m_freem(m);
                    178:                }
                    179:                return ENOTREADY;
                    180:        }
                    181: 
                    182:        /* this is for ether_output */
                    183:        dst.sa_family = AF_APPLETALK;
                    184:        dst.sa_len = 2 + sizeof(struct etalk_addr);
                    185:        bcopy (dst_addr, &dst.sa_data[0], sizeof(struct etalk_addr)); 
                    186: 
                    187:        /* packet chains are used on output and can be tested using aufs */
                    188:        for (m = mlist; m; m = mlist) {
                    189:                mlist = m->m_nextpkt;
                    190:                m->m_nextpkt = 0;
                    191: 
                    192:                M_PREPEND(m, sizeof(llc_header_t), M_DONTWAIT)
                    193:                if (m == 0) {
                    194:                        continue;
                    195:                }
                    196: 
                    197:                llc_header = mtod(m, llc_header_t *);
                    198:                *llc_header = 
                    199:                  (type == AARP_AT_TYPE) ? snap_hdr_aarp : snap_hdr_at;
                    200: 
                    201:                for (m->m_pkthdr.len = 0, m1 = m; m1; m1 = m1->m_next)
                    202:                        m->m_pkthdr.len += m1->m_len;
                    203:                m->m_pkthdr.rcvif = 0;
                    204: 
                    205:                /* *** Note: AT is sending out mbufs of type MSG_DATA,
                    206:                   not MT_DATA.  *** */
                    207: #ifdef APPLETALK_DEBUG
                    208:                if (m->m_next && 
                    209:                    !((m->m_next)->m_flags & M_EXT))
                    210:                        kprintf("po: mlen= %d, m2len= %d\n", m->m_len, 
                    211:                                (m->m_next)->m_len);
                    212: #endif
                    213:                dlil_output(patp->at_dl_tag, m, NULL, &dst, 0);
                    214: 
                    215:                pktsOut++;
                    216:        }
                    217: 
                    218:        return 0;
                    219: } /* pat_output */
                    220: 
                    221: void atalkintr()
                    222: {
                    223:        struct mbuf *m, *m1, *mlist = NULL;
                    224:        struct ifnet *ifp;
                    225:        int s;
                    226:        llc_header_t *llc_header;
                    227:        at_ifaddr_t *ifID;
                    228:        char src[6];
                    229:        enet_header_t *enet_header;
                    230:                
                    231: next:
                    232:        s = splimp();
                    233:        IF_DEQUEUE(&atalkintrq, m);
                    234:        splx(s);        
                    235: 
                    236:        if (m == 0) 
                    237:                return; 
                    238: 
                    239:        for ( ; m ; m = mlist) {
                    240:          mlist = m->m_nextpkt;
                    241: #ifdef APPLETALK_DEBUG
                    242:          /* packet chains are not yet in use on input */
                    243:          if (mlist) kprintf("atalkintr: packet chain\n");
                    244: #endif
                    245:          m->m_nextpkt = 0;
                    246: 
                    247:          if (!appletalk_inited) {
                    248:                m_freem(m);
                    249:                continue;
                    250:          }
                    251: 
                    252:          if ((m->m_flags & M_PKTHDR) == 0) {
                    253: #ifdef APPLETALK_DEBUG
                    254:                 kprintf("atalkintr: no HDR on packet received");
                    255: #endif
                    256:                m_freem(m);
                    257:                continue;
                    258:          }
                    259: 
                    260:          /* make sure the interface this packet was received on is configured
                    261:             for AppleTalk */
                    262:          ifp = m->m_pkthdr.rcvif;
                    263:          TAILQ_FOREACH(ifID, &at_ifQueueHd, aa_link) {
                    264:                if (ifID->aa_ifp && (ifID->aa_ifp == ifp)) 
                    265:                        break;
                    266:          }
                    267:          /* if we didn't find a matching interface */
                    268:          if (!ifID) {
                    269:                m_freem(m);
                    270:                continue; /* was EAFNOSUPPORT */
                    271:          }
                    272: 
                    273:          /* make sure the entire packet header is in the current mbuf */
                    274:          if (m->m_len < ENET_LLC_SIZE &&
                    275:              (m = m_pullup(m, ENET_LLC_SIZE)) == 0) {
                    276: #ifdef APPLETALK_DEBUG
                    277:                kprintf("atalkintr: packet too small\n");
                    278: #endif
                    279:                m_freem(m);
                    280:                continue;
                    281:          }
                    282:          enet_header = mtod(m, enet_header_t *);
                    283: 
                    284:          /* Ignore multicast packets from local station */
                    285:          /* *** Note: code for IFTYPE_TOKENTALK may be needed here. *** */
                    286:          if (ifID->aa_ifp->if_type == IFT_ETHER) {
                    287:                bcopy((char *)enet_header->src, src, sizeof(src));
                    288: 
                    289: #ifdef COMMENT  /* In order to receive packets from the Blue Box, we cannot 
                    290:                   reject packets whose source address matches our local address.
                    291:                */
                    292:                if ((enet_header->dst[0] & 1) && 
                    293:                    (bcmp(src, ifID->xaddr, sizeof(src)) == 0)) {
                    294:                  /* Packet rejected: think it's a local mcast. */
                    295:                  m_freem(m);
                    296:                  continue; /* was EAFNOSUPPORT */
                    297:                }
                    298: #endif COMMENT
                    299: 
                    300:                llc_header = (llc_header_t *)(enet_header+1);
                    301: 
                    302:                /* advance the mbuf pointers past the ethernet header */
                    303:                m->m_data += ENET_LLC_SIZE;
                    304:                m->m_len -= ENET_LLC_SIZE;
                    305: 
                    306:                pktsIn++;
                    307: 
                    308:                if (LLC_PROTO_EQUAL(llc_header->protocol,snap_proto_aarp)) {
                    309:                        (void)aarp_rcv_pkt(mtod(m, aarp_pkt_t *), ifID);
                    310:                        m_freem(m);
                    311:                } 
                    312:                else if (LLC_PROTO_EQUAL(llc_header->protocol, snap_proto_ddp)) {
                    313:                        /* if we're a router take all pkts */
                    314:                        if (!ROUTING_MODE) {
                    315:                          if (aarp_chk_addr(mtod(m, at_ddp_t  *), ifID)
                    316:                              == AARP_ERR_NOT_OURS) {
                    317: #ifdef APPLETALK_DEBUG
                    318:                            kprintf("pat_input: Packet Rejected: not for us? dest=%x.%x.%x.%x.%x.%x LLC_PROTO= %02x%02x\n",
                    319:                                    enet_header->dst[0], enet_header->dst[1], 
                    320:                                    enet_header->dst[2], enet_header->dst[3], 
                    321:                                    enet_header->dst[4], enet_header->dst[5], 
                    322:                                    llc_header->protocol[3],
                    323:                                    llc_header->protocol[4]);
                    324: #endif
                    325:                            m_freem(m);
                    326:                            continue; /* was EAFNOSUPPORT */
                    327:                          }
                    328:                        }
                    329:                        MCHTYPE(m, MSG_DATA); /* set the mbuf type */
                    330: 
                    331:                        ifID->stats.rcv_packets++;
                    332:                        for (m1 = m; m1; m1 = m1->m_next)
                    333:                                ifID->stats.rcv_bytes += m1->m_len;
                    334: 
                    335:                        if (!MULTIPORT_MODE)
                    336:                                ddp_glean(m, ifID, src);
                    337: 
                    338:                        ddp_input(m, ifID);
                    339:                } else {
                    340: #ifdef APPLETALK_DEBUG
                    341:                        kprintf("pat_input: Packet Rejected: wrong LLC_PROTO = %02x%02x\n",
                    342:                                llc_header->protocol[3],
                    343:                                llc_header->protocol[4]);
                    344: #endif
                    345:                        m_freem(m);
                    346:                }
                    347:              }
                    348:        }
                    349:        goto next;
                    350: } /* atalkintr */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.