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 --- |