Deleted Added
full compact
if_tap.c (87914) if_tap.c (90227)
1/*
2 * Copyright (C) 1999-2000 by Maksim Yevmenkin <m_evmenkin@yahoo.com>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

26 * BASED ON:
27 * -------------------------------------------------------------------------
28 *
29 * Copyright (c) 1988, Julian Onions <jpo@cs.nott.ac.uk>
30 * Nottingham University 1987.
31 */
32
33/*
1/*
2 * Copyright (C) 1999-2000 by Maksim Yevmenkin <m_evmenkin@yahoo.com>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

26 * BASED ON:
27 * -------------------------------------------------------------------------
28 *
29 * Copyright (c) 1988, Julian Onions <jpo@cs.nott.ac.uk>
30 * Nottingham University 1987.
31 */
32
33/*
34 * $FreeBSD: head/sys/net/if_tap.c 87914 2001-12-14 19:32:47Z jlemon $
34 * $FreeBSD: head/sys/net/if_tap.c 90227 2002-02-05 02:00:56Z dillon $
35 * $Id: if_tap.c,v 0.21 2000/07/23 21:46:02 max Exp $
36 */
37
38#include "opt_inet.h"
39
40#include <sys/param.h>
41#include <sys/conf.h>
42#include <sys/filedesc.h>

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

763static int
764tapread(dev, uio, flag)
765 dev_t dev;
766 struct uio *uio;
767 int flag;
768{
769 struct tap_softc *tp = dev->si_drv1;
770 struct ifnet *ifp = &tp->tap_if;
35 * $Id: if_tap.c,v 0.21 2000/07/23 21:46:02 max Exp $
36 */
37
38#include "opt_inet.h"
39
40#include <sys/param.h>
41#include <sys/conf.h>
42#include <sys/filedesc.h>

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

763static int
764tapread(dev, uio, flag)
765 dev_t dev;
766 struct uio *uio;
767 int flag;
768{
769 struct tap_softc *tp = dev->si_drv1;
770 struct ifnet *ifp = &tp->tap_if;
771 struct mbuf *m = NULL, *m0 = NULL;
771 struct mbuf *m = NULL;
772 int error = 0, len, s;
773
774 TAPDEBUG("%s%d reading, minor = %#x\n",
775 ifp->if_name, ifp->if_unit, minor(dev));
776
777 if ((tp->tap_flags & TAP_READY) != TAP_READY) {
778 TAPDEBUG("%s%d not ready. minor = %#x, tap_flags = 0x%x\n",
779 ifp->if_name, ifp->if_unit, minor(dev), tp->tap_flags);
780
781 return (EHOSTDOWN);
782 }
783
784 tp->tap_flags &= ~TAP_RWAIT;
785
786 /* sleep until we get a packet */
787 do {
788 s = splimp();
772 int error = 0, len, s;
773
774 TAPDEBUG("%s%d reading, minor = %#x\n",
775 ifp->if_name, ifp->if_unit, minor(dev));
776
777 if ((tp->tap_flags & TAP_READY) != TAP_READY) {
778 TAPDEBUG("%s%d not ready. minor = %#x, tap_flags = 0x%x\n",
779 ifp->if_name, ifp->if_unit, minor(dev), tp->tap_flags);
780
781 return (EHOSTDOWN);
782 }
783
784 tp->tap_flags &= ~TAP_RWAIT;
785
786 /* sleep until we get a packet */
787 do {
788 s = splimp();
789 IF_DEQUEUE(&ifp->if_snd, m0);
789 IF_DEQUEUE(&ifp->if_snd, m);
790 splx(s);
791
790 splx(s);
791
792 if (m0 == NULL) {
792 if (m == NULL) {
793 if (flag & IO_NDELAY)
794 return (EWOULDBLOCK);
795
796 tp->tap_flags |= TAP_RWAIT;
797 error = tsleep((caddr_t)tp,PCATCH|(PZERO+1),"taprd",0);
798 if (error)
799 return (error);
800 }
793 if (flag & IO_NDELAY)
794 return (EWOULDBLOCK);
795
796 tp->tap_flags |= TAP_RWAIT;
797 error = tsleep((caddr_t)tp,PCATCH|(PZERO+1),"taprd",0);
798 if (error)
799 return (error);
800 }
801 } while (m0 == NULL);
801 } while (m == NULL);
802
803 /* feed packet to bpf */
804 if (ifp->if_bpf != NULL)
802
803 /* feed packet to bpf */
804 if (ifp->if_bpf != NULL)
805 bpf_mtap(ifp, m0);
805 bpf_mtap(ifp, m);
806
807 /* xfer packet to user space */
806
807 /* xfer packet to user space */
808 while ((m0 != NULL) && (uio->uio_resid > 0) && (error == 0)) {
809 len = min(uio->uio_resid, m0->m_len);
808 while ((m != NULL) && (uio->uio_resid > 0) && (error == 0)) {
809 len = min(uio->uio_resid, m->m_len);
810 if (len == 0)
811 break;
812
810 if (len == 0)
811 break;
812
813 error = uiomove(mtod(m0, caddr_t), len, uio);
814 MFREE(m0, m);
815 m0 = m;
813 error = uiomove(mtod(m, caddr_t), len, uio);
814 m = m_free(m);
816 }
817
815 }
816
818 if (m0 != NULL) {
817 if (m != NULL) {
819 TAPDEBUG("%s%d dropping mbuf, minor = %#x\n", ifp->if_name,
820 ifp->if_unit, minor(dev));
818 TAPDEBUG("%s%d dropping mbuf, minor = %#x\n", ifp->if_name,
819 ifp->if_unit, minor(dev));
821 m_freem(m0);
820 m_freem(m);
822 }
823
824 return (error);
825} /* tapread */
826
827
828/*
829 * tapwrite

--- 118 unchanged lines hidden ---
821 }
822
823 return (error);
824} /* tapread */
825
826
827/*
828 * tapwrite

--- 118 unchanged lines hidden ---