Added `ds', a black-hole network interface.

This commit is contained in:
Garrett Wollman 1994-12-22 21:00:05 +00:00
parent d87bdc80f2
commit 59d8d13f60
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5191
5 changed files with 239 additions and 6 deletions

View File

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

View File

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

View File

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

View File

@ -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
View 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 *)&af;
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);
}