if_tun.c revision 1.39 1 /* $NetBSD: if_tun.c,v 1.39 2000/03/30 09:45:37 augustss Exp $ */
2
3 /*
4 * Copyright (c) 1988, Julian Onions <jpo (at) cs.nott.ac.uk>
5 * Nottingham University 1987.
6 *
7 * This source may be freely distributed, however I would be interested
8 * in any changes that are made.
9 *
10 * This driver takes packets off the IP i/f and hands them up to a
11 * user process to have its wicked way with. This driver has its
12 * roots in a similar driver written by Phil Cockcroft (formerly) at
13 * UCL. This driver is based much more on read/write/poll mode of
14 * operation though.
15 */
16
17 #include "tun.h"
18 #if NTUN > 0
19
20 #include "opt_inet.h"
21 #include "opt_ns.h"
22
23 #include <sys/param.h>
24 #include <sys/proc.h>
25 #include <sys/systm.h>
26 #include <sys/mbuf.h>
27 #include <sys/buf.h>
28 #include <sys/protosw.h>
29 #include <sys/socket.h>
30 #include <sys/ioctl.h>
31 #include <sys/errno.h>
32 #include <sys/syslog.h>
33 #include <sys/select.h>
34 #include <sys/poll.h>
35 #include <sys/file.h>
36 #include <sys/signalvar.h>
37 #include <sys/conf.h>
38
39 #include <machine/cpu.h>
40
41 #include <net/if.h>
42 #include <net/if_ether.h>
43 #include <net/netisr.h>
44 #include <net/route.h>
45
46
47 #ifdef INET
48 #include <netinet/in.h>
49 #include <netinet/in_systm.h>
50 #include <netinet/in_var.h>
51 #include <netinet/ip.h>
52 #include <netinet/if_inarp.h>
53 #endif
54
55 #ifdef NS
56 #include <netns/ns.h>
57 #include <netns/ns_if.h>
58 #endif
59
60 #include "bpfilter.h"
61 #if NBPFILTER > 0
62 #include <sys/time.h>
63 #include <net/bpf.h>
64 #endif
65
66 #include <net/if_tun.h>
67
68 #define TUNDEBUG if (tundebug) printf
69 int tundebug = 0;
70
71 struct tun_softc tunctl[NTUN];
72 extern int ifqmaxlen;
73 void tunattach __P((int));
74
75 int tun_ioctl __P((struct ifnet *, u_long, caddr_t));
76 int tun_output __P((struct ifnet *, struct mbuf *, struct sockaddr *,
77 struct rtentry *rt));
78
79 static void tuninit __P((struct tun_softc *));
80
81 void
82 tunattach(unused)
83 int unused;
84 {
85 int i;
86 struct ifnet *ifp;
87
88 for (i = 0; i < NTUN; i++) {
89 tunctl[i].tun_flags = TUN_INITED;
90
91 ifp = &tunctl[i].tun_if;
92 sprintf(ifp->if_xname, "tun%d", i);
93 ifp->if_softc = &tunctl[i];
94 ifp->if_mtu = TUNMTU;
95 ifp->if_ioctl = tun_ioctl;
96 ifp->if_output = tun_output;
97 ifp->if_flags = IFF_POINTOPOINT;
98 ifp->if_snd.ifq_maxlen = ifqmaxlen;
99 ifp->if_collisions = 0;
100 ifp->if_ierrors = 0;
101 ifp->if_oerrors = 0;
102 ifp->if_ipackets = 0;
103 ifp->if_opackets = 0;
104 if_attach(ifp);
105 #if NBPFILTER > 0
106 bpfattach(&tunctl[i].tun_bpf, ifp, DLT_NULL, sizeof(u_int32_t));
107 #endif
108 }
109 }
110
111 /*
112 * tunnel open - must be superuser & the device must be
113 * configured in
114 */
115 int
116 tunopen(dev, flag, mode, p)
117 dev_t dev;
118 int flag, mode;
119 struct proc *p;
120 {
121 struct ifnet *ifp;
122 struct tun_softc *tp;
123 int unit, error;
124
125 if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
126 return (error);
127
128 if ((unit = minor(dev)) >= NTUN)
129 return (ENXIO);
130 tp = &tunctl[unit];
131 if (tp->tun_flags & TUN_OPEN)
132 return ENXIO;
133 ifp = &tp->tun_if;
134 tp->tun_flags |= TUN_OPEN;
135 TUNDEBUG("%s: open\n", ifp->if_xname);
136 return (0);
137 }
138
139 /*
140 * tunclose - close the device - mark i/f down & delete
141 * routing info
142 */
143 int
144 tunclose(dev, flag, mode, p)
145 dev_t dev;
146 int flag;
147 int mode;
148 struct proc *p;
149 {
150 int unit = minor(dev), s;
151 struct tun_softc *tp = &tunctl[unit];
152 struct ifnet *ifp = &tp->tun_if;
153 struct mbuf *m;
154
155 tp->tun_flags &= ~TUN_OPEN;
156
157 /*
158 * junk all pending output
159 */
160 do {
161 s = splimp();
162 IF_DEQUEUE(&ifp->if_snd, m);
163 splx(s);
164 if (m)
165 m_freem(m);
166 } while (m);
167
168 if (ifp->if_flags & IFF_UP) {
169 s = splimp();
170 if_down(ifp);
171 if (ifp->if_flags & IFF_RUNNING) {
172 /* find internet addresses and delete routes */
173 struct ifaddr *ifa;
174 for (ifa = ifp->if_addrlist.tqh_first; ifa != 0;
175 ifa = ifa->ifa_list.tqe_next) {
176 #ifdef INET
177 if (ifa->ifa_addr->sa_family == AF_INET) {
178 rtinit(ifa, (int)RTM_DELETE,
179 tp->tun_flags & TUN_DSTADDR
180 ? RTF_HOST
181 : 0);
182 }
183 #endif
184 }
185 }
186 splx(s);
187 }
188 tp->tun_pgrp = 0;
189 selwakeup(&tp->tun_rsel);
190
191 TUNDEBUG ("%s: closed\n", ifp->if_xname);
192 return (0);
193 }
194
195 static void
196 tuninit(tp)
197 struct tun_softc *tp;
198 {
199 struct ifnet *ifp = &tp->tun_if;
200 struct ifaddr *ifa;
201
202 TUNDEBUG("%s: tuninit\n", ifp->if_xname);
203
204 ifp->if_flags |= IFF_UP | IFF_RUNNING;
205
206 tp->tun_flags &= ~(TUN_IASET|TUN_DSTADDR);
207 for (ifa = ifp->if_addrlist.tqh_first; ifa != 0;
208 ifa = ifa->ifa_list.tqe_next) {
209 #ifdef INET
210 if (ifa->ifa_addr->sa_family == AF_INET) {
211 struct sockaddr_in *sin;
212
213 sin = satosin(ifa->ifa_addr);
214 if (sin && sin->sin_addr.s_addr)
215 tp->tun_flags |= TUN_IASET;
216
217 if (ifp->if_flags & IFF_POINTOPOINT) {
218 sin = satosin(ifa->ifa_dstaddr);
219 if (sin && sin->sin_addr.s_addr)
220 tp->tun_flags |= TUN_DSTADDR;
221 }
222 }
223 #endif
224 }
225
226 return;
227 }
228
229 /*
230 * Process an ioctl request.
231 */
232 int
233 tun_ioctl(ifp, cmd, data)
234 struct ifnet *ifp;
235 u_long cmd;
236 caddr_t data;
237 {
238 int error = 0, s;
239
240 s = splimp();
241 switch(cmd) {
242 case SIOCSIFADDR:
243 tuninit((struct tun_softc *)(ifp->if_softc));
244 TUNDEBUG("%s: address set\n", ifp->if_xname);
245 break;
246 case SIOCSIFDSTADDR:
247 tuninit((struct tun_softc *)(ifp->if_softc));
248 TUNDEBUG("%s: destination address set\n", ifp->if_xname);
249 break;
250 case SIOCSIFBRDADDR:
251 TUNDEBUG("%s: broadcast address set\n", ifp->if_xname);
252 break;
253 case SIOCSIFMTU: {
254 struct ifreq *ifr = (struct ifreq *) data;
255 if (ifr->ifr_mtu > TUNMTU || ifr->ifr_mtu < 576) {
256 error = EINVAL;
257 break;
258 }
259 TUNDEBUG("%s: interface mtu set\n", ifp->if_xname);
260 ifp->if_mtu = ifr->ifr_mtu;
261 break;
262 }
263 case SIOCADDMULTI:
264 case SIOCDELMULTI: {
265 struct ifreq *ifr = (struct ifreq *) data;
266 if (ifr == 0) {
267 error = EAFNOSUPPORT; /* XXX */
268 break;
269 }
270 switch (ifr->ifr_addr.sa_family) {
271
272 #ifdef INET
273 case AF_INET:
274 break;
275 #endif
276
277 default:
278 error = EAFNOSUPPORT;
279 break;
280 }
281 break;
282 }
283 case SIOCSIFFLAGS:
284 break;
285 default:
286 error = EINVAL;
287 }
288 splx(s);
289 return (error);
290 }
291
292 /*
293 * tun_output - queue packets from higher level ready to put out.
294 */
295 int
296 tun_output(ifp, m0, dst, rt)
297 struct ifnet *ifp;
298 struct mbuf *m0;
299 struct sockaddr *dst;
300 struct rtentry *rt;
301 {
302 struct tun_softc *tp = ifp->if_softc;
303 struct proc *p;
304 #ifdef INET
305 int s;
306 #endif
307
308 TUNDEBUG ("%s: tun_output\n", ifp->if_xname);
309
310 if ((tp->tun_flags & TUN_READY) != TUN_READY) {
311 TUNDEBUG ("%s: not ready 0%o\n", ifp->if_xname,
312 tp->tun_flags);
313 m_freem (m0);
314 return (EHOSTDOWN);
315 }
316
317 #if NBPFILTER > 0
318 if (tp->tun_bpf) {
319 /*
320 * We need to prepend the address family as
321 * a four byte field. Cons up a dummy header
322 * to pacify bpf. This is safe because bpf
323 * will only read from the mbuf (i.e., it won't
324 * try to free it or keep a pointer to it).
325 */
326 struct mbuf m;
327 u_int32_t af = dst->sa_family;
328
329 m.m_next = m0;
330 m.m_len = sizeof(af);
331 m.m_data = (char *)⁡
332
333 bpf_mtap(tp->tun_bpf, &m);
334 }
335 #endif
336
337 switch(dst->sa_family) {
338 #ifdef INET
339 case AF_INET:
340 if (tp->tun_flags & TUN_PREPADDR) {
341 /* Simple link-layer header */
342 M_PREPEND(m0, dst->sa_len, M_DONTWAIT);
343 if (m0 == NULL) {
344 IF_DROP(&ifp->if_snd);
345 return (ENOBUFS);
346 }
347 bcopy(dst, mtod(m0, char *), dst->sa_len);
348 }
349 /* FALLTHROUGH */
350 case AF_UNSPEC:
351 s = splimp();
352 if (IF_QFULL(&ifp->if_snd)) {
353 IF_DROP(&ifp->if_snd);
354 m_freem(m0);
355 splx(s);
356 ifp->if_collisions++;
357 return (ENOBUFS);
358 }
359 IF_ENQUEUE(&ifp->if_snd, m0);
360 splx(s);
361 ifp->if_opackets++;
362 break;
363 #endif
364 default:
365 m_freem(m0);
366 return (EAFNOSUPPORT);
367 }
368
369 if (tp->tun_flags & TUN_RWAIT) {
370 tp->tun_flags &= ~TUN_RWAIT;
371 wakeup((caddr_t)tp);
372 }
373 if (tp->tun_flags & TUN_ASYNC && tp->tun_pgrp) {
374 if (tp->tun_pgrp > 0)
375 gsignal(tp->tun_pgrp, SIGIO);
376 else if ((p = pfind(-tp->tun_pgrp)) != NULL)
377 psignal(p, SIGIO);
378 }
379 selwakeup(&tp->tun_rsel);
380 return (0);
381 }
382
383 /*
384 * the cdevsw interface is now pretty minimal.
385 */
386 int
387 tunioctl(dev, cmd, data, flag, p)
388 dev_t dev;
389 u_long cmd;
390 caddr_t data;
391 int flag;
392 struct proc *p;
393 {
394 int unit = minor(dev), s;
395 struct tun_softc *tp = &tunctl[unit];
396
397 switch (cmd) {
398 case TUNSDEBUG:
399 tundebug = *(int *)data;
400 break;
401
402 case TUNGDEBUG:
403 *(int *)data = tundebug;
404 break;
405
406 case TUNSIFMODE:
407 switch (*(int *)data & (IFF_POINTOPOINT|IFF_BROADCAST)) {
408 case IFF_POINTOPOINT:
409 case IFF_BROADCAST:
410 s = splimp();
411 if (tp->tun_if.if_flags & IFF_UP) {
412 splx(s);
413 return (EBUSY);
414 }
415 tp->tun_if.if_flags &=
416 ~(IFF_BROADCAST|IFF_POINTOPOINT|IFF_MULTICAST);
417 tp->tun_if.if_flags |= *(int *)data;
418 splx(s);
419 break;
420 default:
421 return (EINVAL);
422 break;
423 }
424 break;
425
426 case TUNSLMODE:
427 if (*(int *)data)
428 tp->tun_flags |= TUN_PREPADDR;
429 else
430 tp->tun_flags &= ~TUN_PREPADDR;
431 break;
432
433 case FIONBIO:
434 if (*(int *)data)
435 tp->tun_flags |= TUN_NBIO;
436 else
437 tp->tun_flags &= ~TUN_NBIO;
438 break;
439
440 case FIOASYNC:
441 if (*(int *)data)
442 tp->tun_flags |= TUN_ASYNC;
443 else
444 tp->tun_flags &= ~TUN_ASYNC;
445 break;
446
447 case FIONREAD:
448 s = splimp();
449 if (tp->tun_if.if_snd.ifq_head)
450 *(int *)data = tp->tun_if.if_snd.ifq_head->m_pkthdr.len;
451 else
452 *(int *)data = 0;
453 splx(s);
454 break;
455
456 case TIOCSPGRP:
457 tp->tun_pgrp = *(int *)data;
458 break;
459
460 case TIOCGPGRP:
461 *(int *)data = tp->tun_pgrp;
462 break;
463
464 default:
465 return (ENOTTY);
466 }
467 return (0);
468 }
469
470 /*
471 * The cdevsw read interface - reads a packet at a time, or at
472 * least as much of a packet as can be read.
473 */
474 int
475 tunread(dev, uio, ioflag)
476 dev_t dev;
477 struct uio *uio;
478 int ioflag;
479 {
480 int unit = minor(dev);
481 struct tun_softc *tp = &tunctl[unit];
482 struct ifnet *ifp = &tp->tun_if;
483 struct mbuf *m, *m0;
484 int error=0, len, s;
485
486 TUNDEBUG ("%s: read\n", ifp->if_xname);
487 if ((tp->tun_flags & TUN_READY) != TUN_READY) {
488 TUNDEBUG ("%s: not ready 0%o\n", ifp->if_xname, tp->tun_flags);
489 return EHOSTDOWN;
490 }
491
492 tp->tun_flags &= ~TUN_RWAIT;
493
494 s = splimp();
495 do {
496 IF_DEQUEUE(&ifp->if_snd, m0);
497 if (m0 == 0) {
498 if (tp->tun_flags & TUN_NBIO) {
499 splx(s);
500 return (EWOULDBLOCK);
501 }
502 tp->tun_flags |= TUN_RWAIT;
503 if (tsleep((caddr_t)tp, PZERO|PCATCH, "tunread", 0)) {
504 splx(s);
505 return (EINTR);
506 }
507 }
508 } while (m0 == 0);
509 splx(s);
510
511 while (m0 && uio->uio_resid > 0 && error == 0) {
512 len = min(uio->uio_resid, m0->m_len);
513 if (len == 0)
514 break;
515 error = uiomove(mtod(m0, caddr_t), len, uio);
516 MFREE(m0, m);
517 m0 = m;
518 }
519
520 if (m0) {
521 TUNDEBUG("Dropping mbuf\n");
522 m_freem(m0);
523 }
524 if (error)
525 ifp->if_ierrors++;
526 return (error);
527 }
528
529 /*
530 * the cdevsw write interface - an atomic write is a packet - or else!
531 */
532 int
533 tunwrite(dev, uio, ioflag)
534 dev_t dev;
535 struct uio *uio;
536 int ioflag;
537 {
538 int unit = minor (dev);
539 struct tun_softc *tp = &tunctl[unit];
540 struct ifnet *ifp = &tp->tun_if;
541 struct mbuf *top, **mp, *m;
542 struct ifqueue *ifq;
543 struct sockaddr dst;
544 int isr, error=0, s, tlen, mlen;
545
546 TUNDEBUG("%s: tunwrite\n", ifp->if_xname);
547
548 if (tp->tun_flags & TUN_PREPADDR) {
549 if (uio->uio_resid < sizeof(dst))
550 return (EIO);
551 error = uiomove((caddr_t)&dst, sizeof(dst), uio);
552 if (dst.sa_len > sizeof(dst)) {
553 /* Duh.. */
554 char discard;
555 int n = dst.sa_len - sizeof(dst);
556 while (n--)
557 if ((error = uiomove(&discard, 1, uio)) != 0)
558 return (error);
559 }
560 } else {
561 #ifdef INET
562 dst.sa_family = AF_INET;
563 #endif
564 }
565
566 if (uio->uio_resid < 0 || uio->uio_resid > TUNMTU) {
567 TUNDEBUG("%s: len=%lu!\n", ifp->if_xname,
568 (unsigned long)uio->uio_resid);
569 return (EIO);
570 }
571
572 switch (dst.sa_family) {
573 #ifdef INET
574 case AF_INET:
575 ifq = &ipintrq;
576 isr = NETISR_IP;
577 break;
578 #endif
579 default:
580 return (EAFNOSUPPORT);
581 }
582
583 tlen = uio->uio_resid;
584
585 /* get a header mbuf */
586 MGETHDR(m, M_DONTWAIT, MT_DATA);
587 if (m == NULL)
588 return (ENOBUFS);
589 mlen = MHLEN;
590
591 top = 0;
592 mp = ⊤
593 while (error == 0 && uio->uio_resid > 0) {
594 m->m_len = min(mlen, uio->uio_resid);
595 error = uiomove(mtod (m, caddr_t), m->m_len, uio);
596 *mp = m;
597 mp = &m->m_next;
598 if (uio->uio_resid > 0) {
599 MGET (m, M_DONTWAIT, MT_DATA);
600 if (m == 0) {
601 error = ENOBUFS;
602 break;
603 }
604 mlen = MLEN;
605 }
606 }
607 if (error) {
608 if (top)
609 m_freem (top);
610 ifp->if_ierrors++;
611 return (error);
612 }
613
614 top->m_pkthdr.len = tlen;
615 top->m_pkthdr.rcvif = ifp;
616
617 #if NBPFILTER > 0
618 if (tp->tun_bpf) {
619 /*
620 * We need to prepend the address family as
621 * a four byte field. Cons up a dummy header
622 * to pacify bpf. This is safe because bpf
623 * will only read from the mbuf (i.e., it won't
624 * try to free it or keep a pointer to it).
625 */
626 struct mbuf m;
627 u_int32_t af = AF_INET;
628
629 m.m_next = top;
630 m.m_len = sizeof(af);
631 m.m_data = (char *)⁡
632
633 bpf_mtap(tp->tun_bpf, &m);
634 }
635 #endif
636
637 s = splimp();
638 if (IF_QFULL(ifq)) {
639 IF_DROP(ifq);
640 splx(s);
641 ifp->if_collisions++;
642 m_freem(top);
643 return (ENOBUFS);
644 }
645 IF_ENQUEUE(ifq, top);
646 splx(s);
647 ifp->if_ipackets++;
648 schednetisr(isr);
649 return (error);
650 }
651
652 /*
653 * tunpoll - the poll interface, this is only useful on reads
654 * really. The write detect always returns true, write never blocks
655 * anyway, it either accepts the packet or drops it.
656 */
657 int
658 tunpoll(dev, events, p)
659 dev_t dev;
660 int events;
661 struct proc *p;
662 {
663 int unit = minor(dev), s;
664 struct tun_softc *tp = &tunctl[unit];
665 struct ifnet *ifp = &tp->tun_if;
666 int revents = 0;
667
668 s = splimp();
669 TUNDEBUG("%s: tunpoll\n", ifp->if_xname);
670
671 if (events & (POLLIN | POLLRDNORM)) {
672 if (ifp->if_snd.ifq_len > 0) {
673 TUNDEBUG("%s: tunpoll q=%d\n", ifp->if_xname,
674 ifp->if_snd.ifq_len);
675 revents |= events & (POLLIN | POLLRDNORM);
676 } else {
677 TUNDEBUG("%s: tunpoll waiting\n", ifp->if_xname);
678 selrecord(p, &tp->tun_rsel);
679 }
680 }
681
682 if (events & (POLLOUT | POLLWRNORM))
683 revents |= events & (POLLOUT | POLLWRNORM);
684
685 splx(s);
686 return (revents);
687 }
688
689 #endif /* NTUN */
690