Added `ds', a black-hole network interface.
This commit is contained in:
parent
d87bdc80f2
commit
59d8d13f60
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5191
@ -2,7 +2,7 @@
|
||||
# LINT -- config file for checking all the sources, tries to pull in
|
||||
# as much of the source tree as it can.
|
||||
#
|
||||
# $Id: LINT,v 1.119 1994/12/17 08:06:01 jkh Exp $
|
||||
# $Id: LINT,v 1.120 1994/12/17 08:37:22 jkh Exp $
|
||||
#
|
||||
# NB: You probably don't want to try running a kernel built from this
|
||||
# file. Instead, you should start from GENERIC, and add options from
|
||||
@ -146,13 +146,17 @@ options TPCONS #ISO TP class 0 over X.25
|
||||
# aware of the legal and administrative consequences of enabling this
|
||||
# option. The number of devices determines the maximum number of
|
||||
# simultaneous BPF clients programs runnable.
|
||||
# The `disc' pseudo-device implements a minimal network interface,
|
||||
# which throws away all packets sent and never receives any. It is
|
||||
# included for testing purposes.
|
||||
#
|
||||
pseudo-device ether #Generic Ethernet
|
||||
pseudo-device sppp #Generic Synchronous PPP
|
||||
pseudo-device loop #Network loop back device
|
||||
pseudo-device loop #Network loopback device
|
||||
pseudo-device sl 2 #Serial Line IP
|
||||
pseudo-device ppp 2 #Point-to-point protocol
|
||||
pseudo-device bpfilter 4 #Berkeley packet filter
|
||||
pseudo-device disc #Discard device
|
||||
|
||||
options NSIP #XNS over IP
|
||||
options EON #ISO CLNP over IP
|
||||
|
@ -139,6 +139,7 @@ msdosfs/msdosfs_vnops.c optional msdosfs
|
||||
net/bpf.c optional bpfilter
|
||||
net/bpf_filter.c optional bpfilter
|
||||
net/if.c standard
|
||||
net/if_disc.c optional disc
|
||||
net/if_ethersubr.c optional ether
|
||||
net/if_loop.c optional loop
|
||||
net/if_ppp.c optional ppp
|
||||
|
@ -2,7 +2,7 @@
|
||||
# LINT -- config file for checking all the sources, tries to pull in
|
||||
# as much of the source tree as it can.
|
||||
#
|
||||
# $Id: LINT,v 1.119 1994/12/17 08:06:01 jkh Exp $
|
||||
# $Id: LINT,v 1.120 1994/12/17 08:37:22 jkh Exp $
|
||||
#
|
||||
# NB: You probably don't want to try running a kernel built from this
|
||||
# file. Instead, you should start from GENERIC, and add options from
|
||||
@ -146,13 +146,17 @@ options TPCONS #ISO TP class 0 over X.25
|
||||
# aware of the legal and administrative consequences of enabling this
|
||||
# option. The number of devices determines the maximum number of
|
||||
# simultaneous BPF clients programs runnable.
|
||||
# The `disc' pseudo-device implements a minimal network interface,
|
||||
# which throws away all packets sent and never receives any. It is
|
||||
# included for testing purposes.
|
||||
#
|
||||
pseudo-device ether #Generic Ethernet
|
||||
pseudo-device sppp #Generic Synchronous PPP
|
||||
pseudo-device loop #Network loop back device
|
||||
pseudo-device loop #Network loopback device
|
||||
pseudo-device sl 2 #Serial Line IP
|
||||
pseudo-device ppp 2 #Point-to-point protocol
|
||||
pseudo-device bpfilter 4 #Berkeley packet filter
|
||||
pseudo-device disc #Discard device
|
||||
|
||||
options NSIP #XNS over IP
|
||||
options EON #ISO CLNP over IP
|
||||
|
@ -2,7 +2,7 @@
|
||||
# LINT -- config file for checking all the sources, tries to pull in
|
||||
# as much of the source tree as it can.
|
||||
#
|
||||
# $Id: LINT,v 1.119 1994/12/17 08:06:01 jkh Exp $
|
||||
# $Id: LINT,v 1.120 1994/12/17 08:37:22 jkh Exp $
|
||||
#
|
||||
# NB: You probably don't want to try running a kernel built from this
|
||||
# file. Instead, you should start from GENERIC, and add options from
|
||||
@ -146,13 +146,17 @@ options TPCONS #ISO TP class 0 over X.25
|
||||
# aware of the legal and administrative consequences of enabling this
|
||||
# option. The number of devices determines the maximum number of
|
||||
# simultaneous BPF clients programs runnable.
|
||||
# The `disc' pseudo-device implements a minimal network interface,
|
||||
# which throws away all packets sent and never receives any. It is
|
||||
# included for testing purposes.
|
||||
#
|
||||
pseudo-device ether #Generic Ethernet
|
||||
pseudo-device sppp #Generic Synchronous PPP
|
||||
pseudo-device loop #Network loop back device
|
||||
pseudo-device loop #Network loopback device
|
||||
pseudo-device sl 2 #Serial Line IP
|
||||
pseudo-device ppp 2 #Point-to-point protocol
|
||||
pseudo-device bpfilter 4 #Berkeley packet filter
|
||||
pseudo-device disc #Discard device
|
||||
|
||||
options NSIP #XNS over IP
|
||||
options EON #ISO CLNP over IP
|
||||
|
220
sys/net/if_disc.c
Normal file
220
sys/net/if_disc.c
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* From: @(#)if_loop.c 8.1 (Berkeley) 6/10/93
|
||||
* $Id: if_loop.c,v 1.6 1994/08/08 12:07:25 davidg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
* Discard interface driver for protocol testing and timing.
|
||||
* (Based on the loopback.)
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/time.h>
|
||||
#include <machine/cpu.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_types.h>
|
||||
#include <net/netisr.h>
|
||||
#include <net/route.h>
|
||||
#include <net/bpf.h>
|
||||
|
||||
#ifdef INET
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/in_var.h>
|
||||
#include <netinet/ip.h>
|
||||
#endif
|
||||
|
||||
#ifdef NS
|
||||
#include <netns/ns.h>
|
||||
#include <netns/ns_if.h>
|
||||
#endif
|
||||
|
||||
#ifdef ISO
|
||||
#include <netiso/iso.h>
|
||||
#include <netiso/iso_var.h>
|
||||
#endif
|
||||
|
||||
#include "bpfilter.h"
|
||||
|
||||
#ifdef TINY_DSMTU
|
||||
#define DSMTU (1024+512)
|
||||
#else
|
||||
#define DSMTU 65532
|
||||
#endif
|
||||
|
||||
static struct ifnet dsif;
|
||||
static int dsoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
|
||||
struct rtentry *);
|
||||
static int dsioctl(struct ifnet *, int, caddr_t);
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
discattach(void)
|
||||
{
|
||||
register struct ifnet *ifp = &dsif;
|
||||
|
||||
ifp->if_name = "ds";
|
||||
ifp->if_mtu = DSMTU;
|
||||
ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
|
||||
ifp->if_ioctl = dsioctl;
|
||||
ifp->if_output = dsoutput;
|
||||
ifp->if_type = IFT_LOOP;
|
||||
ifp->if_hdrlen = 0;
|
||||
ifp->if_addrlen = 0;
|
||||
if_attach(ifp);
|
||||
#if NBPFILTER > 0
|
||||
bpfattach(&ifp->if_bpf, ifp, DLT_NULL, sizeof(u_int));
|
||||
#endif
|
||||
}
|
||||
|
||||
TEXT_SET(pseudo_set, discattach);
|
||||
|
||||
static int
|
||||
dsoutput(ifp, m, dst, rt)
|
||||
struct ifnet *ifp;
|
||||
register struct mbuf *m;
|
||||
struct sockaddr *dst;
|
||||
register struct rtentry *rt;
|
||||
{
|
||||
int s, isr;
|
||||
register struct ifqueue *ifq = 0;
|
||||
|
||||
if ((m->m_flags & M_PKTHDR) == 0)
|
||||
panic("dsoutput no HDR");
|
||||
ifp->if_lastchange = time;
|
||||
#if NBPFILTER > 0
|
||||
if (dsif.if_bpf) {
|
||||
/*
|
||||
* We need to prepend the address family as
|
||||
* a four byte field. Cons up a dummy header
|
||||
* to pacify bpf. This is safe because bpf
|
||||
* will only read from the mbuf (i.e., it won't
|
||||
* try to free it or keep a pointer a to it).
|
||||
*/
|
||||
struct mbuf m0;
|
||||
u_int af = dst->sa_family;
|
||||
|
||||
m0.m_next = m;
|
||||
m0.m_len = 4;
|
||||
m0.m_data = (char *)⁡
|
||||
|
||||
bpf_mtap(dsif.if_bpf, &m0);
|
||||
}
|
||||
#endif
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
|
||||
if (rt && rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) {
|
||||
m_freem(m);
|
||||
return (rt->rt_flags & RTF_BLACKHOLE ? 0 :
|
||||
rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
|
||||
}
|
||||
ifp->if_opackets++;
|
||||
ifp->if_obytes += m->m_pkthdr.len;
|
||||
|
||||
m_freem(m);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
dsrtrequest(cmd, rt, sa)
|
||||
int cmd;
|
||||
struct rtentry *rt;
|
||||
struct sockaddr *sa;
|
||||
{
|
||||
if (rt)
|
||||
rt->rt_rmx.rmx_mtu = DSMTU;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process an ioctl request.
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
int
|
||||
dsioctl(ifp, cmd, data)
|
||||
register struct ifnet *ifp;
|
||||
int cmd;
|
||||
caddr_t data;
|
||||
{
|
||||
register struct ifaddr *ifa;
|
||||
register struct ifreq *ifr = (struct ifreq *)data;
|
||||
register int error = 0;
|
||||
|
||||
switch (cmd) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
ifp->if_flags |= IFF_UP;
|
||||
ifa = (struct ifaddr *)data;
|
||||
if (ifa != 0)
|
||||
ifa->ifa_rtrequest = dsrtrequest;
|
||||
/*
|
||||
* Everything else is done at a higher level.
|
||||
*/
|
||||
break;
|
||||
|
||||
case SIOCADDMULTI:
|
||||
case SIOCDELMULTI:
|
||||
if (ifr == 0) {
|
||||
error = EAFNOSUPPORT; /* XXX */
|
||||
break;
|
||||
}
|
||||
switch (ifr->ifr_addr.sa_family) {
|
||||
|
||||
#ifdef INET
|
||||
case AF_INET:
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
error = EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SIOCSIFMTU:
|
||||
ifp->if_mtu = ifr->ifr_mtu;
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
}
|
||||
return (error);
|
||||
}
|
Loading…
Reference in New Issue
Block a user