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