Deleted Added
full compact
if_tun.c (83805) if_tun.c (90227)
1/* $NetBSD: if_tun.c,v 1.14 1994/06/29 06:36:25 cgd Exp $ */
2
3/*
4 * Copyright (c) 1988, Julian Onions <jpo@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 it's
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 *
1/* $NetBSD: if_tun.c,v 1.14 1994/06/29 06:36:25 cgd Exp $ */
2
3/*
4 * Copyright (c) 1988, Julian Onions <jpo@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 it's
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 * $FreeBSD: head/sys/net/if_tun.c 83805 2001-09-21 22:46:54Z jhb $
16 * $FreeBSD: head/sys/net/if_tun.c 90227 2002-02-05 02:00:56Z dillon $
17 */
18
19#include "opt_inet.h"
20
21#include <sys/param.h>
22#include <sys/proc.h>
23#include <sys/systm.h>
24#include <sys/mbuf.h>

--- 606 unchanged lines hidden (view full) ---

631 * The cdevsw read interface - reads a packet at a time, or at
632 * least as much of a packet as can be read.
633 */
634static int
635tunread(dev_t dev, struct uio *uio, int flag)
636{
637 struct tun_softc *tp = dev->si_drv1;
638 struct ifnet *ifp = &tp->tun_if;
17 */
18
19#include "opt_inet.h"
20
21#include <sys/param.h>
22#include <sys/proc.h>
23#include <sys/systm.h>
24#include <sys/mbuf.h>

--- 606 unchanged lines hidden (view full) ---

631 * The cdevsw read interface - reads a packet at a time, or at
632 * least as much of a packet as can be read.
633 */
634static int
635tunread(dev_t dev, struct uio *uio, int flag)
636{
637 struct tun_softc *tp = dev->si_drv1;
638 struct ifnet *ifp = &tp->tun_if;
639 struct mbuf *m, *m0;
639 struct mbuf *m;
640 int error=0, len, s;
641
642 TUNDEBUG ("%s%d: read\n", ifp->if_name, ifp->if_unit);
643 if ((tp->tun_flags & TUN_READY) != TUN_READY) {
644 TUNDEBUG ("%s%d: not ready 0%o\n", ifp->if_name,
645 ifp->if_unit, tp->tun_flags);
646 return EHOSTDOWN;
647 }
648
649 tp->tun_flags &= ~TUN_RWAIT;
650
651 s = splimp();
652 do {
640 int error=0, len, s;
641
642 TUNDEBUG ("%s%d: read\n", ifp->if_name, ifp->if_unit);
643 if ((tp->tun_flags & TUN_READY) != TUN_READY) {
644 TUNDEBUG ("%s%d: not ready 0%o\n", ifp->if_name,
645 ifp->if_unit, tp->tun_flags);
646 return EHOSTDOWN;
647 }
648
649 tp->tun_flags &= ~TUN_RWAIT;
650
651 s = splimp();
652 do {
653 IF_DEQUEUE(&ifp->if_snd, m0);
654 if (m0 == 0) {
653 IF_DEQUEUE(&ifp->if_snd, m);
654 if (m == NULL) {
655 if (flag & IO_NDELAY) {
656 splx(s);
657 return EWOULDBLOCK;
658 }
659 tp->tun_flags |= TUN_RWAIT;
660 if((error = tsleep((caddr_t)tp, PCATCH | (PZERO + 1),
661 "tunread", 0)) != 0) {
662 splx(s);
663 return error;
664 }
665 }
655 if (flag & IO_NDELAY) {
656 splx(s);
657 return EWOULDBLOCK;
658 }
659 tp->tun_flags |= TUN_RWAIT;
660 if((error = tsleep((caddr_t)tp, PCATCH | (PZERO + 1),
661 "tunread", 0)) != 0) {
662 splx(s);
663 return error;
664 }
665 }
666 } while (m0 == 0);
666 } while (m == NULL);
667 splx(s);
668
667 splx(s);
668
669 while (m0 && uio->uio_resid > 0 && error == 0) {
670 len = min(uio->uio_resid, m0->m_len);
669 while (m && uio->uio_resid > 0 && error == 0) {
670 len = min(uio->uio_resid, m->m_len);
671 if (len != 0)
671 if (len != 0)
672 error = uiomove(mtod(m0, caddr_t), len, uio);
673 MFREE(m0, m);
674 m0 = m;
672 error = uiomove(mtod(m, caddr_t), len, uio);
673 m = m_free(m);
675 }
676
674 }
675
677 if (m0) {
676 if (m) {
678 TUNDEBUG("%s%d: Dropping mbuf\n", ifp->if_name, ifp->if_unit);
677 TUNDEBUG("%s%d: Dropping mbuf\n", ifp->if_name, ifp->if_unit);
679 m_freem(m0);
678 m_freem(m);
680 }
681 return error;
682}
683
684/*
685 * the cdevsw write interface - an atomic write is a packet - or else!
686 */
687static int

--- 133 unchanged lines hidden ---
679 }
680 return error;
681}
682
683/*
684 * the cdevsw write interface - an atomic write is a packet - or else!
685 */
686static int

--- 133 unchanged lines hidden ---