Annotation of kernel/bsd/net/if_fddisubr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
                     26: /*
                     27:  * Copyright (c) 1982, 1989, 1993
                     28:  *     The Regents of the University of California.  All rights reserved.
                     29:  *
                     30:  * The NEXTSTEP Software License Agreement specifies the terms
                     31:  * and conditions for redistribution.
                     32:  *
                     33:  */
                     34: 
                     35: #include <sys/param.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/kernel.h>
                     38: #include <sys/malloc.h>
                     39: #include <sys/mbuf.h>
                     40: #include <sys/protosw.h>
                     41: #include <sys/socket.h>
                     42: #include <sys/ioctl.h>
                     43: #include <sys/errno.h>
                     44: #include <sys/syslog.h>
                     45: 
                     46: #include <machine/cpu.h>
                     47: 
                     48: #include <net/if.h>
                     49: #include <net/netisr.h>
                     50: #include <net/route.h>
                     51: #include <net/if_llc.h>
                     52: #include <net/if_dl.h>
                     53: #include <net/if_types.h>
                     54: 
                     55: #if INET
                     56: #include <netinet/in.h>
                     57: #include <netinet/in_var.h>
                     58: #endif
                     59: #include <netinet/if_ether.h>
                     60: #include <netinet/if_fddi.h>
                     61: 
                     62: #if NS
                     63: #include <netns/ns.h>
                     64: #include <netns/ns_if.h>
                     65: #endif
                     66: 
                     67: #if DECNET
                     68: #include <netdnet/dn.h>
                     69: #endif
                     70: 
                     71: #if defined(ISO) && notyet
                     72: #include <netiso/argo_debug.h>
                     73: #include <netiso/iso.h>
                     74: #include <netiso/iso_var.h>
                     75: #include <netiso/iso_snpac.h>
                     76: #endif /* defined(ISO) && notyet */
                     77: 
                     78: #include "bpfilter.h"
                     79: 
                     80: #if LLC
                     81: #include <netccitt/dll.h>
                     82: #include <netccitt/llc_var.h>
                     83: #endif
                     84: 
                     85: #if defined(LLC) && defined(CCITT)
                     86: extern struct ifqueue pkintrq;
                     87: #endif
                     88: 
                     89: #define senderr(e) { error = (e); goto bad;}
                     90: 
                     91: /*
                     92:  * This really should be defined in if_llc.h but in case it isn't.
                     93:  */
                     94: #ifndef llc_snap
                     95: #define        llc_snap        llc_un.type_snap
                     96: #endif
                     97: 
                     98: /*
                     99:  * FDDI output routine.
                    100:  * Encapsulate a packet of type family for the local net.
                    101:  * Use trailer local net encapsulation if enough data in first
                    102:  * packet leaves a multiple of 512 bytes of data in remainder.
                    103:  * Assumes that ifp is actually pointer to arpcom structure.
                    104:  */
                    105: int
                    106: fddi_output(ifp, m0, dst, rt0)
                    107:        register struct ifnet *ifp;
                    108:        struct mbuf *m0;
                    109:        struct sockaddr *dst;
                    110:        struct rtentry *rt0;
                    111: {
                    112:        short type;
                    113:        int s, error = 0;
                    114:        u_char edst[6];
                    115:        register struct mbuf *m = m0;
                    116:        register struct rtentry *rt;
                    117:        struct mbuf *mcopy = (struct mbuf *)0;
                    118:        register struct fddi_header *fh;
                    119:        struct arpcom *ac = (struct arpcom *)ifp;
                    120: 
                    121:        if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
                    122:                senderr(ENETDOWN);
                    123:        ifp->if_lastchange = time;
                    124:        if (rt = rt0) {
                    125:                if ((rt->rt_flags & RTF_UP) == 0) {
                    126:                        if (rt0 = rt = rtalloc1(dst, 1))
                    127:                                rt->rt_refcnt--;
                    128:                        else
                    129:                                senderr(EHOSTUNREACH);
                    130:                }
                    131:                if (rt->rt_flags & RTF_GATEWAY) {
                    132:                        if (rt->rt_gwroute == 0)
                    133:                                goto lookup;
                    134:                        if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
                    135:                                rtfree(rt); rt = rt0;
                    136:                        lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1);
                    137:                                if ((rt = rt->rt_gwroute) == 0)
                    138:                                        senderr(EHOSTUNREACH);
                    139:                        }
                    140:                }
                    141:                if (rt->rt_flags & RTF_REJECT)
                    142:                        if (rt->rt_rmx.rmx_expire == 0 ||
                    143:                            time.tv_sec < rt->rt_rmx.rmx_expire)
                    144:                                senderr(rt == rt0 ? EHOSTDOWN : EHOSTUNREACH);
                    145:        }
                    146:        switch (dst->sa_family) {
                    147: 
                    148: #if INET
                    149:        case AF_INET:
                    150:                if (!arpresolve(ac, rt, m, dst, edst))
                    151:                        return (0);     /* if not yet resolved */
                    152:                /* If broadcasting on a simplex interface, loopback a copy */
                    153:                if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX))
                    154:                        mcopy = m_copy(m, 0, (int)M_COPYALL);
                    155:                type = ETHERTYPE_IP;
                    156:                break;
                    157: #endif
                    158: #if NS
                    159:        case AF_NS:
                    160:                type = ETHERTYPE_NS;
                    161:                bcopy((caddr_t)&(((struct sockaddr_ns *)dst)->sns_addr.x_host),
                    162:                    (caddr_t)edst, sizeof (edst));
                    163:                if (!bcmp((caddr_t)edst, (caddr_t)&ns_thishost, sizeof(edst)))
                    164:                        return (looutput(ifp, m, dst, rt));
                    165:                /* If broadcasting on a simplex interface, loopback a copy */
                    166:                if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX))
                    167:                        mcopy = m_copy(m, 0, (int)M_COPYALL);
                    168:                break;
                    169: #endif
                    170: #if defined(ISO) && notyet
                    171:        case AF_ISO: {
                    172:                int     snpalen;
                    173:                struct  llc *l;
                    174:                register struct sockaddr_dl *sdl;
                    175: 
                    176:                if (rt && (sdl = (struct sockaddr_dl *)rt->rt_gateway) &&
                    177:                    sdl->sdl_family == AF_LINK && sdl->sdl_alen > 0) {
                    178:                        bcopy(LLADDR(sdl), (caddr_t)edst, sizeof(edst));
                    179:                } else if (error =
                    180:                            iso_snparesolve(ifp, (struct sockaddr_iso *)dst,
                    181:                                            (char *)edst, &snpalen))
                    182:                        goto bad; /* Not Resolved */
                    183:                /* If broadcasting on a simplex interface, loopback a copy */
                    184:                if (*edst & 1)
                    185:                        m->m_flags |= (M_BCAST|M_MCAST);
                    186:                if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX) &&
                    187:                    (mcopy = m_copy(m, 0, (int)M_COPYALL))) {
                    188:                        M_PREPEND(mcopy, sizeof (*fh), M_DONTWAIT);
                    189:                        if (mcopy) {
                    190:                                fh = mtod(mcopy, struct fddi_header *);
                    191:                                bcopy((caddr_t)edst,
                    192:                                      (caddr_t)fh->fddi_dhost, sizeof (edst));
                    193:                                bcopy((caddr_t)ac->ac_enaddr,
                    194:                                      (caddr_t)fh->fddi_shost, sizeof (edst));
                    195:                        }
                    196:                }
                    197:                M_PREPEND(m, 3, M_DONTWAIT);
                    198:                if (m == NULL)
                    199:                        return (0);
                    200:                type = 0;
                    201:                l = mtod(m, struct llc *);
                    202:                l->llc_dsap = l->llc_ssap = LLC_ISO_LSAP;
                    203:                l->llc_control = LLC_UI;
                    204:                IFDEBUG(D_ETHER)
                    205:                        int i;
                    206:                        printf("unoutput: sending pkt to: ");
                    207:                        for (i=0; i<6; i++)
                    208:                                printf("%x ", edst[i] & 0xff);
                    209:                        printf("\n");
                    210:                ENDDEBUG
                    211:                } break;
                    212: #endif /* defined(ISO) && notyet */
                    213: #if    LLC
                    214: /*     case AF_NSAP: */
                    215:        case AF_CCITT: {
                    216:                register struct sockaddr_dl *sdl =
                    217:                        (struct sockaddr_dl *) rt -> rt_gateway;
                    218: 
                    219:                if (sdl && sdl->sdl_family == AF_LINK
                    220:                    && sdl->sdl_alen > 0) {
                    221:                        bcopy(LLADDR(sdl), (char *)edst,
                    222:                                sizeof(edst));
                    223:                } else goto bad; /* Not a link interface ? Funny ... */
                    224:                if ((ifp->if_flags & IFF_SIMPLEX) && (*edst & 1) &&
                    225:                    (mcopy = m_copy(m, 0, (int)M_COPYALL))) {
                    226:                        M_PREPEND(mcopy, sizeof (*fh), M_DONTWAIT);
                    227:                        if (mcopy) {
                    228:                                fh = mtod(mcopy, struct fddi_header *);
                    229:                                bcopy((caddr_t)edst,
                    230:                                      (caddr_t)fh->fddi_dhost, sizeof (edst));
                    231:                                bcopy((caddr_t)ac->ac_enaddr,
                    232:                                      (caddr_t)fh->fddi_shost, sizeof (edst));
                    233:                                fh->fddi_fc = FDDIFC_LLC_ASYNC|FDDIFC_LLC_PRIO4;
                    234:                        }
                    235:                }
                    236:                type = 0;
                    237: #if LLC_DEBUG
                    238:                {
                    239:                        int i;
                    240:                        register struct llc *l = mtod(m, struct llc *);
                    241: 
                    242:                        printf("fddi_output: sending LLC2 pkt to: ");
                    243:                        for (i=0; i<6; i++)
                    244:                                printf("%x ", edst[i] & 0xff);
                    245:                        printf(" len 0x%x dsap 0x%x ssap 0x%x control 0x%x\n",
                    246:                               type & 0xff, l->llc_dsap & 0xff, l->llc_ssap &0xff,
                    247:                               l->llc_control & 0xff);
                    248: 
                    249:                }
                    250: #endif /* LLC_DEBUG */
                    251:                } break;
                    252: #endif /* LLC */
                    253: 
                    254:        case AF_UNSPEC:
                    255:        {
                    256:                struct ether_header *eh;
                    257:                eh = (struct ether_header *)dst->sa_data;
                    258:                (void)memcpy((caddr_t)edst, (caddr_t)eh->ether_dhost, sizeof (edst));
                    259:                if (*edst & 1)
                    260:                        m->m_flags |= (M_BCAST|M_MCAST);
                    261:                type = eh->ether_type;
                    262:                break;
                    263:        }
                    264: 
                    265: #if NBPFILTER > 0
                    266:        case AF_IMPLINK:
                    267:        {
                    268:                fh = mtod(m, struct fddi_header *);
                    269:                error = EPROTONOSUPPORT;
                    270:                switch (fh->fddi_fc & (FDDIFC_C|FDDIFC_L|FDDIFC_F)) {
                    271:                        case FDDIFC_LLC_ASYNC: {
                    272:                                /* legal priorities are 0 through 7 */
                    273:                                if ((fh->fddi_fc & FDDIFC_Z) > 7)
                    274:                                        goto bad;
                    275:                                break;
                    276:                        }
                    277:                        case FDDIFC_LLC_SYNC: {
                    278:                                /* FDDIFC_Z bits reserved, must be zero */
                    279:                                if (fh->fddi_fc & FDDIFC_Z)
                    280:                                        goto bad;
                    281:                                break;
                    282:                        }
                    283:                        case FDDIFC_SMT: {
                    284:                                /* FDDIFC_Z bits must be non zero */
                    285:                                if ((fh->fddi_fc & FDDIFC_Z) == 0)
                    286:                                        goto bad;
                    287:                                break;
                    288:                        }
                    289:                        default: {
                    290:                                /* anything else is too dangerous */
                    291:                                        goto bad;
                    292:                        }
                    293:                }
                    294:                error = 0;
                    295:                if (fh->fddi_dhost[0] & 1)
                    296:                        m->m_flags |= (M_BCAST|M_MCAST);
                    297:                goto queue_it;
                    298:        }
                    299: #endif
                    300:        default:
                    301:                printf("%s%d: can't handle af%d\n", ifp->if_name, ifp->if_unit,
                    302:                        dst->sa_family);
                    303:                senderr(EAFNOSUPPORT);
                    304:        }
                    305: 
                    306: 
                    307:        if (mcopy)
                    308:                (void) looutput(ifp, mcopy, dst, rt);
                    309:        if (type != 0) {
                    310:                register struct llc *l;
                    311:                M_PREPEND(m, sizeof (struct llc), M_DONTWAIT);
                    312:                if (m == 0)
                    313:                        senderr(ENOBUFS);
                    314:                l = mtod(m, struct llc *);
                    315:                l->llc_control = LLC_UI;
                    316:                l->llc_dsap = l->llc_ssap = LLC_SNAP_LSAP;
                    317:                l->llc_snap.org_code[0] = l->llc_snap.org_code[1] = l->llc_snap.org_code[2] = 0;
                    318:                type = ntohs(type);
                    319:                (void)memcpy((caddr_t) &l->llc_snap.ether_type, (caddr_t) &type,
                    320:                        sizeof(u_short));
                    321:        }
                    322:        /*
                    323:         * Add local net header.  If no space in first mbuf,
                    324:         * allocate another.
                    325:         */
                    326:        M_PREPEND(m, sizeof (struct fddi_header), M_DONTWAIT);
                    327:        if (m == 0)
                    328:                senderr(ENOBUFS);
                    329:        fh = mtod(m, struct fddi_header *);
                    330:        fh->fddi_fc = FDDIFC_LLC_ASYNC|FDDIFC_LLC_PRIO4;
                    331:        (void)memcpy((caddr_t)fh->fddi_dhost, (caddr_t)edst, sizeof (edst));
                    332:   queue_it:
                    333:        (void)memcpy((caddr_t)fh->fddi_shost, (caddr_t)ac->ac_enaddr,
                    334:            sizeof(fh->fddi_shost));
                    335:        s = splimp();
                    336:        /*
                    337:         * Queue message on interface, and start output if interface
                    338:         * not yet active.
                    339:         */
                    340:        if (IF_QFULL(&ifp->if_snd)) {
                    341:                IF_DROP(&ifp->if_snd);
                    342:                splx(s);
                    343:                senderr(ENOBUFS);
                    344:        }
                    345:        ifp->if_obytes += m->m_pkthdr.len;
                    346:        IF_ENQUEUE(&ifp->if_snd, m);
                    347:        if ((ifp->if_flags & IFF_OACTIVE) == 0)
                    348:                (*ifp->if_start)(ifp);
                    349:        splx(s);
                    350:        if (m->m_flags & M_MCAST)
                    351:                ifp->if_omcasts++;
                    352:        return (error);
                    353: 
                    354: bad:
                    355:        if (m)
                    356:                m_freem(m);
                    357:        return (error);
                    358: }
                    359: 
                    360: /*
                    361:  * Process a received FDDI packet;
                    362:  * the packet is in the mbuf chain m without
                    363:  * the fddi header, which is provided separately.
                    364:  */
                    365: void
                    366: fddi_input(ifp, fh, m)
                    367:        struct ifnet *ifp;
                    368:        register struct fddi_header *fh;
                    369:        struct mbuf *m;
                    370: {
                    371:        register struct ifqueue *inq;
                    372:        register struct llc *l;
                    373:        int s;
                    374: 
                    375:        if ((ifp->if_flags & IFF_UP) == 0) {
                    376:                m_freem(m);
                    377:                return;
                    378:        }
                    379:        ifp->if_lastchange = time;
                    380:        ifp->if_ibytes += m->m_pkthdr.len + sizeof (*fh);
                    381:        if (bcmp((caddr_t)fddibroadcastaddr, (caddr_t)fh->fddi_dhost,
                    382:            sizeof(fddibroadcastaddr)) == 0)
                    383:                m->m_flags |= M_BCAST;
                    384:        else if (fh->fddi_dhost[0] & 1)
                    385:                m->m_flags |= M_MCAST;
                    386:        if (m->m_flags & (M_BCAST|M_MCAST))
                    387:                ifp->if_imcasts++;
                    388: 
                    389:        l = mtod(m, struct llc *);
                    390:        switch (l->llc_dsap) {
                    391: #if defined(INET) || defined(NS) || defined(DECNET)
                    392:        case LLC_SNAP_LSAP:
                    393:        {
                    394:                unsigned fddi_type;
                    395:                if (l->llc_control != LLC_UI || l->llc_ssap != LLC_SNAP_LSAP)
                    396:                        goto dropanyway;
                    397:                if (l->llc_snap.org_code[0] != 0 || l->llc_snap.org_code[1] != 0|| l->llc_snap.org_code[2] != 0)
                    398:                        goto dropanyway;
                    399:                fddi_type = ntohs(l->llc_snap.ether_type);
                    400:                m_adj(m, 8);
                    401:                switch (fddi_type) {
                    402: #if INET
                    403:                case ETHERTYPE_IP:
                    404:                        schednetisr(NETISR_IP);
                    405:                        inq = &ipintrq;
                    406:                        break;
                    407: 
                    408:                case ETHERTYPE_ARP:
                    409:                        schednetisr(NETISR_ARP);
                    410:                        inq = &arpintrq;
                    411:                        break;
                    412: #endif
                    413: #if NS
                    414:                case ETHERTYPE_NS:
                    415:                        schednetisr(NETISR_NS);
                    416:                        inq = &nsintrq;
                    417:                        break;
                    418: #endif
                    419: #if DECNET
                    420:                case ETHERTYPE_DECENT:
                    421:                        schednetisr(NETISR_DECNET);
                    422:                        inq = &decnetintrq;
                    423:                        break;
                    424: #endif
                    425:                default:
                    426:                        printf("fddi_input: unknown protocol 0x%x\n", fddi_type);
                    427:                        ifp->if_noproto++;
                    428:                        goto dropanyway;
                    429:                }
                    430:                break;
                    431:        }
                    432: #endif /* INET || NS */
                    433: #if defined(ISO) && notyet
                    434:        case LLC_ISO_LSAP:
                    435:                switch (l->llc_control) {
                    436:                case LLC_UI:
                    437:                        /* LLC_UI_P forbidden in class 1 service */
                    438:                        if ((l->llc_dsap == LLC_ISO_LSAP) &&
                    439:                            (l->llc_ssap == LLC_ISO_LSAP)) {
                    440:                                /* LSAP for ISO */
                    441:                                m->m_data += 3;         /* XXX */
                    442:                                m->m_len -= 3;          /* XXX */
                    443:                                m->m_pkthdr.len -= 3;   /* XXX */
                    444:                                M_PREPEND(m, sizeof *fh, M_DONTWAIT);
                    445:                                if (m == 0)
                    446:                                        return;
                    447:                                *mtod(m, struct fddi_header *) = *fh;
                    448:                                IFDEBUG(D_ETHER)
                    449:                                        printf("clnp packet");
                    450:                                ENDDEBUG
                    451:                                schednetisr(NETISR_ISO);
                    452:                                inq = &clnlintrq;
                    453:                                break;
                    454:                        }
                    455:                        goto dropanyway;
                    456: 
                    457:                case LLC_XID:
                    458:                case LLC_XID_P:
                    459:                        if(m->m_len < 6)
                    460:                                goto dropanyway;
                    461:                        l->llc_window = 0;
                    462:                        l->llc_fid = 9;
                    463:                        l->llc_class = 1;
                    464:                        l->llc_dsap = l->llc_ssap = 0;
                    465:                        /* Fall through to */
                    466:                case LLC_TEST:
                    467:                case LLC_TEST_P:
                    468:                {
                    469:                        struct sockaddr sa;
                    470:                        register struct ether_header *eh2;
                    471:                        int i;
                    472:                        u_char c = l->llc_dsap;
                    473: 
                    474:                        l->llc_dsap = l->llc_ssap;
                    475:                        l->llc_ssap = c;
                    476:                        if (m->m_flags & (M_BCAST | M_MCAST))
                    477:                                bcopy((caddr_t)ac->ac_enaddr,
                    478:                                      (caddr_t)eh->ether_dhost, 6);
                    479:                        sa.sa_family = AF_UNSPEC;
                    480:                        sa.sa_len = sizeof(sa);
                    481:                        eh2 = (struct ether_header *)sa.sa_data;
                    482:                        for (i = 0; i < 6; i++) {
                    483:                                eh2->ether_shost[i] = c = eh->fddi_dhost[i];
                    484:                                eh2->ether_dhost[i] =
                    485:                                        eh->ether_dhost[i] = eh->fddi_shost[i];
                    486:                                eh2->ether_shost[i] = c;
                    487:                        }
                    488:                        eh2->ether_type = 0;
                    489:                        ifp->if_output(ifp, m, &sa, NULL);
                    490:                        return;
                    491:                }
                    492:                default:
                    493:                        m_freem(m);
                    494:                        return;
                    495:                }
                    496:                break;
                    497: #endif /* defined(ISO) && notyet */
                    498: #if LLC
                    499:        case LLC_X25_LSAP:
                    500:        {
                    501:                M_PREPEND(m, sizeof(struct sdl_hdr) , M_DONTWAIT);
                    502:                if (m == 0)
                    503:                        return;
                    504:                if ( !sdl_sethdrif(ifp, fh->fddi_shost, LLC_X25_LSAP,
                    505:                                    fh->fddi_dhost, LLC_X25_LSAP, 6,
                    506:                                    mtod(m, struct sdl_hdr *)))
                    507:                        panic("ETHER cons addr failure");
                    508:                mtod(m, struct sdl_hdr *)->sdlhdr_len = m->m_pkthdr.len - sizeof(struct sdl_hdr);
                    509: #if LLC_DEBUG
                    510:                printf("llc packet\n");
                    511: #endif /* LLC_DEBUG */
                    512:                schednetisr(NETISR_CCITT);
                    513:                inq = &llcintrq;
                    514:                break;
                    515:        }
                    516: #endif /* LLC */
                    517: 
                    518:        default:
                    519:                printf("fddi_input: unknown dsap 0x%x\n", l->llc_dsap);
                    520:                ifp->if_noproto++;
                    521:        dropanyway:
                    522:                m_freem(m);
                    523:                return;
                    524:        }
                    525: 
                    526:        s = splimp();
                    527:        if (IF_QFULL(inq)) {
                    528:                IF_DROP(inq);
                    529:                m_freem(m);
                    530:        } else
                    531:                IF_ENQUEUE(inq, m);
                    532:        splx(s);
                    533: }
                    534: /*
                    535:  * Perform common duties while attaching to interface list
                    536:  */
                    537: void
                    538: fddi_ifattach(ifp)
                    539:        register struct ifnet *ifp;
                    540: {
                    541:        register struct ifaddr *ifa;
                    542:        register struct sockaddr_dl *sdl;
                    543: 
                    544:        ifp->if_type = IFT_FDDI;
                    545:        ifp->if_addrlen = 6;
                    546:        ifp->if_hdrlen = 21;
                    547:        ifp->if_mtu = FDDIMTU;
                    548:        for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next)
                    549:                if ((sdl = (struct sockaddr_dl *)ifa->ifa_addr) &&
                    550:                    sdl->sdl_family == AF_LINK) {
                    551:                        sdl->sdl_type = IFT_FDDI;
                    552:                        sdl->sdl_alen = ifp->if_addrlen;
                    553:                        bcopy((caddr_t)((struct arpcom *)ifp)->ac_enaddr,
                    554:                              LLADDR(sdl), ifp->if_addrlen);
                    555:                        break;
                    556:                }
                    557: }

unix.superglobalmegacorp.com

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