Retire synchronous PPP kernel driver sppp(4).

The last two drivers that required sppp are cp(4) and ce(4).

These devices are still produced and can be purchased
at Cronyx <http://cronyx.ru/hardware/wan.html>.

Since Roman Kurakin <rik@FreeBSD.org> has quit them, they no
longer support FreeBSD officially.  Later they have dropped
support for Linux drivers to.  As of mid-2020 they don't even
have a developer to maintain their Windows driver.  However,
their support verbally told me that they could provide aid to
a FreeBSD developer with documentaion in case if there appears
a new customer for their devices.

These drivers have a feature to not use sppp(4) and create an
interface, but instead expose the device as netgraph(4) node.
Then, you can attach ng_ppp(4) with help of ports/net/mpd5 on
top of the node and get your synchronous PPP.  Alternatively
you can attach ng_frame_relay(4) or ng_cisco(4) for HDLC.
Actually, last time I used cp(4) back in 2004, using netgraph(4)
instead of sppp(4) was already the right way to do.

Thus, remove the sppp(4) related part of the drivers and enable
by default the negraph(4) part.  Further maintenance of these
drivers in the tree shouldn't be a big deal.

While doing that, remove some cruft and enable cp(4) compilation
on amd64.  The ce(4) for some unknown reason marks its internal
DDK functions with __attribute__ fastcall, which most likely is
safe to remove, but without hardware I'm not going to do that, so
ce(4) remains i386-only.

Reviewed by:		emaste, imp, donner
Differential Revision:	https://reviews.freebsd.org/D32590
See also:		https://reviews.freebsd.org/D23928
This commit is contained in:
Gleb Smirnoff 2021-10-20 21:08:13 -07:00
parent a23e18ea54
commit 6aae3517ed
47 changed files with 71 additions and 8557 deletions

View File

@ -40,6 +40,17 @@
# xargs -n1 | sort | uniq -d;
# done
# 20211022
OLD_FILES+=sbin/spppcontrol
.if ${TARGET_ARCH} == "i386"
OLD_FILES+=usr/include/machine/cserial.h
.endif
OLD_FILES+=usr/include/net/if_sppp.h
OLD_FILES+=usr/include/netgraph/ng_sppp.h
OLD_FILES+=usr/share/man/man4/ng_sppp.4.gz
OLD_FILES+=usr/share/man/man4/sppp.4.gz
OLD_FILES+=usr/share/man/man8/spppcontrol.8.gz
# 20210929:
OLD_FILES+=usr/sbin/hcseriald
OLD_FILES+=usr/share/man/man8/hcseriald.8.gz

View File

@ -27,6 +27,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 14.x IS SLOW:
world, or to merely disable the most expensive debugging functionality
at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20211022:
The synchronous PPP kernel driver sppp(4) has been removed.
The cp(4) and ce(4) drivers are now always compiled with netgraph(4)
support, formerly enabled by NETGRAPH_CRONYX option.
20211020:
sh(1) is now the default shell for the root user. To force root to use
the csh shell, please run the following command as root:

View File

@ -467,7 +467,7 @@ getnameinfo_link(const struct afd *afd,
* The following have zero-length addresses.
* IFT_GIF (net/if_gif.c)
* IFT_LOOP (net/if_loop.c)
* IFT_PPP (net/if_ppp.c, net/if_spppsubr.c)
* IFT_PPP (net/if_tuntap.c)
* IFT_SLIP (net/if_sl.c, net/if_strip.c)
* IFT_STF (net/if_stf.c)
* IFT_L2VLAN (net/if_vlan.c)

View File

@ -96,7 +96,6 @@ __FBSDID("$FreeBSD$");
#include <netgraph/ng_socket.h>
#include <netgraph/ng_source.h>
#include <netgraph/ng_split.h>
#include <netgraph/ng_sppp.h>
#include <netgraph/ng_tag.h>
#include <netgraph/ng_tcpmss.h>
#include <netgraph/ng_tee.h>
@ -172,7 +171,6 @@ static const struct ng_cookie cookies[] = {
COOKIE(SOCKET),
COOKIE(SOURCE),
COOKIE(SPLIT),
COOKIE(SPPP),
COOKIE(TAG),
COOKIE(TCPMSS),
COOKIE(TEE),

View File

@ -43,7 +43,6 @@ _start=quietstart
/etc/rc.d/ipfilter ${_start}
/etc/rc.d/ipnat ${_start}
/etc/rc.d/ipfs ${_start}
/etc/rc.d/sppp ${_start}
/etc/rc.d/netif ${_start}
/etc/rc.d/ipsec ${_start}
/etc/rc.d/ppp ${_start}

View File

@ -262,12 +262,6 @@ cloned_interfaces="" # List of cloned network interfaces to create.
#
#autobridge_interfaces="bridge0" # List of bridges to check
#autobridge_bridge0="tap* vlan0" # Interface glob to automatically add to the bridge
#
# If you have any sppp(4) interfaces above, you might also want to set
# the following parameters. Refer to spppcontrol(8) for their meaning.
sppp_interfaces="" # List of sppp interfaces.
#sppp_interfaces="...0" # example: sppp over ...
#spppconfig_...0="authproto=chap myauthname=foo myauthsecret='top secret' hisauthname=some-gw hisauthsecret='another secret'"
# User ppp configuration.
ppp_enable="NO" # Start user-ppp (or NO).

View File

@ -96,7 +96,6 @@ CONFS= DAEMON \
savecore \
securelevel \
serial \
sppp \
statd \
static_arp \
static_ndp \

View File

@ -26,7 +26,7 @@
#
# PROVIDE: netif
# REQUIRE: FILESYSTEMS iovctl serial sppp sysctl
# REQUIRE: FILESYSTEMS iovctl serial sysctl
# REQUIRE: hostid
# KEYWORD: nojailvnet

View File

@ -1,37 +0,0 @@
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: sppp
# REQUIRE: root
# BEFORE: netif
# KEYWORD: nojail
. /etc/rc.subr
name="sppp"
desc="Point to point protocol network layer for synchronous lines"
start_cmd="sppp_start"
stop_cmd=":"
sppp_start()
{
# Special options for sppp(4) interfaces go here. These need
# to go _before_ the general ifconfig since in the case
# of hardwired (no link1 flag) but required authentication, you
# cannot pass auth parameters down to the already running interface.
#
for ifn in ${sppp_interfaces}; do
eval spppcontrol_args=\$spppconfig_${ifn}
if [ -n "${spppcontrol_args}" ]; then
# The auth secrets might contain spaces; in order
# to retain the quotation, we need to eval them
# here.
eval spppcontrol ${ifn} ${spppcontrol_args}
fi
done
}
load_rc_config $name
run_rc_command "$1"

View File

@ -101,7 +101,7 @@ CRUNCH_PROGS_sbin= \
mount_udf mount_unionfs newfs \
newfs_msdos nos-tun ping reboot \
restore rcorder route savecore \
shutdown spppcontrol swapon sysctl tunefs umount
shutdown swapon sysctl tunefs umount
.if ${MK_CCD} != "no"
CRUNCH_PROGS_sbin+= ccdconfig

View File

@ -63,7 +63,6 @@ SUBDIR=adjkerntz \
savecore \
setkey \
shutdown \
spppcontrol \
swapon \
sysctl \
tunefs \

View File

@ -216,9 +216,6 @@ Select the Frame Relay synchronous protocol
T1.617 Annex D).
.It Cm ppp
Select the synchronous PPP protocol.
PPP parameters can be configured using the
.Xr spppcontrol 8
utility.
.It Sm Cm keepalive No = Bro Cm on , off Brc Sm
Turn on/off transmission of keepalive messages.
This option is used only for synchronous PPP.
@ -569,10 +566,8 @@ Test error (G.703 only).
.Sh SEE ALSO
.Xr stty 1 ,
.Xr ioctl 2 ,
.Xr sppp 4 ,
.Xr ifconfig 8 ,
.Xr route 8 ,
.Xr spppcontrol 8
.\"--------------------------------------------------------------
.Sh HISTORY
The

View File

@ -1,9 +0,0 @@
# $FreeBSD$
PACKAGE= ppp
PROG= spppcontrol
MAN= spppcontrol.8
WARNS?= 2
.include <bsd.prog.mk>

View File

@ -1,17 +0,0 @@
# $FreeBSD$
# Autogenerated - do NOT edit!
DIRDEPS = \
gnu/lib/csu \
include \
include/xlocale \
lib/${CSU_DIR} \
lib/libc \
lib/libcompiler_rt \
.include <dirdeps.mk>
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
# local dependencies - needed for -jN in clean tree
.endif

View File

@ -1,275 +0,0 @@
.\" Copyright (C) 1997, 2001 by Joerg Wunsch, Dresden
.\" 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.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``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 AUTHOR(S) 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.
.\"
.\" $FreeBSD$
.\"
.Dd December 30, 2001
.Dt SPPPCONTROL 8
.Os
.Sh NAME
.Nm spppcontrol
.Nd display or set parameters for an sppp interface
.Sh SYNOPSIS
.Nm
.Op Fl v
.Ar ifname
.Op Ar parameter Ns Op Li = Ns Ar value
.Op Ar ...
.Sh DESCRIPTION
The
.Xr sppp 4
driver might require a number of additional arguments or optional
parameters besides the settings that can be adjusted with
.Xr ifconfig 8 .
These are things like authentication protocol parameters, but also
other tunable configuration variables.
The
.Nm
utility can be used to display the current settings, or adjust these
parameters as required.
.Pp
For whatever intent
.Nm
is being called, at least the parameter
.Ar ifname
needs to be specified, naming the interface for which the settings
are to be performed or displayed.
Use
.Xr ifconfig 8 ,
or
.Xr netstat 1
to see which interfaces are available.
.Pp
If no other parameter is given,
.Nm
will just list the current settings for
.Ar ifname
and exit.
The reported settings include the current PPP phase the
interface is in, which can be one of the names
.Em dead ,
.Em establish ,
.Em authenticate ,
.Em network ,
or
.Em terminate .
If an authentication protocol is configured for the interface, the
name of the protocol to be used, as well as the system name to be used
or expected will be displayed, plus any possible options to the
authentication protocol if applicable.
Note that the authentication
secrets (sometimes also called
.Em keys )
are not being returned by the underlying system call, and are thus not
displayed.
.Pp
If any additional parameter is supplied, superuser privileges are
required, and the command works in the
.Dq set
mode.
This is normally done quietly, unless the option
.Fl v
is also enabled, which will cause a final printout of the settings as
described above once all other actions have been taken.
Use of this
mode will be rejected if the interface is currently in any other phase
than
.Em dead .
Note that you can force an interface into
.Em dead
phase by calling
.Xr ifconfig 8
with the parameter
.Cm down .
.Pp
The currently supported parameters include:
.Bl -tag -offset indent -width indent
.It Va authproto Ns Li = Ns Ar protoname
Set both, his and my authentication protocol to
.Ar protoname .
The protocol name can be one of
.Dq Li chap ,
.Dq Li pap ,
or
.Dq Li none .
In the latter case, the use of an authentication protocol will be
turned off for the named interface.
This has the side-effect of
clearing the other authentication-related parameters for this
interface as well (i.e., system name and authentication secret will
be forgotten).
.It Va myauthproto Ns Li = Ns Ar protoname
Same as above, but only for my end of the link.
I.e., this is the
protocol when remote is authenticator, and I am the peer required to
authenticate.
.It Va hisauthproto Ns Li = Ns Ar protoname
Same as above, but only for his end of the link.
.It Va myauthname Ns Li = Ns Ar name
Set my system name for the authentication protocol.
.It Va hisauthname Ns Li = Ns Ar name
Set his system name for the authentication protocol.
For CHAP, this
will only be used as a hint, causing a warning message if remote did
supply a different name.
For PAP, it is the name remote must use to
authenticate himself (in connection with his secret).
.It Va myauthsecret Ns Li = Ns Ar secret
Set my secret (key, password) for use in the authentication phase.
For CHAP, this will be used to compute the response hash value, based
on remote's challenge.
For PAP, it will be transmitted as plain text
together with the system name.
Do not forget to quote the secrets from
the shell if they contain shell metacharacters (or white space).
.It Va myauthkey Ns Li = Ns Ar secret
Same as above.
.It Va hisauthsecret Ns Li = Ns Ar secret
Same as above, to be used if we are an authenticator and the remote peer
needs to authenticate.
.It Va hisauthkey Ns Li = Ns Va secret
Same as above.
.It Va callin
Require remote to authenticate himself only when he is calling in, but
not when we are caller.
This is required for some peers that do not
implement the authentication protocols symmetrically (like Ascend
routers, for example).
.It Va always
The opposite of
.Va callin .
Require remote to always authenticate, regardless of which side is
placing the call.
This is the default, and will not be explicitly
displayed in the
.Dq list
mode.
.It Va norechallenge
Only meaningful with CHAP.
Do not re-challenge peer once the initial
CHAP handshake was successful.
Used to work around broken peer
implementations that cannot grok being re-challenged once the
connection is up.
.It Ar rechallenge
With CHAP, send re-challenges at random intervals while the connection
is in network phase.
(The intervals are currently in the range of 300
through approximately 800 seconds.)
This is the default, and will not
be explicitly displayed in the
.Dq list
mode.
.It Va lcp-timeout Ns Li = Ns Ar timeout-value
Allows to change the value of the LCP restart timer.
Values are
specified in milliseconds.
The value must be between 10 and 20000 ms,
defaulting to 3000 ms.
.It Va enable-vj
Enable negotiation of Van Jacobsen header compression.
(Enabled by default.)
.It Va disable-vj
Disable negotiation of Van Jacobsen header compression.
.It Va enable-ipv6
Enable negotiation of the IPv6 network control protocol.
(Enabled by default if the kernel has IPv6 enabled.)
.It Va disable-ipv6
Disable negotiation of the IPv6 network control protocol.
Since every
IPv4 interface in an IPv6-enabled kernel automatically gets an IPv6
address assigned, this option provides for a way to administratively
prevent the link from attempting to negotiate IPv6.
Note that
initialization of an IPv6 interface causes a multicast packet to be
sent, which can cause unwanted traffic costs (for dial-on-demand
interfaces).
.El
.Sh EXAMPLES
.Bd -literal
# spppcontrol bppp0
bppp0: phase=dead
myauthproto=chap myauthname="uriah"
hisauthproto=chap hisauthname="ifb-gw" norechallenge
lcp-timeout=3000
enable-vj
enable-ipv6
.Ed
.Pp
Display the settings for
.Li bppp0 .
The interface is currently in
.Em dead
phase, i.e., the LCP layer is down, and no traffic is possible.
Both
ends of the connection use the CHAP protocol, my end tells remote the
system name
.Dq Li uriah ,
and remote is expected to authenticate by the name
.Dq Li ifb-gw .
Once the initial CHAP handshake was successful, no further CHAP
challenges will be transmitted.
There are supposedly some known CHAP
secrets for both ends of the link which are not being shown.
.Bd -literal
# spppcontrol bppp0 \e
authproto=chap \e
myauthname=uriah myauthsecret='some secret' \e
hisauthname=ifb-gw hisauthsecret='another' \e
norechallenge
.Ed
.Pp
A possible call to
.Nm
that could have been used to bring the interface into the state shown
by the previous example.
.Sh SEE ALSO
.Xr netstat 1 ,
.Xr sppp 4 ,
.Xr ifconfig 8
.Rs
.%A B. Lloyd
.%A W. Simpson
.%T "PPP Authentication Protocols"
.%O RFC 1334
.Re
.Rs
.%A W. Simpson, Editor
.%T "The Point-to-Point Protocol (PPP)"
.%O RFC 1661
.Re
.Rs
.%A W. Simpson
.%T "PPP Challenge Handshake Authentication Protocol (CHAP)"
.%O RFC 1994
.Re
.Sh HISTORY
The
.Nm
utility appeared in
.Fx 3.0 .
.Sh AUTHORS
The program was written by
.An J\(:org Wunsch ,
Dresden.

View File

@ -1,266 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 1997, 2001 Joerg Wunsch
*
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 DEVELOPERS 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.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_sppp.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
static void usage(void);
void print_vals(const char *ifname, struct spppreq *sp);
const char *phase_name(enum ppp_phase phase);
const char *proto_name(u_short proto);
const char *authflags(u_short flags);
#define PPP_PAP 0xc023
#define PPP_CHAP 0xc223
int
main(int argc, char **argv)
{
int s, c;
int errs = 0, verbose = 0;
size_t off;
long to;
char *endp;
const char *ifname, *cp;
struct ifreq ifr;
struct spppreq spr;
while ((c = getopt(argc, argv, "v")) != -1)
switch (c) {
case 'v':
verbose++;
break;
default:
errs++;
break;
}
argv += optind;
argc -= optind;
if (errs || argc < 1)
usage();
ifname = argv[0];
strncpy(ifr.ifr_name, ifname, sizeof ifr.ifr_name);
/* use a random AF to create the socket */
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
err(EX_UNAVAILABLE, "ifconfig: socket");
argc--;
argv++;
spr.cmd = (uintptr_t) SPPPIOGDEFS;
ifr.ifr_data = (caddr_t)&spr;
if (ioctl(s, SIOCGIFGENERIC, &ifr) == -1)
err(EX_OSERR, "SIOCGIFGENERIC(SPPPIOGDEFS)");
if (argc == 0) {
/* list only mode */
print_vals(ifname, &spr);
return 0;
}
#define startswith(s) strncmp(argv[0], s, (off = strlen(s))) == 0
while (argc > 0) {
if (startswith("authproto=")) {
cp = argv[0] + off;
if (strcmp(cp, "pap") == 0)
spr.defs.myauth.proto =
spr.defs.hisauth.proto = PPP_PAP;
else if (strcmp(cp, "chap") == 0)
spr.defs.myauth.proto =
spr.defs.hisauth.proto = PPP_CHAP;
else if (strcmp(cp, "none") == 0)
spr.defs.myauth.proto =
spr.defs.hisauth.proto = 0;
else
errx(EX_DATAERR, "bad auth proto: %s", cp);
} else if (startswith("myauthproto=")) {
cp = argv[0] + off;
if (strcmp(cp, "pap") == 0)
spr.defs.myauth.proto = PPP_PAP;
else if (strcmp(cp, "chap") == 0)
spr.defs.myauth.proto = PPP_CHAP;
else if (strcmp(cp, "none") == 0)
spr.defs.myauth.proto = 0;
else
errx(EX_DATAERR, "bad auth proto: %s", cp);
} else if (startswith("myauthname="))
strncpy(spr.defs.myauth.name, argv[0] + off,
AUTHNAMELEN);
else if (startswith("myauthsecret=") ||
startswith("myauthkey="))
strncpy(spr.defs.myauth.secret, argv[0] + off,
AUTHKEYLEN);
else if (startswith("hisauthproto=")) {
cp = argv[0] + off;
if (strcmp(cp, "pap") == 0)
spr.defs.hisauth.proto = PPP_PAP;
else if (strcmp(cp, "chap") == 0)
spr.defs.hisauth.proto = PPP_CHAP;
else if (strcmp(cp, "none") == 0)
spr.defs.hisauth.proto = 0;
else
errx(EX_DATAERR, "bad auth proto: %s", cp);
} else if (startswith("hisauthname="))
strncpy(spr.defs.hisauth.name, argv[0] + off,
AUTHNAMELEN);
else if (startswith("hisauthsecret=") ||
startswith("hisauthkey="))
strncpy(spr.defs.hisauth.secret, argv[0] + off,
AUTHKEYLEN);
else if (strcmp(argv[0], "callin") == 0)
spr.defs.hisauth.flags |= AUTHFLAG_NOCALLOUT;
else if (strcmp(argv[0], "always") == 0)
spr.defs.hisauth.flags &= ~AUTHFLAG_NOCALLOUT;
else if (strcmp(argv[0], "norechallenge") == 0)
spr.defs.hisauth.flags |= AUTHFLAG_NORECHALLENGE;
else if (strcmp(argv[0], "rechallenge") == 0)
spr.defs.hisauth.flags &= ~AUTHFLAG_NORECHALLENGE;
else if (startswith("lcp-timeout=")) {
cp = argv[0] + off;
to = strtol(cp, &endp, 10);
if (*cp == '\0' || *endp != '\0' ||
/*
* NB: 10 ms is the minimal possible value for
* hz=100. We assume no kernel has less clock
* frequency than that...
*/
to < 10 || to > 20000)
errx(EX_DATAERR, "bad lcp timeout value: %s",
cp);
spr.defs.lcp.timeout = to;
} else if (strcmp(argv[0], "enable-vj") == 0)
spr.defs.enable_vj = 1;
else if (strcmp(argv[0], "disable-vj") == 0)
spr.defs.enable_vj = 0;
else if (strcmp(argv[0], "enable-ipv6") == 0)
spr.defs.enable_ipv6 = 1;
else if (strcmp(argv[0], "disable-ipv6") == 0)
spr.defs.enable_ipv6 = 0;
else
errx(EX_DATAERR, "bad parameter: \"%s\"", argv[0]);
argv++;
argc--;
}
spr.cmd = (uintptr_t)SPPPIOSDEFS;
if (ioctl(s, SIOCSIFGENERIC, &ifr) == -1)
err(EX_OSERR, "SIOCSIFGENERIC(SPPPIOSDEFS)");
if (verbose)
print_vals(ifname, &spr);
return 0;
}
static void
usage(void)
{
fprintf(stderr, "%s\n%s\n",
"usage: spppcontrol [-v] ifname [{my|his}auth{proto|name|secret}=...]",
" spppcontrol [-v] ifname callin|always");
exit(EX_USAGE);
}
void
print_vals(const char *ifname, struct spppreq *sp)
{
printf("%s:\tphase=%s\n", ifname, phase_name(sp->defs.pp_phase));
if (sp->defs.myauth.proto) {
printf("\tmyauthproto=%s myauthname=\"%.*s\"\n",
proto_name(sp->defs.myauth.proto),
AUTHNAMELEN, sp->defs.myauth.name);
}
if (sp->defs.hisauth.proto) {
printf("\thisauthproto=%s hisauthname=\"%.*s\"%s\n",
proto_name(sp->defs.hisauth.proto),
AUTHNAMELEN, sp->defs.hisauth.name,
authflags(sp->defs.hisauth.flags));
}
printf("\tlcp-timeout=%d ms\n", sp->defs.lcp.timeout);
printf("\t%sable-vj\n", sp->defs.enable_vj? "en": "dis");
printf("\t%sable-ipv6\n", sp->defs.enable_ipv6? "en": "dis");
}
const char *
phase_name(enum ppp_phase phase)
{
switch (phase) {
case PHASE_DEAD: return "dead";
case PHASE_ESTABLISH: return "establish";
case PHASE_TERMINATE: return "terminate";
case PHASE_AUTHENTICATE: return "authenticate";
case PHASE_NETWORK: return "network";
}
return "illegal";
}
const char *
proto_name(u_short proto)
{
static char buf[12];
switch (proto) {
case PPP_PAP: return "pap";
case PPP_CHAP: return "chap";
}
sprintf(buf, "0x%x", (unsigned)proto);
return buf;
}
const char *
authflags(u_short flags)
{
static char buf[30];
buf[0] = '\0';
if (flags & AUTHFLAG_NOCALLOUT)
strcat(buf, " callin");
if (flags & AUTHFLAG_NORECHALLENGE)
strcat(buf, " norechallenge");
return buf;
}

View File

@ -379,7 +379,6 @@ MAN= aac.4 \
ng_socket.4 \
ng_source.4 \
ng_split.4 \
ng_sppp.4 \
ng_sscfu.4 \
ng_sscop.4 \
ng_tag.4 \
@ -529,7 +528,6 @@ MAN= aac.4 \
spigen.4 \
${_spkr.4} \
splash.4 \
sppp.4 \
ste.4 \
stf.4 \
stge.4 \

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 30, 2006
.Dd October 22, 2021
.Dt CE 4 i386
.Os
.Sh NAME
@ -44,29 +44,19 @@ module at boot time, place the following line in
.Bd -literal -offset indent
if_ce_load="YES"
.Ed
.Pp
Additional options:
.Cd "device sppp"
.Cd "options NETGRAPH"
.Cd "options NETGRAPH_CRONYX"
.Sh DESCRIPTION
The
.Nm
driver needs either
.Xr sppp 4
or
.Xr netgraph 4 .
Which one to use is determined by the
.Dv NETGRAPH_CRONYX
option.
If this option is present in your kernel configuration file, the
.Nm
driver will be compiled with
driver creates a
.Xr netgraph 4
support.
Otherwise, it will be compiled with
.Xr sppp 4
support.
node for each device found.
The node is usually paired with
.Xr ng_async 4 ,
.Xr ng_cisco 4 ,
.Xr ng_frame_relay 4
or with
.Xr ng_ppp 4
under control of net/mpd5 port.
.Pp
Refer to
.Xr sconfig 8
@ -89,12 +79,8 @@ with 32 HDLC channels.
.El
.Sh SEE ALSO
.Xr cp 4 ,
.Xr ctau 4 ,
.Xr cx 4 ,
.Xr sppp 4 ,
.Xr ifconfig 8 ,
.Xr sconfig 8 ,
.Xr spppcontrol 8
.Xr netgraph 4 ,
.Xr sconfig 8
.Sh HISTORY
The
.Nm
@ -103,9 +89,3 @@ driver was added in
.Fx 5.5
and
.Fx 4.11 .
The
.Nm
driver for previous versions of
.Fx
is available from
.Pa http://www.cronyx.ru/ .

View File

@ -13,7 +13,7 @@
.\" Cronyx Id: cp.4,v 1.1.2.5 2004/06/21 17:47:40 rik Exp $
.\" $FreeBSD$
.\"
.Dd July 16, 2005
.Dd October 22, 2021
.Dt CP 4 i386
.Os
.Sh NAME
@ -34,28 +34,19 @@ module at boot time, place the following line in
if_cp_load="YES"
.Ed
.Pp
Additional options:
.Cd "device sppp"
.Cd "options NETGRAPH"
.Cd "options NETGRAPH_CRONYX"
.Sh DESCRIPTION
The
.Nm
driver needs either
.Xr sppp 4
or
.Xr netgraph 4 .
Which one to use is determined by the
.Dv NETGRAPH_CRONYX
option.
If this option is present in your kernel configuration file, the
.Nm
driver will be compiled with
driver creates a
.Xr netgraph 4
support.
Otherwise, it will be compiled with
.Xr sppp 4
support.
node for each device found.
The node is usually paired with
.Xr ng_async 4 ,
.Xr ng_cisco 4 ,
.Xr ng_frame_relay 4
or with
.Xr ng_ppp 4
under control of net/mpd5 port.
.Pp
Refer to
.Xr sconfig 8
@ -92,12 +83,9 @@ T3 interface
STS-1 interface
.El
.Sh SEE ALSO
.Xr ctau 4 ,
.Xr cx 4 ,
.Xr sppp 4 ,
.Xr ifconfig 8 ,
.Xr sconfig 8 ,
.Xr spppcontrol 8
.Xr ce 4 ,
.Xr netgraph 4 ,
.Xr sconfig 8
.Sh HISTORY
The
.Nm
@ -105,9 +93,3 @@ driver was added in
.Fx 5.3
and
.Fx 4.11 .
The
.Nm
driver for previous versions of
.Fx
is available from
.Pa http://www.cronyx.ru/ .

View File

@ -1454,7 +1454,6 @@ common networking problems, solved using
.Xr ng_rfc1490 4 ,
.Xr ng_socket 4 ,
.Xr ng_split 4 ,
.Xr ng_sppp 4 ,
.Xr ng_sscfu 4 ,
.Xr ng_sscop 4 ,
.Xr ng_tee 4 ,

View File

@ -1,172 +0,0 @@
.\" Copyright (C) 2003-2004 Cronyx Engineering.
.\" Copyright (C) 2003-2004 Roman Kurakin <rik@cronyx.ru>
.\"
.\" This software is distributed with NO WARRANTIES, not even the implied
.\" warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" Authors grant any other persons or organisations a permission to use,
.\" modify and redistribute this software in source and binary forms,
.\" as long as this message is kept with the software, all derivative
.\" works or modified versions.
.\"
.\" Cronyx Id: ng_sppp.4,v 1.1.2.3 2004/03/30 14:28:34 rik Exp $
.\" $FreeBSD$
.\"
.Dd February 3, 2005
.Dt NG_SPPP 4
.Os
.Sh NAME
.Nm ng_sppp
.Nd sppp netgraph node type
.Sh SYNOPSIS
.In netgraph/ng_sppp.h
.Sh DESCRIPTION
An
.Nm sppp
node is a
.Xr netgraph 4
interface to the original
.Xr sppp 4
network module for synchronous lines.
Currently,
.Xr sppp 4
supports PPP and Cisco HDLC protocols.
An
.Nm sppp
node could be considered as an alternative kernel mode PPP
implementation to
.Pa net/mpd
port +
.Xr ng_ppp 4 ,
and as an alternative to
.Xr ng_cisco 4
node.
While having less features than
.Pa net/mpd
+
.Xr ng_ppp 4 ,
it is significantly easier to use in the majority of simple configurations,
and allows the administrator to not install the
.Pa net/mpd
port.
With
.Nm sppp
you do not need any other nodes, not even an
.Xr ng_iface 4
node.
When an
.Nm sppp
node is created, a new interface appears which is accessible via
.Xr ifconfig 8 .
Network interfaces corresponding to
.Nm sppp
nodes are named
.Li sppp0 , sppp1 ,
etc.
When a node is shut down, the corresponding interface is removed,
and the interface name becomes available for reuse by future
.Nm sppp
nodes.
New nodes always take the first unused interface.
The node itself is assigned the same name as its interface, unless the name
already exists, in which case the node remains unnamed.
The
.Nm sppp
node allows drivers written to the old
.Xr sppp 4
interface to be rewritten using the
newer more powerful
.Xr netgraph 4
interface, and still behave in a compatible manner without supporting both
network modules.
.Pp
An
.Nm sppp
node has a single hook named
.Va downstream .
Usually it is connected directly to
a device driver hook.
.Pp
The
.Nm sppp
nodes support the Berkeley Packet Filter,
.Xr bpf 4 .
.Sh HOOKS
This node type supports the following hooks:
.Bl -tag -width ".Va downstream"
.It Va downstream
The connection to the synchronous line.
.El
.Sh CONTROL MESSAGES
This node type supports the generic control messages, plus the following:
.Bl -tag -width foo
.It Dv NGM_SPPP_GET_IFNAME Pq Ic getifname
Returns the name of the associated interface as a
.Dv NUL Ns -terminated
.Tn ASCII
string.
Normally this is the same as the name of the node.
.El
.Sh SHUTDOWN
This node shuts down upon receipt of a
.Dv NGM_SHUTDOWN
control message.
The associated interface is removed and becomes available
for use by future
.Nm sppp
nodes.
.Pp
Unlike most other node types and like
.Xr ng_iface 4
does, an
.Nm sppp
node does
.Em not
go away when all hooks have been disconnected; rather, an explicit
.Dv NGM_SHUTDOWN
control message is required.
.Sh EXAMPLES
For example, if you have the
.Xr cx 4
device, you could run PPP over it with just one command:
.Pp
.Dl "ngctl mkpeer cx0: sppp rawdata downstream"
.Pp
Now you have the
.Li sppp0
interface (if this was the first
.Nm sppp
node) which can be
accessed via
.Xr ifconfig 8
as a normal network interface,
or via
.Xr spppcontrol 8
as an
.Xr sppp 4
interface.
.Sh SEE ALSO
.Xr bpf 4 ,
.Xr cx 4 ,
.Xr netgraph 4 ,
.Xr ng_cisco 4 ,
.Xr ng_iface 4 ,
.Xr ng_ppp 4 ,
.Xr sppp 4 ,
.Xr ifconfig 8 ,
.Xr ngctl 8 ,
.Xr spppcontrol 8
.Pp
For complex networking topologies you may want to look at
.Pa net/mpd
port.
.Sh HISTORY
The
.Nm sppp
node type was implemented for
.Fx 5.0 .
It was included to the system since
.Fx 5.3 .
.Sh AUTHORS
Copyright (C) 2003-2004
.An Roman Kurakin Aq Mt rik@cronyx.ru

View File

@ -1,238 +0,0 @@
.\"
.\" Copyright (c) 1997, 2001 Joerg Wunsch
.\"
.\" 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.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 DEVELOPERS 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.
.\"
.\" $FreeBSD$
.\"
.Dd May 25, 2008
.Dt SPPP 4
.Os
.Sh NAME
.Nm sppp
.Nd point to point protocol network layer for synchronous lines
.Sh SYNOPSIS
.Cd "device sppp"
.Sh DESCRIPTION
The
.Nm
network layer implements the state machine and the Link Control
Protocol (LCP) of the
.Em point to point protocol (PPP)
as described in RFC 1661.
Note that this layer does not provide
network interfaces of its own, it is rather intended to be layered on
top of drivers providing a synchronous point-to-point connection that
wish to run a PPP stack over it.
The corresponding network interfaces
have to be provided by these hardware drivers.
.Pp
The
.Nm
layer provides three basic modes of operation.
The default mode,
with no special flags to be set, is to create the PPP connection
(administrative
.Em Open
event to the LCP layer) as soon as the interface is taken up with the
.Xr ifconfig 8
command.
Taking the interface down again will terminate the LCP layer
and thus all other layers on top.
The link will also terminate itself as
soon as no Network Control Protocol (NCP) is open anymore, indicating
that the lower layers are no longer needed.
.Pp
Setting the link-level flag
.Em link0
with
.Xr ifconfig 8
will cause the respective network interface to go into
.Em passive
mode.
This means, the administrative
.Em Open
event to the LCP layer will be delayed until after the lower layers
signals an
.Em Up
event (rise of
.Dq carrier ) .
This can be used by lower layers to support
a dialin connection where the physical layer is not available
immediately at startup, but only after some external event arrives.
Receipt of a
.Em Down
event from the lower layer will not take the interface completely down
in this case.
.Pp
Finally, setting the flag
.Em link1
will cause the interface to operate in
.Em dial-on-demand
mode.
This is also only useful if the lower layer supports the notion
of a carrier.
Upon configuring the
respective interface, it will delay the administrative
.Em Open
event to the LCP layer until either an outbound network packet
arrives, or until the lower layer signals an
.Em Up
event, indicating an inbound connection.
As with passive mode, receipt
of a
.Em Down
event (loss of carrier) will not automatically take the interface down,
thus it remains available for further connections.
.Pp
The
.Nm
layer supports the
.Em debug
interface flag that can be set with
.Xr ifconfig 8 .
If this flag is set, the various control protocol packets being
exchanged as well as the option negotiation between both ends of the
link will be logged at level
.Dv LOG_DEBUG .
This can be helpful to examine configuration problems during the first
attempts to set up a new configuration.
Without this flag being set,
only the major phase transitions will be logged at level
.Dv LOG_INFO .
.Pp
It is possible to leave the local interface IP address open for
negotiation by setting it to 0.0.0.0.
This requires that the remote
peer can correctly supply a value for it based on the identity of the
caller, or on the remote address supplied by this side.
Due to the
way the IPCP option negotiation works, this address is being supplied
late during the negotiation, which might cause the remote peer to make
wrong assumptions.
.Pp
In a similar spirit the remote address can be set to the magical
value
.Li 0.0.0. Ns Em *
which means that we do not care what address the remote
side will use, as long as it is not 0.0.0.0.
This is useful if your ISP has several dial-in
servers.
You can of course
.Nm route Cm add Ar something_or_other 0.0.0. Ns Em *
and it will do exactly what you would want it to.
.Pp
The PAP and CHAP authentication protocols as described in RFC 1334,
and RFC 1994 resp., are also implemented.
Their parameters are being
controlled by the
.Xr spppcontrol 8
utility.
.Pp
VJ header compression is implemented, and enabled by default.
It can be
disabled using
.Xr spppcontrol 8 .
.Sh DIAGNOSTICS
.Bl -diag
.It <ifname><ifnum>: <proto> illegal <event> in state <statename>
An event happened that should not happen for the current state
the respective control protocol is in.
See RFC 1661 for a description
of the state automaton.
.It <ifname><ifnum>: loopback
The state automaton detected a line loopback (that is, it was talking
with itself).
The interface will be temporarily disabled.
.It <ifname><ifnum>: up
The LCP layer is running again, after a line loopback had previously
been detected.
.It <ifname><ifnum>: down
The keepalive facility detected the line being unresponsive.
Keepalive must be explicitly requested by the lower layers in order to
take place.
.El
.Sh SEE ALSO
.Xr inet 4 ,
.Xr intro 4 ,
.Xr ifconfig 8 ,
.Xr spppcontrol 8
.Rs
.%A W. Simpson, Editor
.%T "The Point-to-Point Protocol (PPP)"
.%O RFC 1661
.Re
.Rs
.%A G. McGregor
.%T "The PPP Internet Protocol Control Protocol (IPCP)"
.%O RFC 1332
.Re
.Rs
.%A B. Lloyd
.%A W. Simpson
.%T "PPP Authentication Protocols"
.%O RFC 1334
.Re
.Rs
.%A W. Simpson
.%T "PPP Challenge Handshake Authentication Protocol (CHAP)"
.%O RFC 1994
.Re
.Sh AUTHORS
.An -nosplit
The original implementation of
.Nm
was written in 1994 at Cronyx Ltd., Moscow by
.An Serge Vakulenko Aq Mt vak@cronyx.ru .
.An J\(:org Wunsch Aq Mt joerg_wunsch@uriah.heep.sax.de
rewrote a large part in 1997 in order
to fully implement the state machine as described in RFC 1661, so it
could also be used for dialup lines.
He also wrote this man page.
Serge later on wrote a basic implementation for PAP and CHAP, which
served as the base for the current implementation, done again by
.An J\(:org Wunsch .
.Sh BUGS
Many.
.Pp
Currently, only the
.Em IPCP
control protocol and
.Xr ip 4
network protocol is supported.
More NCPs should be implemented, as well as other control protocols
for authentication and link quality reporting.
.Pp
Negotiation loop avoidance is not fully implemented.
If the negotiation
does not converge, this can cause an endless loop.
.Pp
The various parameters that should be adjustable per RFC 1661 are
currently hard-coded into the kernel, and should be made accessible
through
.Xr spppcontrol 8 .
.Pp
.Em Passive
mode has not been tested extensively.
.Pp
Link-level compression protocols should be supported.

View File

@ -1941,21 +1941,6 @@ ifconfig_gif0="inet 10.0.0.1 10.0.0.2 netmask 255.255.255.252"
gifconfig_gif1="inet6 2a00::1 2a01::1"
ifconfig_gif1="inet 10.1.0.1 10.1.0.2 netmask 255.255.255.252"
.Ed
.It Va sppp_interfaces
.Pq Vt str
Set to the list of
.Xr sppp 4
interfaces to configure on this host.
A
.Va spppconfig_ Ns Aq Ar interface
variable is assumed to exist for each value of
.Ar interface .
Each interface should also be configured by a general
.Va ifconfig_ Ns Aq Ar interface
setting.
Refer to
.Xr spppcontrol 8
for more information about available options.
.It Va ppp_enable
.Pq Vt bool
If set to

View File

@ -810,7 +810,6 @@ options NETGRAPH_PRED1
options NETGRAPH_RFC1490
options NETGRAPH_SOCKET
options NETGRAPH_SPLIT
options NETGRAPH_SPPP
options NETGRAPH_TAG
options NETGRAPH_TCPMSS
options NETGRAPH_TEE
@ -875,10 +874,6 @@ device wlan_xauth
device wlan_acl
device wlan_amrr
# The `sppp' device serves a similar role for certain types
# of synchronous PPP links (like `cx', `ar').
device sppp
# The `bpf' device enables the Berkeley Packet Filter. Be
# aware of the legal and administrative consequences of enabling this
# option. DHCP requires bpf.

View File

@ -4157,8 +4157,6 @@ net/if_llatbl.c standard
net/if_me.c optional me inet
net/if_media.c standard
net/if_mib.c standard
net/if_spppfr.c optional sppp | netgraph_sppp
net/if_spppsubr.c optional sppp | netgraph_sppp
net/if_stf.c optional stf inet inet6
net/if_tuntap.c optional tuntap
net/if_vlan.c optional vlan
@ -4192,8 +4190,7 @@ net/route/route_tables.c standard
net/route/route_temporal.c standard
net/rss_config.c optional inet rss | inet6 rss
net/rtsock.c standard
net/slcompress.c optional netgraph_vjc | sppp | \
netgraph_sppp
net/slcompress.c optional netgraph_vjc
net/toeplitz.c optional inet rss | inet6 rss | route_mpath
net/vnet.c optional vimage
net80211/ieee80211.c optional wlan
@ -4316,7 +4313,6 @@ netgraph/ng_pred1.c optional netgraph_pred1
netgraph/ng_rfc1490.c optional netgraph_rfc1490
netgraph/ng_socket.c optional netgraph_socket
netgraph/ng_split.c optional netgraph_split
netgraph/ng_sppp.c optional netgraph_sppp
netgraph/ng_tag.c optional netgraph_tag
netgraph/ng_tcpmss.c optional netgraph_tcpmss
netgraph/ng_tee.c optional netgraph_tee

View File

@ -33,9 +33,6 @@ dev/ce/ceddk.c optional ce
dev/ce/if_ce.c optional ce
dev/ce/tau32-ddk.c optional ce \
compile-with "${NORMAL_C} ${NO_WCONSTANT_CONVERSION} ${NO_WMISLEADING_INDENTATION}"
dev/cp/cpddk.c optional cp \
compile-with "${NORMAL_C} ${NO_WMISLEADING_INDENTATION}"
dev/cp/if_cp.c optional cp
dev/glxiic/glxiic.c optional glxiic
dev/glxsb/glxsb.c optional glxsb
dev/glxsb/glxsb_hash.c optional glxsb

View File

@ -79,6 +79,9 @@ dev/bxe/57710_init_values.c optional bxe pci
dev/bxe/57711_init_values.c optional bxe pci
dev/bxe/57712_init_values.c optional bxe pci
dev/coretemp/coretemp.c optional coretemp
dev/cp/cpddk.c optional cp \
compile-with "${NORMAL_C} ${NO_WMISLEADING_INDENTATION}"
dev/cp/if_cp.c optional cp
dev/cpuctl/cpuctl.c optional cpuctl
dev/dpms/dpms.c optional dpms
dev/fb/fb.c optional fb | vga

View File

@ -88,9 +88,6 @@ ATKBD_DFLT_KEYMAP opt_atkbd.h
# Video spigot
SPIGOT_UNSECURE opt_spigot.h
# Enables NETGRAPH support for Cronyx adapters
NETGRAPH_CRONYX opt_ng_cronyx.h
# Device options
DEV_APIC opt_apic.h
DEV_ATPIC opt_atpic.h

View File

@ -38,42 +38,18 @@ __FBSDID("$FreeBSD$");
#include <vm/pmap.h>
#include <net/if.h>
#include <net/if_var.h>
# include <dev/pci/pcivar.h>
# include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include "opt_ng_cronyx.h"
#ifdef NETGRAPH_CRONYX
# include "opt_netgraph.h"
# ifndef NETGRAPH
# error #option NETGRAPH missed from configuration
# endif
# include <netgraph/ng_message.h>
# include <netgraph/netgraph.h>
# include <dev/ce/ng_ce.h>
#else
# include <net/if_types.h>
# include <net/if_sppp.h>
# define PP_CISCO IFF_LINK2
# include <net/bpf.h>
#endif
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <dev/ce/ng_ce.h>
#include <dev/ce/machdep.h>
#include <dev/ce/ceddk.h>
#include <machine/cserial.h>
#include <dev/cp/cserial.h>
#include <machine/resource.h>
/* If we don't have Cronyx's sppp version, we don't have fr support via sppp */
#ifndef PP_FR
#define PP_FR 0
#endif
#ifndef IFP2SP
#define IFP2SP(ifp) ((struct sppp*)ifp)
#endif
#ifndef SP2IFP
#define SP2IFP(sp) ((struct ifnet*)sp)
#endif
#ifndef PCIR_BAR
#define PCIR_BAR(x) (PCIR_MAPS + (x) * 4)
#endif
@ -88,26 +64,6 @@ __FBSDID("$FreeBSD$");
#define CE_DEBUG2(d,s) ({if (d->chan->debug>1) {\
printf ("%s: ", d->name); printf s;}})
#ifndef IF_DRAIN
#define IF_DRAIN(ifq) do { \
struct mbuf *m; \
for (;;) { \
IF_DEQUEUE(ifq, m); \
if (m == NULL) \
break; \
m_freem(m); \
} \
} while (0)
#endif
#ifndef _IF_QLEN
#define _IF_QLEN(ifq) ((ifq)->ifq_len)
#endif
#ifndef callout_drain
#define callout_drain callout_stop
#endif
#define CE_LOCK_NAME "ceX"
#define CE_LOCK(_bd) mtx_lock (&(_bd)->ce_mtx)
@ -143,16 +99,12 @@ typedef struct _drv_t {
ce_board_t *board;
ce_chan_t *chan;
struct ifqueue rqueue;
#ifdef NETGRAPH
char nodename [NG_NODESIZE];
char nodename [NG_NODESIZ];
hook_p hook;
hook_p debug_hook;
node_p node;
struct ifqueue queue;
struct ifqueue hi_queue;
#else
struct ifnet *ifp;
#endif
short timeout;
struct callout timeout_handle;
struct cdev *devt;
@ -185,15 +137,7 @@ static void ce_start (drv_t *d);
static void ce_down (drv_t *d);
static void ce_watchdog (drv_t *d);
static void ce_watchdog_timer (void *arg);
#ifdef NETGRAPH
extern struct ng_type typestruct;
#else
static void ce_ifstart (struct ifnet *ifp);
static void ce_tlf (struct sppp *sp);
static void ce_tls (struct sppp *sp);
static int ce_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data);
static void ce_initialize (void *softc);
#endif
static struct ng_type typestruct;
static ce_board_t *adapter [NBRD];
static drv_t *channel [NBRD*NCHAN];
@ -301,9 +245,8 @@ static void ce_intr (void *arg)
ce_board_t *b = bd->board;
int s;
int i;
#if __FreeBSD_version >= 500000 && defined NETGRAPH
int error;
#endif
s = splimp ();
if (ce_destroy) {
splx (s);
@ -330,15 +273,11 @@ static void ce_intr (void *arg)
IF_DEQUEUE (&d->rqueue,m);
if (!m)
continue;
#ifdef NETGRAPH
if (d->hook) {
NG_SEND_DATA_ONLY (error, d->hook, m);
} else {
IF_DRAIN (&d->rqueue);
}
#else
sppp_input (d->ifp, m);
#endif
}
}
}
@ -534,7 +473,6 @@ static int ce_attach (device_t dev)
d = c->sys;
callout_init (&d->timeout_handle, 1);
#ifdef NETGRAPH
if (ng_make_node_common (&typestruct, &d->node) != 0) {
printf ("%s: cannot make common node\n", d->name);
d->node = NULL;
@ -554,29 +492,6 @@ static int ce_attach (device_t dev)
mtx_init (&d->queue.ifq_mtx, "ce_queue", NULL, MTX_DEF);
mtx_init (&d->hi_queue.ifq_mtx, "ce_queue_hi", NULL, MTX_DEF);
mtx_init (&d->rqueue.ifq_mtx, "ce_rqueue", NULL, MTX_DEF);
#else /*NETGRAPH*/
d->ifp = if_alloc(IFT_PPP);
if (!d->ifp) {
printf ("%s: cannot if_alloc() interface\n", d->name);
continue;
}
d->ifp->if_softc = d;
if_initname (d->ifp, "ce", b->num * NCHAN + c->num);
d->ifp->if_mtu = PP_MTU;
d->ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
d->ifp->if_ioctl = ce_sioctl;
d->ifp->if_start = ce_ifstart;
d->ifp->if_init = ce_initialize;
d->rqueue.ifq_maxlen = ifqmaxlen;
mtx_init (&d->rqueue.ifq_mtx, "ce_rqueue", NULL, MTX_DEF);
sppp_attach (d->ifp);
if_attach (d->ifp);
IFP2SP(d->ifp)->pp_tlf = ce_tlf;
IFP2SP(d->ifp)->pp_tls = ce_tls;
/* If BPF is in the kernel, call the attach for it.
* The header size of PPP or Cisco/HDLC is 4 bytes. */
bpfattach (d->ifp, DLT_PPP, 4);
#endif /*NETGRAPH*/
ce_start_chan (c, 1, 1, d->dmamem.virt, d->dmamem.phys);
/* Register callback functions. */
@ -635,20 +550,6 @@ static int ce_detach (device_t dev)
if (! d || ! d->chan)
continue;
callout_stop (&d->timeout_handle);
#ifndef NETGRAPH
/* Detach from the packet filter list of interfaces. */
bpfdetach (d->ifp);
/* Detach from the sync PPP list. */
sppp_detach (d->ifp);
/* Detach from the system list of interfaces. */
if_detach (d->ifp);
if_free(d->ifp);
IF_DRAIN (&d->rqueue);
mtx_destroy (&d->rqueue.ifq_mtx);
#else
if (d->node) {
ng_rmnode_self (d->node);
NG_NODE_UNREF (d->node);
@ -658,7 +559,6 @@ static int ce_detach (device_t dev)
mtx_destroy (&d->queue.ifq_mtx);
mtx_destroy (&d->hi_queue.ifq_mtx);
mtx_destroy (&d->rqueue.ifq_mtx);
#endif
destroy_dev (d->devt);
}
@ -690,91 +590,6 @@ static int ce_detach (device_t dev)
return 0;
}
#ifndef NETGRAPH
static void ce_ifstart (struct ifnet *ifp)
{
drv_t *d = ifp->if_softc;
bdrv_t *bd = d->board->sys;
CE_LOCK (bd);
ce_start (d);
CE_UNLOCK (bd);
}
static void ce_tlf (struct sppp *sp)
{
drv_t *d = SP2IFP(sp)->if_softc;
CE_DEBUG2 (d, ("ce_tlf\n"));
sp->pp_down (sp);
}
static void ce_tls (struct sppp *sp)
{
drv_t *d = SP2IFP(sp)->if_softc;
CE_DEBUG2 (d, ("ce_tls\n"));
sp->pp_up (sp);
}
/*
* Process an ioctl request.
*/
static int ce_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data)
{
drv_t *d = ifp->if_softc;
bdrv_t *bd = d->board->sys;
int error, s, was_up, should_be_up;
was_up = (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0;
error = sppp_ioctl (ifp, cmd, data);
if (error)
return error;
if (! (ifp->if_flags & IFF_DEBUG))
d->chan->debug = 0;
else
d->chan->debug = d->chan->debug_shadow;
switch (cmd) {
default: CE_DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0;
case SIOCADDMULTI: CE_DEBUG2 (d, ("ioctl SIOCADDMULTI\n")); return 0;
case SIOCDELMULTI: CE_DEBUG2 (d, ("ioctl SIOCDELMULTI\n")); return 0;
case SIOCSIFFLAGS: CE_DEBUG2 (d, ("ioctl SIOCSIFFLAGS\n")); break;
case SIOCSIFADDR: CE_DEBUG2 (d, ("ioctl SIOCSIFADDR\n")); break;
}
/* We get here only in case of SIFFLAGS or SIFADDR. */
s = splimp ();
CE_LOCK (bd);
should_be_up = (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0;
if (! was_up && should_be_up) {
/* Interface goes up -- start it. */
ce_up (d);
ce_start (d);
} else if (was_up && ! should_be_up) {
/* Interface is going down -- stop it. */
/* if ((IFP2SP(ifp)->pp_flags & PP_FR) || (ifp->if_flags & PP_CISCO))*/
ce_down (d);
}
CE_DEBUG (d, ("ioctl 0x%lx p4\n", cmd));
CE_UNLOCK (bd);
splx (s);
return 0;
}
/*
* Initialization of interface.
* It seems to be never called by upper level?
*/
static void ce_initialize (void *softc)
{
drv_t *d = softc;
CE_DEBUG (d, ("ce_initialize\n"));
}
#endif /*NETGRAPH*/
/*
* Stop the interface. Called on splimp().
@ -820,18 +635,11 @@ static void ce_send (drv_t *d)
while (ce_transmit_space (d->chan)) {
/* Get the packet to send. */
#ifdef NETGRAPH
IF_DEQUEUE (&d->hi_queue, m);
if (! m)
IF_DEQUEUE (&d->queue, m);
#else
m = sppp_dequeue (d->ifp);
#endif
if (! m)
return;
#ifndef NETGRAPH
BPF_MTAP (d->ifp, m);
#endif
len = m_length (m, NULL);
if (len >= BUFSZ)
printf ("%s: too long packet: %d bytes: ",
@ -847,9 +655,6 @@ static void ce_send (drv_t *d)
/* Set up transmit timeout, if the transmit ring is not empty.*/
d->timeout = 10;
}
#ifndef NETGRAPH
d->ifp->if_flags |= IFF_DRV_OACTIVE;
#endif
}
/*
@ -906,10 +711,6 @@ static void ce_transmit (ce_chan_t *c, void *attachment, int len)
drv_t *d = c->sys;
d->timeout = 0;
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_OPACKETS, 1);
d->ifp->if_flags &= ~IFF_DRV_OACTIVE;
#endif
ce_start (d);
}
@ -924,24 +725,12 @@ static void ce_receive (ce_chan_t *c, unsigned char *data, int len)
m = makembuf (data, len);
if (! m) {
CE_DEBUG (d, ("no memory for packet\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IQDROPS, 1);
#endif
return;
}
if (c->debug > 1)
m_print (m, 0);
#ifdef NETGRAPH
m->m_pkthdr.rcvif = 0;
IF_ENQUEUE(&d->rqueue, m);
#else
if_inc_counter(d->ifp, IFCOUNTER_IPACKETS, 1);
m->m_pkthdr.rcvif = d->ifp;
/* Check if there's a BPF listener on this interface.
* If so, hand off the raw packet to bpf. */
BPF_MTAP(d->ifp, m);
IF_ENQUEUE(&d->rqueue, m);
#endif
}
static void ce_error (ce_chan_t *c, int data)
@ -951,36 +740,19 @@ static void ce_error (ce_chan_t *c, int data)
switch (data) {
case CE_FRAME:
CE_DEBUG (d, ("frame error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CE_CRC:
CE_DEBUG (d, ("crc error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CE_OVERRUN:
CE_DEBUG (d, ("overrun error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_COLLISIONS, 1);
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CE_OVERFLOW:
CE_DEBUG (d, ("overflow error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CE_UNDERRUN:
CE_DEBUG (d, ("underrun error\n"));
d->timeout = 0;
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_OERRORS, 1);
d->ifp->if_flags &= ~IFF_DRV_OACTIVE;
#endif
ce_start (d);
break;
default:
@ -1054,65 +826,6 @@ static int ce_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
bcopy (mask, data, sizeof (mask));
return 0;
#ifndef NETGRAPH
case SERIAL_GETPROTO:
CE_DEBUG2 (d, ("ioctl: getproto\n"));
strcpy ((char*)data, (IFP2SP(d->ifp)->pp_flags & PP_FR) ? "fr" :
(d->ifp->if_flags & PP_CISCO) ? "cisco" : "ppp");
return 0;
case SERIAL_SETPROTO:
CE_DEBUG2 (d, ("ioctl: setproto\n"));
/* Only for superuser! */
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
if (d->ifp->if_flags & IFF_DRV_RUNNING)
return EBUSY;
if (! strcmp ("cisco", (char*)data)) {
IFP2SP(d->ifp)->pp_flags &= ~(PP_FR);
IFP2SP(d->ifp)->pp_flags |= PP_KEEPALIVE;
d->ifp->if_flags |= PP_CISCO;
#if PP_FR != 0
} else if (! strcmp ("fr", (char*)data)) {
d->ifp->if_flags &= ~(PP_CISCO);
IFP2SP(d->ifp)->pp_flags |= PP_FR | PP_KEEPALIVE;
#endif
} else if (! strcmp ("ppp", (char*)data)) {
IFP2SP(d->ifp)->pp_flags &= ~PP_FR;
IFP2SP(d->ifp)->pp_flags &= ~PP_KEEPALIVE;
d->ifp->if_flags &= ~(PP_CISCO);
} else
return EINVAL;
return 0;
case SERIAL_GETKEEPALIVE:
CE_DEBUG2 (d, ("ioctl: getkeepalive\n"));
if ((IFP2SP(d->ifp)->pp_flags & PP_FR) ||
(d->ifp->if_flags & PP_CISCO))
return EINVAL;
*(int*)data = (IFP2SP(d->ifp)->pp_flags & PP_KEEPALIVE) ? 1 : 0;
return 0;
case SERIAL_SETKEEPALIVE:
CE_DEBUG2 (d, ("ioctl: setkeepalive\n"));
/* Only for superuser! */
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
if ((IFP2SP(d->ifp)->pp_flags & PP_FR) ||
(d->ifp->if_flags & PP_CISCO))
return EINVAL;
s = splimp ();
CE_LOCK (bd);
if (*(int*)data)
IFP2SP(d->ifp)->pp_flags |= PP_KEEPALIVE;
else
IFP2SP(d->ifp)->pp_flags &= ~PP_KEEPALIVE;
CE_UNLOCK (bd);
splx (s);
return 0;
#endif /*NETGRAPH*/
case SERIAL_GETMODE:
CE_DEBUG2 (d, ("ioctl: getmode\n"));
@ -1304,18 +1017,7 @@ static int ce_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
#ifndef NETGRAPH
/*
* The debug_shadow is always greater than zero for logic
* simplicity. For switching debug off the IFF_DEBUG is
* responsible.
*/
d->chan->debug_shadow = (*(int*)data) ? (*(int*)data) : 1;
if (d->ifp->if_flags & IFF_DEBUG)
d->chan->debug = d->chan->debug_shadow;
#else
d->chan->debug = *(int*)data;
#endif
return 0;
case SERIAL_GETBAUD:
@ -1651,7 +1353,6 @@ static int ce_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
return ENOTTY;
}
#ifdef NETGRAPH
static int ng_ce_constructor (node_p node)
{
drv_t *d = NG_NODE_PRIVATE (node);
@ -2059,7 +1760,6 @@ static int ng_ce_disconnect (hook_p hook)
}
return 0;
}
#endif
static int ce_modevent (module_t mod, int type, void *unused)
{
@ -2068,10 +1768,8 @@ static int ce_modevent (module_t mod, int type, void *unused)
switch (type) {
case MOD_LOAD:
#if __FreeBSD_version >= 500000 && defined NETGRAPH
if (ng_newtype (&typestruct))
printf ("Failed to register ng_ce\n");
#endif
++load_count;
callout_init (&timeout_handle, 1);
callout_reset (&timeout_handle, hz*5, ce_timeout, 0);
@ -2079,9 +1777,7 @@ static int ce_modevent (module_t mod, int type, void *unused)
case MOD_UNLOAD:
if (load_count == 1) {
printf ("Removing device entry for Tau32-PCI\n");
#if __FreeBSD_version >= 500000 && defined NETGRAPH
ng_rmtype (&typestruct);
#endif
}
/* If we were wait it than it reasserted now, just stop it.
* Actually we shouldn't get this condition. But code could be
@ -2097,7 +1793,6 @@ static int ce_modevent (module_t mod, int type, void *unused)
return 0;
}
#ifdef NETGRAPH
static struct ng_type typestruct = {
.version = NG_ABI_VERSION,
.name = NG_CE_NODE_TYPE,
@ -2110,13 +1805,8 @@ static struct ng_type typestruct = {
.disconnect = ng_ce_disconnect,
};
#endif /*NETGRAPH*/
#ifdef NETGRAPH
MODULE_DEPEND (ng_ce, netgraph, NG_ABI_VERSION, NG_ABI_VERSION, NG_ABI_VERSION);
#else
MODULE_DEPEND (ce, sppp, 1, 1, 1);
#endif
#ifdef KLD_MODULE
DRIVER_MODULE (cemod, pci, ce_driver, ce_devclass, ce_modevent, NULL);
#else

View File

@ -16,8 +16,6 @@
* $FreeBSD$
*/
#ifdef NETGRAPH
#ifndef _CE_NETGRAPH_H_
#define _CE_NETGRAPH_H_
@ -27,5 +25,3 @@
#define NG_CE_HOOK_DEBUG "debug"
#endif /* _CE_NETGRAPH_H_ */
#endif /* NETGRAPH */

View File

@ -47,32 +47,14 @@ __FBSDID("$FreeBSD$");
#include <dev/pci/pcireg.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include "opt_ng_cronyx.h"
#ifdef NETGRAPH_CRONYX
# include "opt_netgraph.h"
# ifndef NETGRAPH
# error #option NETGRAPH missed from configuration
# endif
# include <netgraph/ng_message.h>
# include <netgraph/netgraph.h>
# include <dev/cp/ng_cp.h>
#else
# include <net/if_sppp.h>
# include <net/if_types.h>
#include <dev/pci/pcivar.h>
# define PP_CISCO IFF_LINK2
# include <net/bpf.h>
#endif
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <dev/cp/ng_cp.h>
#include <dev/cp/machdep.h>
#include <dev/cp/cpddk.h>
#include <machine/cserial.h>
#include <dev/cp/cserial.h>
#include <machine/resource.h>
/* If we don't have Cronyx's sppp version, we don't have fr support via sppp */
#ifndef PP_FR
#define PP_FR 0
#endif
#define CP_DEBUG(d,s) ({if (d->chan->debug) {\
printf ("%s: ", d->name); printf s;}})
#define CP_DEBUG2(d,s) ({if (d->chan->debug>1) {\
@ -110,17 +92,12 @@ typedef struct _drv_t {
cp_chan_t *chan;
cp_board_t *board;
cp_dma_mem_t dmamem;
#ifdef NETGRAPH
char nodename [NG_NODESIZE];
char nodename [NG_NODESIZ];
hook_p hook;
hook_p debug_hook;
node_p node;
struct ifqueue queue;
struct ifqueue hi_queue;
#else
struct ifqueue queue;
struct ifnet *ifp;
#endif
short timeout;
struct callout timeout_handle;
struct cdev *devt;
@ -152,15 +129,7 @@ static void cp_start (drv_t *d);
static void cp_down (drv_t *d);
static void cp_watchdog (drv_t *d);
static void cp_watchdog_timer (void *arg);
#ifdef NETGRAPH
extern struct ng_type typestruct;
#else
static void cp_ifstart (struct ifnet *ifp);
static void cp_tlf (struct sppp *sp);
static void cp_tls (struct sppp *sp);
static int cp_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data);
static void cp_initialize (void *softc);
#endif
static struct ng_type typestruct;
static cp_board_t *adapter [NBRD];
static drv_t *channel [NBRD*NCHAN];
@ -274,9 +243,6 @@ static void cp_intr (void *arg)
{
bdrv_t *bd = arg;
cp_board_t *b = bd->board;
#ifndef NETGRAPH
int i;
#endif
int s = splimp ();
if (cp_destroy) {
splx (s);
@ -300,21 +266,6 @@ static void cp_intr (void *arg)
CP_UNLOCK (bd);
splx (s);
#ifndef NETGRAPH
/* Pass packets in a lock-free state */
for (i = 0; i < NCHAN && b->chan[i].type; i++) {
drv_t *d = b->chan[i].sys;
struct mbuf *m;
if (!d || !d->running)
continue;
while (_IF_QLEN(&d->queue)) {
IF_DEQUEUE (&d->queue,m);
if (!m)
continue;
sppp_input (d->ifp, m);
}
}
#endif
}
static void
@ -474,7 +425,6 @@ static int cp_attach (device_t dev)
d->chan = c;
c->sys = d;
callout_init (&d->timeout_handle, 1);
#ifdef NETGRAPH
if (ng_make_node_common (&typestruct, &d->node) != 0) {
printf ("%s: cannot make common node\n", d->name);
d->node = NULL;
@ -492,29 +442,6 @@ static int cp_attach (device_t dev)
d->hi_queue.ifq_maxlen = ifqmaxlen;
mtx_init (&d->queue.ifq_mtx, "cp_queue", NULL, MTX_DEF);
mtx_init (&d->hi_queue.ifq_mtx, "cp_queue_hi", NULL, MTX_DEF);
#else /*NETGRAPH*/
d->ifp = if_alloc(IFT_PPP);
if (d->ifp == NULL) {
printf ("%s: cannot if_alloc() interface\n", d->name);
continue;
}
d->ifp->if_softc = d;
if_initname (d->ifp, "cp", b->num * NCHAN + c->num);
d->ifp->if_mtu = PP_MTU;
d->ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
d->ifp->if_ioctl = cp_sioctl;
d->ifp->if_start = cp_ifstart;
d->ifp->if_init = cp_initialize;
d->queue.ifq_maxlen = NRBUF;
mtx_init (&d->queue.ifq_mtx, "cp_queue", NULL, MTX_DEF);
sppp_attach (d->ifp);
if_attach (d->ifp);
IFP2SP(d->ifp)->pp_tlf = cp_tlf;
IFP2SP(d->ifp)->pp_tls = cp_tls;
/* If BPF is in the kernel, call the attach for it.
* The header size of PPP or Cisco/HDLC is 4 bytes. */
bpfattach (d->ifp, DLT_PPP, 4);
#endif /*NETGRAPH*/
cp_start_e1 (c);
cp_start_chan (c, 1, 1, d->dmamem.virt, d->dmamem.phys);
@ -586,19 +513,6 @@ static int cp_detach (device_t dev)
if (! d || ! d->chan->type)
continue;
callout_stop (&d->timeout_handle);
#ifndef NETGRAPH
/* Detach from the packet filter list of interfaces. */
bpfdetach (d->ifp);
/* Detach from the sync PPP list. */
sppp_detach (d->ifp);
/* Detach from the system list of interfaces. */
if_detach (d->ifp);
if_free (d->ifp);
IF_DRAIN (&d->queue);
mtx_destroy (&d->queue.ifq_mtx);
#else
if (d->node) {
ng_rmnode_self (d->node);
NG_NODE_UNREF (d->node);
@ -606,7 +520,6 @@ static int cp_detach (device_t dev)
}
mtx_destroy (&d->queue.ifq_mtx);
mtx_destroy (&d->hi_queue.ifq_mtx);
#endif
destroy_dev (d->devt);
}
@ -639,96 +552,6 @@ static int cp_detach (device_t dev)
return 0;
}
#ifndef NETGRAPH
static void cp_ifstart (struct ifnet *ifp)
{
drv_t *d = ifp->if_softc;
bdrv_t *bd = d->board->sys;
CP_LOCK (bd);
cp_start (d);
CP_UNLOCK (bd);
}
static void cp_tlf (struct sppp *sp)
{
drv_t *d = SP2IFP(sp)->if_softc;
CP_DEBUG2 (d, ("cp_tlf\n"));
/* XXXRIK: Don't forget to protect them by LOCK, or kill them. */
/* cp_set_dtr (d->chan, 0);*/
/* cp_set_rts (d->chan, 0);*/
if (!(sp->pp_flags & PP_FR) && !(d->ifp->if_flags & PP_CISCO))
sp->pp_down (sp);
}
static void cp_tls (struct sppp *sp)
{
drv_t *d = SP2IFP(sp)->if_softc;
CP_DEBUG2 (d, ("cp_tls\n"));
if (!(sp->pp_flags & PP_FR) && !(d->ifp->if_flags & PP_CISCO))
sp->pp_up (sp);
}
/*
* Process an ioctl request.
*/
static int cp_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data)
{
drv_t *d = ifp->if_softc;
bdrv_t *bd = d->board->sys;
int error, s, was_up, should_be_up;
was_up = (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0;
error = sppp_ioctl (ifp, cmd, data);
if (error)
return error;
if (! (ifp->if_flags & IFF_DEBUG))
d->chan->debug = 0;
else
d->chan->debug = d->chan->debug_shadow;
switch (cmd) {
default: CP_DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0;
case SIOCADDMULTI: CP_DEBUG2 (d, ("ioctl SIOCADDMULTI\n")); return 0;
case SIOCDELMULTI: CP_DEBUG2 (d, ("ioctl SIOCDELMULTI\n")); return 0;
case SIOCSIFFLAGS: CP_DEBUG2 (d, ("ioctl SIOCSIFFLAGS\n")); break;
case SIOCSIFADDR: CP_DEBUG2 (d, ("ioctl SIOCSIFADDR\n")); break;
}
/* We get here only in case of SIFFLAGS or SIFADDR. */
s = splimp ();
CP_LOCK (bd);
should_be_up = (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0;
if (! was_up && should_be_up) {
/* Interface goes up -- start it. */
cp_up (d);
cp_start (d);
} else if (was_up && ! should_be_up) {
/* Interface is going down -- stop it. */
/* if ((IFP2SP(ifp)->pp_flags & PP_FR) || (ifp->if_flags & PP_CISCO))*/
cp_down (d);
}
CP_DEBUG (d, ("ioctl 0x%lx p4\n", cmd));
CP_UNLOCK (bd);
splx (s);
return 0;
}
/*
* Initialization of interface.
* It seems to be never called by upper level?
*/
static void cp_initialize (void *softc)
{
drv_t *d = softc;
CP_DEBUG (d, ("cp_initialize\n"));
}
#endif /*NETGRAPH*/
/*
* Stop the interface. Called on splimp().
@ -778,18 +601,11 @@ static void cp_send (drv_t *d)
while (cp_transmit_space (d->chan)) {
/* Get the packet to send. */
#ifdef NETGRAPH
IF_DEQUEUE (&d->hi_queue, m);
if (! m)
IF_DEQUEUE (&d->queue, m);
#else
m = sppp_dequeue (d->ifp);
#endif
if (! m)
return;
#ifndef NETGRAPH
BPF_MTAP (d->ifp, m);
#endif
len = m_length (m, NULL);
if (len >= BUFSZ)
printf ("%s: too long packet: %d bytes: ",
@ -805,9 +621,6 @@ static void cp_send (drv_t *d)
/* Set up transmit timeout, if the transmit ring is not empty.*/
d->timeout = 10;
}
#ifndef NETGRAPH
d->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
#endif
}
/*
@ -864,10 +677,6 @@ static void cp_transmit (cp_chan_t *c, void *attachment, int len)
drv_t *d = c->sys;
d->timeout = 0;
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_OPACKETS, 1);
d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
#endif
cp_start (d);
}
@ -875,9 +684,7 @@ static void cp_receive (cp_chan_t *c, unsigned char *data, int len)
{
drv_t *d = c->sys;
struct mbuf *m;
#ifdef NETGRAPH
int error;
#endif
if (! d->running)
return;
@ -885,24 +692,12 @@ static void cp_receive (cp_chan_t *c, unsigned char *data, int len)
m = makembuf (data, len);
if (! m) {
CP_DEBUG (d, ("no memory for packet\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IQDROPS, 1);
#endif
return;
}
if (c->debug > 1)
m_print (m, 0);
#ifdef NETGRAPH
m->m_pkthdr.rcvif = 0;
NG_SEND_DATA_ONLY (error, d->hook, m);
#else
if_inc_counter(d->ifp, IFCOUNTER_IPACKETS, 1);
m->m_pkthdr.rcvif = d->ifp;
/* Check if there's a BPF listener on this interface.
* If so, hand off the raw packet to bpf. */
BPF_MTAP(d->ifp, m);
IF_ENQUEUE (&d->queue, m);
#endif
}
static void cp_error (cp_chan_t *c, int data)
@ -912,36 +707,19 @@ static void cp_error (cp_chan_t *c, int data)
switch (data) {
case CP_FRAME:
CP_DEBUG (d, ("frame error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CP_CRC:
CP_DEBUG (d, ("crc error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CP_OVERRUN:
CP_DEBUG (d, ("overrun error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_COLLISIONS, 1);
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CP_OVERFLOW:
CP_DEBUG (d, ("overflow error\n"));
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_IERRORS, 1);
#endif
break;
case CP_UNDERRUN:
CP_DEBUG (d, ("underrun error\n"));
d->timeout = 0;
#ifndef NETGRAPH
if_inc_counter(d->ifp, IFCOUNTER_OERRORS, 1);
d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
#endif
cp_start (d);
break;
default:
@ -1016,65 +794,6 @@ static int cp_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
bcopy (mask, data, sizeof (mask));
return 0;
#ifndef NETGRAPH
case SERIAL_GETPROTO:
CP_DEBUG2 (d, ("ioctl: getproto\n"));
strcpy ((char*)data, (IFP2SP(d->ifp)->pp_flags & PP_FR) ? "fr" :
(d->ifp->if_flags & PP_CISCO) ? "cisco" : "ppp");
return 0;
case SERIAL_SETPROTO:
CP_DEBUG2 (d, ("ioctl: setproto\n"));
/* Only for superuser! */
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
if (d->ifp->if_drv_flags & IFF_DRV_RUNNING)
return EBUSY;
if (! strcmp ("cisco", (char*)data)) {
IFP2SP(d->ifp)->pp_flags &= ~(PP_FR);
IFP2SP(d->ifp)->pp_flags |= PP_KEEPALIVE;
d->ifp->if_flags |= PP_CISCO;
#if PP_FR != 0
} else if (! strcmp ("fr", (char*)data)) {
d->ifp->if_flags &= ~(PP_CISCO);
IFP2SP(d->ifp)->pp_flags |= PP_FR | PP_KEEPALIVE;
#endif
} else if (! strcmp ("ppp", (char*)data)) {
IFP2SP(d->ifp)->pp_flags &= ~PP_FR;
IFP2SP(d->ifp)->pp_flags &= ~PP_KEEPALIVE;
d->ifp->if_flags &= ~(PP_CISCO);
} else
return EINVAL;
return 0;
case SERIAL_GETKEEPALIVE:
CP_DEBUG2 (d, ("ioctl: getkeepalive\n"));
if ((IFP2SP(d->ifp)->pp_flags & PP_FR) ||
(d->ifp->if_flags & PP_CISCO))
return EINVAL;
*(int*)data = (IFP2SP(d->ifp)->pp_flags & PP_KEEPALIVE) ? 1 : 0;
return 0;
case SERIAL_SETKEEPALIVE:
CP_DEBUG2 (d, ("ioctl: setkeepalive\n"));
/* Only for superuser! */
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
if ((IFP2SP(d->ifp)->pp_flags & PP_FR) ||
(d->ifp->if_flags & PP_CISCO))
return EINVAL;
s = splimp ();
CP_LOCK (bd);
if (*(int*)data)
IFP2SP(d->ifp)->pp_flags |= PP_KEEPALIVE;
else
IFP2SP(d->ifp)->pp_flags &= ~PP_KEEPALIVE;
CP_UNLOCK (bd);
splx (s);
return 0;
#endif /*NETGRAPH*/
case SERIAL_GETMODE:
CP_DEBUG2 (d, ("ioctl: getmode\n"));
@ -1308,18 +1027,7 @@ static int cp_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
#ifndef NETGRAPH
/*
* The debug_shadow is always greater than zero for logic
* simplicity. For switching debug off the IFF_DEBUG is
* responsible.
*/
d->chan->debug_shadow = (*(int*)data) ? (*(int*)data) : 1;
if (d->ifp->if_flags & IFF_DEBUG)
d->chan->debug = d->chan->debug_shadow;
#else
d->chan->debug = *(int*)data;
#endif
return 0;
case SERIAL_GETHIGAIN:
@ -1783,7 +1491,6 @@ static int cp_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
return ENOTTY;
}
#ifdef NETGRAPH
static int ng_cp_constructor (node_p node)
{
drv_t *d = NG_NODE_PRIVATE (node);
@ -2209,7 +1916,6 @@ static int ng_cp_disconnect (hook_p hook)
}
return 0;
}
#endif
static int cp_modevent (module_t mod, int type, void *unused)
{
@ -2217,10 +1923,8 @@ static int cp_modevent (module_t mod, int type, void *unused)
switch (type) {
case MOD_LOAD:
#ifdef NETGRAPH
if (ng_newtype (&typestruct))
printf ("Failed to register ng_cp\n");
#endif
++load_count;
callout_init (&timeout_handle, 1);
callout_reset (&timeout_handle, hz*5, cp_timeout, 0);
@ -2228,9 +1932,7 @@ static int cp_modevent (module_t mod, int type, void *unused)
case MOD_UNLOAD:
if (load_count == 1) {
printf ("Removing device entry for Tau-PCI\n");
#ifdef NETGRAPH
ng_rmtype (&typestruct);
#endif
}
/* If we were wait it than it reasserted now, just stop it.
* Actually we shouldn't get this condition. But code could be
@ -2246,7 +1948,6 @@ static int cp_modevent (module_t mod, int type, void *unused)
return 0;
}
#ifdef NETGRAPH
static struct ng_type typestruct = {
.version = NG_ABI_VERSION,
.name = NG_CP_NODE_TYPE,
@ -2258,12 +1959,7 @@ static struct ng_type typestruct = {
.rcvdata = ng_cp_rcvdata,
.disconnect = ng_cp_disconnect,
};
#endif /*NETGRAPH*/
#ifdef NETGRAPH
MODULE_DEPEND (ng_cp, netgraph, NG_ABI_VERSION, NG_ABI_VERSION, NG_ABI_VERSION);
#else
MODULE_DEPEND (cp, sppp, 1, 1, 1);
#endif
DRIVER_MODULE (cp, pci, cp_driver, cp_devclass, cp_modevent, NULL);
MODULE_VERSION (cp, 1);

View File

@ -16,8 +16,6 @@
* $FreeBSD$
*/
#ifdef NETGRAPH
#ifndef _CP_NETGRAPH_H_
#define _CP_NETGRAPH_H_
@ -27,5 +25,3 @@
#define NG_CP_HOOK_DEBUG "debug"
#endif /* _CP_NETGRAPH_H_ */
#endif /* NETGRAPH */

View File

@ -490,12 +490,7 @@ device cpufreq
# bxe: Broadcom NetXtreme II (BCM5771X/BCM578XX) PCIe 10Gb Ethernet
# adapters.
# ce: Cronyx Tau-PCI/32 sync single/dual port G.703/E1 serial adaptor
# with 32 HDLC subchannels (requires sppp (default), or NETGRAPH if
# NETGRAPH_CRONYX is configured)
# cp: Cronyx Tau-PCI sync single/dual/four port
# V.35/RS-232/RS-530/RS-449/X.21/G.703/E1/E3/T3/STS-1
# serial adaptor (requires sppp (default), or NETGRAPH if
# NETGRAPH_CRONYX is configured)
# with 32 HDLC subchannels, requires NETGRAPH
# igc: Intel I225 2.5G Ethernet adapter
# ipw: Intel PRO/Wireless 2100 IEEE 802.11 adapter
# iwi: Intel PRO/Wireless 2200BG/2225BG/2915ABG IEEE 802.11 adapters
@ -516,10 +511,8 @@ device cpufreq
device bxe # Broadcom NetXtreme II BCM5771X/BCM578XX 10GbE
device ce
device cp
envvar hint.cs.0.at="isa"
envvar hint.cs.0.port="0x300"
#options NETGRAPH_CRONYX # Enable NETGRAPH support for Cronyx adapter(s)
options ED_3C503
options ED_HPP
options ED_SIC

View File

@ -353,7 +353,6 @@ SUBDIR= \
${_speaker} \
spi \
${_splash} \
${_sppp} \
ste \
stge \
${_sume} \
@ -665,7 +664,6 @@ _rdma= rdma
_safe= safe
_speaker= speaker
_splash= splash
_sppp= sppp
_p2sb= p2sb
_wbwd= wbwd

View File

@ -4,26 +4,7 @@
.PATH: ${SRCTOP}/sys/dev/ce
KMOD = if_ce
SRCS = if_ce.c ceddk.c tau32-ddk.c
SRCS += opt_bpf.h opt_netgraph.h opt_ng_cronyx.h device_if.h bus_if.h \
pci_if.h
.if !defined(KERNBUILDDIR)
PROTOS?= -DINET
NG_CRONYX?= 0
NETGRAPH= ${NG_CRONYX}
CFLAGS+= ${PROTOS}
.if ${NETGRAPH} != 0
opt_netgraph.h:
echo "#define NETGRAPH ${NETGRAPH}" > ${.TARGET}
.endif
.if ${NG_CRONYX} != 0
opt_ng_cronyx.h:
echo "#define NETGRAPH_CRONYX 1" > ${.TARGET}
.endif
.endif
SRCS += device_if.h bus_if.h pci_if.h
.include <bsd.kmod.mk>

View File

@ -4,26 +4,7 @@
.PATH: ${SRCTOP}/sys/dev/cp
KMOD = if_cp
SRCS = if_cp.c cpddk.c
SRCS += opt_netgraph.h opt_ng_cronyx.h device_if.h bus_if.h \
pci_if.h
.if !defined(KERNBUILDDIR)
PROTOS?= -DINET
NG_CRONYX?= 0
NETGRAPH= ${NG_CRONYX}
CFLAGS+= ${PROTOS}
.if ${NETGRAPH} != 0
opt_netgraph.h:
echo "#define NETGRAPH ${NETGRAPH}" > ${.TARGET}
.endif
.if ${NG_CRONYX} != 0
opt_ng_cronyx.h:
echo "#define NETGRAPH_CRONYX 1" > ${.TARGET}
.endif
.endif
SRCS += device_if.h bus_if.h pci_if.h
.include <bsd.kmod.mk>

View File

@ -47,7 +47,6 @@ SUBDIR= async \
socket \
source \
split \
sppp \
tag \
tcpmss \
tee \

View File

@ -1,7 +0,0 @@
# $FreeBSD$
# Cronyx Id: ng_sppp.Makefile,v 1.1.2.1 2002/12/25 08:37:25 rik Exp $
KMOD= ng_sppp
SRCS= ng_sppp.c
.include <bsd.kmod.mk>

View File

@ -1,18 +0,0 @@
# $FreeBSD$
.PATH: ${SRCTOP}/sys/net
KMOD= sppp
SRCS= if_spppfr.c if_spppsubr.c slcompress.c
SRCS+= opt_inet.h opt_inet6.h
EXPORT_SYMS= sppp_attach \
sppp_detach \
sppp_input \
sppp_ioctl \
sppp_dequeue \
sppp_pick \
sppp_isempty \
sppp_flush
.include <bsd.kmod.mk>

View File

@ -1,234 +0,0 @@
/*
* Defines for synchronous PPP/Cisco/Frame Relay link level subroutines.
*/
/*-
* Copyright (C) 1994-2000 Cronyx Engineering.
* Author: Serge Vakulenko, <vak@cronyx.ru>
*
* Heavily revamped to conform to RFC 1661.
* Copyright (C) 1997, Joerg Wunsch.
*
* This software is distributed with NO WARRANTIES, not even the implied
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Authors grant any other persons or organizations permission to use
* or modify this software as long as this message is kept with the software,
* all derivative works or modified versions.
*
* From: Version 2.0, Fri Oct 6 20:39:21 MSK 1995
*
* $FreeBSD$
*/
#ifndef _NET_IF_SPPP_H_
#define _NET_IF_SPPP_H_ 1
#define IDX_LCP 0 /* idx into state table */
struct slcp {
u_long opts; /* LCP options to send (bitfield) */
u_long magic; /* local magic number */
u_long mru; /* our max receive unit */
u_long their_mru; /* their max receive unit */
u_long protos; /* bitmask of protos that are started */
u_char echoid; /* id of last keepalive echo request */
/* restart max values, see RFC 1661 */
int timeout;
int max_terminate;
int max_configure;
int max_failure;
};
#define IDX_IPCP 1 /* idx into state table */
#define IDX_IPV6CP 2 /* idx into state table */
struct sipcp {
u_long opts; /* IPCP options to send (bitfield) */
u_int flags;
#define IPCP_HISADDR_SEEN 1 /* have seen his address already */
#define IPCP_MYADDR_DYN 2 /* my address is dynamically assigned */
#define IPCP_MYADDR_SEEN 4 /* have seen his address already */
#ifdef notdef
#define IPV6CP_MYIFID_DYN 8 /* my ifid is dynamically assigned */
#endif
#define IPV6CP_MYIFID_SEEN 0x10 /* have seen his ifid already */
#define IPCP_VJ 0x20 /* can use VJ compression */
int max_state; /* VJ: Max-Slot-Id */
int compress_cid; /* VJ: Comp-Slot-Id */
};
#define AUTHNAMELEN 64
#define AUTHKEYLEN 16
struct sauth {
u_short proto; /* authentication protocol to use */
u_short flags;
#define AUTHFLAG_NOCALLOUT 1 /* do not require authentication on */
/* callouts */
#define AUTHFLAG_NORECHALLENGE 2 /* do not re-challenge CHAP */
u_char name[AUTHNAMELEN]; /* system identification name */
u_char secret[AUTHKEYLEN]; /* secret password */
u_char challenge[AUTHKEYLEN]; /* random challenge */
};
#define IDX_PAP 3
#define IDX_CHAP 4
#define IDX_COUNT (IDX_CHAP + 1) /* bump this when adding cp's! */
/*
* Don't change the order of this. Ordering the phases this way allows
* for a comparison of ``pp_phase >= PHASE_AUTHENTICATE'' in order to
* know whether LCP is up.
*/
enum ppp_phase {
PHASE_DEAD, PHASE_ESTABLISH, PHASE_TERMINATE,
PHASE_AUTHENTICATE, PHASE_NETWORK
};
#define PP_MTU 1500 /* default/minimal MRU */
#define PP_MAX_MRU 2048 /* maximal MRU we want to negotiate */
/*
* This is a cut down struct sppp (see below) that can easily be
* exported to/ imported from userland without the need to include
* dozens of kernel-internal header files. It is used by the
* SPPPIO[GS]DEFS ioctl commands below.
*/
struct sppp_parms {
enum ppp_phase pp_phase; /* phase we're currently in */
int enable_vj; /* VJ header compression enabled */
int enable_ipv6; /*
* Enable IPv6 negotiations -- only
* needed since each IPv4 i/f auto-
* matically gets an IPv6 address
* assigned, so we can't use this as
* a decision.
*/
struct slcp lcp; /* LCP params */
struct sipcp ipcp; /* IPCP params */
struct sipcp ipv6cp; /* IPv6CP params */
struct sauth myauth; /* auth params, i'm peer */
struct sauth hisauth; /* auth params, i'm authenticator */
};
/*
* Definitions to pass struct sppp_parms data down into the kernel
* using the SIOC[SG]IFGENERIC ioctl interface.
*
* In order to use this, create a struct spppreq, fill in the cmd
* field with SPPPIOGDEFS, and put the address of this structure into
* the ifr_data portion of a struct ifreq. Pass this struct to a
* SIOCGIFGENERIC ioctl. Then replace the cmd field by SPPPIOSDEFS,
* modify the defs field as desired, and pass the struct ifreq now
* to a SIOCSIFGENERIC ioctl.
*/
#define SPPPIOGDEFS ((caddr_t)(('S' << 24) + (1 << 16) +\
sizeof(struct sppp_parms)))
#define SPPPIOSDEFS ((caddr_t)(('S' << 24) + (2 << 16) +\
sizeof(struct sppp_parms)))
struct spppreq {
int cmd;
struct sppp_parms defs;
};
#ifdef _KERNEL
struct sppp {
struct ifnet *pp_ifp; /* network interface data */
struct ifqueue pp_fastq; /* fast output queue */
struct ifqueue pp_cpq; /* PPP control protocol queue */
struct sppp *pp_next; /* next interface in keepalive list */
u_int pp_mode; /* major protocol modes (cisco/ppp/...) */
u_int pp_flags; /* sub modes */
u_short pp_alivecnt; /* keepalive packets counter */
u_short pp_loopcnt; /* loopback detection counter */
u_long pp_seq[IDX_COUNT]; /* local sequence number */
u_long pp_rseq[IDX_COUNT]; /* remote sequence number */
enum ppp_phase pp_phase; /* phase we're currently in */
int state[IDX_COUNT]; /* state machine */
u_char confid[IDX_COUNT]; /* id of last configuration request */
int rst_counter[IDX_COUNT]; /* restart counter */
int fail_counter[IDX_COUNT]; /* negotiation failure counter */
int confflags; /* administrative configuration flags */
#define CONF_ENABLE_VJ 0x01 /* VJ header compression enabled */
#define CONF_ENABLE_IPV6 0x02 /* IPv6 administratively enabled */
time_t pp_last_recv; /* time last packet has been received */
time_t pp_last_sent; /* time last packet has been sent */
struct callout ch[IDX_COUNT]; /* per-proto and if callouts */
struct callout pap_my_to_ch; /* PAP needs one more... */
struct callout keepalive_callout; /* keepalive callout */
struct slcp lcp; /* LCP params */
struct sipcp ipcp; /* IPCP params */
struct sipcp ipv6cp; /* IPv6CP params */
struct sauth myauth; /* auth params, i'm peer */
struct sauth hisauth; /* auth params, i'm authenticator */
struct slcompress *pp_comp; /* for VJ compression */
u_short fr_dlci; /* Frame Relay DLCI number, 16..1023 */
u_char fr_status; /* PVC status, active/new/delete */
/*
* These functions are filled in by sppp_attach(), and are
* expected to be used by the lower layer (hardware) drivers
* in order to communicate the (un)availability of the
* communication link. Lower layer drivers that are always
* ready to communicate (like hardware HDLC) can shortcut
* pp_up from pp_tls, and pp_down from pp_tlf.
*/
void (*pp_up)(struct sppp *sp);
void (*pp_down)(struct sppp *sp);
/*
* These functions need to be filled in by the lower layer
* (hardware) drivers if they request notification from the
* PPP layer whether the link is actually required. They
* correspond to the tls and tlf actions.
*/
void (*pp_tls)(struct sppp *sp);
void (*pp_tlf)(struct sppp *sp);
/*
* These (optional) functions may be filled by the hardware
* driver if any notification of established connections
* (currently: IPCP up) is desired (pp_con) or any internal
* state change of the interface state machine should be
* signaled for monitoring purposes (pp_chg).
*/
void (*pp_con)(struct sppp *sp);
void (*pp_chg)(struct sppp *sp, int new_state);
/* These two fields are for use by the lower layer */
void *pp_lowerp;
int pp_loweri;
/* Lock */
struct mtx mtx;
/* if_start () wrapper */
void (*if_start) (struct ifnet *);
struct callout ifstart_callout; /* if_start () scheduler */
};
#define IFP2SP(ifp) ((struct sppp *)(ifp)->if_l2com)
#define SP2IFP(sp) ((sp)->pp_ifp)
/* bits for pp_flags */
#define PP_KEEPALIVE 0x01 /* use keepalive protocol */
#define PP_FR 0x04 /* use Frame Relay protocol instead of PPP */
/* 0x04 was PP_TIMO */
#define PP_CALLIN 0x08 /* we are being called */
#define PP_NEEDAUTH 0x10 /* remote requested authentication */
void sppp_attach (struct ifnet *ifp);
void sppp_detach (struct ifnet *ifp);
void sppp_input (struct ifnet *ifp, struct mbuf *m);
int sppp_ioctl (struct ifnet *ifp, u_long cmd, void *data);
struct mbuf *sppp_dequeue (struct ifnet *ifp);
struct mbuf *sppp_pick(struct ifnet *ifp);
int sppp_isempty (struct ifnet *ifp);
void sppp_flush (struct ifnet *ifp);
/* Internal functions */
void sppp_fr_input (struct sppp *sp, struct mbuf *m);
struct mbuf *sppp_fr_header (struct sppp *sp, struct mbuf *m, int fam);
void sppp_fr_keepalive (struct sppp *sp);
void sppp_get_ip_addrs(struct sppp *sp, u_long *src, u_long *dst,
u_long *srcmask);
#endif
#endif /* _NET_IF_SPPP_H_ */

View File

@ -1,611 +0,0 @@
/*-
* Synchronous Frame Relay link level subroutines.
* ANSI T1.617-compaible link management signaling
* implemented for Frame Relay mode.
* Cisco-type Frame Relay framing added, thanks Alex Tutubalin.
* Only one DLCI per channel for now.
*
* Copyright (C) 1994-2000 Cronyx Engineering.
* Author: Serge Vakulenko, <vak@cronyx.ru>
*
* Copyright (C) 1999-2004 Cronyx Engineering.
* Author: Kurakin Roman, <rik@cronyx.ru>
*
* This software is distributed with NO WARRANTIES, not even the implied
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Authors grant any other persons or organisations a permission to use,
* modify and redistribute this software in source and binary forms,
* as long as this message is kept with the software, all derivative
* works or modified versions.
*
* $Cronyx Id: if_spppfr.c,v 1.1.2.10 2004/06/29 09:02:30 rik Exp $
* $FreeBSD$
*/
#include <sys/param.h>
#if defined(__FreeBSD__)
#include "opt_inet.h"
#include "opt_inet6.h"
#endif
#ifdef NetBSD1_3
# if NetBSD1_3 > 6
# include "opt_inet.h"
# include "opt_inet6.h"
# include "opt_iso.h"
# endif
#endif
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/sockio.h>
#include <sys/socket.h>
#include <sys/syslog.h>
#if defined(__FreeBSD__)
#include <sys/random.h>
#endif
#include <sys/malloc.h>
#include <sys/mbuf.h>
#if defined (__OpenBSD__)
#include <sys/md5k.h>
#else
#include <sys/md5.h>
#endif
#include <net/if.h>
#include <net/if_var.h>
#include <net/netisr.h>
#include <net/if_types.h>
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <net/slcompress.h>
#if defined (__NetBSD__) || defined (__OpenBSD__)
#include <machine/cpu.h> /* XXX for softnet */
#endif
#include <machine/stdarg.h>
#include <netinet/in_var.h>
#ifdef INET
#include <netinet/ip.h>
#include <netinet/tcp.h>
#endif
#if defined (__FreeBSD__) || defined (__OpenBSD__)
# include <netinet/if_ether.h>
#else
# include <net/ethertypes.h>
#endif
#include <net/if_sppp.h>
/*
* Frame Relay.
*/
#define FR_UI 0x03 /* Unnumbered Information */
#define FR_IP 0xCC /* IP protocol identifier */
#define FR_PADDING 0x00 /* NLPID padding */
#define FR_SIGNALING 0x08 /* Q.933/T1.617 signaling identifier */
#define FR_SNAP 0x80 /* NLPID snap */
/*
* Header flags.
*/
#define FR_DE 0x02 /* discard eligibility */
#define FR_FECN 0x04 /* forward notification */
#define FR_BECN 0x08 /* backward notification */
/*
* Signaling message types.
*/
#define FR_MSG_ENQUIRY 0x75 /* status enquiry */
#define FR_MSG_STATUS 0x7d /* status */
#define FR_ENQUIRY_SIZE 14
/*
* Message field types.
*/
#define FR_FLD_RTYPE 0x01 /* report type */
#define FR_FLD_VERIFY 0x03 /* link verification */
#define FR_FLD_PVC 0x07 /* PVC status */
#define FR_FLD_LSHIFT5 0x95 /* locking shift 5 */
/*
* Report types.
*/
#define FR_RTYPE_FULL 0 /* full status */
#define FR_RTYPE_SHORT 1 /* link verification only */
#define FR_RTYPE_SINGLE 2 /* single PVC status */
/* PVC status field. */
#define FR_DLCI_DELETE 0x04 /* PVC is deleted */
#define FR_DLCI_ACTIVE 0x02 /* PVC is operational */
#define FR_DLCI_NEW 0x08 /* PVC is new */
struct arp_req {
unsigned short htype; /* hardware type = ARPHRD_FRELAY */
unsigned short ptype; /* protocol type = ETHERTYPE_IP */
unsigned char halen; /* hardware address length = 2 */
unsigned char palen; /* protocol address length = 4 */
unsigned short op; /* ARP/RARP/InARP request/reply */
unsigned short hsource; /* hardware source address */
unsigned short psource1; /* protocol source */
unsigned short psource2;
unsigned short htarget; /* hardware target address */
unsigned short ptarget1; /* protocol target */
unsigned short ptarget2;
} __packed;
#if defined(__FreeBSD__) && __FreeBSD_version < 501113
#define SPP_FMT "%s%d: "
#define SPP_ARGS(ifp) (ifp)->if_name, (ifp)->if_unit
#else
#define SPP_FMT "%s: "
#define SPP_ARGS(ifp) (ifp)->if_xname
#endif
/* almost every function needs these */
#define STDDCL \
struct ifnet *ifp = SP2IFP(sp); \
int debug = ifp->if_flags & IFF_DEBUG
static void sppp_fr_arp (struct sppp *sp, struct arp_req *req, u_short addr);
static void sppp_fr_signal (struct sppp *sp, unsigned char *h, int len);
void sppp_fr_input (struct sppp *sp, struct mbuf *m)
{
STDDCL;
u_char *h = mtod (m, u_char*);
int isr = -1;
int dlci, hlen, proto;
/* Get the DLCI number. */
if (m->m_pkthdr.len < 10) {
bad: m_freem (m);
return;
}
dlci = (h[0] << 2 & 0x3f0) | (h[1] >> 4 & 0x0f);
/* Process signaling packets. */
if (dlci == 0) {
sppp_fr_signal (sp, h, m->m_pkthdr.len);
m_freem (m);
return;
}
if (dlci != sp->fr_dlci) {
if (debug)
printf (SPP_FMT "Received packet from invalid DLCI %d\n",
SPP_ARGS(ifp), dlci);
goto bad;
}
/* Process the packet. */
if (ntohs (*(short*) (h+2)) == ETHERTYPE_IP) {
/* Prehistoric IP framing? */
h[2] = FR_UI;
h[3] = FR_IP;
}
if (h[2] != FR_UI) {
if (debug)
printf (SPP_FMT "Invalid frame relay header flag 0x%02x\n",
SPP_ARGS(ifp), h[2]);
goto bad;
}
switch (h[3]) {
default:
if (debug)
printf (SPP_FMT "Unsupported NLPID 0x%02x\n",
SPP_ARGS(ifp), h[3]);
goto bad;
case FR_PADDING:
if (h[4] != FR_SNAP) {
if (debug)
printf (SPP_FMT "Bad NLPID 0x%02x\n",
SPP_ARGS(ifp), h[4]);
goto bad;
}
if (h[5] || h[6] || h[7]) {
if (debug)
printf (SPP_FMT "Bad OID 0x%02x-0x%02x-0x%02x\n",
SPP_ARGS(ifp),
h[5], h[6], h[7]);
goto bad;
}
proto = ntohs (*(short*) (h+8));
if (proto == ETHERTYPE_ARP) {
/* Process the ARP request. */
if (m->m_pkthdr.len != 10 + sizeof (struct arp_req)) {
if (debug)
printf (SPP_FMT "Bad ARP request size = %d bytes\n",
SPP_ARGS(ifp),
m->m_pkthdr.len);
goto bad;
}
sppp_fr_arp (sp, (struct arp_req*) (h + 10),
h[0] << 8 | h[1]);
m_freem (m);
return;
}
hlen = 10;
break;
case FR_IP:
proto = ETHERTYPE_IP;
hlen = 4;
break;
}
/* Remove frame relay header. */
m_adj (m, hlen);
switch (proto) {
default:
if_inc_counter(ifp, IFCOUNTER_NOPROTO, 1);
drop: if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
m_freem (m);
return;
#ifdef INET
case ETHERTYPE_IP:
isr = NETISR_IP;
break;
#endif
}
if (! (ifp->if_flags & IFF_UP))
goto drop;
M_SETFIB(m, ifp->if_fib);
/* Check queue. */
if (netisr_queue(isr, m)) { /* (0) on success. */
if (debug)
log(LOG_DEBUG, SPP_FMT "protocol queue overflow\n",
SPP_ARGS(ifp));
}
}
/*
* Add the frame relay header to the packet.
* For IP the header length is 4 bytes,
* for all other protocols - 10 bytes (RFC 1490).
*/
struct mbuf *sppp_fr_header (struct sppp *sp, struct mbuf *m,
int family)
{
STDDCL;
u_char *h;
int type, hlen;
/* Prepend the space for Frame Relay header. */
hlen = (family == AF_INET) ? 4 : 10;
M_PREPEND (m, hlen, M_NOWAIT);
if (! m)
return 0;
h = mtod (m, u_char*);
/* Fill the header. */
h[0] = sp->fr_dlci >> 2 & 0xfc;
h[1] = sp->fr_dlci << 4 | 1;
h[2] = FR_UI;
switch (family) {
default:
if (debug)
printf (SPP_FMT "Cannot handle address family %d\n",
SPP_ARGS(ifp), family);
m_freem (m);
return 0;
#ifdef INET
case AF_INET:
#if 0 /* Crashes on fragmented packets */
/*
* Set the discard eligibility bit, if:
* 1) no fragmentation
* 2) length > 400 bytes
* 3a) the protocol is UDP or
* 3b) TCP data (no control bits)
*/
{
struct ip *ip = (struct ip*) (h + hlen);
struct tcphdr *tcp = (struct tcphdr*) ((long*)ip + ip->ip_hl);
if (! (ip->ip_off & ~IP_DF) && ip->ip_len > 400 &&
(ip->ip_p == IPPROTO_UDP ||
ip->ip_p == IPPROTO_TCP && ! tcp->th_flags))
h[1] |= FR_DE;
}
#endif
h[3] = FR_IP;
return m;
#endif
#ifdef NS
case AF_NS:
type = 0x8137;
break;
#endif
}
h[3] = FR_PADDING;
h[4] = FR_SNAP;
h[5] = 0;
h[6] = 0;
h[7] = 0;
*(short*) (h+8) = htons(type);
return m;
}
/*
* Send periodical frame relay link verification messages via DLCI 0.
* Called every 10 seconds (default value of T391 timer is 10 sec).
* Every 6-th message is a full status request
* (default value of N391 counter is 6).
*/
void sppp_fr_keepalive (struct sppp *sp)
{
STDDCL;
unsigned char *h, *p;
struct mbuf *m;
MGETHDR (m, M_NOWAIT, MT_DATA);
if (! m)
return;
m->m_pkthdr.rcvif = 0;
h = mtod (m, u_char*);
p = h;
*p++ = 0; /* DLCI = 0 */
*p++ = 1;
*p++ = FR_UI;
*p++ = FR_SIGNALING; /* NLPID = UNI call control */
*p++ = 0; /* call reference length = 0 */
*p++ = FR_MSG_ENQUIRY; /* message type = status enquiry */
*p++ = FR_FLD_LSHIFT5; /* locking shift 5 */
*p++ = FR_FLD_RTYPE; /* report type field */
*p++ = 1; /* report type length = 1 */
if (sp->pp_seq[IDX_LCP] % 6)
*p++ = FR_RTYPE_SHORT; /* link verification only */
else
*p++ = FR_RTYPE_FULL; /* full status needed */
if (sp->pp_seq[IDX_LCP] >= 255)
sp->pp_seq[IDX_LCP] = 0;
*p++ = FR_FLD_VERIFY; /* link verification type field */
*p++ = 2; /* link verification field length = 2 */
*p++ = ++sp->pp_seq[IDX_LCP]; /* our sequence number */
*p++ = sp->pp_rseq[IDX_LCP]; /* last received sequence number */
m->m_pkthdr.len = m->m_len = p - h;
if (debug)
printf (SPP_FMT "send lmi packet, seq=%d, rseq=%d\n",
SPP_ARGS(ifp), (u_char) sp->pp_seq[IDX_LCP],
(u_char) sp->pp_rseq[IDX_LCP]);
if (! IF_HANDOFF_ADJ(&sp->pp_cpq, m, ifp, 3))
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
}
/*
* Process the frame relay Inverse ARP request.
*/
static void sppp_fr_arp (struct sppp *sp, struct arp_req *req,
u_short his_hardware_address)
{
STDDCL;
struct mbuf *m;
struct arp_req *reply;
u_char *h;
u_short my_hardware_address;
u_long his_ip_address, my_ip_address;
if ((ntohs (req->htype) != ARPHRD_FRELAY ||
ntohs (req->htype) != 16) || /* for BayNetworks routers */
ntohs (req->ptype) != ETHERTYPE_IP) {
if (debug)
printf (SPP_FMT "Invalid ARP hardware/protocol type = 0x%x/0x%x\n",
SPP_ARGS(ifp),
ntohs (req->htype), ntohs (req->ptype));
return;
}
if (req->halen != 2 || req->palen != 4) {
if (debug)
printf (SPP_FMT "Invalid ARP hardware/protocol address length = %d/%d\n",
SPP_ARGS(ifp),
req->halen, req->palen);
return;
}
switch (ntohs (req->op)) {
default:
if (debug)
printf (SPP_FMT "Invalid ARP op = 0x%x\n",
SPP_ARGS(ifp), ntohs (req->op));
return;
case ARPOP_INVREPLY:
/* Ignore. */
return;
case ARPOP_INVREQUEST:
my_hardware_address = ntohs (req->htarget);
his_ip_address = ntohs (req->psource1) << 16 |
ntohs (req->psource2);
my_ip_address = ntohs (req->ptarget1) << 16 |
ntohs (req->ptarget2);
break;
}
if (debug)
printf (SPP_FMT "got ARP request, source=0x%04x/%d.%d.%d.%d, target=0x%04x/%d.%d.%d.%d\n",
SPP_ARGS(ifp), ntohs (req->hsource),
(unsigned char) (his_ip_address >> 24),
(unsigned char) (his_ip_address >> 16),
(unsigned char) (his_ip_address >> 8),
(unsigned char) his_ip_address,
my_hardware_address,
(unsigned char) (my_ip_address >> 24),
(unsigned char) (my_ip_address >> 16),
(unsigned char) (my_ip_address >> 8),
(unsigned char) my_ip_address);
sppp_get_ip_addrs (sp, &my_ip_address, 0, 0);
if (! my_ip_address)
return; /* nothing to reply */
if (debug)
printf (SPP_FMT "send ARP reply, source=0x%04x/%d.%d.%d.%d, target=0x%04x/%d.%d.%d.%d\n",
SPP_ARGS(ifp), my_hardware_address,
(unsigned char) (my_ip_address >> 24),
(unsigned char) (my_ip_address >> 16),
(unsigned char) (my_ip_address >> 8),
(unsigned char) my_ip_address,
his_hardware_address,
(unsigned char) (his_ip_address >> 24),
(unsigned char) (his_ip_address >> 16),
(unsigned char) (his_ip_address >> 8),
(unsigned char) his_ip_address);
/* Send the Inverse ARP reply. */
MGETHDR (m, M_NOWAIT, MT_DATA);
if (! m)
return;
m->m_pkthdr.len = m->m_len = 10 + sizeof (*reply);
m->m_pkthdr.rcvif = 0;
h = mtod (m, u_char*);
reply = (struct arp_req*) (h + 10);
h[0] = his_hardware_address >> 8;
h[1] = his_hardware_address;
h[2] = FR_UI;
h[3] = FR_PADDING;
h[4] = FR_SNAP;
h[5] = 0;
h[6] = 0;
h[7] = 0;
*(short*) (h+8) = htons (ETHERTYPE_ARP);
reply->htype = htons (ARPHRD_FRELAY);
reply->ptype = htons (ETHERTYPE_IP);
reply->halen = 2;
reply->palen = 4;
reply->op = htons (ARPOP_INVREPLY);
reply->hsource = htons (my_hardware_address);
reply->psource1 = htonl (my_ip_address);
reply->psource2 = htonl (my_ip_address) >> 16;
reply->htarget = htons (his_hardware_address);
reply->ptarget1 = htonl (his_ip_address);
reply->ptarget2 = htonl (his_ip_address) >> 16;
if (! IF_HANDOFF_ADJ(&sp->pp_cpq, m, ifp, 3))
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
}
/*
* Process the input signaling packet (DLCI 0).
* The implemented protocol is ANSI T1.617 Annex D.
*/
static void sppp_fr_signal (struct sppp *sp, unsigned char *h, int len)
{
STDDCL;
u_char *p;
int dlci;
if (h[2] != FR_UI || h[3] != FR_SIGNALING || h[4] != 0) {
if (debug)
printf (SPP_FMT "Invalid signaling header\n",
SPP_ARGS(ifp));
bad: if (debug) {
printf ("%02x", *h++);
while (--len > 0)
printf ("-%02x", *h++);
printf ("\n");
}
return;
}
if (h[5] == FR_MSG_ENQUIRY) {
if (len == FR_ENQUIRY_SIZE &&
h[12] == (u_char) sp->pp_seq[IDX_LCP]) {
sp->pp_seq[IDX_LCP] = random();
printf (SPP_FMT "loopback detected\n",
SPP_ARGS(ifp));
}
return;
}
if (h[5] != FR_MSG_STATUS) {
if (debug)
printf (SPP_FMT "Unknown signaling message: 0x%02x\n",
SPP_ARGS(ifp), h[5]);
goto bad;
}
/* Parse message fields. */
for (p=h+6; p<h+len; ) {
switch (*p) {
default:
if (debug)
printf (SPP_FMT "Unknown signaling field 0x%x\n",
SPP_ARGS(ifp), *p);
break;
case FR_FLD_LSHIFT5:
case FR_FLD_RTYPE:
/* Ignore. */
break;
case FR_FLD_VERIFY:
if (p[1] != 2) {
if (debug)
printf (SPP_FMT "Invalid signaling verify field length %d\n",
SPP_ARGS(ifp), p[1]);
break;
}
sp->pp_rseq[IDX_LCP] = p[2];
if (debug) {
printf (SPP_FMT "got lmi reply rseq=%d, seq=%d",
SPP_ARGS(ifp), p[2], p[3]);
if (p[3] != (u_char) sp->pp_seq[IDX_LCP])
printf (" (really %d)",
(u_char) sp->pp_seq[IDX_LCP]);
printf ("\n");
}
break;
case FR_FLD_PVC:
if (p[1] < 3) {
if (debug)
printf (SPP_FMT "Invalid PVC status length %d\n",
SPP_ARGS(ifp), p[1]);
break;
}
dlci = (p[2] << 4 & 0x3f0) | (p[3] >> 3 & 0x0f);
if (! sp->fr_dlci)
sp->fr_dlci = dlci;
if (sp->fr_status != p[4])
printf (SPP_FMT "DLCI %d %s%s\n",
SPP_ARGS(ifp), dlci,
p[4] & FR_DLCI_DELETE ? "deleted" :
p[4] & FR_DLCI_ACTIVE ? "active" : "passive",
p[4] & FR_DLCI_NEW ? ", new" : "");
sp->fr_status = p[4];
break;
}
if (*p & 0x80)
++p;
else if (p < h+len+1 && p[1])
p += 2 + p[1];
else {
if (debug)
printf (SPP_FMT "Invalid signaling field 0x%x\n",
SPP_ARGS(ifp), *p);
goto bad;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,411 +0,0 @@
/*
* ng_sppp.c Netgraph to Sppp module.
*/
/*-
* Copyright (C) 2002-2004 Cronyx Engineering.
* Copyright (C) 2002-2004 Roman Kurakin <rik@cronyx.ru>
*
* This software is distributed with NO WARRANTIES, not even the implied
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Authors grant any other persons or organisations a permission to use,
* modify and redistribute this software in source and binary forms,
* as long as this message is kept with the software, all derivative
* works or modified versions.
*
* Cronyx Id: ng_sppp.c,v 1.1.2.10 2004/03/01 15:17:21 rik Exp $
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/errno.h>
#include <sys/sockio.h>
#include <sys/socket.h>
#include <sys/syslog.h>
#include <sys/libkern.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_types.h>
#include <net/bpf.h>
#include <net/if_sppp.h>
#include <netinet/in.h>
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <netgraph/ng_parse.h>
#include <netgraph/ng_sppp.h>
#ifdef NG_SEPARATE_MALLOC
static MALLOC_DEFINE(M_NETGRAPH_SPPP, "netgraph_sppp", "netgraph sppp node");
#else
#define M_NETGRAPH_SPPP M_NETGRAPH
#endif
/* Node private data */
struct ng_sppp_private {
struct ifnet *ifp; /* Our interface */
int unit; /* Interface unit number */
node_p node; /* Our netgraph node */
hook_p hook; /* Hook */
};
typedef struct ng_sppp_private *priv_p;
/* Interface methods */
static void ng_sppp_start (struct ifnet *ifp);
static int ng_sppp_ioctl (struct ifnet *ifp, u_long cmd, caddr_t data);
/* Netgraph methods */
static ng_constructor_t ng_sppp_constructor;
static ng_rcvmsg_t ng_sppp_rcvmsg;
static ng_shutdown_t ng_sppp_shutdown;
static ng_newhook_t ng_sppp_newhook;
static ng_rcvdata_t ng_sppp_rcvdata;
static ng_disconnect_t ng_sppp_disconnect;
/* List of commands and how to convert arguments to/from ASCII */
static const struct ng_cmdlist ng_sppp_cmds[] = {
{
NGM_SPPP_COOKIE,
NGM_SPPP_GET_IFNAME,
"getifname",
NULL,
&ng_parse_string_type
},
{ 0 }
};
/* Node type descriptor */
static struct ng_type typestruct = {
.version = NG_ABI_VERSION,
.name = NG_SPPP_NODE_TYPE,
.constructor = ng_sppp_constructor,
.rcvmsg = ng_sppp_rcvmsg,
.shutdown = ng_sppp_shutdown,
.newhook = ng_sppp_newhook,
.rcvdata = ng_sppp_rcvdata,
.disconnect = ng_sppp_disconnect,
.cmdlist = ng_sppp_cmds,
};
NETGRAPH_INIT(sppp, &typestruct);
MODULE_DEPEND (ng_sppp, sppp, 1, 1, 1);
/* We keep a bitmap indicating which unit numbers are free.
Zero means the unit number is free, one means it's taken. */
static unsigned char *ng_sppp_units = NULL;
static unsigned char ng_sppp_units_len = 0;
static unsigned char ng_units_in_use = 0;
/*
* Find the first free unit number for a new interface.
* Increase the size of the unit bitmap as necessary.
*/
static __inline void
ng_sppp_get_unit (int *unit)
{
int index, bit;
unsigned char mask;
for (index = 0; index < ng_sppp_units_len
&& ng_sppp_units[index] == 0xFF; index++);
if (index == ng_sppp_units_len) { /* extend array */
unsigned char *newarray;
int newlen;
newlen = (2 * ng_sppp_units_len) + sizeof (*ng_sppp_units);
newarray = malloc (newlen * sizeof (*ng_sppp_units),
M_NETGRAPH_SPPP, M_WAITOK);
bcopy (ng_sppp_units, newarray,
ng_sppp_units_len * sizeof (*ng_sppp_units));
bzero (newarray + ng_sppp_units_len,
newlen - ng_sppp_units_len);
if (ng_sppp_units != NULL)
free (ng_sppp_units, M_NETGRAPH_SPPP);
ng_sppp_units = newarray;
ng_sppp_units_len = newlen;
}
mask = ng_sppp_units[index];
for (bit = 0; (mask & 1) != 0; bit++)
mask >>= 1;
KASSERT ((bit >= 0 && bit < NBBY),
("%s: word=%d bit=%d", __func__, ng_sppp_units[index], bit));
ng_sppp_units[index] |= (1 << bit);
*unit = (index * NBBY) + bit;
ng_units_in_use++;
}
/*
* Free a no longer needed unit number.
*/
static __inline void
ng_sppp_free_unit (int unit)
{
int index, bit;
index = unit / NBBY;
bit = unit % NBBY;
KASSERT (index < ng_sppp_units_len,
("%s: unit=%d len=%d", __func__, unit, ng_sppp_units_len));
KASSERT ((ng_sppp_units[index] & (1 << bit)) != 0,
("%s: unit=%d is free", __func__, unit));
ng_sppp_units[index] &= ~(1 << bit);
ng_units_in_use--;
if (ng_units_in_use == 0) {
free (ng_sppp_units, M_NETGRAPH_SPPP);
ng_sppp_units_len = 0;
ng_sppp_units = NULL;
}
}
/************************************************************************
INTERFACE STUFF
************************************************************************/
/*
* Process an ioctl for the interface
*/
static int
ng_sppp_ioctl (struct ifnet *ifp, u_long command, caddr_t data)
{
int error = 0;
error = sppp_ioctl (ifp, command, data);
if (error)
return error;
return error;
}
/*
* This routine should never be called
*/
static void
ng_sppp_start (struct ifnet *ifp)
{
struct mbuf *m;
int len, error = 0;
priv_p priv = ifp->if_softc;
/* Check interface flags */
/*
* This has side effects. It is not good idea to stop sending if we
* are not UP. If we are not running we still want to send LCP term
* packets.
*/
/* if (!((ifp->if_flags & IFF_UP) && */
/* (ifp->if_drv_flags & IFF_DRV_RUNNING))) { */
/* return;*/
/* }*/
if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
return;
if (!priv->hook)
return;
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
while ((m = sppp_dequeue (ifp)) != NULL) {
BPF_MTAP (ifp, m);
len = m->m_pkthdr.len;
NG_SEND_DATA_ONLY (error, priv->hook, m);
if (error) {
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
return;
}
}
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
}
/************************************************************************
NETGRAPH NODE STUFF
************************************************************************/
/*
* Constructor for a node
*/
static int
ng_sppp_constructor (node_p node)
{
struct sppp *pp;
struct ifnet *ifp;
priv_p priv;
/* Allocate node and interface private structures */
priv = malloc(sizeof(*priv), M_NETGRAPH_SPPP, M_WAITOK | M_ZERO);
ifp = if_alloc(IFT_PPP);
if (ifp == NULL) {
free (priv, M_NETGRAPH_SPPP);
return (ENOSPC);
}
pp = IFP2SP(ifp);
/* Link them together */
ifp->if_softc = priv;
priv->ifp = ifp;
/* Get an interface unit number */
ng_sppp_get_unit(&priv->unit);
/* Link together node and private info */
NG_NODE_SET_PRIVATE (node, priv);
priv->node = node;
/* Initialize interface structure */
if_initname (SP2IFP(pp), NG_SPPP_IFACE_NAME, priv->unit);
ifp->if_start = ng_sppp_start;
ifp->if_ioctl = ng_sppp_ioctl;
ifp->if_flags = (IFF_POINTOPOINT|IFF_MULTICAST);
/* Give this node the same name as the interface (if possible) */
if (ng_name_node(node, SP2IFP(pp)->if_xname) != 0)
log (LOG_WARNING, "%s: can't acquire netgraph name\n",
SP2IFP(pp)->if_xname);
/* Attach the interface */
sppp_attach (ifp);
if_attach (ifp);
bpfattach (ifp, DLT_NULL, sizeof(u_int32_t));
/* Done */
return (0);
}
/*
* Give our ok for a hook to be added
*/
static int
ng_sppp_newhook (node_p node, hook_p hook, const char *name)
{
priv_p priv = NG_NODE_PRIVATE (node);
if (strcmp (name, NG_SPPP_HOOK_DOWNSTREAM) != 0)
return (EINVAL);
if (priv->hook)
return (EISCONN);
priv->hook = hook;
NG_HOOK_SET_PRIVATE (hook, priv);
return (0);
}
/*
* Receive a control message
*/
static int
ng_sppp_rcvmsg (node_p node, item_p item, hook_p lasthook)
{
const priv_p priv = NG_NODE_PRIVATE (node);
struct ng_mesg *msg = NULL;
struct ng_mesg *resp = NULL;
struct sppp *const pp = IFP2SP(priv->ifp);
int error = 0;
NGI_GET_MSG (item, msg);
switch (msg->header.typecookie) {
case NGM_SPPP_COOKIE:
switch (msg->header.cmd) {
case NGM_SPPP_GET_IFNAME:
NG_MKRESPONSE (resp, msg, IFNAMSIZ, M_NOWAIT);
if (!resp) {
error = ENOMEM;
break;
}
strlcpy(resp->data, SP2IFP(pp)->if_xname, IFNAMSIZ);
break;
default:
error = EINVAL;
break;
}
break;
default:
error = EINVAL;
break;
}
NG_RESPOND_MSG (error, node, item, resp);
NG_FREE_MSG (msg);
return (error);
}
/*
* Recive data from a hook. Pass the packet to the correct input routine.
*/
static int
ng_sppp_rcvdata (hook_p hook, item_p item)
{
struct mbuf *m;
const priv_p priv = NG_NODE_PRIVATE (NG_HOOK_NODE (hook));
struct sppp *const pp = IFP2SP(priv->ifp);
NGI_GET_M (item, m);
NG_FREE_ITEM (item);
/* Sanity checks */
KASSERT (m->m_flags & M_PKTHDR, ("%s: not pkthdr", __func__));
if ((SP2IFP(pp)->if_flags & IFF_UP) == 0) {
NG_FREE_M (m);
return (ENETDOWN);
}
/* Update interface stats */
if_inc_counter(SP2IFP(pp), IFCOUNTER_IPACKETS, 1);
/* Note receiving interface */
m->m_pkthdr.rcvif = SP2IFP(pp);
/* Berkeley packet filter */
BPF_MTAP (SP2IFP(pp), m);
/* Send packet */
sppp_input (SP2IFP(pp), m);
return 0;
}
/*
* Shutdown and remove the node and its associated interface.
*/
static int
ng_sppp_shutdown (node_p node)
{
const priv_p priv = NG_NODE_PRIVATE(node);
/* Detach from the packet filter list of interfaces. */
bpfdetach (priv->ifp);
sppp_detach (priv->ifp);
if_detach (priv->ifp);
if_free(priv->ifp);
ng_sppp_free_unit (priv->unit);
free (priv, M_NETGRAPH_SPPP);
NG_NODE_SET_PRIVATE (node, NULL);
NG_NODE_UNREF (node);
return (0);
}
/*
* Hook disconnection.
*/
static int
ng_sppp_disconnect (hook_p hook)
{
const priv_p priv = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
if (priv)
priv->hook = NULL;
return (0);
}

View File

@ -1,39 +0,0 @@
/*
* ng_sppp.h Netgraph to Sppp module.
*/
/*-
* Copyright (C) 2002-2004 Cronyx Engineering.
* Copyright (C) 2002-2004 Roman Kurakin <rik@cronyx.ru>
*
* This software is distributed with NO WARRANTIES, not even the implied
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Authors grant any other persons or organisations a permission to use,
* modify and redistribute this software in source and binary forms,
* as long as this message is kept with the software, all derivative
* works or modified versions.
*
* $FreeBSD$
* Cronyx Id: ng_sppp.h,v 1.1.2.6 2004/03/01 15:17:21 rik Exp $
*/
#ifndef _NETGRAPH_SPPP_H_
#define _NETGRAPH_SPPP_H_
/* Node type name and magic cookie */
#define NG_SPPP_NODE_TYPE "sppp"
#define NGM_SPPP_COOKIE 1040804655
/* Interface base name */
#define NG_SPPP_IFACE_NAME "sppp"
/* My hook names */
#define NG_SPPP_HOOK_DOWNSTREAM "downstream"
/* Netgraph commands */
enum {
NGM_SPPP_GET_IFNAME = 1, /* returns struct ng_sppp_ifname */
};
#endif /* _NETGRAPH_SPPP_H_ */

View File

@ -103,3 +103,8 @@ envvar hint.fd.0.at="fdc0"
envvar hint.fd.0.drive="0"
envvar hint.fd.1.at="fdc0"
envvar hint.fd.1.drive="1"
# cp: Cronyx Tau-PCI sync single/dual/four port
# V.35/RS-232/RS-530/RS-449/X.21/G.703/E1/E3/T3/STS-1
# serial adaptor, requires NETGRAPH
device cp

View File

@ -129,7 +129,6 @@ DIRDEPS+= \
sbin/savecore \
sbin/setkey \
sbin/shutdown \
sbin/spppcontrol \
sbin/swapon \
sbin/sysctl \
sbin/tunefs \