[BACK]Return to if_enc.c CVS log [TXT][DIR] Up to [local] / sys / net

Annotation of sys/net/if_enc.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_enc.c,v 1.46 2007/05/26 17:13:30 jason Exp $       */
                      2: /*
                      3:  * The authors of this code are John Ioannidis (ji@tla.org),
                      4:  * Angelos D. Keromytis (kermit@csd.uch.gr) and
                      5:  * Niels Provos (provos@physnet.uni-hamburg.de).
                      6:  *
                      7:  * This code was written by John Ioannidis for BSD/OS in Athens, Greece,
                      8:  * in November 1995.
                      9:  *
                     10:  * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
                     11:  * by Angelos D. Keromytis.
                     12:  *
                     13:  * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
                     14:  * and Niels Provos.
                     15:  *
                     16:  * Copyright (C) 1995, 1996, 1997, 1998 by John Ioannidis, Angelos D. Keromytis
                     17:  * and Niels Provos.
                     18:  * Copyright (c) 2001, Angelos D. Keromytis.
                     19:  *
                     20:  * Permission to use, copy, and modify this software with or without fee
                     21:  * is hereby granted, provided that this entire notice is included in
                     22:  * all copies of any software which is or includes a copy or
                     23:  * modification of this software.
                     24:  * You may use this code under the GNU public license if you so wish. Please
                     25:  * contribute changes back to the authors under this freer than GPL license
                     26:  * so that we may further the use of strong encryption without limitations to
                     27:  * all.
                     28:  *
                     29:  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
                     30:  * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
                     31:  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
                     32:  * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
                     33:  * PURPOSE.
                     34:  */
                     35:
                     36: /*
                     37:  * Encapsulation interface driver.
                     38:  */
                     39:
                     40: #include <sys/param.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/mbuf.h>
                     43: #include <sys/socket.h>
                     44: #include <sys/ioctl.h>
                     45:
                     46: #include <net/if.h>
                     47: #include <net/if_types.h>
                     48: #include <net/route.h>
                     49: #include <net/bpf.h>
                     50:
                     51: #include <net/if_enc.h>
                     52:
                     53: #ifdef INET
                     54: #include <netinet/in.h>
                     55: #include <netinet/in_var.h>
                     56: #endif
                     57:
                     58: #ifdef INET6
                     59: #ifndef INET
                     60: #include <netinet/in.h>
                     61: #endif
                     62: #include <netinet6/nd6.h>
                     63: #endif /* INET6 */
                     64:
                     65: #include "bpfilter.h"
                     66: #include "enc.h"
                     67:
                     68: #ifdef ENCDEBUG
                     69: #define DPRINTF(x)    do { if (encdebug) printf x ; } while (0)
                     70: #else
                     71: #define DPRINTF(x)
                     72: #endif
                     73:
                     74: struct enc_softc encif[NENC];
                     75:
                     76: void   encattach(int);
                     77: int    encoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
                     78:            struct rtentry *);
                     79: int    encioctl(struct ifnet *, u_long, caddr_t);
                     80: void   encstart(struct ifnet *);
                     81:
                     82: void
                     83: encattach(int nenc)
                     84: {
                     85:        struct ifnet *ifp;
                     86:        int i;
                     87:
                     88:        bzero(encif, sizeof(encif));
                     89:
                     90:        for (i = 0; i < NENC; i++) {
                     91:                ifp = &encif[i].sc_if;
                     92:                snprintf(ifp->if_xname, sizeof ifp->if_xname, "enc%d", i);
                     93:                ifp->if_softc = &encif[i];
                     94:                ifp->if_mtu = ENCMTU;
                     95:                ifp->if_ioctl = encioctl;
                     96:                ifp->if_output = encoutput;
                     97:                ifp->if_start = encstart;
                     98:                ifp->if_type = IFT_ENC;
                     99:                ifp->if_snd.ifq_maxlen = ifqmaxlen;
                    100:                ifp->if_hdrlen = ENC_HDRLEN;
                    101:                if_attach(ifp);
                    102:                if_alloc_sadl(ifp);
                    103:
                    104: #if NBPFILTER > 0
                    105:                bpfattach(&encif[i].sc_if.if_bpf, ifp, DLT_ENC, ENC_HDRLEN);
                    106: #endif
                    107:        }
                    108: }
                    109:
                    110: /*
                    111:  * Start output on the enc interface.
                    112:  */
                    113: void
                    114: encstart(struct ifnet *ifp)
                    115: {
                    116:        struct mbuf *m;
                    117:        int s;
                    118:
                    119:        for (;;) {
                    120:                s = splnet();
                    121:                IF_DROP(&ifp->if_snd);
                    122:                IF_DEQUEUE(&ifp->if_snd, m);
                    123:                splx(s);
                    124:
                    125:                if (m == NULL)
                    126:                        return;
                    127:                else
                    128:                        m_freem(m);
                    129:        }
                    130: }
                    131:
                    132: int
                    133: encoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
                    134:     struct rtentry *rt)
                    135: {
                    136:        m_freem(m);
                    137:        return (0);
                    138: }
                    139:
                    140: /* ARGSUSED */
                    141: int
                    142: encioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
                    143: {
                    144:        switch (cmd) {
                    145:        case SIOCSIFADDR:
                    146:        case SIOCAIFADDR:
                    147:        case SIOCSIFDSTADDR:
                    148:        case SIOCSIFFLAGS:
                    149:                if (ifp->if_flags & IFF_UP)
                    150:                        ifp->if_flags |= IFF_RUNNING;
                    151:                else
                    152:                        ifp->if_flags &= ~IFF_RUNNING;
                    153:                break;
                    154:        default:
                    155:                return (EINVAL);
                    156:        }
                    157:
                    158:        return 0;
                    159: }

CVSweb