Remove "kernel ppp", i.e. if_ppp.ko and pppd(8). master
authorSascha Wildner <saw@online.de>
Tue, 17 Oct 2017 07:36:30 +0000 (09:36 +0200)
committerSascha Wildner <saw@online.de>
Tue, 17 Oct 2017 07:40:26 +0000 (09:40 +0200)
It has been replaced by ppp(8), in conjunction with tun(4).

While here, rename the ppp-user rc script to 'ppp' and fix up
REQUIRE/PROVIDE situation.

83 files changed:
Makefile_upgrade.inc
UPDATING
etc/mtree/BSD.include.dist
etc/mtree/BSD.usr.dist
etc/rc.d/Makefile
etc/rc.d/NETWORKING
etc/rc.d/ipfw
etc/rc.d/ppp
etc/rc.d/ppp-user [deleted file]
etc/rc.d/routing
etc/rc.d/rpcbind
include/Makefile
lib/libc/net/getnameinfo.c
libexec/bootpd/syslog.conf
share/examples/pppd/auth-down.sample [deleted file]
share/examples/pppd/auth-up.sample [deleted file]
share/examples/pppd/chap-secrets.sample [deleted file]
share/examples/pppd/chat.sh.sample [deleted file]
share/examples/pppd/ip-down.sample [deleted file]
share/examples/pppd/ip-up.sample [deleted file]
share/examples/pppd/options.sample [deleted file]
share/examples/pppd/pap-secrets.sample [deleted file]
share/examples/pppd/ppp.deny.sample [deleted file]
share/examples/pppd/ppp.shells.sample [deleted file]
share/man/man4/Makefile
share/man/man4/ppp.4 [deleted file]
share/man/man4/sppp.4
share/man/man4/ugensa.4
share/man/man8/rc.8
share/man/man9/ioctl.9
sys/boot/dloader/loader-bootp.conf
sys/boot/dloader/loader.conf
sys/conf/files
sys/conf/options
sys/config/LINT64
sys/net/Makefile
sys/net/bsd_comp.c [deleted file]
sys/net/ppp/if_ppp.c [deleted file]
sys/net/ppp/if_ppp.h [deleted file]
sys/net/ppp/if_pppvar.h [deleted file]
sys/net/ppp_layer/Makefile [deleted file]
sys/net/ppp_layer/ppp_comp.h [deleted file]
sys/net/ppp_layer/ppp_deflate.c [deleted file]
sys/net/ppp_layer/ppp_tty.c [deleted file]
sys/sys/param.h
usr.bin/chat/chat.8
usr.bin/crunch/examples/really-big.conf
usr.bin/rfcomm_sppd/rfcomm_sppd.1
usr.sbin/Makefile
usr.sbin/ppp/ppp.8.m4
usr.sbin/pppd/Makefile [deleted file]
usr.sbin/pppd/RELNOTES [deleted file]
usr.sbin/pppd/auth.c [deleted file]
usr.sbin/pppd/cbcp.c [deleted file]
usr.sbin/pppd/cbcp.h [deleted file]
usr.sbin/pppd/ccp.c [deleted file]
usr.sbin/pppd/ccp.h [deleted file]
usr.sbin/pppd/chap.c [deleted file]
usr.sbin/pppd/chap.h [deleted file]
usr.sbin/pppd/chap_ms.c [deleted file]
usr.sbin/pppd/chap_ms.h [deleted file]
usr.sbin/pppd/demand.c [deleted file]
usr.sbin/pppd/fsm.c [deleted file]
usr.sbin/pppd/fsm.h [deleted file]
usr.sbin/pppd/ipcp.c [deleted file]
usr.sbin/pppd/ipcp.h [deleted file]
usr.sbin/pppd/lcp.c [deleted file]
usr.sbin/pppd/lcp.h [deleted file]
usr.sbin/pppd/magic.c [deleted file]
usr.sbin/pppd/magic.h [deleted file]
usr.sbin/pppd/main.c [deleted file]
usr.sbin/pppd/options.c [deleted file]
usr.sbin/pppd/patchlevel.h [deleted file]
usr.sbin/pppd/pathnames.h [deleted file]
usr.sbin/pppd/pppd.8 [deleted file]
usr.sbin/pppd/pppd.h [deleted file]
usr.sbin/pppd/sys-bsd.c [deleted file]
usr.sbin/pppd/upap.c [deleted file]
usr.sbin/pppd/upap.h [deleted file]
usr.sbin/pppstats/Makefile [deleted file]
usr.sbin/pppstats/pppstats.8 [deleted file]
usr.sbin/pppstats/pppstats.c [deleted file]
usr.sbin/slstat/slstat.8

index c2318ea..cfd7dab 100644 (file)
@@ -3250,6 +3250,17 @@ TO_REMOVE+=/usr/share/man/man3/mparse_reset.3.gz
 TO_REMOVE+=/usr/share/man/man3/mparse_result.3.gz
 TO_REMOVE+=/usr/share/man/man3/mparse_strerror.3.gz
 TO_REMOVE+=/usr/share/man/man3/mparse_strlevel.3.gz
+TO_REMOVE+=/boot/kernel/if_ppp.ko
+TO_REMOVE+=/etc/rc.d/ppp-user
+TO_REMOVE+=/usr/include/net/ppp
+TO_REMOVE+=/usr/include/ppp_layer/ppp_comp.h
+TO_REMOVE+=/usr/sbin/pppd
+TO_REMOVE+=/usr/sbin/pppstats
+TO_REMOVE+=/usr/share/examples/pppd
+TO_REMOVE+=/usr/share/man/man4/if_ppp.4.gz
+TO_REMOVE+=/usr/share/man/man4/ppp.4.gz
+TO_REMOVE+=/usr/share/man/man8/pppd.8.gz
+TO_REMOVE+=/usr/share/man/man8/pppstats.8.gz
 
 .if !defined(WANT_INSTALLER)
 TO_REMOVE+=/usr/sbin/dfuibe_installer
index 4b7e31f..3e9848f 100644 (file)
--- a/UPDATING
+++ b/UPDATING
@@ -8,6 +8,18 @@
 # If you discover any problem, please contact the bugs@lists.dragonflybsd.org
 # mailing list with the details.
 
++-----------------------------------------------------------------------+
++         UPGRADING DRAGONFLY FROM 5.0 TO LATER VERSIONS                +
++-----------------------------------------------------------------------+
+
+IF_PPP AND PPPD REMOVED
+-----------------------
+
+It has been replaced by "user ppp", i.e. ppp(8) and tun(4). It had
+already been removed from our default kernel configuration before 5.0,
+so only people with custom configurations based on earlier X86_64_GENERIC
+will have to remove it manually.
+
 +-----------------------------------------------------------------------+
 +         UPGRADING DRAGONFLY FROM 4.8 TO LATER VERSIONS                +
 +-----------------------------------------------------------------------+
index 7dbc821..50a4dc6 100644 (file)
         ..
         pf
         ..
-        ppp
-        ..
         ppp_layer
         ..
         sl
index 1890d1c..b039f9d 100644 (file)
             ..
             ppp
             ..
-            pppd
-            ..
             printing
             ..
             puffs
index 2d26f4c..0b436b2 100644 (file)
@@ -17,7 +17,7 @@ FILES=        DAEMON LOGIN NETWORKING SERVERS \
        mountd moused mroute6d mrouted msgs \
        named netif netoptions newsyslog \
        network_ipv6 nfsclient nfsd nfsserver nisdomain nscd nsswitch \
-       dntpd othermta pf pflog powerd ppp ppp-user pppoed pwcheck \
+       dntpd othermta pf pflog powerd ppp pppoed pwcheck \
        quota random rarpd rcconf resident rndcontrol root route6d routed \
        routing rpcbind rtadvd rtsold rwho sysdb savecore sdpd securelevel \
        sendmail sensorsd serial sppp sshd statd swap1 syscons sysctl syslogd sysvipcd \
index d04772b..f96de4f 100644 (file)
@@ -5,7 +5,7 @@
 #
 
 # PROVIDE: NETWORKING NETWORK
-# REQUIRE: netif routing network_ipv6 ppp-user
+# REQUIRE: netif routing network_ipv6 ppp
 # REQUIRE: routed mrouted route6d mroute6d
 
 #      This is a dummy dependency, for services which require networking
index 5107d14..30c0ef8 100644 (file)
@@ -4,7 +4,7 @@
 #
 
 # PROVIDE: ipfw
-# REQUIRE: ppp-user
+# REQUIRE: ppp
 # BEFORE: NETWORKING
 
 . /etc/rc.subr
index 3e7ea0d..ae50e73 100644 (file)
@@ -1,67 +1,67 @@
 #!/bin/sh
 #
-# $NetBSD: ppp,v 1.6 2002/03/22 04:33:59 thorpej Exp $
-# $FreeBSD: src/etc/rc.d/ppp,v 1.2 2002/06/13 22:14:36 gordon Exp $
-# $DragonFly: src/etc/rc.d/ppp,v 1.3 2005/11/19 21:47:32 swildner Exp $
+# $FreeBSD: src/etc/rc.d/ppp-user,v 1.4 2003/04/18 17:55:05 mtm Exp $
 #
 
 # PROVIDE: ppp
-# REQUIRE: mountcritremote syslogd
-# BEFORE:  SERVERS
-#
-#      Note that this means that syslogd will not be listening on
-#      any PPP addresses.  This is considered a feature.
-#
+# REQUIRE: netif
 
 . /etc/rc.subr
 
 name="ppp"
+rcvar="ppp_enable"
 start_cmd="ppp_start"
 stop_cmd="ppp_stop"
-sig_stop="-INT"
-sig_hup="-HUP"
-hup_cmd="ppp_hup"
-extra_commands="hup"
 
 ppp_start()
 {
-       #       /etc/ppp/peers and $ppp_peers contain boot configuration
-       #       information for pppd.  each value in $ppp_peers that has a
-       #       file in /etc/ppp/peers of the same name, will be run as
-       #       `pppd call <peer>'.
+       local _punct_c _punct _ppp_unit
+       _profile=${ppp_profile}
+
+       _punct=". - / +"
+       for _punct_c in $_punct; do
+               _profile=`ltr ${_profile} ${_punct_c} '_'`
+       done
+
+       # Establish ppp mode.
        #
-       if [ -n "$ppp_peers" ]; then
-               set -- $ppp_peers
-               echo -n "Starting pppd:"
-               while [ $# -ge 1 ]; do
-                       peer=$1
-                       shift
-                       if [ -f /etc/ppp/peers/$peer ]; then
-                               pppd call $peer
-                               echo -n " $peer"
-                       fi
-               done
-               echo "."
+       if [ "${ppp_mode}" != "ddial" -a "${ppp_mode}" != "direct" \
+               -a "${ppp_mode}" != "dedicated" \
+               -a "${ppp_mode}" != "background" ]; then
+               ppp_mode="auto"
        fi
-}
 
-ppp_hup()
-{
-       pids="`check_process pppd`"
-       if [ -n "$pids" ]; then
-               for pid in $pids; do
-                       kill $sig_hup $pid
-               done
+       ppp_command="/usr/sbin/ppp -quiet -${ppp_mode}"
+
+       # Switch on NAT mode?
+       #
+       case ${ppp_nat} in
+       [Yy][Ee][Ss])
+               ppp_command="${ppp_command} -nat"
+               ;;
+       esac
+
+       # Check whether we are asked to use a specific unit
+       #
+       eval _ppp_unit=\$ppp_${_profile}_unit
+       if [ -n "${_ppp_unit}" ]; then
+               ppp_command="${ppp_command} -unit${_ppp_unit}"
        fi
+
+       ppp_command="${ppp_command} ${ppp_profile}"
+
+       echo "Starting ppp as \"${ppp_user}\""
+       su -m ${ppp_user} -c "exec ${ppp_command}"
 }
 
 ppp_stop()
 {
-       pids="`check_process pppd`"
-       if [ -n "$pids" ]; then
-               for pid in $pids; do
-                       kill $sig_stop $pid
+       pids=`check_process /usr/sbin/ppp`
+       if [ -n "${pids}" ]; then
+               for pid in ${pids}; do
+                       kill -TERM ${pid}
                done
+               wait_for_pids ${pids}
        fi
 }
 
diff --git a/etc/rc.d/ppp-user b/etc/rc.d/ppp-user
deleted file mode 100644 (file)
index b8eab95..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD: src/etc/rc.d/ppp-user,v 1.4 2003/04/18 17:55:05 mtm Exp $
-#
-
-# PROVIDE: ppp-user
-# REQUIRE: netif
-
-. /etc/rc.subr
-
-name="ppp"
-rcvar="ppp_enable"
-start_cmd="ppp_start"
-stop_cmd="ppp_stop"
-
-ppp_start()
-{
-       local _punct_c _punct _ppp_unit
-       _profile=${ppp_profile}
-
-       _punct=". - / +"
-       for _punct_c in $_punct; do
-               _profile=`ltr ${_profile} ${_punct_c} '_'`
-       done
-
-       # Establish ppp mode.
-       #
-       if [ "${ppp_mode}" != "ddial" -a "${ppp_mode}" != "direct" \
-               -a "${ppp_mode}" != "dedicated" \
-               -a "${ppp_mode}" != "background" ]; then
-               ppp_mode="auto"
-       fi
-
-       ppp_command="/usr/sbin/ppp -quiet -${ppp_mode}"
-
-       # Switch on NAT mode?
-       #
-       case ${ppp_nat} in
-       [Yy][Ee][Ss])
-               ppp_command="${ppp_command} -nat"
-               ;;
-       esac
-
-       # Check whether we are asked to use a specific unit
-       #
-       eval _ppp_unit=\$ppp_${_profile}_unit
-       if [ -n "${_ppp_unit}" ]; then
-               ppp_command="${ppp_command} -unit${_ppp_unit}"
-       fi
-
-       ppp_command="${ppp_command} ${ppp_profile}"
-
-       echo "Starting ppp as \"${ppp_user}\""
-       su -m ${ppp_user} -c "exec ${ppp_command}"
-}
-
-ppp_stop()
-{
-       pids=`check_process /usr/sbin/ppp`
-       if [ -n "${pids}" ]; then
-               for pid in ${pids}; do
-                       kill -TERM ${pid}
-               done
-               wait_for_pids ${pids}
-       fi
-}
-
-load_rc_config $name
-run_rc_command "$1"
index 82b4d9d..226e6c1 100644 (file)
@@ -6,7 +6,7 @@
 #
 
 # PROVIDE: routing
-# REQUIRE: netif ppp-user
+# REQUIRE: netif ppp
 
 . /etc/rc.subr
 
index 3a2f14b..768f05f 100644 (file)
@@ -2,11 +2,10 @@
 #
 # $NetBSD: rpcbind,v 1.6 2002/01/31 01:26:06 lukem Exp $
 # $FreeBSD: src/etc/rc.d/rpcbind,v 1.6 2002/09/06 16:18:05 gordon Exp $
-# $DragonFly: src/etc/rc.d/rpcbind,v 1.4 2008/02/17 19:51:53 swildner Exp $
 #
 
 # PROVIDE: rpcbind
-# REQUIRE: NETWORKING syslogd named ppp
+# REQUIRE: NETWORKING syslogd named
 
 . /etc/rc.subr
 
index 0f42e70..3f67f61 100644 (file)
@@ -64,7 +64,7 @@ LSUBDIRS= \
        dev/video/bktr dev/video/meteor \
        gnu/vfs/ext2fs \
        libprop \
-       net/bridge net/tap net/tun net/ppp net/ppp_layer net/sl \
+       net/bridge net/tap net/tun net/ppp_layer net/sl \
        net/pf net/altq \
        net/vlan net/ipfw net/ip6fw net/dummynet net/sppp net/ip_mroute \
        net/lagg \
index a4ae677..fb79944 100644 (file)
@@ -401,7 +401,7 @@ getnameinfo_link(const struct sockaddr *sa, socklen_t salen __unused,
         * IFT_FAITH    (net/faith/if_faith.c)
         * IFT_GIF      (net/gif/if_gif.c)
         * IFT_LOOP     (net/if_loop.c, net/disc/if_disc.c)
-        * IFT_PPP      (net/ppp/if_ppp.c, net/sppp/if_spppsubr.c)
+        * IFT_PPP      (net/sppp/if_spppsubr.c)
         * IFT_SLIP     (net/sl/if_sl.c)
         * IFT_STF      (net/stf/if_stf.c)
         * IFT_L2VLAN   (net/vlan/if_vlan.c)
index 2c135af..42bae0b 100644 (file)
@@ -58,6 +58,6 @@ user.alert                                    `root, operator'
 user.emerg                                     *
 )
 
-# Local2: (bootpd, pppd)
+# Local2: (bootpd)
 local2.debug                           /dev/console
 #local2.debug                          /var/log/local2
diff --git a/share/examples/pppd/auth-down.sample b/share/examples/pppd/auth-down.sample
deleted file mode 100644 (file)
index b4675df..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD: src/share/examples/pppd/auth-down.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/auth-down.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for /etc/ppp/auth-down file.
-
-/usr/bin/logger -p daemon.notice -t pppd "User $2 is logged off"
diff --git a/share/examples/pppd/auth-up.sample b/share/examples/pppd/auth-up.sample
deleted file mode 100644 (file)
index 92ac86c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD: src/share/examples/pppd/auth-up.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/auth-up.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for /etc/ppp/auth-up file.
-
-/usr/bin/logger -p daemon.notice -t pppd "User $2 is logged in"
diff --git a/share/examples/pppd/chap-secrets.sample b/share/examples/pppd/chap-secrets.sample
deleted file mode 100644 (file)
index d76a83e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD: src/share/examples/pppd/chap-secrets.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/chap-secrets.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for /etc/ppp/chap-secrets file.
-#
-# This file should be owned by root and not readable or
-# writable by any other user.
-#
-# Dialin format: <remote name> <our name> <password> <allowed IP addresses>
-#
-joe    server  password        192.168.0.0/24 192.168.2.2
-lisa   server  l1z4            * !192.168.0.1
-mike   server  secret          *
-luser  server  nopass          -
-#
-# Dialout format: <our name> <server name> <password>
-#
-jane   isp     password
diff --git a/share/examples/pppd/chat.sh.sample b/share/examples/pppd/chat.sh.sample
deleted file mode 100644 (file)
index 92191c1..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD: src/share/examples/pppd/chat.sh.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/chat.sh.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for chat.sh file.
-
-INIT='at&f'
-
-dial(){
-       /usr/bin/chat -v                \
-               ABORT   "ERROR"         \
-               ABORT   "NO DIALTONE"   \
-               TIMEOUT 5               \
-               ""      "AT"            \
-               "OK"    "${INIT}"       \
-               "OK"-"+++"-""   "ATH"   \
-               ABORT   "BUSY"          \
-               ABORT   "NO ANSWER"     \
-               ABORT   "NO CARRIER"    \
-               "OK"    "ATDP$1"        \
-               TIMEOUT 70              \
-               "ogin:" "username"      \
-               "word:" "pasword"       \
-               TIMEOUT 50              \
-               "PPP"   "\c"
-
-       [ $? -eq 0 ] && exit 0
-
-       echo "$1 failed" 1>&2
-       exit 1
-}
-
-dial 1234567
diff --git a/share/examples/pppd/ip-down.sample b/share/examples/pppd/ip-down.sample
deleted file mode 100644 (file)
index 6b9483a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD: src/share/examples/pppd/ip-down.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/ip-down.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for /etc/ppp/ip-down file.
-
-/usr/bin/logger -p daemon.notice -t pppd "$1 is down"
diff --git a/share/examples/pppd/ip-up.sample b/share/examples/pppd/ip-up.sample
deleted file mode 100644 (file)
index 82c73b6..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD: src/share/examples/pppd/ip-up.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/ip-up.sample,v 1.3 2005/01/11 19:14:58 swildner Exp $
-#
-# Example for /etc/ppp/ip-up file.
-
-/usr/bin/logger -p daemon.notice -t pppd "$1 is up"
-/usr/sbin/rdate ntpserver
diff --git a/share/examples/pppd/options.sample b/share/examples/pppd/options.sample
deleted file mode 100644 (file)
index 2cfc9cd..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-# $FreeBSD: src/share/examples/pppd/options.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/options.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for /etc/ppp/options file.
-#
-/dev/cuaa4
-115200
-modem
-crtscts
-asyncmap 0
-connect '/etc/ppp/chat.sh'
-defaultroute
-noipdefault
-persist
-holdoff 5
-mtu 250
-mru 250
diff --git a/share/examples/pppd/pap-secrets.sample b/share/examples/pppd/pap-secrets.sample
deleted file mode 100644 (file)
index 2dfd11a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD: src/share/examples/pppd/pap-secrets.sample,v 1.1.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/pap-secrets.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# Example for /etc/ppp/pap-secrets file.
-#
-# This file should be owned by root and not readable or
-# writable by any other user.
-#
-# Dialin format: <remote name> <our name> <password> <allowed IP addresses>
-#
-joe    server  password        192.168.0.1/24 192.168.2.2
-lisa   server  l1z4            * !192.168.0.1
-mike   server  secret          *
-luser  server  nopass          -
-#
-# Dialout format:  <our name> <server name> <password>
-#
-jane   isp     password
diff --git a/share/examples/pppd/ppp.deny.sample b/share/examples/pppd/ppp.deny.sample
deleted file mode 100644 (file)
index 8833808..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# $FreeBSD: src/share/examples/pppd/ppp.deny.sample,v 1.5.2.3 2002/06/30 18:23:00 maxim Exp $
-# $DragonFly: src/share/examples/pppd/ppp.deny.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# list of users disallowed any pppd access via 'system
-# password login'.
-# read by pppd(8).
-root
-toor
-daemon
-operator
-bin
-tty
-kmem
-games
-news
-man
-sshd
-smmsp
-mailnull
-bind
-ftp
-uucp
-xten
-pop
-www
-nobody
diff --git a/share/examples/pppd/ppp.shells.sample b/share/examples/pppd/ppp.shells.sample
deleted file mode 100644 (file)
index a4682a8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# $FreeBSD: src/share/examples/pppd/ppp.shells.sample,v 1.5.2.1 2002/02/12 00:49:12 cjc Exp $
-# $DragonFly: src/share/examples/pppd/ppp.shells.sample,v 1.2 2003/06/17 04:36:57 dillon Exp $
-#
-# List of acceptable shells for pppd(8).
-# Pppd will not accept a system password login
-# by a user whose shell is not listed below.
-
-/bin/sh
-/bin/csh
-/bin/tcsh
-/usr/local/bin/ksh
-/usr/local/bin/zsh
-/usr/local/bin/bash
-/usr/local/bin/tcsh
-/usr/local/bin/ppplogin.sh
index f0b3ced..79b698a 100644 (file)
@@ -245,7 +245,6 @@ MAN=        aac.4 \
        ppbus.4 \
        ppc.4 \
        ppi.4 \
-       ppp.4 \
        psm.4 \
        pt.4 \
        pty.4 \
@@ -490,7 +489,6 @@ MLINKS+=oce.4 if_oce.4
 MLINKS+=pccbb.4 cbb.4
 MLINKS+=pcm.4 sound.4
 MLINKS+=pcn.4 if_pcn.4
-MLINKS+=ppp.4 if_ppp.4
 MLINKS+=radeonkms.4 radeon.4 \
        radeonkms.4 radeondrm.4
 MLINKS+=ral.4 if_ral.4
diff --git a/share/man/man4/ppp.4 b/share/man/man4/ppp.4
deleted file mode 100644 (file)
index bd4156b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-.\"    $NetBSD: ppp.4,v 1.1 1996/08/10 21:26:12 explorer Exp $
-.\"
-.\" Copyright (c) 1983, 1991, 1993
-.\"    The Regents of the University of California.  All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\"     From:  @(#)lo.4        8.1 (Berkeley) 6/5/93
-.\" $FreeBSD: src/share/man/man4/ppp.4,v 1.4.2.1 2000/12/08 14:59:07 ru Exp $
-.\" $DragonFly: src/share/man/man4/ppp.4,v 1.2 2003/06/17 04:36:59 dillon Exp $
-.\"
-.Dd August 10, 1996
-.Dt PPP 4
-.Os
-.Sh NAME
-.Nm ppp
-.Nd point to point protocol network interface
-.Sh SYNOPSIS
-.Cd "pseudo-device ppp" Op Ar count
-.Sh DESCRIPTION
-The
-.Nm
-interface allows serial lines to be used as network interfaces using the
-.Em point-to-point
-protocol.  The
-.Nm
-interface can use various types of compression and has many features over
-the
-.Xr sl 4
-protocol.
-.Sh DIAGNOSTICS
-.Bl -diag
-.It ppp%d: af%d not supported.
-The interface was handed
-a message with addresses formatted in an unsuitable address
-family; the packet was dropped.
-.El
-.Sh SEE ALSO
-.Xr inet 4 ,
-.Xr intro 4 ,
-.Xr sl 4 ,
-.Xr pppd 8 ,
-.Xr pppstats 8
-.Sh BUGS
-Currently, only the
-.Xr ip 4
-protocol is supported.
index 6aceebe..3d08cbc 100644 (file)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man4/sppp.4,v 1.8.2.5 2002/04/24 18:55:35 joerg Exp $
 .\"
-.Dd December 30, 2001
+.Dd October 17, 2017
 .Dt SPPP 4
 .Os
 .Sh NAME
@@ -158,7 +158,6 @@ take place.
 .Sh SEE ALSO
 .Xr inet 4 ,
 .Xr intro 4 ,
-.Xr ppp 4 ,
 .Xr ifconfig 8 ,
 .Xr spppcontrol 8
 .Rs
index eaf972a..6db931b 100644 (file)
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd February 21, 2008
+.Dd October 17, 2017
 .Dt UGENSA 4
 .Os
 .Sh NAME
@@ -58,9 +58,7 @@ Communication devices supported by the
 .Nm
 driver typically have more than one virtual serial port, but only one of
 them (usually the first one) can be used with
-.Xr ppp 8
-or
-.Xr pppd 8 .
+.Xr ppp 8 .
 At least one of additional ports can usually be used for device/network
 monitoring and other communication tasks (like SMS for example).
 Protocols and methods used to access these features are out of scope of this
@@ -127,8 +125,7 @@ list is certainly incomplete.
 .Xr tty 4 ,
 .Xr ucom 4 ,
 .Xr usb 4 ,
-.Xr ppp 8 ,
-.Xr pppd 8
+.Xr ppp 8
 .Sh HISTORY
 The
 .Nm
index 47d3d4e..5b6007d 100644 (file)
@@ -31,7 +31,7 @@
 .\"     @(#)rc.8       8.2 (Berkeley) 12/11/93
 .\" $FreeBSD: src/share/man/man8/rc.8,v 1.22 2002/12/12 17:25:58 ru Exp $
 .\"
-.Dd October 14, 2017
+.Dd October 17, 2017
 .Dt RC 8
 .Os
 .Sh NAME
@@ -188,7 +188,7 @@ In order of startup, these are:
 .It Pa NETWORKING
 Ensure basic network services are running, including general
 network configuration
-.Pq Pa netif , routing , network_ipv6 , ppp-user .
+.Pq Pa netif , routing , network_ipv6 , ppp .
 .It Pa SERVERS
 Ensure basic services (such as
 .Pa NETWORKING
index fdd66c6..cd684d6 100644 (file)
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 10, 2015
+.Dd October 17, 2017
 .Dt IOCTL 9
 .Os
 .Sh NAME
@@ -150,8 +150,6 @@ random number generator
 .It 't'
 .Xr tty 4
 .It 't'
-.Xr ppp 4
-.It 't'
 .Xr tap 4
 .It 't'
 .Xr tun 4
index 689929a..a22d942 100644 (file)
@@ -145,7 +145,6 @@ if_ef_load="NO"                     # pseudo-device providing support for multiple ethernet frame
 if_faith_load="NO"             # IPv6-to-IPv4 TCP relay capturing interface
 if_gif_load="NO"               # generic tunnel interface
 if_gre_load="NO"               # encapsulating network device
-if_ppp_load="NO"               # Kernel ppp
 if_sl_load="NO"                        # SLIP
 if_stf_load="NO"               # 6to4 tunnel interface
 if_tap_load="NO"               # Ethernet tunnel software network interface
index f1a7b28..08ce18d 100644 (file)
@@ -153,7 +153,6 @@ if_ef_load="NO"                     # pseudo-device providing support for multiple ethernet frame
 if_faith_load="NO"             # IPv6-to-IPv4 TCP relay capturing interface
 if_gif_load="NO"               # generic tunnel interface
 if_gre_load="NO"               # encapsulating network device
-if_ppp_load="NO"               # Kernel ppp
 if_sl_load="NO"                        # SLIP
 if_stf_load="NO"               # 6to4 tunnel interface
 if_tap_load="NO"               # Ethernet tunnel software network interface
index c782ee3..ce2a35f 100644 (file)
@@ -1520,7 +1520,6 @@ net/bpf.c                 standard
 net/bpf_filter.c               optional bpf
 net/bridge/if_bridge.c         optional bridge
 net/bridge/bridgestp.c         optional bridge
-net/bsd_comp.c                 optional ppp_bsdcomp
 net/if.c                       standard
 net/if_clone.c                 standard
 net/if_poll.c                  optional ifpoll_enable
@@ -1542,15 +1541,11 @@ net/pf/pf_norm.c                optional pf
 net/pf/pf_ruleset.c            optional pf
 net/pf/pf_table.c              optional pf
 net/pf/pf_osfp.c               optional pf
-net/ppp_layer/slcompress.c     optional ppp
 net/ppp_layer/slcompress.c     optional sl
 net/ppp_layer/slcompress.c     optional sppp
-net/ppp_layer/ppp_deflate.c    optional ppp_deflate
-net/ppp_layer/ppp_tty.c                optional ppp
 net/if_loop.c          optional loop
 net/if_media.c         standard
 net/if_mib.c           standard
-net/ppp/if_ppp.c               optional ppp
 net/sl/if_sl.c         optional sl
 net/sppp/if_spppsubr.c optional sppp
 net/stf/if_stf.c               optional stf
@@ -1565,7 +1560,6 @@ net/raw_cb.c              standard
 net/raw_usrreq.c       standard
 net/route.c            standard
 net/rtsock.c           standard
-net/zlib.c             optional ppp_deflate
 net/zlib.c             optional ipsec
 netbt/bt_input.c       optional bluetooth
 netbt/bt_proto.c       optional bluetooth
index 33d2427..7a8ad3f 100644 (file)
@@ -250,9 +250,6 @@ IPV6FIREWALL_DEFAULT_TO_ACCEPT      opt_ip6fw.h
 IPSTEALTH
 LIBMCHAIN
 MPLS                   opt_mpls.h
-PPP_BSDCOMP            opt_ppp.h
-PPP_DEFLATE            opt_ppp.h
-PPP_FILTER             opt_ppp.h
 TCPDEBUG
 TCP_SIGNATURE          opt_inet.h
 TCP_DROP_SYNFIN                opt_tcp_input.h
index 9f42a5e..0fe6ea8 100644 (file)
@@ -306,7 +306,6 @@ device              mn      # Munich32x/Falc54 Nx64kbit/sec cards.
 #  The `sppp' pseudo-device serves a similar role for certain types
 #  of synchronous PPP links.
 #  The `sl' pseudo-device implements the Serial Line IP (SLIP) service.
-#  The `ppp' pseudo-device implements the Point-to-Point Protocol.
 #  The `bpf' pseudo-device enables the Berkeley Packet Filter.  Be
 #  aware of the legal and administrative consequences of enabling this
 #  option.  The number of devices determines the maximum number of
@@ -326,12 +325,6 @@ device             mn      # Munich32x/Falc54 Nx64kbit/sec cards.
 #  The `ef' pseudo-device provides support for multiple ethernet frame types
 #  specified via ETHER_* options. See ef(4) for details.
 #
-# The PPP_BSDCOMP option enables support for compress(1) style entire
-# packet compression, the PPP_DEFLATE is for zlib/gzip style compression.
-# PPP_FILTER enables code for filtering the ppp data stream and selecting
-# events for resetting the demand dial activity timer - requires bpf.
-# See pppd(8) for more details.
-#
 pseudo-device  ether                   #Generic Ethernet
 pseudo-device  vlan    1               #VLAN support
 pseudo-device  bridge                  #Bridging support
@@ -343,10 +336,6 @@ pseudo-device      tap                     #Ethernet tunnel network interface
 pseudo-device  tun                     #Tunnel driver (ppp(8), nos-tun(8))
 pseudo-device  sl      2               #Serial Line IP
 pseudo-device  gre                     #IP over IP tunneling
-pseudo-device  ppp     2               #Point-to-point protocol
-options        PPP_BSDCOMP             #PPP BSD-compress support
-options        PPP_DEFLATE             #PPP zlib/deflate/gzip support
-options        PPP_FILTER              #enable bpf filtering (needs bpf)
 
 # for IPv6
 pseudo-device  gif                     #IPv6 and IPv4 tunneling
index caec824..8862bbf 100644 (file)
@@ -1,7 +1,7 @@
 SUBDIR=accf_data accf_http disc faith gif gre sl stf tap tun \
        vlan zlib bridge lagg libalias dummynet ipfw \
        dummynet3 ipfw3 ipfw3_basic ipfw3_nat ipfw3_layer2 ipfw3_layer4 \
-       ip6fw ip_mroute sppp ppp_layer pf
+       ip6fw ip_mroute sppp pf
 
 # empty to allow concurrent building
 #
diff --git a/sys/net/bsd_comp.c b/sys/net/bsd_comp.c
deleted file mode 100644 (file)
index 47d47f7..0000000
+++ /dev/null
@@ -1,1085 +0,0 @@
-/* Because this code is derived from the 4.3BSD compress source:
- *
- *
- * Copyright (c) 1985, 1986 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James A. Woods, derived from original work by Spencer Thomas
- * and Joseph Orost.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * This version is for use with mbufs on BSD-derived systems.
- *
- * $FreeBSD: src/sys/net/bsd_comp.c,v 1.11.2.1 2002/04/14 21:41:48 luigi Exp $
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <net/ppp_layer/ppp_defs.h>
-
-#define PACKETPTR      struct mbuf *
-#include <net/ppp_layer/ppp_comp.h>
-
-#if DO_BSD_COMPRESS
-/*
- * PPP "BSD compress" compression
- *  The differences between this compression and the classic BSD LZW
- *  source are obvious from the requirement that the classic code worked
- *  with files while this handles arbitrarily long streams that
- *  are broken into packets.  They are:
- *
- *     When the code size expands, a block of junk is not emitted by
- *         the compressor and not expected by the decompressor.
- *
- *     New codes are not necessarily assigned every time an old
- *         code is output by the compressor.  This is because a packet
- *         end forces a code to be emitted, but does not imply that a
- *         new sequence has been seen.
- *
- *     The compression ratio is checked at the first end of a packet
- *         after the appropriate gap.  Besides simplifying and speeding
- *         things up, this makes it more likely that the transmitter
- *         and receiver will agree when the dictionary is cleared when
- *         compression is not going well.
- */
-
-/*
- * A dictionary for doing BSD compress.
- */
-struct bsd_db {
-    int            totlen;                     /* length of this structure */
-    u_int   hsize;                     /* size of the hash table */
-    u_char  hshift;                    /* used in hash function */
-    u_char  n_bits;                    /* current bits/code */
-    u_char  maxbits;
-    u_char  debug;
-    u_char  unit;
-    u_int16_t seqno;                   /* sequence # of next packet */
-    u_int   hdrlen;                    /* header length to preallocate */
-    u_int   mru;
-    u_int   maxmaxcode;                        /* largest valid code */
-    u_int   max_ent;                   /* largest code in use */
-    u_int   in_count;                  /* uncompressed bytes, aged */
-    u_int   bytes_out;                 /* compressed bytes, aged */
-    u_int   ratio;                     /* recent compression ratio */
-    u_int   checkpoint;                        /* when to next check the ratio */
-    u_int   clear_count;               /* times dictionary cleared */
-    u_int   incomp_count;              /* incompressible packets */
-    u_int   incomp_bytes;              /* incompressible bytes */
-    u_int   uncomp_count;              /* uncompressed packets */
-    u_int   uncomp_bytes;              /* uncompressed bytes */
-    u_int   comp_count;                        /* compressed packets */
-    u_int   comp_bytes;                        /* compressed bytes */
-    u_int16_t *lens;                   /* array of lengths of codes */
-    struct bsd_dict {
-       union {                         /* hash value */
-           u_int32_t   fcode;
-           struct {
-#if BYTE_ORDER == LITTLE_ENDIAN
-               u_int16_t prefix;       /* preceding code */
-               u_char  suffix;         /* last character of new code */
-               u_char  pad;
-#else
-               u_char  pad;
-               u_char  suffix;         /* last character of new code */
-               u_int16_t prefix;       /* preceding code */
-#endif
-           } hs;
-       } f;
-       u_int16_t codem1;               /* output of hash table -1 */
-       u_int16_t cptr;                 /* map code to hash table entry */
-    } dict[1];
-};
-
-#define BSD_OVHD       2               /* BSD compress overhead/packet */
-#define BSD_INIT_BITS  BSD_MIN_BITS
-
-static void    bsd_clear (struct bsd_db *db);
-static int     bsd_check (struct bsd_db *db);
-static void    *bsd_alloc (u_char *options, int opt_len, int decomp);
-static int     bsd_init (struct bsd_db *db, u_char *options, int opt_len,
-                             int unit, int hdrlen, int mru, int debug,
-                             int decomp);
-static void    *bsd_comp_alloc (u_char *options, int opt_len);
-static void    *bsd_decomp_alloc (u_char *options, int opt_len);
-static void    bsd_free (void *state);
-static int     bsd_comp_init (void *state, u_char *options, int opt_len,
-                                  int unit, int hdrlen, int debug);
-static int     bsd_decomp_init (void *state, u_char *options, int opt_len,
-                                    int unit, int hdrlen, int mru, int debug);
-static int     bsd_compress (void *state, struct mbuf **mret,
-                                 struct mbuf *mp, int slen, int maxolen);
-static void    bsd_incomp (void *state, struct mbuf *dmsg);
-static int     bsd_decompress (void *state, struct mbuf *cmp,
-                                   struct mbuf **dmpp);
-static void    bsd_reset (void *state);
-static void    bsd_comp_stats (void *state, struct compstat *stats);
-
-/*
- * Procedures exported to if_ppp.c.
- */
-struct compressor ppp_bsd_compress = {
-    CI_BSD_COMPRESS,           /* compress_proto */
-    bsd_comp_alloc,            /* comp_alloc */
-    bsd_free,                  /* comp_free */
-    bsd_comp_init,             /* comp_init */
-    bsd_reset,                 /* comp_reset */
-    bsd_compress,              /* compress */
-    bsd_comp_stats,            /* comp_stat */
-    bsd_decomp_alloc,          /* decomp_alloc */
-    bsd_free,                  /* decomp_free */
-    bsd_decomp_init,           /* decomp_init */
-    bsd_reset,                 /* decomp_reset */
-    bsd_decompress,            /* decompress */
-    bsd_incomp,                        /* incomp */
-    bsd_comp_stats,            /* decomp_stat */
-};
-
-/*
- * the next two codes should not be changed lightly, as they must not
- * lie within the contiguous general code space.
- */
-#define CLEAR  256                     /* table clear output code */
-#define FIRST  257                     /* first free entry */
-#define LAST   255
-
-#define MAXCODE(b)     ((1 << (b)) - 1)
-#define BADCODEM1      MAXCODE(BSD_MAX_BITS)
-
-#define BSD_HASH(prefix,suffix,hshift) ((((u_int32_t)(suffix)) << (hshift)) \
-                                        ^ (u_int32_t)(prefix))
-#define BSD_KEY(prefix,suffix)         ((((u_int32_t)(suffix)) << 16) \
-                                        + (u_int32_t)(prefix))
-
-#define CHECK_GAP      10000           /* Ratio check interval */
-
-#define RATIO_SCALE_LOG        8
-#define RATIO_SCALE    (1<<RATIO_SCALE_LOG)
-#define RATIO_MAX      (0x7fffffff>>RATIO_SCALE_LOG)
-
-/*
- * clear the dictionary
- */
-static void
-bsd_clear(struct bsd_db *db)
-{
-    db->clear_count++;
-    db->max_ent = FIRST-1;
-    db->n_bits = BSD_INIT_BITS;
-    db->ratio = 0;
-    db->bytes_out = 0;
-    db->in_count = 0;
-    db->checkpoint = CHECK_GAP;
-}
-
-/*
- * If the dictionary is full, then see if it is time to reset it.
- *
- * Compute the compression ratio using fixed-point arithmetic
- * with 8 fractional bits.
- *
- * Since we have an infinite stream instead of a single file,
- * watch only the local compression ratio.
- *
- * Since both peers must reset the dictionary at the same time even in
- * the absence of CLEAR codes (while packets are incompressible), they
- * must compute the same ratio.
- *
- * Return 1=output CLEAR
- */
-static int
-bsd_check(struct bsd_db *db)
-{
-    u_int new_ratio;
-
-    if (db->in_count >= db->checkpoint) {
-       /* age the ratio by limiting the size of the counts */
-       if (db->in_count >= RATIO_MAX
-           || db->bytes_out >= RATIO_MAX) {
-           db->in_count -= db->in_count/4;
-           db->bytes_out -= db->bytes_out/4;
-       }
-
-       db->checkpoint = db->in_count + CHECK_GAP;
-
-       if (db->max_ent >= db->maxmaxcode) {
-           /* Reset the dictionary only if the ratio is worse,
-            * or if it looks as if it has been poisoned
-            * by incompressible data.
-            *
-            * This does not overflow, because
-            *  db->in_count <= RATIO_MAX.
-            */
-           new_ratio = db->in_count << RATIO_SCALE_LOG;
-           if (db->bytes_out != 0)
-               new_ratio /= db->bytes_out;
-
-           if (new_ratio < db->ratio || new_ratio < 1 * RATIO_SCALE) {
-               bsd_clear(db);
-               return 1;
-           }
-           db->ratio = new_ratio;
-       }
-    }
-    return 0;
-}
-
-/*
- * Return statistics.
- */
-static void
-bsd_comp_stats(void *state, struct compstat *stats)
-{
-    struct bsd_db *db = (struct bsd_db *) state;
-    u_int out;
-
-    stats->unc_bytes = db->uncomp_bytes;
-    stats->unc_packets = db->uncomp_count;
-    stats->comp_bytes = db->comp_bytes;
-    stats->comp_packets = db->comp_count;
-    stats->inc_bytes = db->incomp_bytes;
-    stats->inc_packets = db->incomp_count;
-    stats->ratio = db->in_count;
-    out = db->bytes_out;
-    if (stats->ratio <= 0x7fffff)
-       stats->ratio <<= 8;
-    else
-       out >>= 8;
-    if (out != 0)
-       stats->ratio /= out;
-}
-
-/*
- * Reset state, as on a CCP ResetReq.
- */
-static void
-bsd_reset(void *state)
-{
-    struct bsd_db *db = (struct bsd_db *) state;
-
-    db->seqno = 0;
-    bsd_clear(db);
-    db->clear_count = 0;
-}
-
-/*
- * Allocate space for a (de) compressor.
- */
-static void *
-bsd_alloc(u_char *options, int opt_len, int decomp)
-{
-    int bits;
-    u_int newlen, hsize, hshift, maxmaxcode;
-    struct bsd_db *db;
-
-    if (opt_len < CILEN_BSD_COMPRESS || options[0] != CI_BSD_COMPRESS
-       || options[1] != CILEN_BSD_COMPRESS
-       || BSD_VERSION(options[2]) != BSD_CURRENT_VERSION)
-       return NULL;
-    bits = BSD_NBITS(options[2]);
-    switch (bits) {
-    case 9:                    /* needs 82152 for both directions */
-    case 10:                   /* needs 84144 */
-    case 11:                   /* needs 88240 */
-    case 12:                   /* needs 96432 */
-       hsize = 5003;
-       hshift = 4;
-       break;
-    case 13:                   /* needs 176784 */
-       hsize = 9001;
-       hshift = 5;
-       break;
-    case 14:                   /* needs 353744 */
-       hsize = 18013;
-       hshift = 6;
-       break;
-    case 15:                   /* needs 691440 */
-       hsize = 35023;
-       hshift = 7;
-       break;
-    case 16:                   /* needs 1366160--far too much, */
-       /* hsize = 69001; */    /* and 69001 is too big for cptr */
-       /* hshift = 8; */       /* in struct bsd_db */
-       /* break; */
-    default:
-       return NULL;
-    }
-
-    maxmaxcode = MAXCODE(bits);
-    newlen = sizeof(*db) + (hsize-1) * (sizeof(db->dict[0]));
-    db = kmalloc(newlen, M_DEVBUF, M_WAITOK);
-    bzero(db, sizeof(*db) - sizeof(db->dict));
-
-    if (!decomp) {
-       db->lens = NULL;
-    } else {
-       db->lens = kmalloc((maxmaxcode + 1) * sizeof(db->lens[0]), M_DEVBUF,
-                           M_WAITOK);
-    }
-
-    db->totlen = newlen;
-    db->hsize = hsize;
-    db->hshift = hshift;
-    db->maxmaxcode = maxmaxcode;
-    db->maxbits = bits;
-
-    return (void *) db;
-}
-
-static void
-bsd_free(void *state)
-{
-    struct bsd_db *db = (struct bsd_db *) state;
-
-    if (db->lens)
-       kfree(db->lens, M_DEVBUF);
-    kfree(db, M_DEVBUF);
-}
-
-static void *
-bsd_comp_alloc(u_char *options, int opt_len)
-{
-    return bsd_alloc(options, opt_len, 0);
-}
-
-static void *
-bsd_decomp_alloc(u_char *options, int opt_len)
-{
-    return bsd_alloc(options, opt_len, 1);
-}
-
-/*
- * Initialize the database.
- */
-static int
-bsd_init(struct bsd_db *db, u_char *options, int opt_len, int unit,
-    int hdrlen, int mru, int debug, int decomp)
-{
-    int i;
-
-    if (opt_len < CILEN_BSD_COMPRESS || options[0] != CI_BSD_COMPRESS
-       || options[1] != CILEN_BSD_COMPRESS
-       || BSD_VERSION(options[2]) != BSD_CURRENT_VERSION
-       || BSD_NBITS(options[2]) != db->maxbits
-       || (decomp && db->lens == NULL))
-       return 0;
-
-    if (decomp) {
-       i = LAST+1;
-       while (i != 0)
-           db->lens[--i] = 1;
-    }
-    i = db->hsize;
-    while (i != 0) {
-       db->dict[--i].codem1 = BADCODEM1;
-       db->dict[i].cptr = 0;
-    }
-
-    db->unit = unit;
-    db->hdrlen = hdrlen;
-    db->mru = mru;
-#ifndef DEBUG
-    if (debug)
-#endif
-       db->debug = 1;
-
-    bsd_reset(db);
-
-    return 1;
-}
-
-static int
-bsd_comp_init(void *state, u_char *options, int opt_len, int unit, 
-    int hdrlen, int debug)
-{
-    return bsd_init((struct bsd_db *) state, options, opt_len,
-                   unit, hdrlen, 0, debug, 0);
-}
-
-static int
-bsd_decomp_init(void *state, u_char *options, int opt_len, 
-    int unit, int hdrlen, int mru, int debug)
-{
-       return bsd_init((struct bsd_db *) state, options, opt_len, 
-           unit, hdrlen, mru, debug, 1);
-}
-
-
-/*
- * compress a packet
- *     One change from the BSD compress command is that when the
- *     code size expands, we do not output a bunch of padding.
- *   **mret    - return compressed mbuf chain here
- *   *mp       - from here
- *   slen      - uncompressed length
- *   maxolen   - max compressed length
- *
- * return new slen
- */
-static int
-bsd_compress(void *state, struct mbuf **mret, struct mbuf *mp, 
-    int slen, int maxolen)
-{
-    struct bsd_db *db = (struct bsd_db *) state;
-    int hshift = db->hshift;
-    u_int max_ent = db->max_ent;
-    u_int n_bits = db->n_bits;
-    u_int bitno = 32;
-    u_int32_t accm = 0, fcode;
-    struct bsd_dict *dictp;
-    u_char c;
-    int hval, disp, ent, ilen;
-    u_char *rptr, *wptr;
-    u_char *cp_end;
-    int olen;
-    struct mbuf *m;
-
-#define PUTBYTE(v) {                                   \
-    ++olen;                                            \
-    if (wptr) {                                                \
-       *wptr++ = (v);                                  \
-       if (wptr >= cp_end) {                           \
-           m->m_len = wptr - mtod(m, u_char *);        \
-           MGET(m->m_next, M_NOWAIT, MT_DATA);         \
-           m = m->m_next;                              \
-           if (m) {                                    \
-               m->m_len = 0;                           \
-               if (maxolen - olen > MLEN)              \
-                   MCLGET(m, M_NOWAIT);                \
-               wptr = mtod(m, u_char *);               \
-               cp_end = wptr + M_TRAILINGSPACE(m);     \
-           } else                                      \
-               wptr = NULL;                            \
-       }                                               \
-    }                                                  \
-}
-
-#define OUTPUT(ent) {                                  \
-    bitno -= n_bits;                                   \
-    accm |= ((ent) << bitno);                          \
-    do {                                               \
-       PUTBYTE(accm >> 24);                            \
-       accm <<= 8;                                     \
-       bitno += 8;                                     \
-    } while (bitno <= 24);                             \
-}
-
-    /*
-     * If the protocol is not in the range we're interested in,
-     * just return without compressing the packet.  If it is,
-     * the protocol becomes the first byte to compress.
-     */
-    rptr = mtod(mp, u_char *);
-    ent = PPP_PROTOCOL(rptr);
-    if (ent < 0x21 || ent > 0xf9) {
-       *mret = NULL;
-       return slen;
-    }
-
-    /* Don't generate compressed packets which are larger than
-       the uncompressed packet. */
-    if (maxolen > slen)
-       maxolen = slen;
-
-    /* Allocate one mbuf to start with. */
-    MGET(m, M_NOWAIT, MT_DATA);
-    *mret = m;
-    if (m != NULL) {
-       m->m_len = 0;
-       if (maxolen + db->hdrlen > MLEN)
-           MCLGET(m, M_NOWAIT);
-       m->m_data += db->hdrlen;
-       wptr = mtod(m, u_char *);
-       cp_end = wptr + M_TRAILINGSPACE(m);
-    } else
-       wptr = cp_end = NULL;
-
-    /*
-     * Copy the PPP header over, changing the protocol,
-     * and install the 2-byte packet sequence number.
-     */
-    if (wptr) {
-       *wptr++ = PPP_ADDRESS(rptr);    /* assumes the ppp header is */
-       *wptr++ = PPP_CONTROL(rptr);    /* all in one mbuf */
-       *wptr++ = 0;                    /* change the protocol */
-       *wptr++ = PPP_COMP;
-       *wptr++ = db->seqno >> 8;
-       *wptr++ = db->seqno;
-    }
-    ++db->seqno;
-
-    olen = 0;
-    rptr += PPP_HDRLEN;
-    slen = mp->m_len - PPP_HDRLEN;
-    ilen = slen + 1;
-    for (;;) {
-       if (slen <= 0) {
-           mp = mp->m_next;
-           if (!mp)
-               break;
-           rptr = mtod(mp, u_char *);
-           slen = mp->m_len;
-           if (!slen)
-               continue;   /* handle 0-length buffers */
-           ilen += slen;
-       }
-
-       slen--;
-       c = *rptr++;
-       fcode = BSD_KEY(ent, c);
-       hval = BSD_HASH(ent, c, hshift);
-       dictp = &db->dict[hval];
-
-       /* Validate and then check the entry. */
-       if (dictp->codem1 >= max_ent)
-           goto nomatch;
-       if (dictp->f.fcode == fcode) {
-           ent = dictp->codem1+1;
-           continue;   /* found (prefix,suffix) */
-       }
-
-       /* continue probing until a match or invalid entry */
-       disp = (hval == 0) ? 1 : hval;
-       do {
-           hval += disp;
-           if (hval >= db->hsize)
-               hval -= db->hsize;
-           dictp = &db->dict[hval];
-           if (dictp->codem1 >= max_ent)
-               goto nomatch;
-       } while (dictp->f.fcode != fcode);
-       ent = dictp->codem1 + 1;        /* finally found (prefix,suffix) */
-       continue;
-
-    nomatch:
-       OUTPUT(ent);            /* output the prefix */
-
-       /* code -> hashtable */
-       if (max_ent < db->maxmaxcode) {
-           struct bsd_dict *dictp2;
-           /* expand code size if needed */
-           if (max_ent >= MAXCODE(n_bits))
-               db->n_bits = ++n_bits;
-
-           /* Invalidate old hash table entry using
-            * this code, and then take it over.
-            */
-           dictp2 = &db->dict[max_ent+1];
-           if (db->dict[dictp2->cptr].codem1 == max_ent)
-               db->dict[dictp2->cptr].codem1 = BADCODEM1;
-           dictp2->cptr = hval;
-           dictp->codem1 = max_ent;
-           dictp->f.fcode = fcode;
-
-           db->max_ent = ++max_ent;
-       }
-       ent = c;
-    }
-
-    OUTPUT(ent);               /* output the last code */
-    db->bytes_out += olen;
-    db->in_count += ilen;
-    if (bitno < 32)
-       ++db->bytes_out;        /* count complete bytes */
-
-    if (bsd_check(db))
-       OUTPUT(CLEAR);          /* do not count the CLEAR */
-
-    /*
-     * Pad dribble bits of last code with ones.
-     * Do not emit a completely useless byte of ones.
-     */
-    if (bitno != 32)
-       PUTBYTE((accm | (0xff << (bitno-8))) >> 24);
-
-    if (m != NULL) {
-       m->m_len = wptr - mtod(m, u_char *);
-       m->m_next = NULL;
-    }
-
-    /*
-     * Increase code size if we would have without the packet
-     * boundary and as the decompressor will.
-     */
-    if (max_ent >= MAXCODE(n_bits) && max_ent < db->maxmaxcode)
-       db->n_bits++;
-
-    db->uncomp_bytes += ilen;
-    ++db->uncomp_count;
-    if (olen + PPP_HDRLEN + BSD_OVHD > maxolen) {
-       /* throw away the compressed stuff if it is longer than uncompressed */
-       if (*mret != NULL) {
-           m_freem(*mret);
-           *mret = NULL;
-       }
-       ++db->incomp_count;
-       db->incomp_bytes += ilen;
-    } else {
-       ++db->comp_count;
-       db->comp_bytes += olen + BSD_OVHD;
-    }
-
-    return olen + PPP_HDRLEN + BSD_OVHD;
-#undef OUTPUT
-#undef PUTBYTE
-}
-
-
-/*
- * Update the "BSD Compress" dictionary on the receiver for
- * incompressible data by pretending to compress the incoming data.
- */
-static void
-bsd_incomp(void *state, struct mbuf *dmsg)
-{
-    struct bsd_db *db = (struct bsd_db *) state;
-    u_int hshift = db->hshift;
-    u_int max_ent = db->max_ent;
-    u_int n_bits = db->n_bits;
-    struct bsd_dict *dictp;
-    u_int32_t fcode;
-    u_char c;
-    u_int32_t hval, disp;
-    int slen, ilen;
-    u_int bitno = 7;
-    u_char *rptr;
-    u_int ent;
-
-    /*
-     * If the protocol is not in the range we're interested in,
-     * just return without looking at the packet.  If it is,
-     * the protocol becomes the first byte to "compress".
-     */
-    rptr = mtod(dmsg, u_char *);
-    ent = PPP_PROTOCOL(rptr);
-    if (ent < 0x21 || ent > 0xf9)
-       return;
-
-    db->seqno++;
-    ilen = 1;          /* count the protocol as 1 byte */
-    rptr += PPP_HDRLEN;
-    slen = dmsg->m_len - PPP_HDRLEN;
-    for (;;) {
-       if (slen <= 0) {
-           dmsg = dmsg->m_next;
-           if (!dmsg)
-               break;
-           rptr = mtod(dmsg, u_char *);
-           slen = dmsg->m_len;
-           continue;
-       }
-       ilen += slen;
-
-       do {
-           c = *rptr++;
-           fcode = BSD_KEY(ent, c);
-           hval = BSD_HASH(ent, c, hshift);
-           dictp = &db->dict[hval];
-
-           /* validate and then check the entry */
-           if (dictp->codem1 >= max_ent)
-               goto nomatch;
-           if (dictp->f.fcode == fcode) {
-               ent = dictp->codem1+1;
-               continue;   /* found (prefix,suffix) */
-           }
-
-           /* continue probing until a match or invalid entry */
-           disp = (hval == 0) ? 1 : hval;
-           do {
-               hval += disp;
-               if (hval >= db->hsize)
-                   hval -= db->hsize;
-               dictp = &db->dict[hval];
-               if (dictp->codem1 >= max_ent)
-                   goto nomatch;
-           } while (dictp->f.fcode != fcode);
-           ent = dictp->codem1+1;
-           continue;   /* finally found (prefix,suffix) */
-
-       nomatch:                /* output (count) the prefix */
-           bitno += n_bits;
-
-           /* code -> hashtable */
-           if (max_ent < db->maxmaxcode) {
-               struct bsd_dict *dictp2;
-               /* expand code size if needed */
-               if (max_ent >= MAXCODE(n_bits))
-                   db->n_bits = ++n_bits;
-
-               /* Invalidate previous hash table entry
-                * assigned this code, and then take it over.
-                */
-               dictp2 = &db->dict[max_ent+1];
-               if (db->dict[dictp2->cptr].codem1 == max_ent)
-                   db->dict[dictp2->cptr].codem1 = BADCODEM1;
-               dictp2->cptr = hval;
-               dictp->codem1 = max_ent;
-               dictp->f.fcode = fcode;
-
-               db->max_ent = ++max_ent;
-               db->lens[max_ent] = db->lens[ent]+1;
-           }
-           ent = c;
-       } while (--slen != 0);
-    }
-    bitno += n_bits;           /* output (count) the last code */
-    db->bytes_out += bitno/8;
-    db->in_count += ilen;
-    bsd_check(db);
-
-    ++db->incomp_count;
-    db->incomp_bytes += ilen;
-    ++db->uncomp_count;
-    db->uncomp_bytes += ilen;
-
-    /* Increase code size if we would have without the packet
-     * boundary and as the decompressor will.
-     */
-    if (max_ent >= MAXCODE(n_bits) && max_ent < db->maxmaxcode)
-       db->n_bits++;
-}
-
-
-/*
- * Decompress "BSD Compress".
- *
- * Because of patent problems, we return DECOMP_ERROR for errors
- * found by inspecting the input data and for system problems, but
- * DECOMP_FATALERROR for any errors which could possibly be said to
- * be being detected "after" decompression.  For DECOMP_ERROR,
- * we can issue a CCP reset-request; for DECOMP_FATALERROR, we may be
- * infringing a patent of Motorola's if we do, so we take CCP down
- * instead.
- *
- * Given that the frame has the correct sequence number and a good FCS,
- * errors such as invalid codes in the input most likely indicate a
- * bug, so we return DECOMP_FATALERROR for them in order to turn off
- * compression, even though they are detected by inspecting the input.
- */
-static int
-bsd_decompress(void *state, struct mbuf *cmp, struct mbuf **dmpp)
-{
-    struct bsd_db *db = (struct bsd_db *) state;
-    u_int max_ent = db->max_ent;
-    u_int32_t accm = 0;
-    u_int bitno = 32;          /* 1st valid bit in accm */
-    u_int n_bits = db->n_bits;
-    u_int tgtbitno = 32-n_bits;        /* bitno when we have a code */
-    struct bsd_dict *dictp;
-    int explen, i, seq, len;
-    u_int incode, oldcode, finchar;
-    u_char *p, *rptr, *wptr;
-    struct mbuf *m, *dmp, *mret;
-    int adrs, ctrl, ilen;
-    int space, codelen, extra;
-
-    /*
-     * Save the address/control from the PPP header
-     * and then get the sequence number.
-     */
-    *dmpp = NULL;
-    rptr = mtod(cmp, u_char *);
-    adrs = PPP_ADDRESS(rptr);
-    ctrl = PPP_CONTROL(rptr);
-    rptr += PPP_HDRLEN;
-    len = cmp->m_len - PPP_HDRLEN;
-    seq = 0;
-    for (i = 0; i < 2; ++i) {
-       while (len <= 0) {
-           cmp = cmp->m_next;
-           if (cmp == NULL)
-               return DECOMP_ERROR;
-           rptr = mtod(cmp, u_char *);
-           len = cmp->m_len;
-       }
-       seq = (seq << 8) + *rptr++;
-       --len;
-    }
-
-    /*
-     * Check the sequence number and give up if it differs from
-     * the value we're expecting.
-     */
-    if (seq != db->seqno) {
-       if (db->debug)
-           kprintf("bsd_decomp%d: bad sequence # %d, expected %d\n",
-                  db->unit, seq, db->seqno - 1);
-       return DECOMP_ERROR;
-    }
-    ++db->seqno;
-
-    /*
-     * Allocate one mbuf to start with.
-     */
-    MGETHDR(dmp, M_NOWAIT, MT_DATA);
-    if (dmp == NULL)
-       return DECOMP_ERROR;
-    mret = dmp;
-    dmp->m_len = 0;
-    dmp->m_next = NULL;
-    MCLGET(dmp, M_NOWAIT);
-    dmp->m_data += db->hdrlen;
-    wptr = mtod(dmp, u_char *);
-    space = M_TRAILINGSPACE(dmp) - PPP_HDRLEN + 1;
-
-    /*
-     * Fill in the ppp header, but not the last byte of the protocol
-     * (that comes from the decompressed data).
-     */
-    wptr[0] = adrs;
-    wptr[1] = ctrl;
-    wptr[2] = 0;
-    wptr += PPP_HDRLEN - 1;
-
-    ilen = len;
-    oldcode = CLEAR;
-    explen = 0;
-    for (;;) {
-       if (len == 0) {
-           cmp = cmp->m_next;
-           if (!cmp)           /* quit at end of message */
-               break;
-           rptr = mtod(cmp, u_char *);
-           len = cmp->m_len;
-           ilen += len;
-           continue;           /* handle 0-length buffers */
-       }
-
-       /*
-        * Accumulate bytes until we have a complete code.
-        * Then get the next code, relying on the 32-bit,
-        * unsigned accm to mask the result.
-        */
-       bitno -= 8;
-       accm |= *rptr++ << bitno;
-       --len;
-       if (tgtbitno < bitno)
-           continue;
-       incode = accm >> tgtbitno;
-       accm <<= n_bits;
-       bitno += n_bits;
-
-       if (incode == CLEAR) {
-           /*
-            * The dictionary must only be cleared at
-            * the end of a packet.  But there could be an
-            * empty mbuf at the end.
-            */
-           if (len > 0 || cmp->m_next != NULL) {
-               while ((cmp = cmp->m_next) != NULL)
-                   len += cmp->m_len;
-               if (len > 0) {
-                   m_freem(mret);
-                   if (db->debug)
-                       kprintf("bsd_decomp%d: bad CLEAR\n", db->unit);
-                   return DECOMP_FATALERROR;   /* probably a bug */
-               }
-           }
-           bsd_clear(db);
-           explen = ilen = 0;
-           break;
-       }
-
-       if (incode > max_ent + 2 || incode > db->maxmaxcode
-           || (incode > max_ent && oldcode == CLEAR)) {
-           m_freem(mret);
-           if (db->debug) {
-               kprintf("bsd_decomp%d: bad code 0x%x oldcode=0x%x ",
-                      db->unit, incode, oldcode);
-               kprintf("max_ent=0x%x explen=%d seqno=%d\n",
-                      max_ent, explen, db->seqno);
-           }
-           return DECOMP_FATALERROR;   /* probably a bug */
-       }
-
-       /* Special case for KwKwK string. */
-       if (incode > max_ent) {
-           finchar = oldcode;
-           extra = 1;
-       } else {
-           finchar = incode;
-           extra = 0;
-       }
-
-       codelen = db->lens[finchar];
-       explen += codelen + extra;
-       if (explen > db->mru + 1) {
-           m_freem(mret);
-           if (db->debug) {
-               kprintf("bsd_decomp%d: ran out of mru\n", db->unit);
-#ifdef DEBUG
-               while ((cmp = cmp->m_next) != NULL)
-                   len += cmp->m_len;
-               kprintf("  len=%d, finchar=0x%x, codelen=%d, explen=%d\n",
-                      len, finchar, codelen, explen);
-#endif
-           }
-           return DECOMP_FATALERROR;
-       }
-
-       /*
-        * For simplicity, the decoded characters go in a single mbuf,
-        * so we allocate a single extra cluster mbuf if necessary.
-        */
-       if ((space -= codelen + extra) < 0) {
-           dmp->m_len = wptr - mtod(dmp, u_char *);
-           MGET(m, M_NOWAIT, MT_DATA);
-           if (m == NULL) {
-               m_freem(mret);
-               return DECOMP_ERROR;
-           }
-           m->m_len = 0;
-           m->m_next = NULL;
-           dmp->m_next = m;
-           MCLGET(m, M_NOWAIT);
-           space = M_TRAILINGSPACE(m) - (codelen + extra);
-           if (space < 0) {
-               /* now that's what I call *compression*. */
-               m_freem(mret);
-               return DECOMP_ERROR;
-           }
-           dmp = m;
-           wptr = mtod(dmp, u_char *);
-       }
-
-       /*
-        * Decode this code and install it in the decompressed buffer.
-        */
-       p = (wptr += codelen);
-       while (finchar > LAST) {
-           dictp = &db->dict[db->dict[finchar].cptr];
-#ifdef DEBUG
-           if (--codelen <= 0 || dictp->codem1 != finchar-1)
-               goto bad;
-#endif
-           *--p = dictp->f.hs.suffix;
-           finchar = dictp->f.hs.prefix;
-       }
-       *--p = finchar;
-
-#ifdef DEBUG
-       if (--codelen != 0)
-           kprintf("bsd_decomp%d: short by %d after code 0x%x, max_ent=0x%x\n",
-                  db->unit, codelen, incode, max_ent);
-#endif
-
-       if (extra)              /* the KwKwK case again */
-           *wptr++ = finchar;
-
-       /*
-        * If not first code in a packet, and
-        * if not out of code space, then allocate a new code.
-        *
-        * Keep the hash table correct so it can be used
-        * with uncompressed packets.
-        */
-       if (oldcode != CLEAR && max_ent < db->maxmaxcode) {
-           struct bsd_dict *dictp2;
-           u_int32_t fcode;
-           u_int32_t hval, disp;
-
-           fcode = BSD_KEY(oldcode,finchar);
-           hval = BSD_HASH(oldcode,finchar,db->hshift);
-           dictp = &db->dict[hval];
-
-           /* look for a free hash table entry */
-           if (dictp->codem1 < max_ent) {
-               disp = (hval == 0) ? 1 : hval;
-               do {
-                   hval += disp;
-                   if (hval >= db->hsize)
-                       hval -= db->hsize;
-                   dictp = &db->dict[hval];
-               } while (dictp->codem1 < max_ent);
-           }
-
-           /*
-            * Invalidate previous hash table entry
-            * assigned this code, and then take it over
-            */
-           dictp2 = &db->dict[max_ent+1];
-           if (db->dict[dictp2->cptr].codem1 == max_ent) {
-               db->dict[dictp2->cptr].codem1 = BADCODEM1;
-           }
-           dictp2->cptr = hval;
-           dictp->codem1 = max_ent;
-           dictp->f.fcode = fcode;
-
-           db->max_ent = ++max_ent;
-           db->lens[max_ent] = db->lens[oldcode]+1;
-
-           /* Expand code size if needed. */
-           if (max_ent >= MAXCODE(n_bits) && max_ent < db->maxmaxcode) {
-               db->n_bits = ++n_bits;
-               tgtbitno = 32-n_bits;
-           }
-       }
-       oldcode = incode;
-    }
-    dmp->m_len = wptr - mtod(dmp, u_char *);
-
-    /*
-     * Keep the checkpoint right so that incompressible packets
-     * clear the dictionary at the right times.
-     */
-    db->bytes_out += ilen;
-    db->in_count += explen;
-    if (bsd_check(db) && db->debug) {
-       kprintf("bsd_decomp%d: peer should have cleared dictionary\n",
-              db->unit);
-    }
-
-    ++db->comp_count;
-    db->comp_bytes += ilen + BSD_OVHD;
-    ++db->uncomp_count;
-    db->uncomp_bytes += explen;
-
-    *dmpp = mret;
-    return DECOMP_OK;
-
-#ifdef DEBUG
- bad:
-    if (codelen <= 0) {
-       kprintf("bsd_decomp%d: fell off end of chain ", db->unit);
-       kprintf("0x%x at 0x%x by 0x%x, max_ent=0x%x\n",
-              incode, finchar, db->dict[finchar].cptr, max_ent);
-    } else if (dictp->codem1 != finchar-1) {
-       kprintf("bsd_decomp%d: bad code chain 0x%x finchar=0x%x ",
-              db->unit, incode, finchar);
-       kprintf("oldcode=0x%x cptr=0x%x codem1=0x%x\n", oldcode,
-              db->dict[finchar].cptr, dictp->codem1);
-    }
-    m_freem(mret);
-    return DECOMP_FATALERROR;
-#endif /* DEBUG */
-}
-#endif /* DO_BSD_COMPRESS */
diff --git a/sys/net/ppp/if_ppp.c b/sys/net/ppp/if_ppp.c
deleted file mode 100644 (file)
index 175bd4a..0000000
+++ /dev/null
@@ -1,1577 +0,0 @@
-/*
- * if_ppp.c - Point-to-Point Protocol (PPP) Asynchronous driver.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Drew D. Perkins
- * Carnegie Mellon University
- * 4910 Forbes Ave.
- * Pittsburgh, PA 15213
- * (412) 268-8576
- * ddp@andrew.cmu.edu
- *
- * Based on:
- *     @(#)if_sl.c     7.6.1.2 (Berkeley) 2/15/89
- *
- * Copyright (c) 1987 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Serial Line interface
- *
- * Rick Adams
- * Center for Seismic Studies
- * 1300 N 17th Street, Suite 1450
- * Arlington, Virginia 22209
- * (703)276-7900
- * rick@seismo.ARPA
- * seismo!rick
- *
- * Pounded on heavily by Chris Torek (chris@mimsy.umd.edu, umcp-cs!chris).
- * Converted to 4.3BSD Beta by Chris Torek.
- * Other changes made at Berkeley, based in part on code by Kirk Smith.
- *
- * Converted to 4.3BSD+ 386BSD by Brad Parker (brad@cayman.com)
- * Added VJ tcp header compression; more unified ioctls
- *
- * Extensively modified by Paul Mackerras (paulus@cs.anu.edu.au).
- * Cleaned up a lot of the mbuf-related code to fix bugs that
- * caused system crashes and packet corruption.  Changed pppstart
- * so that it doesn't just give up with a collision if the whole
- * packet doesn't fit in the output ring buffer.
- *
- * Added priority queueing for interactive IP packets, following
- * the model of if_sl.c, plus hooks for bpf.
- * Paul Mackerras (paulus@cs.anu.edu.au).
- */
-
-/* $FreeBSD: src/sys/net/if_ppp.c,v 1.67.2.4 2002/04/14 21:41:48 luigi Exp $ */
-/* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */
-/* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */
-
-#include "use_ppp.h"
-
-#include "opt_inet.h"
-#include "opt_ppp.h"
-
-#ifdef INET
-#define VJC
-#endif
-#define PPP_COMPRESS
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/proc.h>
-#include <sys/priv.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/filio.h>
-#include <sys/sockio.h>
-#include <sys/kernel.h>
-#include <sys/time.h>
-#include <sys/malloc.h>
-
-#include <sys/msgport2.h>
-#include <sys/mplock2.h>
-
-#include <net/if.h>
-#include <net/if_types.h>
-#include <net/ifq_var.h>
-#include <net/netisr.h>
-#include <net/bpf.h>
-
-#ifdef INET
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/in_var.h>
-#include <netinet/ip.h>
-#endif
-
-#ifdef VJC
-#include <net/slcompress.h>
-#endif
-
-#include "if_ppp.h"
-#include "if_pppvar.h"
-
-/* minimise diffs */
-#ifndef splsoftnet
-#define splsoftnet     splnet
-#endif
-
-#ifdef PPP_COMPRESS
-#define PACKETPTR      struct mbuf *
-#include <net/ppp_layer/ppp_comp.h>
-#endif
-
-struct ppp_softc ppp_softc[NPPP];
-
-/* XXX layering violation */
-extern void    pppasyncattach (void *);
-
-static void    pppattach (void *);
-PSEUDO_SET(pppattach, if_ppp);
-
-static int     pppsioctl (struct ifnet *ifp, u_long cmd, caddr_t data,
-                          struct ucred *);
-
-static void    ppp_requeue (struct ppp_softc *);
-static void    ppp_ccp (struct ppp_softc *, struct mbuf *m, int rcvd);
-static void    ppp_ccp_closed (struct ppp_softc *);
-static void    ppp_inproc (struct ppp_softc *, struct mbuf *);
-static void    pppdumpm (struct mbuf *m0);
-static void    ppp_ifstart(struct ifnet *ifp, struct ifaltq_subque *ifsq);
-
-/*
- * Some useful mbuf macros not in mbuf.h.
- */
-#define M_IS_CLUSTER(m)        ((m)->m_flags & M_EXT)
-
-#define M_DATASTART(m) \
-       (M_IS_CLUSTER(m) ? (m)->m_ext.ext_buf : \
-           (m)->m_flags & M_PKTHDR ? (m)->m_pktdat : (m)->m_dat)
-
-#define M_DATASIZE(m)  \
-       (M_IS_CLUSTER(m) ? (m)->m_ext.ext_size : \
-           (m)->m_flags & M_PKTHDR ? MHLEN: MLEN)
-
-/*
- * We steal two bits in the mbuf m_flags, to mark high-priority packets
- * for output, and received packets following lost/corrupted packets.
- */
-#define M_HIGHPRI      M_PROTO2        /* output packet for sc_fastq */
-#define M_ERRMARK      M_PROTO3        /* steal a bit in mbuf m_flags */
-
-
-#ifdef PPP_COMPRESS
-/*
- * List of compressors we know about.
- * We leave some space so maybe we can modload compressors.
- */
-
-extern struct compressor ppp_bsd_compress;
-extern struct compressor ppp_deflate, ppp_deflate_draft;
-
-static struct compressor *ppp_compressors[8] = {
-#if DO_BSD_COMPRESS && defined(PPP_BSDCOMP)
-    &ppp_bsd_compress,
-#endif
-#if DO_DEFLATE && defined(PPP_DEFLATE)
-    &ppp_deflate,
-    &ppp_deflate_draft,
-#endif
-    NULL
-};
-#endif /* PPP_COMPRESS */
-
-/*
- * Software interrupt routine, called at spl[soft]net.
- */
-static void
-pppintr(netmsg_t msg)
-{
-    struct mbuf *m;
-    struct ppp_softc *sc;
-    struct ifaltq_subque *ifsq;
-    int i;
-
-    /*
-     * Packets are never sent to this netisr so the message must always
-     * be replied.  Interlock processing and notification by replying
-     * the message first.
-     */
-    lwkt_replymsg(&msg->lmsg, 0);
-
-    get_mplock();
-
-    sc = ppp_softc;
-    ifsq = ifq_get_subq_default(&sc->sc_if.if_snd);
-
-    for (i = 0; i < NPPP; ++i, ++sc) {
-       ifnet_serialize_all(&sc->sc_if);
-       if (!(sc->sc_flags & SC_TBUSY)
-           && (!ifsq_is_empty(ifsq) || !IF_QEMPTY(&sc->sc_fastq))) {
-           sc->sc_flags |= SC_TBUSY;
-           (*sc->sc_start)(sc);
-       } 
-       for (;;) {
-           IF_DEQUEUE(&sc->sc_rawq, m);
-           if (m == NULL)
-               break;
-           ppp_inproc(sc, m);
-       }
-       ifnet_deserialize_all(&sc->sc_if);
-    }
-    rel_mplock();
-}
-
-/*
- * Called from boot code to establish ppp interfaces.
- */
-static void
-pppattach(void *dummy)
-{
-    struct ppp_softc *sc;
-    int i = 0;
-
-    for (sc = ppp_softc; i < NPPP; sc++) {
-       if_initname(&(sc->sc_if), "ppp", i++);
-       sc->sc_if.if_softc = sc;
-       sc->sc_if.if_mtu = PPP_MTU;
-       sc->sc_if.if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
-       sc->sc_if.if_type = IFT_PPP;
-       sc->sc_if.if_hdrlen = PPP_HDRLEN;
-       sc->sc_if.if_ioctl = pppsioctl;
-       sc->sc_if.if_output = pppoutput;
-       sc->sc_if.if_start = ppp_ifstart;
-       ifq_set_maxlen(&sc->sc_if.if_snd, IFQ_MAXLEN);
-       ifq_set_ready(&sc->sc_if.if_snd);
-       sc->sc_inq.ifq_maxlen = IFQ_MAXLEN;
-       sc->sc_fastq.ifq_maxlen = IFQ_MAXLEN;
-       sc->sc_rawq.ifq_maxlen = IFQ_MAXLEN;
-       callout_init(&sc->sc_timeout);
-       if_attach(&sc->sc_if, NULL);
-       bpfattach(&sc->sc_if, DLT_PPP, PPP_HDRLEN);
-    }
-    netisr_register(NETISR_PPP, pppintr, NULL);
-    /*
-     * XXX layering violation - if_ppp can work over any lower level
-     * transport that cares to attach to it.
-     */
-    pppasyncattach(dummy);
-}
-
-/*
- * Allocate a ppp interface unit and initialize it.
- */
-struct ppp_softc *
-pppalloc(struct thread *td)
-{
-    int nppp, i;
-    struct ppp_softc *sc;
-
-    for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++)
-       if (sc->sc_xfer == td) {
-           sc->sc_xfer = NULL;
-           return sc;
-       }
-    for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++)
-       if (sc->sc_devp == NULL)
-           break;
-    if (nppp >= NPPP)
-       return NULL;
-
-    sc->sc_flags = 0;
-    sc->sc_mru = PPP_MRU;
-    sc->sc_relinq = NULL;
-    bzero((char *)&sc->sc_stats, sizeof(sc->sc_stats));
-#ifdef VJC
-    sc->sc_comp = kmalloc(sizeof(struct slcompress), M_DEVBUF, M_WAITOK);
-    sl_compress_init(sc->sc_comp, -1);
-#endif
-#ifdef PPP_COMPRESS
-    sc->sc_xc_state = NULL;
-    sc->sc_rc_state = NULL;
-#endif /* PPP_COMPRESS */
-    for (i = 0; i < NUM_NP; ++i)
-       sc->sc_npmode[i] = NPMODE_ERROR;
-    sc->sc_npqueue = NULL;
-    sc->sc_npqtail = &sc->sc_npqueue;
-    sc->sc_last_sent = sc->sc_last_recv = time_uptime;
-
-    return sc;
-}
-
-/*
- * Deallocate a ppp unit.  Must be called at splsoftnet or higher.
- */
-void
-pppdealloc(struct ppp_softc *sc)
-{
-    struct mbuf *m;
-
-    if_down(&sc->sc_if);
-    sc->sc_if.if_flags &= ~(IFF_UP|IFF_RUNNING);
-    getmicrotime(&sc->sc_if.if_lastchange);
-    sc->sc_devp = NULL;
-    sc->sc_xfer = NULL;
-    for (;;) {
-       IF_DEQUEUE(&sc->sc_rawq, m);
-       if (m == NULL)
-           break;
-       m_freem(m);
-    }
-    for (;;) {
-       IF_DEQUEUE(&sc->sc_inq, m);
-       if (m == NULL)
-           break;
-       m_freem(m);
-    }
-    for (;;) {
-       IF_DEQUEUE(&sc->sc_fastq, m);
-       if (m == NULL)
-           break;
-       m_freem(m);
-    }
-    while ((m = sc->sc_npqueue) != NULL) {
-       sc->sc_npqueue = m->m_nextpkt;
-       m_freem(m);
-    }
-#ifdef PPP_COMPRESS
-    ppp_ccp_closed(sc);
-    sc->sc_xc_state = NULL;
-    sc->sc_rc_state = NULL;
-#endif /* PPP_COMPRESS */
-#ifdef PPP_FILTER
-    if (sc->sc_pass_filt.bf_insns != NULL) {
-       kfree(sc->sc_pass_filt.bf_insns, M_DEVBUF);
-       sc->sc_pass_filt.bf_insns = NULL;
-       sc->sc_pass_filt.bf_len = 0;
-    }
-    if (sc->sc_active_filt.bf_insns != NULL) {
-       kfree(sc->sc_active_filt.bf_insns, M_DEVBUF);
-       sc->sc_active_filt.bf_insns = NULL;
-       sc->sc_active_filt.bf_len = 0;
-    }
-#endif /* PPP_FILTER */
-#ifdef VJC
-    if (sc->sc_comp != NULL) {
-       kfree(sc->sc_comp, M_DEVBUF);
-       sc->sc_comp = NULL;
-    }
-#endif
-}
-
-/*
- * Ioctl routine for generic ppp devices.
- */
-int
-pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data,
-    int flag, struct ucred *cred)
-{
-    int error, flags, mru, npx;
-    u_int nb;
-    struct ppp_option_data *odp;
-    struct compressor **cp;
-    struct npioctl *npi;
-    time_t t;
-#ifdef PPP_FILTER
-    struct bpf_program *bp, *nbp;
-    struct bpf_insn *newcode, *oldcode;
-    int newcodelen;
-#endif /* PPP_FILTER */
-#ifdef PPP_COMPRESS
-    u_char ccp_option[CCP_MAX_OPTION_LENGTH];
-#endif
-
-    switch (cmd) {
-    case FIONREAD:
-       *(int *)data = sc->sc_inq.ifq_len;
-       break;
-
-    case PPPIOCGUNIT:
-       *(int *)data = sc->sc_if.if_dunit;
-       break;
-
-    case PPPIOCGFLAGS:
-       *(u_int *)data = sc->sc_flags;
-       break;
-
-    case PPPIOCSFLAGS:
-       if ((error = priv_check_cred(cred, PRIV_ROOT, 0)) != 0)
-           return (error);
-       flags = *(int *)data & SC_MASK;
-       crit_enter();
-#ifdef PPP_COMPRESS
-       if (sc->sc_flags & SC_CCP_OPEN && !(flags & SC_CCP_OPEN))
-           ppp_ccp_closed(sc);
-#endif
-       sc->sc_flags = (sc->sc_flags & ~SC_MASK) | flags;
-       crit_exit();
-       break;
-
-    case PPPIOCSMRU:
-       if ((error = priv_check_cred(cred, PRIV_ROOT, 0)) != 0)
-           return (error);
-       mru = *(int *)data;
-       if (mru >= PPP_MRU && mru <= PPP_MAXMRU)
-           sc->sc_mru = mru;
-       break;
-
-    case PPPIOCGMRU:
-       *(int *)data = sc->sc_mru;
-       break;
-
-#ifdef VJC
-    case PPPIOCSMAXCID:
-       if ((error = priv_check_cred(cred, PRIV_ROOT, 0)) != 0)
-           return (error);
-       if (sc->sc_comp) {
-           crit_enter();
-           sl_compress_init(sc->sc_comp, *(int *)data);
-           crit_exit();
-       }
-       break;
-#endif
-
-    case PPPIOCXFERUNIT:
-       if ((error = priv_check_cred(cred, PRIV_ROOT, 0)) != 0)
-           return (error);
-       sc->sc_xfer = curthread;
-       break;
-
-#ifdef PPP_COMPRESS
-    case PPPIOCSCOMPRESS:
-       if ((error = priv_check_cred(cred, PRIV_ROOT, 0)) != 0)
-           return (error);
-       odp = (struct ppp_option_data *) data;
-       nb = odp->length;
-       if (nb > sizeof(ccp_option))
-           nb = sizeof(ccp_option);
-       if ((error = copyin(odp->ptr, ccp_option, nb)) != 0)
-           return (error);
-       if (ccp_option[1] < 2)  /* preliminary check on the length byte */
-           return (EINVAL);
-       for (cp = ppp_compressors; *cp != NULL; ++cp)
-           if ((*cp)->compress_proto == ccp_option[0]) {
-               /*
-                * Found a handler for the protocol - try to allocate
-                * a compressor or decompressor.
-                */
-               error = 0;
-               if (odp->transmit) {
-                   crit_enter();
-                   if (sc->sc_xc_state != NULL)
-                       (*sc->sc_xcomp->comp_free)(sc->sc_xc_state);
-                   sc->sc_xcomp = *cp;
-                   sc->sc_xc_state = (*cp)->comp_alloc(ccp_option, nb);
-                   if (sc->sc_xc_state == NULL) {
-                       if (sc->sc_flags & SC_DEBUG)
-                           kprintf("%s: comp_alloc failed\n",
-                              sc->sc_if.if_xname);
-                       error = ENOBUFS;
-                   }
-                   sc->sc_flags &= ~SC_COMP_RUN;
-                   crit_exit();
-               } else {
-                   crit_enter();
-                   if (sc->sc_rc_state != NULL)
-                       (*sc->sc_rcomp->decomp_free)(sc->sc_rc_state);
-                   sc->sc_rcomp = *cp;
-                   sc->sc_rc_state = (*cp)->decomp_alloc(ccp_option, nb);
-                   if (sc->sc_rc_state == NULL) {
-                       if (sc->sc_flags & SC_DEBUG)
-                           kprintf("%s: decomp_alloc failed\n",
-                              sc->sc_if.if_xname);
-                       error = ENOBUFS;
-                   }
-                   sc->sc_flags &= ~SC_DECOMP_RUN;
-                   crit_exit();
-               }
-               return (error);
-           }
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: no compressor for [%x %x %x], %x\n",
-                  sc->sc_if.if_xname, ccp_option[0], ccp_option[1],
-                  ccp_option[2], nb);
-       return (EINVAL);        /* no handler found */
-#endif /* PPP_COMPRESS */
-
-    case PPPIOCGNPMODE:
-    case PPPIOCSNPMODE:
-       npi = (struct npioctl *) data;
-       switch (npi->protocol) {
-       case PPP_IP:
-           npx = NP_IP;
-           break;
-       default:
-           return EINVAL;
-       }
-       if (cmd == PPPIOCGNPMODE) {
-           npi->mode = sc->sc_npmode[npx];
-       } else {
-           if ((error = priv_check_cred(cred, PRIV_ROOT, 0)) != 0)
-               return (error);
-           if (npi->mode != sc->sc_npmode[npx]) {
-               crit_enter();
-               sc->sc_npmode[npx] = npi->mode;
-               if (npi->mode != NPMODE_QUEUE) {
-                   ppp_requeue(sc);
-                   (*sc->sc_start)(sc);
-               }
-               crit_exit();
-           }
-       }
-       break;
-
-    case PPPIOCGIDLE:
-       crit_enter();
-       t = time_uptime;
-       ((struct ppp_idle *)data)->xmit_idle = t - sc->sc_last_sent;
-       ((struct ppp_idle *)data)->recv_idle = t - sc->sc_last_recv;
-       crit_exit();
-       break;
-
-#ifdef PPP_FILTER
-    case PPPIOCSPASS:
-    case PPPIOCSACTIVE:
-       nbp = (struct bpf_program *) data;
-       if ((unsigned) nbp->bf_len > BPF_MAXINSNS)
-           return EINVAL;
-       newcodelen = nbp->bf_len * sizeof(struct bpf_insn);
-       if (newcodelen != 0) {
-           newcode = kmalloc(newcodelen, M_DEVBUF, M_WAITOK);
-           if ((error = copyin((caddr_t)nbp->bf_insns, (caddr_t)newcode,
-                              newcodelen)) != 0) {
-               kfree(newcode, M_DEVBUF);
-               return error;
-           }
-           if (!bpf_validate(newcode, nbp->bf_len)) {
-               kfree(newcode, M_DEVBUF);
-               return EINVAL;
-           }
-       } else
-           newcode = NULL;
-       bp = (cmd == PPPIOCSPASS)? &sc->sc_pass_filt: &sc->sc_active_filt;
-       oldcode = bp->bf_insns;
-       crit_enter();
-       bp->bf_len = nbp->bf_len;
-       bp->bf_insns = newcode;
-       crit_exit();
-       if (oldcode != NULL)
-           kfree(oldcode, M_DEVBUF);
-       break;
-#endif
-
-    default:
-       return (ENOIOCTL);
-    }
-    return (0);
-}
-
-/*
- * Process an ioctl request to the ppp network interface.
- */
-static int
-pppsioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
-{
-    struct ppp_softc *sc = &ppp_softc[ifp->if_dunit];
-    struct ifaddr *ifa = (struct ifaddr *)data;
-    struct ifreq *ifr = (struct ifreq *)data;
-    struct ppp_stats *psp;
-#ifdef PPP_COMPRESS
-    struct ppp_comp_stats *pcp;
-#endif
-    int error = 0;
-
-    crit_enter();
-
-    switch (cmd) {
-    case SIOCSIFFLAGS:
-       if ((ifp->if_flags & IFF_RUNNING) == 0)
-           ifp->if_flags &= ~IFF_UP;
-       break;
-
-    case SIOCSIFADDR:
-    case SIOCAIFADDR:
-       switch(ifa->ifa_addr->sa_family) {
-#ifdef INET
-       case AF_INET:
-           break;
-#endif
-       default:
-           error = EAFNOSUPPORT;
-           break;
-       }
-       break;
-
-    case SIOCSIFDSTADDR:
-       switch(ifa->ifa_addr->sa_family) {
-#ifdef INET
-       case AF_INET:
-           break;
-#endif
-       default:
-           error = EAFNOSUPPORT;
-           break;
-       }
-       break;
-
-    case SIOCSIFMTU:
-       if ((error = priv_check_cred(cr, PRIV_ROOT, 0)) != 0)
-           break;
-       if (ifr->ifr_mtu > PPP_MAXMTU)
-           error = EINVAL;
-       else {
-           sc->sc_if.if_mtu = ifr->ifr_mtu;
-           if (sc->sc_setmtu)
-                   (*sc->sc_setmtu)(sc);
-       }
-       break;
-
-    case SIOCGIFMTU:
-       ifr->ifr_mtu = sc->sc_if.if_mtu;
-       break;
-
-    case SIOCADDMULTI:
-    case SIOCDELMULTI:
-       if (ifr == NULL) {
-           error = EAFNOSUPPORT;
-           break;
-       }
-       switch(ifr->ifr_addr.sa_family) {
-#ifdef INET
-       case AF_INET:
-           break;
-#endif
-       default:
-           error = EAFNOSUPPORT;
-           break;
-       }
-       break;
-
-    case SIOCGPPPSTATS:
-       psp = &((struct ifpppstatsreq *) data)->stats;
-       bzero(psp, sizeof(*psp));
-       psp->p = sc->sc_stats;
-#if defined(VJC) && !defined(SL_NO_STATS)
-       if (sc->sc_comp) {
-           psp->vj.vjs_packets = sc->sc_comp->sls_packets;
-           psp->vj.vjs_compressed = sc->sc_comp->sls_compressed;
-           psp->vj.vjs_searches = sc->sc_comp->sls_searches;
-           psp->vj.vjs_misses = sc->sc_comp->sls_misses;
-           psp->vj.vjs_uncompressedin = sc->sc_comp->sls_uncompressedin;
-           psp->vj.vjs_compressedin = sc->sc_comp->sls_compressedin;
-           psp->vj.vjs_errorin = sc->sc_comp->sls_errorin;
-           psp->vj.vjs_tossed = sc->sc_comp->sls_tossed;
-       }
-#endif /* VJC */
-       break;
-
-#ifdef PPP_COMPRESS
-    case SIOCGPPPCSTATS:
-       pcp = &((struct ifpppcstatsreq *) data)->stats;
-       bzero(pcp, sizeof(*pcp));
-       if (sc->sc_xc_state != NULL)
-           (*sc->sc_xcomp->comp_stat)(sc->sc_xc_state, &pcp->c);
-       if (sc->sc_rc_state != NULL)
-           (*sc->sc_rcomp->decomp_stat)(sc->sc_rc_state, &pcp->d);
-       break;
-#endif /* PPP_COMPRESS */
-
-    default:
-       error = ENOTTY;
-    }
-    crit_exit();
-    return (error);
-}
-
-/*
- * Queue a packet.  Start transmission if not active.
- * Packet is placed in Information field of PPP frame.
- * Called at splnet as the if->if_output handler.
- * Called at splnet from pppwrite().
- */
-static int
-pppoutput_serialized(struct ifnet *ifp, struct ifaltq_subque *ifsq,
-    struct mbuf *m0, struct sockaddr *dst, struct rtentry *rtp)
-{
-    struct ppp_softc *sc = &ppp_softc[ifp->if_dunit];
-    int protocol, address, control;
-    u_char *cp;
-    int error;
-#ifdef INET
-    struct ip *ip;
-#endif
-    struct ifqueue *ifq;
-    enum NPmode mode;
-    int len;
-    struct mbuf *m;
-    struct altq_pktattr pktattr;
-
-    if (sc->sc_devp == NULL || (ifp->if_flags & IFF_RUNNING) == 0
-       || ((ifp->if_flags & IFF_UP) == 0 && dst->sa_family != AF_UNSPEC)) {
-       error = ENETDOWN;       /* sort of */
-       goto bad;
-    }
-
-    ifq_classify(&ifp->if_snd, m0, dst->sa_family, &pktattr);
-
-    /*
-     * Compute PPP header.
-     */
-    m0->m_flags &= ~M_HIGHPRI;
-    switch (dst->sa_family) {
-#ifdef INET
-    case AF_INET:
-       address = PPP_ALLSTATIONS;
-       control = PPP_UI;
-       protocol = PPP_IP;
-       mode = sc->sc_npmode[NP_IP];
-
-       /*
-        * If this packet has the "low delay" bit set in the IP header,
-        * put it on the fastq instead.
-        */
-       ip = mtod(m0, struct ip *);
-       if (ip->ip_tos & IPTOS_LOWDELAY)
-           m0->m_flags |= M_HIGHPRI;
-       break;
-#endif
-    case AF_UNSPEC:
-       address = PPP_ADDRESS(dst->sa_data);
-       control = PPP_CONTROL(dst->sa_data);
-       protocol = PPP_PROTOCOL(dst->sa_data);
-       mode = NPMODE_PASS;
-       break;
-    default:
-       kprintf("%s: af%d not supported\n", ifp->if_xname, dst->sa_family);
-       error = EAFNOSUPPORT;
-       goto bad;
-    }
-
-    /*
-     * Drop this packet, or return an error, if necessary.
-     */
-    if (mode == NPMODE_ERROR) {
-       error = ENETDOWN;
-       goto bad;
-    }
-    if (mode == NPMODE_DROP) {
-       error = 0;
-       goto bad;
-    }
-
-    /*
-     * Add PPP header.  If no space in first mbuf, allocate another.
-     * (This assumes M_LEADINGSPACE is always 0 for a cluster mbuf.)
-     */
-    if (M_LEADINGSPACE(m0) < PPP_HDRLEN) {
-       m0 = m_prepend(m0, PPP_HDRLEN, M_NOWAIT);
-       if (m0 == NULL) {
-           error = ENOBUFS;
-           goto bad;
-       }
-       m0->m_len = 0;
-    } else
-       m0->m_data -= PPP_HDRLEN;
-
-    cp = mtod(m0, u_char *);
-    *cp++ = address;
-    *cp++ = control;
-    *cp++ = protocol >> 8;
-    *cp++ = protocol & 0xff;
-    m0->m_len += PPP_HDRLEN;
-
-    len = 0;
-    for (m = m0; m != NULL; m = m->m_next)
-       len += m->m_len;
-
-    if (sc->sc_flags & SC_LOG_OUTPKT) {
-       kprintf("%s output: ", ifp->if_xname);
-       pppdumpm(m0);
-    }
-
-    if ((protocol & 0x8000) == 0) {
-#ifdef PPP_FILTER
-       /*
-        * Apply the pass and active filters to the packet,
-        * but only if it is a data packet.
-        */
-       *mtod(m0, u_char *) = 1;        /* indicates outbound */
-       if (sc->sc_pass_filt.bf_insns != NULL
-           && bpf_filter(sc->sc_pass_filt.bf_insns, (u_char *) m0,
-                         len, 0) == 0) {
-           error = 0;          /* drop this packet */
-           goto bad;
-       }
-
-       /*
-        * Update the time we sent the most recent packet.
-        */
-       if (sc->sc_active_filt.bf_insns == NULL
-           || bpf_filter(sc->sc_active_filt.bf_insns, (u_char *) m0, len, 0))
-           sc->sc_last_sent = time_uptime;
-
-       *mtod(m0, u_char *) = address;
-#else
-       /*
-        * Update the time we sent the most recent data packet.
-        */
-       sc->sc_last_sent = time_uptime;
-#endif /* PPP_FILTER */
-    }
-
-    BPF_MTAP(ifp, m0);
-
-    /*
-     * Put the packet on the appropriate queue.
-     */
-    crit_enter();
-    if (mode == NPMODE_QUEUE) {
-       /* XXX we should limit the number of packets on this queue */
-       *sc->sc_npqtail = m0;
-       m0->m_nextpkt = NULL;
-       sc->sc_npqtail = &m0->m_nextpkt;
-    } else {
-       /* fastq and if_snd are emptied at spl[soft]net now */
-       if ((m0->m_flags & M_HIGHPRI) && !ifq_is_enabled(&sc->sc_if.if_snd)) {
-           ifq = &sc->sc_fastq;
-           if (IF_QFULL(ifq) && dst->sa_family != AF_UNSPEC) {
-               IF_DROP(ifq);
-               m_freem(m0);
-               error = ENOBUFS;
-           } else {
-               IF_ENQUEUE(ifq, m0);
-               error = 0;
-           }
-       } else {
-           ASSERT_ALTQ_SQ_SERIALIZED_HW(ifsq);
-           error = ifsq_enqueue(ifsq, m0, &pktattr);
-       }
-       if (error) {
-           crit_exit();
-           IFNET_STAT_INC(&sc->sc_if, oqdrops, 1);
-           sc->sc_stats.ppp_oerrors++;
-           return (error);
-       }
-       (*sc->sc_start)(sc);
-    }
-    getmicrotime(&ifp->if_lastchange);
-    IFNET_STAT_INC(ifp, opackets, 1);
-    IFNET_STAT_INC(ifp, obytes, len);
-
-    crit_exit();
-    return (0);
-
-bad:
-    m_freem(m0);
-    return (error);
-}
-
-int
-pppoutput(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst,
-         struct rtentry *rtp)
-{
-       struct ifaltq_subque *ifsq = ifq_get_subq_default(&ifp->if_snd);
-       int error;
-
-       ifsq_serialize_hw(ifsq);
-       error = pppoutput_serialized(ifp, ifsq, m0, dst, rtp);
-       ifsq_deserialize_hw(ifsq);
-
-       return error;
-}
-
-/*
- * After a change in the NPmode for some NP, move packets from the
- * npqueue to the send queue or the fast queue as appropriate.
- * Should be called at spl[soft]net.
- */
-static void
-ppp_requeue(struct ppp_softc *sc)
-{
-    struct mbuf *m, **mpp;
-    struct ifqueue *ifq;
-    struct ifaltq_subque *ifsq;
-    enum NPmode mode;
-    int error;
-
-    ifsq = ifq_get_subq_default(&sc->sc_if.if_snd);
-    for (mpp = &sc->sc_npqueue; (m = *mpp) != NULL; ) {
-       switch (PPP_PROTOCOL(mtod(m, u_char *))) {
-       case PPP_IP:
-           mode = sc->sc_npmode[NP_IP];
-           break;
-       default:
-           mode = NPMODE_PASS;
-       }
-
-       switch (mode) {
-       case NPMODE_PASS:
-           /*
-            * This packet can now go on one of the queues to be sent.
-            */
-           *mpp = m->m_nextpkt;
-           m->m_nextpkt = NULL;
-           if ((m->m_flags & M_HIGHPRI) && !ifq_is_enabled(&sc->sc_if.if_snd)) {
-               ifq = &sc->sc_fastq;
-               if (IF_QFULL(ifq)) {
-                   IF_DROP(ifq);
-                   error = ENOBUFS;
-               } else {
-                   IF_ENQUEUE(ifq, m);
-                   error = 0;
-               }
-           } else {
-               error = ifsq_enqueue(ifsq, m, NULL);
-           }
-           if (error) {
-                   IFNET_STAT_INC(&sc->sc_if, oqdrops, 1);
-                   sc->sc_stats.ppp_oerrors++;
-           }
-           break;
-
-       case NPMODE_DROP:
-       case NPMODE_ERROR:
-           *mpp = m->m_nextpkt;
-           m_freem(m);
-           break;
-
-       case NPMODE_QUEUE:
-           mpp = &m->m_nextpkt;
-           break;
-       }
-    }
-    sc->sc_npqtail = mpp;
-}
-
-/*
- * Transmitter has finished outputting some stuff;
- * remember to call sc->sc_start later at splsoftnet.
- */
-void
-ppp_restart(struct ppp_softc *sc)
-{
-    crit_enter();
-    sc->sc_flags &= ~SC_TBUSY;
-    schednetisr(NETISR_PPP);
-    crit_exit();
-}
-
-
-/*
- * Get a packet to send.  This procedure is intended to be called at
- * splsoftnet, since it may involve time-consuming operations such as
- * applying VJ compression, packet compression, address/control and/or
- * protocol field compression to the packet.
- */
-struct mbuf *
-ppp_dequeue(struct ppp_softc *sc)
-{
-    struct mbuf *m, *mp;
-    u_char *cp;
-    int address, control, protocol;
-
-    /*
-     * Grab a packet to send: first try the fast queue, then the
-     * normal queue.
-     */
-    IF_DEQUEUE(&sc->sc_fastq, m);
-    if (m == NULL)
-       m = ifsq_dequeue(ifq_get_subq_default(&sc->sc_if.if_snd));
-    if (m == NULL)
-       return NULL;
-
-    ++sc->sc_stats.ppp_opackets;
-
-    /*
-     * Extract the ppp header of the new packet.
-     * The ppp header will be in one mbuf.
-     */
-    cp = mtod(m, u_char *);
-    address = PPP_ADDRESS(cp);
-    control = PPP_CONTROL(cp);
-    protocol = PPP_PROTOCOL(cp);
-
-    switch (protocol) {
-    case PPP_IP:
-#ifdef VJC
-       /*
-        * If the packet is a TCP/IP packet, see if we can compress it.
-        */
-       if ((sc->sc_flags & SC_COMP_TCP) && sc->sc_comp != NULL) {
-           struct ip *ip;
-           int type;
-
-           mp = m;
-           ip = (struct ip *) (cp + PPP_HDRLEN);
-           if (mp->m_len <= PPP_HDRLEN) {
-               mp = mp->m_next;
-               if (mp == NULL)
-                   break;
-               ip = mtod(mp, struct ip *);
-           }
-           /* this code assumes the IP/TCP header is in one non-shared mbuf */
-           if (ip->ip_p == IPPROTO_TCP) {
-               type = sl_compress_tcp(mp, ip, sc->sc_comp,
-                                      !(sc->sc_flags & SC_NO_TCP_CCID));
-               switch (type) {
-               case TYPE_UNCOMPRESSED_TCP:
-                   protocol = PPP_VJC_UNCOMP;
-                   break;
-               case TYPE_COMPRESSED_TCP:
-                   protocol = PPP_VJC_COMP;
-                   cp = mtod(m, u_char *);
-                   cp[0] = address;    /* header has moved */
-                   cp[1] = control;
-                   cp[2] = 0;
-                   break;
-               }
-               cp[3] = protocol;       /* update protocol in PPP header */
-           }
-       }
-#endif /* VJC */
-       break;
-
-#ifdef PPP_COMPRESS
-    case PPP_CCP:
-       ppp_ccp(sc, m, 0);
-       break;
-#endif /* PPP_COMPRESS */
-    }
-
-#ifdef PPP_COMPRESS
-    if (protocol != PPP_LCP && protocol != PPP_CCP
-       && sc->sc_xc_state && (sc->sc_flags & SC_COMP_RUN)) {
-       struct mbuf *mcomp = NULL;
-       int slen;
-
-       slen = 0;
-       for (mp = m; mp != NULL; mp = mp->m_next)
-           slen += mp->m_len;
-       (*sc->sc_xcomp->compress)
-           (sc->sc_xc_state, &mcomp, m, slen, sc->sc_if.if_mtu + PPP_HDRLEN);
-       if (mcomp != NULL) {
-           if (sc->sc_flags & SC_CCP_UP) {
-               /* Send the compressed packet instead of the original. */
-               m_freem(m);
-               m = mcomp;
-               cp = mtod(m, u_char *);
-               protocol = cp[3];
-           } else {
-               /* Can't transmit compressed packets until CCP is up. */
-               m_freem(mcomp);
-           }
-       }
-    }
-#endif /* PPP_COMPRESS */
-
-    /*
-     * Compress the address/control and protocol, if possible.
-     */
-    if (sc->sc_flags & SC_COMP_AC && address == PPP_ALLSTATIONS &&
-       control == PPP_UI && protocol != PPP_ALLSTATIONS &&
-       protocol != PPP_LCP) {
-       /* can compress address/control */
-       m->m_data += 2;
-       m->m_len -= 2;
-    }
-    if (sc->sc_flags & SC_COMP_PROT && protocol < 0xFF) {
-       /* can compress protocol */
-       if (mtod(m, u_char *) == cp) {
-           cp[2] = cp[1];      /* move address/control up */
-           cp[1] = cp[0];
-       }
-       ++m->m_data;
-       --m->m_len;
-    }
-
-    return m;
-}
-
-#ifdef PPP_COMPRESS
-/*
- * Handle a CCP packet.  `rcvd' is 1 if the packet was received,
- * 0 if it is about to be transmitted.
- */
-static void
-ppp_ccp(struct ppp_softc *sc, struct mbuf *m, int rcvd)
-{
-    u_char *dp, *ep;
-    struct mbuf *mp;
-    int slen;
-
-    /*
-     * Get a pointer to the data after the PPP header.
-     */
-    if (m->m_len <= PPP_HDRLEN) {
-       mp = m->m_next;
-       if (mp == NULL)
-           return;
-       dp = (mp != NULL)? mtod(mp, u_char *): NULL;
-    } else {
-       mp = m;
-       dp = mtod(mp, u_char *) + PPP_HDRLEN;
-    }
-
-    ep = mtod(mp, u_char *) + mp->m_len;
-    if (dp + CCP_HDRLEN > ep)
-       return;
-    slen = CCP_LENGTH(dp);
-    if (dp + slen > ep) {
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("if_ppp/ccp: not enough data in mbuf (%p+%x > %p+%x)\n",
-                  dp, slen, mtod(mp, u_char *), mp->m_len);
-       return;
-    }
-
-    switch (CCP_CODE(dp)) {
-    case CCP_CONFREQ:
-    case CCP_TERMREQ:
-    case CCP_TERMACK:
-       /* CCP must be going down - disable compression */
-       if (sc->sc_flags & SC_CCP_UP) {
-           crit_enter();
-           sc->sc_flags &= ~(SC_CCP_UP | SC_COMP_RUN | SC_DECOMP_RUN);
-           crit_exit();
-       }
-       break;
-
-    case CCP_CONFACK:
-       if (sc->sc_flags & SC_CCP_OPEN && !(sc->sc_flags & SC_CCP_UP)
-           && slen >= CCP_HDRLEN + CCP_OPT_MINLEN
-           && slen >= CCP_OPT_LENGTH(dp + CCP_HDRLEN) + CCP_HDRLEN) {
-           if (!rcvd) {
-               /* we're agreeing to send compressed packets. */
-               if (sc->sc_xc_state != NULL
-                   && (*sc->sc_xcomp->comp_init)
-                       (sc->sc_xc_state, dp + CCP_HDRLEN, slen - CCP_HDRLEN,
-                        sc->sc_if.if_dunit, 0, sc->sc_flags & SC_DEBUG)) {
-                   crit_enter();
-                   sc->sc_flags |= SC_COMP_RUN;
-                   crit_exit();
-               }
-           } else {
-               /* peer is agreeing to send compressed packets. */
-               if (sc->sc_rc_state != NULL
-                   && (*sc->sc_rcomp->decomp_init)
-                       (sc->sc_rc_state, dp + CCP_HDRLEN, slen - CCP_HDRLEN,
-                        sc->sc_if.if_dunit, 0, sc->sc_mru,
-                        sc->sc_flags & SC_DEBUG)) {
-                   crit_enter();
-                   sc->sc_flags |= SC_DECOMP_RUN;
-                   sc->sc_flags &= ~(SC_DC_ERROR | SC_DC_FERROR);
-                   crit_exit();
-               }
-           }
-       }
-       break;
-
-    case CCP_RESETACK:
-       if (sc->sc_flags & SC_CCP_UP) {
-           if (!rcvd) {
-               if (sc->sc_xc_state && (sc->sc_flags & SC_COMP_RUN))
-                   (*sc->sc_xcomp->comp_reset)(sc->sc_xc_state);
-           } else {
-               if (sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN)) {
-                   (*sc->sc_rcomp->decomp_reset)(sc->sc_rc_state);
-                   crit_enter();
-                   sc->sc_flags &= ~SC_DC_ERROR;
-                   crit_exit();
-               }
-           }
-       }
-       break;
-    }
-}
-
-/*
- * CCP is down; free (de)compressor state if necessary.
- */
-static void
-ppp_ccp_closed(struct ppp_softc *sc)
-{
-    if (sc->sc_xc_state) {
-       (*sc->sc_xcomp->comp_free)(sc->sc_xc_state);
-       sc->sc_xc_state = NULL;
-    }
-    if (sc->sc_rc_state) {
-       (*sc->sc_rcomp->decomp_free)(sc->sc_rc_state);
-       sc->sc_rc_state = NULL;
-    }
-}
-#endif /* PPP_COMPRESS */
-
-/*
- * PPP packet input routine.
- * The caller has checked and removed the FCS and has inserted
- * the address/control bytes and the protocol high byte if they
- * were omitted.
- */
-void
-ppppktin(struct ppp_softc *sc, struct mbuf *m, int lost)
-{
-    crit_enter();
-
-    if (lost)
-       m->m_flags |= M_ERRMARK;
-    IF_ENQUEUE(&sc->sc_rawq, m);
-    schednetisr(NETISR_PPP);
-
-    crit_exit();
-}
-
-/*
- * Process a received PPP packet, doing decompression as necessary.
- * Should be called at splsoftnet.
- */
-#define COMPTYPE(proto)        ((proto) == PPP_VJC_COMP? TYPE_COMPRESSED_TCP: \
-                        TYPE_UNCOMPRESSED_TCP)
-
-static void
-ppp_inproc(struct ppp_softc *sc, struct mbuf *m)
-{
-    struct ifnet *ifp = &sc->sc_if;
-    int isr;
-    int ilen = 0, proto, rv;
-    u_char *cp, adrs, ctrl;
-    struct mbuf *mp, *dmp = NULL;
-#ifdef VJC
-    int xlen;
-    u_char *iphdr;
-    u_int hlen;
-#endif
-
-    ASSERT_IFNET_SERIALIZED_ALL(ifp);
-
-    sc->sc_stats.ppp_ipackets++;
-
-    if (sc->sc_flags & SC_LOG_INPKT) {
-       ilen = 0;
-       for (mp = m; mp != NULL; mp = mp->m_next)
-           ilen += mp->m_len;
-       kprintf("%s: got %d bytes\n", ifp->if_xname, ilen);
-       pppdumpm(m);
-    }
-
-    cp = mtod(m, u_char *);
-    adrs = PPP_ADDRESS(cp);
-    ctrl = PPP_CONTROL(cp);
-    proto = PPP_PROTOCOL(cp);
-
-    if (m->m_flags & M_ERRMARK) {
-       m->m_flags &= ~M_ERRMARK;
-       crit_enter();
-       sc->sc_flags |= SC_VJ_RESET;
-       crit_exit();
-    }
-
-#ifdef PPP_COMPRESS
-    /*
-     * Decompress this packet if necessary, update the receiver's
-     * dictionary, or take appropriate action on a CCP packet.
-     */
-    if (proto == PPP_COMP && sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN)
-       && !(sc->sc_flags & SC_DC_ERROR) && !(sc->sc_flags & SC_DC_FERROR)) {
-       /* decompress this packet */
-       rv = (*sc->sc_rcomp->decompress)(sc->sc_rc_state, m, &dmp);
-       if (rv == DECOMP_OK) {
-           m_freem(m);
-           if (dmp == NULL) {
-               /* no error, but no decompressed packet produced */
-               return;
-           }
-           m = dmp;
-           cp = mtod(m, u_char *);
-           proto = PPP_PROTOCOL(cp);
-
-       } else {
-           /*
-            * An error has occurred in decompression.
-            * Pass the compressed packet up to pppd, which may take
-            * CCP down or issue a Reset-Req.
-            */
-           if (sc->sc_flags & SC_DEBUG)
-               kprintf("%s: decompress failed %d\n", ifp->if_xname, rv);
-           crit_enter();
-           sc->sc_flags |= SC_VJ_RESET;
-           if (rv == DECOMP_ERROR)
-               sc->sc_flags |= SC_DC_ERROR;
-           else
-               sc->sc_flags |= SC_DC_FERROR;
-           crit_exit();
-       }
-
-    } else {
-       if (sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN)) {
-           (*sc->sc_rcomp->incomp)(sc->sc_rc_state, m);
-       }
-       if (proto == PPP_CCP) {
-           ppp_ccp(sc, m, 1);
-       }
-    }
-#endif
-
-    ilen = 0;
-    for (mp = m; mp != NULL; mp = mp->m_next)
-       ilen += mp->m_len;
-
-#ifdef VJC
-    if (sc->sc_flags & SC_VJ_RESET) {
-       /*
-        * If we've missed a packet, we must toss subsequent compressed
-        * packets which don't have an explicit connection ID.
-        */
-       if (sc->sc_comp)
-           sl_uncompress_tcp(NULL, 0, TYPE_ERROR, sc->sc_comp);
-       crit_enter();
-       sc->sc_flags &= ~SC_VJ_RESET;
-       crit_exit();
-    }
-
-    /*
-     * See if we have a VJ-compressed packet to uncompress.
-     */
-    if (proto == PPP_VJC_COMP) {
-       if ((sc->sc_flags & SC_REJ_COMP_TCP) || sc->sc_comp == NULL)
-           goto bad;
-
-       xlen = sl_uncompress_tcp_core(cp + PPP_HDRLEN, m->m_len - PPP_HDRLEN,
-                                     ilen - PPP_HDRLEN, TYPE_COMPRESSED_TCP,
-                                     sc->sc_comp, &iphdr, &hlen);
-
-       if (xlen <= 0) {
-           if (sc->sc_flags & SC_DEBUG)
-               kprintf("%s: VJ uncompress failed on type comp\n",
-                       ifp->if_xname);
-           goto bad;
-       }
-
-       /* Copy the PPP and IP headers into a new mbuf. */
-       MGETHDR(mp, M_NOWAIT, MT_DATA);
-       if (mp == NULL)
-           goto bad;
-       mp->m_len = 0;
-       mp->m_next = NULL;
-       if (hlen + PPP_HDRLEN > MHLEN) {
-           MCLGET(mp, M_NOWAIT);
-           if (M_TRAILINGSPACE(mp) < hlen + PPP_HDRLEN) {
-               m_freem(mp);
-               goto bad;       /* lose if big headers and no clusters */
-           }
-       }
-       cp = mtod(mp, u_char *);
-       cp[0] = adrs;
-       cp[1] = ctrl;
-       cp[2] = 0;
-       cp[3] = PPP_IP;
-       proto = PPP_IP;
-       bcopy(iphdr, cp + PPP_HDRLEN, hlen);
-       mp->m_len = hlen + PPP_HDRLEN;
-
-       /*
-        * Trim the PPP and VJ headers off the old mbuf
-        * and stick the new and old mbufs together.
-        */
-       m->m_data += PPP_HDRLEN + xlen;
-       m->m_len -= PPP_HDRLEN + xlen;
-       if (m->m_len <= M_TRAILINGSPACE(mp)) {
-           bcopy(mtod(m, u_char *), mtod(mp, u_char *) + mp->m_len, m->m_len);
-           mp->m_len += m->m_len;
-           mp->m_next = m_free(m);
-       } else {
-           mp->m_next = m;
-       }
-       m = mp;
-       ilen += hlen - xlen;
-
-    } else if (proto == PPP_VJC_UNCOMP) {
-       if ((sc->sc_flags & SC_REJ_COMP_TCP) || sc->sc_comp == NULL)
-           goto bad;
-
-       xlen = sl_uncompress_tcp_core(cp + PPP_HDRLEN, m->m_len - PPP_HDRLEN,
-                                     ilen - PPP_HDRLEN, TYPE_UNCOMPRESSED_TCP,
-                                     sc->sc_comp, &iphdr, &hlen);
-
-       if (xlen < 0) {
-           if (sc->sc_flags & SC_DEBUG)
-               kprintf("%s: VJ uncompress failed on type uncomp\n",
-                       ifp->if_xname);
-           goto bad;
-       }
-
-       proto = PPP_IP;
-       cp[3] = PPP_IP;
-    }
-#endif /* VJC */
-
-    /*
-     * If the packet will fit in a header mbuf, don't waste a
-     * whole cluster on it.
-     */
-    if (ilen <= MHLEN && M_IS_CLUSTER(m)) {
-       MGETHDR(mp, M_NOWAIT, MT_DATA);
-       if (mp != NULL) {
-           m_copydata(m, 0, ilen, mtod(mp, caddr_t));
-           m_freem(m);
-           m = mp;
-           m->m_len = ilen;
-       }
-    }
-    m->m_pkthdr.len = ilen;
-    m->m_pkthdr.rcvif = ifp;
-
-    if ((proto & 0x8000) == 0) {
-#ifdef PPP_FILTER
-       /*
-        * See whether we want to pass this packet, and
-        * if it counts as link activity.
-        */
-       adrs = *mtod(m, u_char *);      /* save address field */
-       *mtod(m, u_char *) = 0;         /* indicate inbound */
-       if (sc->sc_pass_filt.bf_insns != NULL
-           && bpf_filter(sc->sc_pass_filt.bf_insns, (u_char *) m,
-                         ilen, 0) == 0) {
-           /* drop this packet */
-           m_freem(m);
-           return;
-       }
-       if (sc->sc_active_filt.bf_insns == NULL
-           || bpf_filter(sc->sc_active_filt.bf_insns, (u_char *) m, ilen, 0))
-           sc->sc_last_recv = time_uptime;
-
-       *mtod(m, u_char *) = adrs;
-#else
-       /*
-        * Record the time that we received this packet.
-        */
-       sc->sc_last_recv = time_uptime;
-#endif /* PPP_FILTER */
-    }
-
-    BPF_MTAP(&sc->sc_if, m);
-
-    isr = -1;
-    switch (proto) {
-#ifdef INET
-    case PPP_IP:
-       /*
-        * IP packet - take off the ppp header and pass it up to IP.
-        */
-       if ((ifp->if_flags & IFF_UP) == 0
-           || sc->sc_npmode[NP_IP] != NPMODE_PASS) {
-           /* interface is down - drop the packet. */
-           m_freem(m);
-           return;
-       }
-       m->m_pkthdr.len -= PPP_HDRLEN;
-       m->m_data += PPP_HDRLEN;
-       m->m_len -= PPP_HDRLEN;
-#ifdef notyet
-       if (ipflow_fastforward(m))
-           return;
-#endif
-       isr = NETISR_IP;
-       break;
-#endif
-
-    default:
-       /*
-        * Some other protocol - place on input queue for read().
-        */
-       break;
-    }
-
-    /*
-     * If we found a netproto just pass it to the proto.  Otherwise queue
-     * the packet to the tty (e.g. pppd).  Note that sc_ctlp() must be
-     * called EXACTLY once per packet queued.
-     */
-    if (isr == -1) {
-       struct ifqueue *inq = &sc->sc_inq;
-
-       if (IF_QFULL(inq)) {
-           IF_DROP(inq);
-           rv = 0;
-       } else {
-           IF_ENQUEUE(inq, m);
-           sc->sc_ctlp(sc);
-           rv = 1;
-       }
-    } else {
-       rv = (netisr_queue(isr, m) == 0);
-       m = NULL;
-    }
-    if (!rv) {
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: input queue full\n", ifp->if_xname);
-       IFNET_STAT_INC(ifp, iqdrops, 1);
-       goto bad;
-    }
-
-    IFNET_STAT_INC(ifp, ipackets, 1);
-    IFNET_STAT_INC(ifp, ibytes, ilen);
-    getmicrotime(&ifp->if_lastchange);
-
-    return;
-
- bad:
-    if (m != NULL)
-       m_freem(m);
-    IFNET_STAT_INC(&sc->sc_if, ierrors, 1);
-    sc->sc_stats.ppp_ierrors++;
-}
-
-#define MAX_DUMP_BYTES 128
-
-static void
-pppdumpm(struct mbuf *m0)
-{
-    char buf[3*MAX_DUMP_BYTES+4];
-    char *bp = buf;
-    struct mbuf *m;
-
-    for (m = m0; m; m = m->m_next) {
-       int l = m->m_len;
-       u_char *rptr = (u_char *)m->m_data;
-
-       while (l--) {
-           if (bp > buf + sizeof(buf) - 4)
-               goto done;
-           *bp++ = hex2ascii(*rptr >> 4);
-           *bp++ = hex2ascii(*rptr++ & 0xf);
-       }
-
-       if (m->m_next) {
-           if (bp > buf + sizeof(buf) - 3)
-               goto done;
-           *bp++ = '|';
-       } else
-           *bp++ = ' ';
-    }
-done:
-    if (m)
-       *bp++ = '>';
-    *bp = 0;
-    kprintf("%s\n", buf);
-}
-
-/*
- * a wrapper to transmit a packet from if_start since ALTQ uses
- * if_start to send a packet.
- */
-static void
-ppp_ifstart(struct ifnet *ifp, struct ifaltq_subque *ifsq __unused)
-{
-       struct ppp_softc *sc;
-
-       sc = ifp->if_softc;
-       (*sc->sc_start)(sc);
-}
-
-MODULE_VERSION(if_ppp, 1);
diff --git a/sys/net/ppp/if_ppp.h b/sys/net/ppp/if_ppp.h
deleted file mode 100644 (file)
index 6a4e620..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * if_ppp.h - Point-to-Point Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $FreeBSD: src/sys/net/if_ppp.h,v 1.14 1999/08/28 00:48:20 peter Exp $
- * $DragonFly: src/sys/net/ppp/if_ppp.h,v 1.3 2003/08/07 21:17:30 dillon Exp $
- */
-
-#ifndef _IF_PPP_H_
-#define _IF_PPP_H_
-
-/* XXX this used to be self-contained. */
-#include <net/ppp_layer/ppp_defs.h>
-#include <net/if.h>
-#include <sys/ioccom.h>
-
-/*
- * Packet sizes
- */
-#define        PPP_MTU         1500    /* Default MTU (size of Info field) */
-#define PPP_MAXMRU     65000   /* Largest MRU we allow */
-#define PPP_MAXMTU     16384   /* Largest MTU we allow */
-
-/*
- * Bit definitions for flags.
- */
-#define SC_COMP_PROT   0x00000001      /* protocol compression (output) */
-#define SC_COMP_AC     0x00000002      /* header compression (output) */
-#define        SC_COMP_TCP     0x00000004      /* TCP (VJ) compression (output) */
-#define SC_NO_TCP_CCID 0x00000008      /* disable VJ connection-id comp. */
-#define SC_REJ_COMP_AC 0x00000010      /* reject adrs/ctrl comp. on input */
-#define SC_REJ_COMP_TCP        0x00000020      /* reject TCP (VJ) comp. on input */
-#define SC_CCP_OPEN    0x00000040      /* Look at CCP packets */
-#define SC_CCP_UP      0x00000080      /* May send/recv compressed packets */
-#define SC_DEBUG       0x00010000      /* enable debug messages */
-#define SC_LOG_INPKT   0x00020000      /* log contents of good pkts recvd */
-#define SC_LOG_OUTPKT  0x00040000      /* log contents of pkts sent */
-#define SC_LOG_RAWIN   0x00080000      /* log all chars received */
-#define SC_LOG_FLUSH   0x00100000      /* log all chars flushed */
-#define SC_RCV_B7_0    0x01000000      /* have rcvd char with bit 7 = 0 */
-#define SC_RCV_B7_1    0x02000000      /* have rcvd char with bit 7 = 1 */
-#define SC_RCV_EVNP    0x04000000      /* have rcvd char with even parity */
-#define SC_RCV_ODDP    0x08000000      /* have rcvd char with odd parity */
-#define        SC_MASK         0x0fff00ff      /* bits that user can change */
-
-/*
- * State bits in sc_flags, not changeable by user.
- */
-#define SC_TIMEOUT     0x00000400      /* timeout is currently pending */
-#define SC_VJ_RESET    0x00000800      /* need to reset VJ decomp */
-#define SC_COMP_RUN    0x00001000      /* compressor has been initiated */
-#define SC_DECOMP_RUN  0x00002000      /* decompressor has been initiated */
-#define SC_DC_ERROR    0x00004000      /* non-fatal decomp error detected */
-#define SC_DC_FERROR   0x00008000      /* fatal decomp error detected */
-#define SC_TBUSY       0x10000000      /* xmitter doesn't need a packet yet */
-#define SC_PKTLOST     0x20000000      /* have lost or dropped a packet */
-#define        SC_FLUSH        0x40000000      /* flush input until next PPP_FLAG */
-#define        SC_ESCAPED      0x80000000      /* saw a PPP_ESCAPE */
-
-/*
- * Ioctl definitions.
- */
-
-struct npioctl {
-    int                protocol;       /* PPP procotol, e.g. PPP_IP */
-    enum NPmode        mode;
-};
-
-/* Structure describing a CCP configuration option, for PPPIOCSCOMPRESS */
-struct ppp_option_data {
-       u_char  *ptr;
-       u_int   length;
-       int     transmit;
-};
-
-struct ifpppstatsreq {
-    char ifr_name[IFNAMSIZ];
-    struct ppp_stats stats;
-};
-
-struct ifpppcstatsreq {
-    char ifr_name[IFNAMSIZ];
-    struct ppp_comp_stats stats;
-};
-
-/*
- * Ioctl definitions.
- */
-
-#define        PPPIOCGFLAGS    _IOR('t', 90, int)      /* get configuration flags */
-#define        PPPIOCSFLAGS    _IOW('t', 89, int)      /* set configuration flags */
-#define        PPPIOCGASYNCMAP _IOR('t', 88, int)      /* get async map */
-#define        PPPIOCSASYNCMAP _IOW('t', 87, int)      /* set async map */
-#define        PPPIOCGUNIT     _IOR('t', 86, int)      /* get ppp unit number */
-#define        PPPIOCGRASYNCMAP _IOR('t', 85, int)     /* get receive async map */
-#define        PPPIOCSRASYNCMAP _IOW('t', 84, int)     /* set receive async map */
-#define        PPPIOCGMRU      _IOR('t', 83, int)      /* get max receive unit */
-#define        PPPIOCSMRU      _IOW('t', 82, int)      /* set max receive unit */
-#define        PPPIOCSMAXCID   _IOW('t', 81, int)      /* set VJ max slot ID */
-#define PPPIOCGXASYNCMAP _IOR('t', 80, ext_accm) /* get extended ACCM */
-#define PPPIOCSXASYNCMAP _IOW('t', 79, ext_accm) /* set extended ACCM */
-#define PPPIOCXFERUNIT _IO('t', 78)            /* transfer PPP unit */
-#define PPPIOCSCOMPRESS        _IOW('t', 77, struct ppp_option_data)
-#define PPPIOCGNPMODE  _IOWR('t', 76, struct npioctl) /* get NP mode */
-#define PPPIOCSNPMODE  _IOW('t', 75, struct npioctl)  /* set NP mode */
-#define PPPIOCGIDLE    _IOR('t', 74, struct ppp_idle) /* get idle time */
-#define PPPIOCSPASS    _IOW('t', 71, struct bpf_program) /* set pass filter */
-#define PPPIOCSACTIVE  _IOW('t', 70, struct bpf_program) /* set active filt */
-
-/* PPPIOC[GS]MTU are alternatives to SIOC[GS]IFMTU, used under Ultrix */
-#define PPPIOCGMTU     _IOR('t', 73, int)      /* get interface MTU */
-#define PPPIOCSMTU     _IOW('t', 72, int)      /* set interface MTU */
-
-/*
- * These two are interface ioctls so that pppstats can do them on
- * a socket without having to open the serial device.
- */
-#define SIOCGPPPSTATS  _IOWR('i', 123, struct ifpppstatsreq)
-#define SIOCGPPPCSTATS _IOWR('i', 122, struct ifpppcstatsreq)
-
-#if !defined(ifr_mtu)
-#define ifr_mtu        ifr_ifru.ifru_metric
-#endif
-
-#endif /* _IF_PPP_H_ */
diff --git a/sys/net/ppp/if_pppvar.h b/sys/net/ppp/if_pppvar.h
deleted file mode 100644 (file)
index 9b62943..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * if_pppvar.h - private structures and declarations for PPP.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $FreeBSD: src/sys/net/if_pppvar.h,v 1.15 2000/01/29 16:56:23 peter Exp $
- * $DragonFly: src/sys/net/ppp/if_pppvar.h,v 1.6 2006/07/28 02:17:40 dillon Exp $
- */
-
-/*
- * Supported network protocols.  These values are used for
- * indexing sc_npmode.
- */
-#define NP_IP  0               /* Internet Protocol */
-#define NUM_NP 1               /* Number of NPs. */
-
-/*
- * Structure describing each ppp unit.
- */
-struct ppp_softc {
-       struct  ifnet sc_if;            /* network-visible interface */
-/*hi*/ u_int   sc_flags;               /* control/status bits; see if_ppp.h */
-       struct  callout sc_timeout;     /* Used for scheduling timeouts */
-       void    *sc_devp;               /* pointer to device-dep structure */
-       void    (*sc_start) (struct ppp_softc *);       /* start output proc */
-       void    (*sc_ctlp) (struct ppp_softc *); /* rcvd control pkt */
-       void    (*sc_relinq) (struct ppp_softc *); /* relinquish ifunit */
-       void    (*sc_setmtu) (struct ppp_softc *); /* set mtu */
-       short   sc_mru;                 /* max receive unit */
-       struct  thread *sc_xfer;        /* used in transferring unit */
-/*hi*/ struct  ifqueue sc_rawq;        /* received packets */
-/*net*/        struct  ifqueue sc_inq;         /* queue of input packets for daemon */
-/*net*/        struct  ifqueue sc_fastq;       /* interactive output packet q */
-       struct  mbuf *sc_npqueue;       /* output packets not to be sent yet */
-       struct  mbuf **sc_npqtail;      /* ptr to last next ptr in npqueue */
-       struct  pppstat sc_stats;       /* count of bytes/pkts sent/rcvd */
-       enum    NPmode sc_npmode[NUM_NP]; /* what to do with each NP */
-       struct  compressor *sc_xcomp;   /* transmit compressor */
-       void    *sc_xc_state;           /* transmit compressor state */
-       struct  compressor *sc_rcomp;   /* receive decompressor */
-       void    *sc_rc_state;           /* receive decompressor state */
-       time_t  sc_last_sent;           /* time (secs) last NP pkt sent */
-       time_t  sc_last_recv;           /* time (secs) last NP pkt rcvd */
-#ifdef PPP_FILTER
-       struct  bpf_program sc_pass_filt;   /* filter for packets to pass */
-       struct  bpf_program sc_active_filt; /* filter for "non-idle" packets */
-#endif /* PPP_FILTER */
-#ifdef VJC
-       struct  slcompress *sc_comp;    /* vjc control buffer */
-#endif
-
-       /* Device-dependent part for async lines. */
-       ext_accm sc_asyncmap;           /* async control character map */
-       u_long  sc_rasyncmap;           /* receive async control char map */
-       struct  mbuf *sc_outm;          /* mbuf chain currently being output */
-       struct  mbuf *sc_m;             /* pointer to input mbuf chain */
-       struct  mbuf *sc_mc;            /* pointer to current input mbuf */
-       char    *sc_mp;                 /* ptr to next char in input mbuf */
-       short   sc_ilen;                /* length of input packet so far */
-       u_short sc_fcs;                 /* FCS so far (input) */
-       u_short sc_outfcs;              /* FCS so far for output packet */
-       u_char  sc_rawin[16];           /* chars as received */
-       int     sc_rawin_count;         /* # in sc_rawin */
-};
-
-extern struct ppp_softc ppp_softc[];
-
-struct ppp_softc *pppalloc (struct thread *td);
-void   pppdealloc (struct ppp_softc *sc);
-int    pppioctl (struct ppp_softc *sc, u_long cmd, caddr_t data,
-                     int flag, struct ucred *cred);
-int    pppoutput (struct ifnet *ifp, struct mbuf *m0,
-                      struct sockaddr *dst, struct rtentry *rtp);
-void   ppp_restart (struct ppp_softc *sc);
-void   ppppktin (struct ppp_softc *sc, struct mbuf *m, int lost);
-struct mbuf *ppp_dequeue (struct ppp_softc *sc);
diff --git a/sys/net/ppp_layer/Makefile b/sys/net/ppp_layer/Makefile
deleted file mode 100644 (file)
index 6f6358c..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# $FreeBSD: src/sys/modules/if_ppp/Makefile,v 1.21 1999/11/28 18:52:51 bde Exp $
-
-.PATH:  ${.CURDIR}/../ppp ${.CURDIR}/..
-KMOD=   if_ppp
-SRCS=  if_ppp.c ppp_tty.c slcompress.c \
-       use_ppp.h opt_inet.h opt_ppp.h
-
-NPPP?=         4
-PPP_BSDCOMP?=  1       # 0/1
-PPP_DEFLATE?=  1       # 0/1
-PPP_FILTER?=   1       # 0/1 - requires bpf to be configured in kernel
-PPP_INET?=     1       # 0/1 - requires INET to be configured in kernel
-
-.if ${PPP_BSDCOMP} > 0
-SRCS+= bsd_comp.c
-.endif
-.if ${PPP_DEFLATE} > 0
-SRCS+= ppp_deflate.c zlib.c
-.endif
-
-use_ppp.h:
-       echo "#define NPPP ${NPPP}" > ${.TARGET}
-
-opt_inet.h:
-       touch opt_inet.h
-.if ${PPP_INET} > 0
-       echo "#define INET 1" > ${.TARGET}
-.endif
-
-opt_ppp.h:
-       touch ${.TARGET}
-.if ${PPP_BSDCOMP} > 0
-       echo "#define PPP_BSDCOMP ${PPP_BSDCOMP}" > ${.TARGET}
-.endif
-.if ${PPP_DEFLATE} > 0
-       echo "#define PPP_DEFLATE ${PPP_DEFLATE}" >> ${.TARGET}
-.endif
-.if ${PPP_FILTER} > 0
-       echo "#define PPP_FILTER ${PPP_FILTER}" >> ${.TARGET}
-.endif
-
-.include <bsd.kmod.mk>
diff --git a/sys/net/ppp_layer/ppp_comp.h b/sys/net/ppp_layer/ppp_comp.h
deleted file mode 100644 (file)
index 6780303..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * ppp_comp.h - Definitions for doing PPP packet compression.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- *
- * $FreeBSD: src/sys/net/ppp_comp.h,v 1.8 1999/08/28 00:48:25 peter Exp $
- * $DragonFly: src/sys/net/ppp_layer/ppp_comp.h,v 1.3 2003/08/26 20:49:48 rob Exp $
- */
-
-#ifndef _NET_PPP_COMP_H
-#define _NET_PPP_COMP_H
-
-/*
- * The following symbols control whether we include code for
- * various compression methods.
- */
-#ifndef DO_BSD_COMPRESS
-#define DO_BSD_COMPRESS        1       /* by default, include BSD-Compress */
-#endif
-#ifndef DO_DEFLATE
-#define DO_DEFLATE     1       /* by default, include Deflate */
-#endif
-#define DO_PREDICTOR_1 0
-#define DO_PREDICTOR_2 0
-
-/*
- * Structure giving methods for compression/decompression.
- */
-#ifdef PACKETPTR
-struct compressor {
-       int     compress_proto; /* CCP compression protocol number */
-
-       /* Allocate space for a compressor (transmit side) */
-       void    *(*comp_alloc) (u_char *options, int opt_len);
-       /* Free space used by a compressor */
-       void    (*comp_free) (void *state);
-       /* Initialize a compressor */
-       int     (*comp_init) (void *state, u_char *options, int opt_len,
-                                 int unit, int hdrlen, int debug);
-       /* Reset a compressor */
-       void    (*comp_reset) (void *state);
-       /* Compress a packet */
-       int     (*compress) (void *state, PACKETPTR *mret,
-                                PACKETPTR mp, int orig_len, int max_len);
-       /* Return compression statistics */
-       void    (*comp_stat) (void *state, struct compstat *stats);
-
-       /* Allocate space for a decompressor (receive side) */
-       void    *(*decomp_alloc) (u_char *options, int opt_len);
-       /* Free space used by a decompressor */
-       void    (*decomp_free) (void *state);
-       /* Initialize a decompressor */
-       int     (*decomp_init) (void *state, u_char *options, int opt_len,
-                                   int unit, int hdrlen, int mru, int debug);
-       /* Reset a decompressor */
-       void    (*decomp_reset) (void *state);
-       /* Decompress a packet. */
-       int     (*decompress) (void *state, PACKETPTR mp,
-                                  PACKETPTR *dmpp);
-       /* Update state for an incompressible packet received */
-       void    (*incomp) (void *state, PACKETPTR mp);
-       /* Return decompression statistics */
-       void    (*decomp_stat) (void *state, struct compstat *stats);
-};
-#endif /* PACKETPTR */
-
-/*
- * Return values for decompress routine.
- * We need to make these distinctions so that we can disable certain
- * useful functionality, namely sending a CCP reset-request as a result
- * of an error detected after decompression.  This is to avoid infringing
- * a patent held by Motorola.
- * Don't you just lurve software patents.
- */
-#define DECOMP_OK              0       /* everything went OK */
-#define DECOMP_ERROR           1       /* error detected before decomp. */
-#define DECOMP_FATALERROR      2       /* error detected after decomp. */
-
-/*
- * CCP codes.
- */
-#define CCP_CONFREQ    1
-#define CCP_CONFACK    2
-#define CCP_TERMREQ    5
-#define CCP_TERMACK    6
-#define CCP_RESETREQ   14
-#define CCP_RESETACK   15
-
-/*
- * Max # bytes for a CCP option
- */
-#define CCP_MAX_OPTION_LENGTH  32
-
-/*
- * Parts of a CCP packet.
- */
-#define CCP_CODE(dp)           ((dp)[0])
-#define CCP_ID(dp)             ((dp)[1])
-#define CCP_LENGTH(dp)         (((dp)[2] << 8) + (dp)[3])
-#define CCP_HDRLEN             4
-
-#define CCP_OPT_CODE(dp)       ((dp)[0])
-#define CCP_OPT_LENGTH(dp)     ((dp)[1])
-#define CCP_OPT_MINLEN         2
-
-/*
- * Definitions for BSD-Compress.
- */
-#define CI_BSD_COMPRESS                21      /* config. option for BSD-Compress */
-#define CILEN_BSD_COMPRESS     3       /* length of config. option */
-
-/* Macros for handling the 3rd byte of the BSD-Compress config option. */
-#define BSD_NBITS(x)           ((x) & 0x1F)    /* number of bits requested */
-#define BSD_VERSION(x)         ((x) >> 5)      /* version of option format */
-#define BSD_CURRENT_VERSION    1               /* current version number */
-#define BSD_MAKE_OPT(v, n)     (((v) << 5) | (n))
-
-#define BSD_MIN_BITS           9       /* smallest code size supported */
-#define BSD_MAX_BITS           15      /* largest code size supported */
-
-/*
- * Definitions for Deflate.
- */
-#define CI_DEFLATE             26      /* config option for Deflate */
-#define CI_DEFLATE_DRAFT       24      /* value used in original draft RFC */
-#define CILEN_DEFLATE          4       /* length of its config option */
-
-#define DEFLATE_MIN_SIZE       8
-#define DEFLATE_MAX_SIZE       15
-#define DEFLATE_METHOD_VAL     8
-#define DEFLATE_SIZE(x)                (((x) >> 4) + DEFLATE_MIN_SIZE)
-#define DEFLATE_METHOD(x)      ((x) & 0x0F)
-#define DEFLATE_MAKE_OPT(w)    ((((w) - DEFLATE_MIN_SIZE) << 4) \
-                                + DEFLATE_METHOD_VAL)
-#define DEFLATE_CHK_SEQUENCE   0
-
-/*
- * Definitions for other, as yet unsupported, compression methods.
- */
-#define CI_PREDICTOR_1         1       /* config option for Predictor-1 */
-#define CILEN_PREDICTOR_1      2       /* length of its config option */
-#define CI_PREDICTOR_2         2       /* config option for Predictor-2 */
-#define CILEN_PREDICTOR_2      2       /* length of its config option */
-
-#endif /* _NET_PPP_COMP_H */
diff --git a/sys/net/ppp_layer/ppp_deflate.c b/sys/net/ppp_layer/ppp_deflate.c
deleted file mode 100644 (file)
index ab47de6..0000000
+++ /dev/null
@@ -1,654 +0,0 @@
-/* $FreeBSD: src/sys/net/ppp_deflate.c,v 1.12.2.1 2002/04/14 21:41:48 luigi Exp $      */
-
-/*
- * ppp_deflate.c - interface the zlib procedures for Deflate compression
- * and decompression (as used by gzip) to the PPP code.
- * This version is for use with mbufs on BSD-derived systems.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include "ppp_defs.h"
-#include <net/zlib.h>
-
-#define PACKETPTR      struct mbuf *
-#include "ppp_comp.h"
-
-#if DO_DEFLATE
-
-#define DEFLATE_DEBUG  1
-
-/*
- * State for a Deflate (de)compressor.
- */
-struct deflate_state {
-    int                seqno;
-    int                w_size;
-    int                unit;
-    int                hdrlen;
-    int                mru;
-    int                debug;
-    z_stream   strm;
-    struct compstat stats;
-};
-
-#define DEFLATE_OVHD   2               /* Deflate overhead/packet */
-
-static void    *z_alloc (void *, u_int items, u_int size);
-static void    z_free (void *, void *ptr);
-static void    *z_comp_alloc (u_char *options, int opt_len);
-static void    *z_decomp_alloc (u_char *options, int opt_len);
-static void    z_comp_free (void *state);
-static void    z_decomp_free (void *state);
-static int     z_comp_init (void *state, u_char *options, int opt_len,
-                                int unit, int hdrlen, int debug);
-static int     z_decomp_init (void *state, u_char *options, int opt_len,
-                                    int unit, int hdrlen, int mru, int debug);
-static int     z_compress (void *state, struct mbuf **mret,
-                                 struct mbuf *mp, int slen, int maxolen);
-static void    z_incomp (void *state, struct mbuf *dmsg);
-static int     z_decompress (void *state, struct mbuf *cmp,
-                                   struct mbuf **dmpp);
-static void    z_comp_reset (void *state);
-static void    z_decomp_reset (void *state);
-static void    z_comp_stats (void *state, struct compstat *stats);
-
-/*
- * Procedures exported to if_ppp.c.
- */
-struct compressor ppp_deflate = {
-    CI_DEFLATE,                        /* compress_proto */
-    z_comp_alloc,              /* comp_alloc */
-    z_comp_free,               /* comp_free */
-    z_comp_init,               /* comp_init */
-    z_comp_reset,              /* comp_reset */
-    z_compress,                        /* compress */
-    z_comp_stats,              /* comp_stat */
-    z_decomp_alloc,            /* decomp_alloc */
-    z_decomp_free,             /* decomp_free */
-    z_decomp_init,             /* decomp_init */
-    z_decomp_reset,            /* decomp_reset */
-    z_decompress,              /* decompress */
-    z_incomp,                  /* incomp */
-    z_comp_stats,              /* decomp_stat */
-};
-
-struct compressor ppp_deflate_draft = {
-    CI_DEFLATE_DRAFT,          /* compress_proto */
-    z_comp_alloc,              /* comp_alloc */
-    z_comp_free,               /* comp_free */
-    z_comp_init,               /* comp_init */
-    z_comp_reset,              /* comp_reset */
-    z_compress,                        /* compress */
-    z_comp_stats,              /* comp_stat */
-    z_decomp_alloc,            /* decomp_alloc */
-    z_decomp_free,             /* decomp_free */
-    z_decomp_init,             /* decomp_init */
-    z_decomp_reset,            /* decomp_reset */
-    z_decompress,              /* decompress */
-    z_incomp,                  /* incomp */
-    z_comp_stats,              /* decomp_stat */
-};
-
-/*
- * Space allocation and freeing routines for use by zlib routines.
- */
-static void *
-z_alloc(void *notused, u_int items, u_int size)
-{
-    void *ptr;
-
-    ptr = kmalloc(items * size, M_DEVBUF, M_WAITOK);
-    return ptr;
-}
-
-static void
-z_free(void *notused, void *ptr)
-{
-    kfree(ptr, M_DEVBUF);
-}
-
-/*
- * Allocate space for a compressor.
- */
-static void *
-z_comp_alloc(u_char *options, int opt_len)
-{
-    struct deflate_state *state;
-    int w_size;
-
-    if (opt_len != CILEN_DEFLATE
-       || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT)
-       || options[1] != CILEN_DEFLATE
-       || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL
-       || options[3] != DEFLATE_CHK_SEQUENCE)
-       return NULL;
-    w_size = DEFLATE_SIZE(options[2]);
-    if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE)
-       return NULL;
-
-    state = kmalloc(sizeof(struct deflate_state), M_DEVBUF, M_WAITOK);
-
-    state->strm.next_in = NULL;
-    state->strm.zalloc = z_alloc;
-    state->strm.zfree = z_free;
-    if (deflateInit2(&state->strm, Z_DEFAULT_COMPRESSION, DEFLATE_METHOD_VAL,
-                    -w_size, 8, Z_DEFAULT_STRATEGY) != Z_OK) {
-       kfree(state, M_DEVBUF);
-       return NULL;
-    }
-
-    state->w_size = w_size;
-    bzero(&state->stats, sizeof(state->stats));
-    return (void *) state;
-}
-
-static void
-z_comp_free(void *arg)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-
-    deflateEnd(&state->strm);
-    kfree(state, M_DEVBUF);
-}
-
-static int
-z_comp_init(void *arg, u_char *options, int opt_len, int unit, int hdrlen,
-           int debug)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-
-    if (opt_len < CILEN_DEFLATE
-       || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT)
-       || options[1] != CILEN_DEFLATE
-       || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL
-       || DEFLATE_SIZE(options[2]) != state->w_size
-       || options[3] != DEFLATE_CHK_SEQUENCE)
-       return 0;
-
-    state->seqno = 0;
-    state->unit = unit;
-    state->hdrlen = hdrlen;
-    state->debug = debug;
-
-    deflateReset(&state->strm);
-
-    return 1;
-}
-
-static void
-z_comp_reset(void *arg)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-
-    state->seqno = 0;
-    deflateReset(&state->strm);
-}
-
-/*
- * Parameters:
- *     mret:   compressed packet (out)
- *     mp:     uncompressed packet (in)
- */
-static int
-z_compress(void *arg, struct mbuf **mret, struct mbuf *mp, int orig_len,
-          int maxolen)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-    u_char *rptr, *wptr;
-    int proto, olen, wspace, r, flush;
-    struct mbuf *m;
-
-    /*
-     * Check that the protocol is in the range we handle.
-     */
-    rptr = mtod(mp, u_char *);
-    proto = PPP_PROTOCOL(rptr);
-    if (proto > 0x3fff || proto == 0xfd || proto == 0xfb) {
-       *mret = NULL;
-       return orig_len;
-    }
-
-    /* Allocate one mbuf initially. */
-    if (maxolen > orig_len)
-       maxolen = orig_len;
-    MGET(m, M_NOWAIT, MT_DATA);
-    *mret = m;
-    if (m != NULL) {
-       m->m_len = 0;
-       if (maxolen + state->hdrlen > MLEN)
-           MCLGET(m, M_NOWAIT);
-       wspace = M_TRAILINGSPACE(m);
-       if (state->hdrlen + PPP_HDRLEN + 2 < wspace) {
-           m->m_data += state->hdrlen;
-           wspace -= state->hdrlen;
-       }
-       wptr = mtod(m, u_char *);
-
-       /*
-        * Copy over the PPP header and store the 2-byte sequence number.
-        */
-       wptr[0] = PPP_ADDRESS(rptr);
-       wptr[1] = PPP_CONTROL(rptr);
-       wptr[2] = PPP_COMP >> 8;
-       wptr[3] = PPP_COMP;
-       wptr += PPP_HDRLEN;
-       wptr[0] = state->seqno >> 8;
-       wptr[1] = state->seqno;
-       wptr += 2;
-       state->strm.next_out = wptr;
-       state->strm.avail_out = wspace - (PPP_HDRLEN + 2);
-    } else {
-       state->strm.next_out = NULL;
-       state->strm.avail_out = 1000000;
-       wptr = NULL;
-       wspace = 0;
-    }
-    ++state->seqno;
-
-    rptr += (proto > 0xff)? 2: 3;      /* skip 1st proto byte if 0 */
-    state->strm.next_in = rptr;
-    state->strm.avail_in = mtod(mp, u_char *) + mp->m_len - rptr;
-    mp = mp->m_next;
-    flush = (mp == NULL)? Z_PACKET_FLUSH: Z_NO_FLUSH;
-    olen = 0;
-    for (;;) {
-       r = deflate(&state->strm, flush);
-       if (r != Z_OK) {
-           kprintf("z_compress: deflate returned %d (%s)\n",
-                  r, (state->strm.msg? state->strm.msg: ""));
-           break;
-       }
-       if (flush != Z_NO_FLUSH && state->strm.avail_out != 0)
-           break;              /* all done */
-       if (state->strm.avail_in == 0 && mp != NULL) {
-           state->strm.next_in = mtod(mp, u_char *);
-           state->strm.avail_in = mp->m_len;
-           mp = mp->m_next;
-           if (mp == NULL)
-               flush = Z_PACKET_FLUSH;
-       }
-       if (state->strm.avail_out == 0) {
-           if (m != NULL) {
-               m->m_len = wspace;
-               olen += wspace;
-               MGET(m->m_next, M_NOWAIT, MT_DATA);
-               m = m->m_next;
-               if (m != NULL) {
-                   m->m_len = 0;
-                   if (maxolen - olen > MLEN)
-                       MCLGET(m, M_NOWAIT);
-                   state->strm.next_out = mtod(m, u_char *);
-                   state->strm.avail_out = wspace = M_TRAILINGSPACE(m);
-               }
-           }
-           if (m == NULL) {
-               state->strm.next_out = NULL;
-               state->strm.avail_out = 1000000;
-           }
-       }
-    }
-    if (m != NULL)
-       olen += (m->m_len = wspace - state->strm.avail_out);
-
-    /*
-     * See if we managed to reduce the size of the packet.
-     */
-    if (m != NULL && olen < orig_len) {
-       state->stats.comp_bytes += olen;
-       state->stats.comp_packets++;
-    } else {
-       if (*mret != NULL) {
-           m_freem(*mret);
-           *mret = NULL;
-       }
-       state->stats.inc_bytes += orig_len;
-       state->stats.inc_packets++;
-       olen = orig_len;
-    }
-    state->stats.unc_bytes += orig_len;
-    state->stats.unc_packets++;
-
-    return olen;
-}
-
-static void
-z_comp_stats(void *arg, struct compstat *stats)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-    u_int out;
-
-    *stats = state->stats;
-    stats->ratio = stats->unc_bytes;
-    out = stats->comp_bytes + stats->inc_bytes;
-    if (stats->ratio <= 0x7ffffff)
-       stats->ratio <<= 8;
-    else
-       out >>= 8;
-    if (out != 0)
-       stats->ratio /= out;
-}
-
-/*
- * Allocate space for a decompressor.
- */
-static void *
-z_decomp_alloc(u_char *options, int opt_len)
-{
-    struct deflate_state *state;
-    int w_size;
-
-    if (opt_len != CILEN_DEFLATE
-       || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT)
-       || options[1] != CILEN_DEFLATE
-       || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL
-       || options[3] != DEFLATE_CHK_SEQUENCE)
-       return NULL;
-    w_size = DEFLATE_SIZE(options[2]);
-    if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE)
-       return NULL;
-
-    state = kmalloc(sizeof(struct deflate_state), M_DEVBUF, M_WAITOK);
-
-    state->strm.next_out = NULL;
-    state->strm.zalloc = z_alloc;
-    state->strm.zfree = z_free;
-    if (inflateInit2(&state->strm, -w_size) != Z_OK) {
-       kfree(state, M_DEVBUF);
-       return NULL;
-    }
-
-    state->w_size = w_size;
-    bzero(&state->stats, sizeof(state->stats));
-    return (void *) state;
-}
-
-static void
-z_decomp_free(void *arg)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-
-    inflateEnd(&state->strm);
-    kfree(state, M_DEVBUF);
-}
-
-static int
-z_decomp_init(void *arg, u_char *options, int opt_len, int unit, int hdrlen,
-             int mru, int debug)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-
-    if (opt_len < CILEN_DEFLATE
-       || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT)
-       || options[1] != CILEN_DEFLATE
-       || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL
-       || DEFLATE_SIZE(options[2]) != state->w_size
-       || options[3] != DEFLATE_CHK_SEQUENCE)
-       return 0;
-
-    state->seqno = 0;
-    state->unit = unit;
-    state->hdrlen = hdrlen;
-    state->debug = debug;
-    state->mru = mru;
-
-    inflateReset(&state->strm);
-
-    return 1;
-}
-
-static void
-z_decomp_reset(void *arg)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-
-    state->seqno = 0;
-    inflateReset(&state->strm);
-}
-
-/*
- * Decompress a Deflate-compressed packet.
- *
- * Because of patent problems, we return DECOMP_ERROR for errors
- * found by inspecting the input data and for system problems, but
- * DECOMP_FATALERROR for any errors which could possibly be said to
- * be being detected "after" decompression.  For DECOMP_ERROR,
- * we can issue a CCP reset-request; for DECOMP_FATALERROR, we may be
- * infringing a patent of Motorola's if we do, so we take CCP down
- * instead.
- *
- * Given that the frame has the correct sequence number and a good FCS,
- * errors such as invalid codes in the input most likely indicate a
- * bug, so we return DECOMP_FATALERROR for them in order to turn off
- * compression, even though they are detected by inspecting the input.
- */
-static int
-z_decompress(void *arg, struct mbuf *mi, struct mbuf **mop)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-    struct mbuf *mo, *mo_head;
-    u_char *rptr, *wptr;
-    int rlen, olen, ospace;
-    int seq, i, flush, r, decode_proto;
-    u_char hdr[PPP_HDRLEN + DEFLATE_OVHD];
-
-    *mop = NULL;
-    rptr = mtod(mi, u_char *);
-    rlen = mi->m_len;
-    for (i = 0; i < PPP_HDRLEN + DEFLATE_OVHD; ++i) {
-       while (rlen <= 0) {
-           mi = mi->m_next;
-           if (mi == NULL)
-               return DECOMP_ERROR;
-           rptr = mtod(mi, u_char *);
-           rlen = mi->m_len;
-       }
-       hdr[i] = *rptr++;
-       --rlen;
-    }
-
-    /* Check the sequence number. */
-    seq = (hdr[PPP_HDRLEN] << 8) + hdr[PPP_HDRLEN+1];
-    if (seq != state->seqno) {
-       if (state->debug)
-           kprintf("z_decompress%d: bad seq # %d, expected %d\n",
-                  state->unit, seq, state->seqno);
-       return DECOMP_ERROR;
-    }
-    ++state->seqno;
-
-    /* Allocate an output mbuf. */
-    MGETHDR(mo, M_NOWAIT, MT_DATA);
-    if (mo == NULL)
-       return DECOMP_ERROR;
-    mo_head = mo;
-    mo->m_len = 0;
-    mo->m_next = NULL;
-    MCLGET(mo, M_NOWAIT);
-    ospace = M_TRAILINGSPACE(mo);
-    if (state->hdrlen + PPP_HDRLEN < ospace) {
-       mo->m_data += state->hdrlen;
-       ospace -= state->hdrlen;
-    }
-
-    /*
-     * Fill in the first part of the PPP header.  The protocol field
-     * comes from the decompressed data.
-     */
-    wptr = mtod(mo, u_char *);
-    wptr[0] = PPP_ADDRESS(hdr);
-    wptr[1] = PPP_CONTROL(hdr);
-    wptr[2] = 0;
-
-    /*
-     * Set up to call inflate.  We set avail_out to 1 initially so we can
-     * look at the first byte of the output and decide whether we have
-     * a 1-byte or 2-byte protocol field.
-     */
-    state->strm.next_in = rptr;
-    state->strm.avail_in = rlen;
-    mi = mi->m_next;
-    flush = (mi == NULL)? Z_PACKET_FLUSH: Z_NO_FLUSH;
-    rlen += PPP_HDRLEN + DEFLATE_OVHD;
-    state->strm.next_out = wptr + 3;
-    state->strm.avail_out = 1;
-    decode_proto = 1;
-    olen = PPP_HDRLEN;
-
-    /*
-     * Call inflate, supplying more input or output as needed.
-     */
-    for (;;) {
-       r = inflate(&state->strm, flush);
-       if (r != Z_OK) {
-#if !DEFLATE_DEBUG
-           if (state->debug)
-#endif
-               kprintf("z_decompress%d: inflate returned %d (%s)\n",
-                      state->unit, r, (state->strm.msg? state->strm.msg: ""));
-           m_freem(mo_head);
-           return DECOMP_FATALERROR;
-       }
-       if (flush != Z_NO_FLUSH && state->strm.avail_out != 0)
-           break;              /* all done */
-       if (state->strm.avail_in == 0 && mi != NULL) {
-           state->strm.next_in = mtod(mi, u_char *);
-           state->strm.avail_in = mi->m_len;
-           rlen += mi->m_len;
-           mi = mi->m_next;
-           if (mi == NULL)
-               flush = Z_PACKET_FLUSH;
-       }
-       if (state->strm.avail_out == 0) {
-           if (decode_proto) {
-               state->strm.avail_out = ospace - PPP_HDRLEN;
-               if ((wptr[3] & 1) == 0) {
-                   /* 2-byte protocol field */
-                   wptr[2] = wptr[3];
-                   --state->strm.next_out;
-                   ++state->strm.avail_out;
-                   --olen;
-               }
-               decode_proto = 0;
-           } else {
-               mo->m_len = ospace;
-               olen += ospace;
-               MGET(mo->m_next, M_NOWAIT, MT_DATA);
-               mo = mo->m_next;
-               if (mo == NULL) {
-                   m_freem(mo_head);
-                   return DECOMP_ERROR;
-               }
-               MCLGET(mo, M_NOWAIT);
-               state->strm.next_out = mtod(mo, u_char *);
-               state->strm.avail_out = ospace = M_TRAILINGSPACE(mo);
-           }
-       }
-    }
-    if (decode_proto) {
-       m_freem(mo_head);
-       return DECOMP_ERROR;
-    }
-    olen += (mo->m_len = ospace - state->strm.avail_out);
-#if DEFLATE_DEBUG
-    if (state->debug && olen > state->mru + PPP_HDRLEN)
-       kprintf("ppp_deflate%d: exceeded mru (%d > %d)\n",
-              state->unit, olen, state->mru + PPP_HDRLEN);
-#endif
-
-    state->stats.unc_bytes += olen;
-    state->stats.unc_packets++;
-    state->stats.comp_bytes += rlen;
-    state->stats.comp_packets++;
-
-    *mop = mo_head;
-    return DECOMP_OK;
-}
-
-/*
- * Incompressible data has arrived - add it to the history.
- */
-static void
-z_incomp(void *arg, struct mbuf *mi)
-{
-    struct deflate_state *state = (struct deflate_state *) arg;
-    u_char *rptr;
-    int rlen, proto, r;
-
-    /*
-     * Check that the protocol is one we handle.
-     */
-    rptr = mtod(mi, u_char *);
-    proto = PPP_PROTOCOL(rptr);
-    if (proto > 0x3fff || proto == 0xfd || proto == 0xfb)
-       return;
-
-    ++state->seqno;
-
-    /*
-     * Iterate through the mbufs, adding the characters in them
-     * to the decompressor's history.  For the first mbuf, we start
-     * at the either the 1st or 2nd byte of the protocol field,
-     * depending on whether the protocol value is compressible.
-     */
-    rlen = mi->m_len;
-    state->strm.next_in = rptr + 3;
-    state->strm.avail_in = rlen - 3;
-    if (proto > 0xff) {
-       --state->strm.next_in;
-       ++state->strm.avail_in;
-    }
-    for (;;) {
-       r = inflateIncomp(&state->strm);
-       if (r != Z_OK) {
-           /* gak! */
-#if !DEFLATE_DEBUG
-           if (state->debug)
-#endif
-               kprintf("z_incomp%d: inflateIncomp returned %d (%s)\n",
-                      state->unit, r, (state->strm.msg? state->strm.msg: ""));
-           return;
-       }
-       mi = mi->m_next;
-       if (mi == NULL)
-           break;
-       state->strm.next_in = mtod(mi, u_char *);
-       state->strm.avail_in = mi->m_len;
-       rlen += mi->m_len;
-    }
-
-    /*
-     * Update stats.
-     */
-    state->stats.inc_bytes += rlen;
-    state->stats.inc_packets++;
-    state->stats.unc_bytes += rlen;
-    state->stats.unc_packets++;
-}
-
-#endif /* DO_DEFLATE */
diff --git a/sys/net/ppp_layer/ppp_tty.c b/sys/net/ppp_layer/ppp_tty.c
deleted file mode 100644 (file)
index 9ae1855..0000000
+++ /dev/null
@@ -1,1144 +0,0 @@
-/*
- * (MPSAFE)
- *
- * ppp_tty.c - Point-to-Point Protocol (PPP) driver for asynchronous
- *            tty devices.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Drew D. Perkins
- * Carnegie Mellon University
- * 4910 Forbes Ave.
- * Pittsburgh, PA 15213
- * (412) 268-8576
- * ddp@andrew.cmu.edu
- *
- * Based on:
- *     @(#)if_sl.c     7.6.1.2 (Berkeley) 2/15/89
- *
- * Copyright (c) 1987 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Serial Line interface
- *
- * Rick Adams
- * Center for Seismic Studies
- * 1300 N 17th Street, Suite 1450
- * Arlington, Virginia 22209
- * (703)276-7900
- * rick@seismo.ARPA
- * seismo!rick
- *
- * Pounded on heavily by Chris Torek (chris@mimsy.umd.edu, umcp-cs!chris).
- * Converted to 4.3BSD Beta by Chris Torek.
- * Other changes made at Berkeley, based in part on code by Kirk Smith.
- *
- * Converted to 4.3BSD+ 386BSD by Brad Parker (brad@cayman.com)
- * Added VJ tcp header compression; more unified ioctls
- *
- * Extensively modified by Paul Mackerras (paulus@cs.anu.edu.au).
- * Cleaned up a lot of the mbuf-related code to fix bugs that
- * caused system crashes and packet corruption.  Changed pppstart
- * so that it doesn't just give up with a "collision" if the whole
- * packet doesn't fit in the output ring buffer.
- *
- * Added priority queueing for interactive IP packets, following
- * the model of if_sl.c, plus hooks for bpf.
- * Paul Mackerras (paulus@cs.anu.edu.au).
- */
-
-/* $FreeBSD: src/sys/net/ppp_tty.c,v 1.43.2.1 2002/02/13 00:43:11 dillon Exp $ */
-
-#include "opt_ppp.h"           /* XXX for ppp_defs.h */
-
-#define VJC                    /* XXX for ppp_defs.h */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/proc.h>
-#include <sys/priv.h>
-#include <sys/mbuf.h>
-#include <sys/dkstat.h>
-#include <sys/socket.h>
-#include <sys/fcntl.h>
-#include <sys/thread2.h>
-#include <sys/tty.h>
-#include <sys/conf.h>
-#include <sys/uio.h>
-#include <sys/vnode.h>
-
-#include <net/if.h>
-#include <net/ifq_var.h>
-
-#ifdef PPP_FILTER
-#include <net/bpf.h>
-#endif
-#include <net/ppp/if_ppp.h>
-#include <net/ppp/if_pppvar.h>
-
-static int     pppopen (cdev_t dev, struct tty *tp);
-static int     pppclose (struct tty *tp, int flag);
-static int     pppread (struct tty *tp, struct uio *uio, int flag);
-static int     pppwrite (struct tty *tp, struct uio *uio, int flag);
-static int     ppptioctl (struct tty *tp, u_long cmd, caddr_t data,
-                       int flag, struct ucred *);
-static int     pppinput (int c, struct tty *tp);
-static int     pppstart (struct tty *tp);
-
-static u_short pppfcs (u_short fcs, u_char *cp, int len);
-static void    pppasyncstart (struct ppp_softc *);
-static void    pppasyncctlp (struct ppp_softc *);
-static void    pppasyncrelinq (struct ppp_softc *);
-static void    pppasyncsetmtu (struct ppp_softc *);
-static void    ppp_timeout (void *);
-static void    pppgetm (struct ppp_softc *sc);
-static void    ppplogchar (struct ppp_softc *, int);
-
-/* XXX called from if_ppp.c - layering violation */
-void           pppasyncattach (void *);
-
-/*
- * Some useful mbuf macros not in mbuf.h.
- */
-#define M_IS_CLUSTER(m)        ((m)->m_flags & M_EXT)
-
-#define M_DATASTART(m) \
-       (M_IS_CLUSTER(m) ? (m)->m_ext.ext_buf : \
-           (m)->m_flags & M_PKTHDR ? (m)->m_pktdat : (m)->m_dat)
-
-#define M_DATASIZE(m)  \
-       (M_IS_CLUSTER(m) ? (m)->m_ext.ext_size : \
-           (m)->m_flags & M_PKTHDR ? MHLEN: MLEN)
-
-/*
- * Does c need to be escaped?
- */
-#define ESCAPE_P(c)    (sc->sc_asyncmap[(c) >> 5] & (1 << ((c) & 0x1F)))
-
-/*
- * Procedures for using an async tty interface for PPP.
- */
-
-/* This is a FreeBSD-2.X kernel. */
-#define CCOUNT(q)      ((q)->c_cc)
-#define PPP_LOWAT      100     /* Process more output when < LOWAT on queue */
-#define        PPP_HIWAT       400     /* Don't start a new packet if HIWAT on que */
-
-/*
- * Define the PPP line discipline.
- */
-
-static struct linesw pppdisc = {
-       pppopen,        pppclose,       pppread,        pppwrite,
-       ppptioctl,      pppinput,       pppstart,       ttymodem,
-       PPP_FLAG
-};
-
-void
-pppasyncattach(void *dummy)
-{
-    /* register line discipline */
-    linesw[PPPDISC] = pppdisc;
-}
-
-/*
- * Line specific open routine for async tty devices.
- * Attach the given tty to the first available ppp unit.
- * Called from device open routine or ttioctl() at >= splsofttty()
- */
-/* ARGSUSED */
-static int
-pppopen(cdev_t dev, struct tty *tp)
-{
-    struct thread *td = curthread;     /* XXX */
-    struct ppp_softc *sc;
-    int error;
-
-    if ((error = priv_check(td, PRIV_ROOT)) != 0)
-       return (error);
-
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-
-    if (tp->t_line == PPPDISC) {
-       sc = (struct ppp_softc *) tp->t_slsc;
-       if (sc != NULL && sc->sc_devp == (void *) tp) {
-           lwkt_reltoken(&tty_token);
-           crit_exit();
-           return (0);
-       }
-    }
-
-    if ((sc = pppalloc(td)) == NULL) {
-        lwkt_reltoken(&tty_token);
-       crit_exit();
-       return ENXIO;
-    }
-
-    if (sc->sc_relinq)
-       (*sc->sc_relinq)(sc);   /* get previous owner to relinquish the unit */
-
-    sc->sc_ilen = 0;
-    sc->sc_m = NULL;
-    bzero(sc->sc_asyncmap, sizeof(sc->sc_asyncmap));
-    sc->sc_asyncmap[0] = 0xffffffff;
-    sc->sc_asyncmap[3] = 0x60000000;
-    sc->sc_rasyncmap = 0;
-    sc->sc_devp = (void *) tp;
-    sc->sc_start = pppasyncstart;
-    sc->sc_ctlp = pppasyncctlp;
-    sc->sc_relinq = pppasyncrelinq;
-    sc->sc_setmtu = pppasyncsetmtu;
-    sc->sc_outm = NULL;
-    pppgetm(sc);
-    sc->sc_if.if_flags |= IFF_RUNNING;
-    getmicrotime(&sc->sc_if.if_lastchange);
-    sc->sc_if.if_baudrate = tp->t_ospeed;
-
-    tp->t_slsc = (caddr_t) sc;
-    ttyflush(tp, FREAD | FWRITE);
-
-    /*
-     * Pre-allocate cblocks to the "just right" amount.  The 1 byte t_canq
-     * allocation helps avoid the need for select and/or FIONREAD.
-     * We also pass 1 byte tokens through t_canq...
-     */
-    clist_alloc_cblocks(&tp->t_canq, 1, 1);
-    clist_alloc_cblocks(&tp->t_outq, sc->sc_if.if_mtu + PPP_HIWAT,
-                       sc->sc_if.if_mtu + PPP_HIWAT);
-    clist_alloc_cblocks(&tp->t_rawq, 0, 0);
-
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-
-    return (0);
-}
-
-/*
- * Line specific close routine, called from device close routine
- * and from ttioctl at >= splsofttty().
- * Detach the tty from the ppp unit.
- * Mimics part of ttyclose().
- */
-static int
-pppclose(struct tty *tp, int flag)
-{
-    struct ppp_softc *sc;
-
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-    ttyflush(tp, FREAD | FWRITE);
-    clist_free_cblocks(&tp->t_canq);
-    clist_free_cblocks(&tp->t_outq);
-    tp->t_line = 0;
-    sc = (struct ppp_softc *) tp->t_slsc;
-    if (sc != NULL) {
-       tp->t_slsc = NULL;
-       if (tp == (struct tty *) sc->sc_devp) {
-           pppasyncrelinq(sc);
-           pppdealloc(sc);
-       }
-    }
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-    return 0;
-}
-
-/*
- * Relinquish the interface unit to another device.
- */
-static void
-pppasyncrelinq(struct ppp_softc *sc)
-{
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-
-    if (sc->sc_outm) {
-       m_freem(sc->sc_outm);
-       sc->sc_outm = NULL;
-    }
-    if (sc->sc_m) {
-       m_freem(sc->sc_m);
-       sc->sc_m = NULL;
-    }
-    if (sc->sc_flags & SC_TIMEOUT) {
-       callout_stop(&sc->sc_timeout);
-       sc->sc_flags &= ~SC_TIMEOUT;
-    }
-
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-}
-
-/*
- * This gets called from the upper layer to notify a mtu change
- */
-static void
-pppasyncsetmtu(struct ppp_softc *sc)
-{
-    struct tty *tp = (struct tty *) sc->sc_devp;
-
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-    if (tp != NULL)
-       clist_alloc_cblocks(&tp->t_outq, sc->sc_if.if_mtu + PPP_HIWAT,
-                            sc->sc_if.if_mtu + PPP_HIWAT);
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-}
-
-/*
- * Line specific (tty) read routine.
- * called at zero spl from the device driver in the response to user-level
- * reads on the tty file descriptor (ie: pppd).
- */
-static int
-pppread(struct tty *tp, struct uio *uio, int flag)
-{
-    struct ppp_softc *sc = (struct ppp_softc *)tp->t_slsc;
-    struct mbuf *m, *m0;
-    int error = 0;
-
-    if (sc == NULL)
-       return 0;
-    /*
-     * Loop waiting for input, checking that nothing disasterous
-     * happens in the meantime.
-     */
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-    for (;;) {
-       if (tp != (struct tty *) sc->sc_devp || tp->t_line != PPPDISC) {
-           lwkt_reltoken(&tty_token);
-           crit_exit();
-           return 0;
-       }
-       if (sc->sc_inq.ifq_head != NULL)
-           break;
-       if ((tp->t_state & TS_CONNECTED) == 0) {
-           lwkt_reltoken(&tty_token);
-           crit_exit();
-           return 0;           /* end of file */
-       }
-       if (tp->t_state & TS_ASYNC || flag & IO_NDELAY) {
-           lwkt_reltoken(&tty_token);
-           crit_exit();
-           return (EWOULDBLOCK);
-       }
-       error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), PCATCH, "pppin", 0);
-       if (error) {
-           lwkt_reltoken(&tty_token);
-           crit_exit();
-           return error;
-       }
-    }
-
-    /* Pull place-holder byte out of canonical queue */
-    clist_getc(&tp->t_canq);
-
-    /* Get the packet from the input queue */
-    IF_DEQUEUE(&sc->sc_inq, m0);
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-
-    for (m = m0; m && uio->uio_resid; m = m->m_next)
-       if ((error = uiomove(mtod(m, u_char *), m->m_len, uio)) != 0)
-           break;
-    m_freem(m0);
-    return (error);
-}
-
-/*
- * Line specific (tty) write routine.
- * called at zero spl from the device driver in the response to user-level
- * writes on the tty file descriptor (ie: pppd).
- */
-static int
-pppwrite(struct tty *tp, struct uio *uio, int flag)
-{
-    struct ppp_softc *sc = (struct ppp_softc *)tp->t_slsc;
-    struct mbuf *m, *m0, **mp;
-    struct sockaddr dst;
-    int len, error;
-
-    lwkt_gettoken(&tty_token);
-    if ((tp->t_state & TS_CONNECTED) == 0) {
-       lwkt_reltoken(&tty_token);
-       return 0;               /* wrote 0 bytes */
-    }
-    if (tp->t_line != PPPDISC) {
-        lwkt_reltoken(&tty_token);
-       return (EINVAL);
-    }
-    if (sc == NULL || tp != (struct tty *) sc->sc_devp) {
-        lwkt_reltoken(&tty_token);
-       return EIO;
-    }
-    if (uio->uio_resid > sc->sc_if.if_mtu + PPP_HDRLEN ||
-       uio->uio_resid < PPP_HDRLEN) {
-       lwkt_reltoken(&tty_token);
-       return (EMSGSIZE);
-    }
-
-    crit_enter();
-    for (mp = &m0; uio->uio_resid; mp = &m->m_next) {
-       if (mp == &m0) {
-               MGETHDR(m, M_WAITOK, MT_DATA);
-               m->m_pkthdr.len = uio->uio_resid - PPP_HDRLEN;
-               m->m_pkthdr.rcvif = NULL;
-       } else {
-               MGET(m, M_WAITOK, MT_DATA);
-       }
-       if ((*mp = m) == NULL) {
-           m_freem(m0);
-           crit_exit();
-           lwkt_reltoken(&tty_token);
-           return (ENOBUFS);
-       }
-       m->m_len = 0;
-       if (uio->uio_resid >= MCLBYTES / 2)
-           MCLGET(m, M_NOWAIT);
-       len = M_TRAILINGSPACE(m);
-       if (len > uio->uio_resid)
-           len = uio->uio_resid;
-       if ((error = uiomove(mtod(m, u_char *), len, uio)) != 0) {
-           m_freem(m0);
-           crit_exit();
-           lwkt_reltoken(&tty_token);
-           return (error);
-       }
-       m->m_len = len;
-    }
-    dst.sa_family = AF_UNSPEC;
-    bcopy(mtod(m0, u_char *), dst.sa_data, PPP_HDRLEN);
-    m0->m_data += PPP_HDRLEN;
-    m0->m_len -= PPP_HDRLEN;
-
-    /* call the upper layer to "transmit" it... */
-    error = pppoutput(&sc->sc_if, m0, &dst, NULL);
-    crit_exit();
-    lwkt_reltoken(&tty_token);
-    return (error);
-}
-
-/*
- * Line specific (tty) ioctl routine.
- * This discipline requires that tty device drivers call
- * the line specific l_ioctl routine from their ioctl routines.
- */
-/* ARGSUSED */
-static int
-ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct ucred *cr)
-{
-    struct ppp_softc *sc = (struct ppp_softc *) tp->t_slsc;
-    int error;
-
-    lwkt_gettoken(&tty_token);
-    if (sc == NULL || tp != (struct tty *) sc->sc_devp) {
-       lwkt_reltoken(&tty_token);
-       return (ENOIOCTL);
-    }
-
-    error = 0;
-    switch (cmd) {
-    case PPPIOCSASYNCMAP:
-       if ((error = priv_check_cred(cr, PRIV_ROOT, 0)) != 0)
-           break;
-       sc->sc_asyncmap[0] = *(u_int *)data;
-       break;
-
-    case PPPIOCGASYNCMAP:
-       *(u_int *)data = sc->sc_asyncmap[0];
-       break;
-
-    case PPPIOCSRASYNCMAP:
-       if ((error = priv_check_cred(cr, PRIV_ROOT, 0)) != 0)
-           break;
-       sc->sc_rasyncmap = *(u_int *)data;
-       break;
-
-    case PPPIOCGRASYNCMAP:
-       *(u_int *)data = sc->sc_rasyncmap;
-       break;
-
-    case PPPIOCSXASYNCMAP:
-       if ((error = priv_check_cred(cr, PRIV_ROOT, 0)) != 0)
-           break;
-       crit_enter();
-       bcopy(data, sc->sc_asyncmap, sizeof(sc->sc_asyncmap));
-       sc->sc_asyncmap[1] = 0;             /* mustn't escape 0x20 - 0x3f */
-       sc->sc_asyncmap[2] &= ~0x40000000;  /* mustn't escape 0x5e */
-       sc->sc_asyncmap[3] |= 0x60000000;   /* must escape 0x7d, 0x7e */
-       crit_exit();
-       break;
-
-    case PPPIOCGXASYNCMAP:
-       bcopy(sc->sc_asyncmap, data, sizeof(sc->sc_asyncmap));
-       break;
-
-    default:
-       error = pppioctl(sc, cmd, data, flag, cr);
-       if (error == 0 && cmd == PPPIOCSMRU)
-           pppgetm(sc);
-    }
-
-    lwkt_reltoken(&tty_token);
-    return error;
-}
-
-/*
- * FCS lookup table as calculated by genfcstab.
- */
-static u_short fcstab[256] = {
-       0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
-       0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
-       0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
-       0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
-       0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
-       0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
-       0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
-       0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
-       0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
-       0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
-       0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
-       0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
-       0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
-       0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
-       0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
-       0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
-       0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
-       0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
-       0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
-       0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
-       0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
-       0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
-       0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
-       0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
-       0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
-       0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
-       0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
-       0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
-       0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
-       0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
-       0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
-       0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
-};
-
-/*
- * Calculate a new FCS given the current FCS and the new data.
- */
-static u_short
-pppfcs(u_short fcs, u_char *cp, int len)
-{
-    while (len--)
-       fcs = PPP_FCS(fcs, *cp++);
-    return (fcs);
-}
-
-/*
- * This gets called at splsoftnet from if_ppp.c at various times
- * when there is data ready to be sent.
- */
-static void
-pppasyncstart(struct ppp_softc *sc)
-{
-    struct tty *tp = (struct tty *) sc->sc_devp;
-    struct mbuf *m;
-    int len;
-    u_char *start, *stop, *cp;
-    int n, ndone, done, idle;
-
-    idle = 0;
-    lwkt_gettoken(&tty_token);
-    /* XXX assumes atomic access to *tp although we're not at spltty(). */
-    while (CCOUNT(&tp->t_outq) < PPP_HIWAT) {
-       /*
-        * See if we have an existing packet partly sent.
-        * If not, get a new packet and start sending it.
-        */
-       m = sc->sc_outm;
-       if (m == NULL) {
-           /*
-            * Get another packet to be sent.
-            */
-           m = ppp_dequeue(sc);
-           if (m == NULL) {
-               idle = 1;
-               break;
-           }
-
-           /*
-            * The extra PPP_FLAG will start up a new packet, and thus
-            * will flush any accumulated garbage.  We do this whenever
-            * the line may have been idle for some time.
-            */
-           /* XXX as above. */
-           if (CCOUNT(&tp->t_outq) == 0) {
-               ++sc->sc_stats.ppp_obytes;
-               clist_putc(PPP_FLAG, &tp->t_outq);
-           }
-
-           /* Calculate the FCS for the first mbuf's worth. */
-           sc->sc_outfcs = pppfcs(PPP_INITFCS, mtod(m, u_char *), m->m_len);
-           getmicrotime(&sc->sc_if.if_lastchange);
-       }
-
-       for (;;) {
-           start = mtod(m, u_char *);
-           len = m->m_len;
-           stop = start + len;
-           while (len > 0) {
-               /*
-                * Find out how many bytes in the string we can
-                * handle without doing something special.
-                */
-               for (cp = start; cp < stop; cp++)
-                   if (ESCAPE_P(*cp))
-                       break;
-               n = cp - start;
-               if (n) {
-                   /* NetBSD (0.9 or later), 4.3-Reno or similar. */
-                   ndone = n - b_to_q(start, n, &tp->t_outq);
-                   len -= ndone;
-                   start += ndone;
-                   sc->sc_stats.ppp_obytes += ndone;
-
-                   if (ndone < n)
-                       break;  /* packet doesn't fit */
-               }
-               /*
-                * If there are characters left in the mbuf,
-                * the first one must be special.
-                * Put it out in a different form.
-                */
-               if (len) {
-                   crit_enter();
-                   if (clist_putc(PPP_ESCAPE, &tp->t_outq)) {
-                       crit_exit();
-                       break;
-                   }
-                   if (clist_putc(*start ^ PPP_TRANS, &tp->t_outq)) {
-                       clist_unputc(&tp->t_outq);
-                       crit_exit();
-                       break;
-                   }
-                   crit_exit();
-                   sc->sc_stats.ppp_obytes += 2;
-                   start++;
-                   len--;
-               }
-           }
-
-           /*
-            * If we didn't empty this mbuf, remember where we're up to.
-            * If we emptied the last mbuf, try to add the FCS and closing
-            * flag, and if we can't, leave sc_outm pointing to m, but with
-            * m->m_len == 0, to remind us to output the FCS and flag later.
-            */
-           done = len == 0;
-           if (done && m->m_next == NULL) {
-               u_char *p, *q;
-               int c;
-               u_char endseq[8];
-
-               /*
-                * We may have to escape the bytes in the FCS.
-                */
-               p = endseq;
-               c = ~sc->sc_outfcs & 0xFF;
-               if (ESCAPE_P(c)) {
-                   *p++ = PPP_ESCAPE;
-                   *p++ = c ^ PPP_TRANS;
-               } else
-                   *p++ = c;
-               c = (~sc->sc_outfcs >> 8) & 0xFF;
-               if (ESCAPE_P(c)) {
-                   *p++ = PPP_ESCAPE;
-                   *p++ = c ^ PPP_TRANS;
-               } else
-                   *p++ = c;
-               *p++ = PPP_FLAG;
-
-               /*
-                * Try to output the FCS and flag.  If the bytes
-                * don't all fit, back out.
-                */
-               crit_enter();
-               for (q = endseq; q < p; ++q)
-                   if (clist_putc(*q, &tp->t_outq)) {
-                       done = 0;
-                       for (; q > endseq; --q)
-                           clist_unputc(&tp->t_outq);
-                       break;
-                   }
-               crit_exit();
-               if (done)
-                   sc->sc_stats.ppp_obytes += q - endseq;
-           }
-
-           if (!done) {
-               /* remember where we got to */
-               m->m_data = start;
-               m->m_len = len;
-               break;
-           }
-
-           /* Finished with this mbuf; free it and move on. */
-           m = m_free(m);
-           if (m == NULL) {
-               /* Finished a packet */
-               break;
-           }
-           sc->sc_outfcs = pppfcs(sc->sc_outfcs, mtod(m, u_char *), m->m_len);
-       }
-
-       /*
-        * If m == NULL, we have finished a packet.
-        * If m != NULL, we've either done as much work this time
-        * as we need to, or else we've filled up the output queue.
-        */
-       sc->sc_outm = m;
-       if (m)
-           break;
-    }
-
-    /* Call pppstart to start output again if necessary. */
-    crit_enter();
-    pppstart(tp);
-
-    /*
-     * This timeout is needed for operation on a pseudo-tty,
-     * because the pty code doesn't call pppstart after it has
-     * drained the t_outq.
-     */
-    if (!idle && (sc->sc_flags & SC_TIMEOUT) == 0) {
-       callout_reset(&sc->sc_timeout, 1, ppp_timeout, sc);
-       sc->sc_flags |= SC_TIMEOUT;
-    }
-
-    crit_exit();
-    lwkt_reltoken(&tty_token);
-}
-
-/*
- * This gets called when a received packet is placed on
- * the inq, at splsoftnet. The pppd daemon is to be woken up to do a read().
- */
-static void
-pppasyncctlp(struct ppp_softc *sc)
-{
-    struct tty *tp;
-
-    /* Put a placeholder byte in canq for ttselect()/ttnread(). */
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-    tp = (struct tty *) sc->sc_devp;
-    clist_putc(0, &tp->t_canq);
-    ttwakeup(tp);
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-}
-
-/*
- * Start output on async tty interface.  If the transmit queue
- * has drained sufficiently, arrange for pppasyncstart to be
- * called later at splsoftnet.
- * Called at spltty or higher.
- */
-static int
-pppstart(struct tty *tp)
-{
-    struct ppp_softc *sc = (struct ppp_softc *) tp->t_slsc;
-
-    lwkt_gettoken(&tty_token);
-    /*
-     * Call output process whether or not there is any output.
-     * We are being called in lieu of ttstart and must do what it would.
-     */
-    if (tp->t_oproc != NULL)
-       (*tp->t_oproc)(tp);
-
-    /*
-     * If ALTQ is enabled, don't invoke NETISR_PPP.
-     * pppintr() could loop without doing anything useful
-     * under rate-limiting.
-     */
-    if (ifq_is_enabled(&sc->sc_if.if_snd)) {
-       lwkt_reltoken(&tty_token);
-       return 0;
-    }
-
-    /*
-     * If the transmit queue has drained and the tty has not hung up
-     * or been disconnected from the ppp unit, then tell if_ppp.c that
-     * we need more output.
-     */
-    if (CCOUNT(&tp->t_outq) < PPP_LOWAT
-       && !((tp->t_state & TS_CONNECTED) == 0)
-       && sc != NULL && tp == (struct tty *) sc->sc_devp) {
-       ppp_restart(sc);
-    }
-
-    lwkt_reltoken(&tty_token);
-    return 0;
-}
-
-/*
- * Timeout routine - try to start some more output.
- */
-static void
-ppp_timeout(void *x)
-{
-    struct ppp_softc *sc = (struct ppp_softc *) x;
-    struct tty *tp = (struct tty *) sc->sc_devp;
-
-    crit_enter();
-    lwkt_gettoken(&tty_token);
-    sc->sc_flags &= ~SC_TIMEOUT;
-    pppstart(tp);
-    lwkt_reltoken(&tty_token);
-    crit_exit();
-}
-
-/*
- * Allocate enough mbuf to handle current MRU.
- */
-static void
-pppgetm(struct ppp_softc *sc)
-{
-    struct mbuf *m, **mp;
-    int len;
-
-    mp = &sc->sc_m;
-    for (len = sc->sc_mru + PPP_HDRLEN + PPP_FCSLEN; len > 0; ){
-       if ((m = *mp) == NULL) {
-           MGETHDR(m, M_NOWAIT, MT_DATA);
-           if (m == NULL)
-               break;
-           *mp = m;
-           MCLGET(m, M_NOWAIT);
-       }
-       len -= M_DATASIZE(m);
-       mp = &m->m_next;
-    }
-}
-
-/*
- * tty interface receiver interrupt.
- */
-static unsigned paritytab[8] = {
-    0x96696996, 0x69969669, 0x69969669, 0x96696996,
-    0x69969669, 0x96696996, 0x96696996, 0x69969669
-};
-
-/*
- * Called when character is available from device driver.
- * Only guaranteed to be at splsofttty() or spltty()
- * This is safe to be called while the upper half's netisr is preempted.
- */
-static int
-pppinput(int c, struct tty *tp)
-{
-    struct ppp_softc *sc;
-    struct mbuf *m;
-    int ilen;
-
-    lwkt_gettoken(&tty_token);
-    sc = (struct ppp_softc *) tp->t_slsc;
-    if (sc == NULL || tp != (struct tty *) sc->sc_devp) {
-       lwkt_reltoken(&tty_token);
-       return 0;
-    }
-
-    ++tk_nin;
-    ++sc->sc_stats.ppp_ibytes;
-
-    if ((tp->t_state & TS_CONNECTED) == 0) {
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: no carrier\n", sc->sc_if.if_xname);
-       goto flush;
-    }
-
-    if (c & TTY_ERRORMASK) {
-       /* framing error or overrun on this char - abort packet */
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: line error %x\n", sc->sc_if.if_xname,
-                                               c & TTY_ERRORMASK);
-       goto flush;
-    }
-
-    c &= TTY_CHARMASK;
-
-    /*
-     * Handle software flow control of output.
-     */
-    if (tp->t_iflag & IXON) {
-       if (c == tp->t_cc[VSTOP] && tp->t_cc[VSTOP] != _POSIX_VDISABLE) {
-           if ((tp->t_state & TS_TTSTOP) == 0) {
-               tp->t_state |= TS_TTSTOP;
-               tp->t_stop(tp, 0);
-           }
-           lwkt_reltoken(&tty_token);
-           return 0;
-       }
-       if (c == tp->t_cc[VSTART] && tp->t_cc[VSTART] != _POSIX_VDISABLE) {
-           tp->t_state &= ~TS_TTSTOP;
-           if (tp->t_oproc != NULL)
-               (*tp->t_oproc)(tp);
-           lwkt_reltoken(&tty_token);
-           return 0;
-       }
-    }
-
-    crit_enter();
-    if (c & 0x80)
-       sc->sc_flags |= SC_RCV_B7_1;
-    else
-       sc->sc_flags |= SC_RCV_B7_0;
-    if (paritytab[c >> 5] & (1 << (c & 0x1F)))
-       sc->sc_flags |= SC_RCV_ODDP;
-    else
-       sc->sc_flags |= SC_RCV_EVNP;
-    crit_exit();
-
-    if (sc->sc_flags & SC_LOG_RAWIN)
-       ppplogchar(sc, c);
-
-    if (c == PPP_FLAG) {
-       ilen = sc->sc_ilen;
-       sc->sc_ilen = 0;
-
-       if (sc->sc_rawin_count > 0) 
-           ppplogchar(sc, -1);
-
-       /*
-        * If SC_ESCAPED is set, then we've seen the packet
-        * abort sequence "}~".
-        */
-       if (sc->sc_flags & (SC_FLUSH | SC_ESCAPED)
-           || (ilen > 0 && sc->sc_fcs != PPP_GOODFCS)) {
-           crit_enter();
-           sc->sc_flags |= SC_PKTLOST; /* note the dropped packet */
-           if ((sc->sc_flags & (SC_FLUSH | SC_ESCAPED)) == 0){
-               if (sc->sc_flags & SC_DEBUG)
-                   kprintf("%s: bad fcs %x, pkt len %d\n",
-                          sc->sc_if.if_xname, sc->sc_fcs, ilen);
-               IFNET_STAT_INC(&sc->sc_if, ierrors, 1);
-               sc->sc_stats.ppp_ierrors++;
-           } else
-               sc->sc_flags &= ~(SC_FLUSH | SC_ESCAPED);
-           crit_exit();
-           lwkt_reltoken(&tty_token);
-           return 0;
-       }
-
-       if (ilen < PPP_HDRLEN + PPP_FCSLEN) {
-           if (ilen) {
-               if (sc->sc_flags & SC_DEBUG)
-                   kprintf("%s: too short (%d)\n", sc->sc_if.if_xname, ilen);
-               crit_enter();
-               IFNET_STAT_INC(&sc->sc_if, ierrors, 1);
-               sc->sc_stats.ppp_ierrors++;
-               sc->sc_flags |= SC_PKTLOST;
-               crit_exit();
-           }
-           lwkt_reltoken(&tty_token);
-           return 0;
-       }
-
-       /*
-        * Remove FCS trailer.  Somewhat painful...
-        */
-       ilen -= 2;
-       if (--sc->sc_mc->m_len == 0) {
-           for (m = sc->sc_m; m->m_next != sc->sc_mc; m = m->m_next)
-               ;
-           sc->sc_mc = m;
-       }
-       sc->sc_mc->m_len--;
-
-       /* excise this mbuf chain */
-       m = sc->sc_m;
-       sc->sc_m = sc->sc_mc->m_next;
-       sc->sc_mc->m_next = NULL;
-
-       ppppktin(sc, m, sc->sc_flags & SC_PKTLOST);
-       if (sc->sc_flags & SC_PKTLOST) {
-           crit_enter();
-           sc->sc_flags &= ~SC_PKTLOST;
-           crit_exit();
-       }
-
-       pppgetm(sc);
-       lwkt_reltoken(&tty_token);
-       return 0;
-    }
-
-    if (sc->sc_flags & SC_FLUSH) {
-       if (sc->sc_flags & SC_LOG_FLUSH)
-           ppplogchar(sc, c);
-       lwkt_reltoken(&tty_token);
-       return 0;
-    }
-
-    if (c < 0x20 && (sc->sc_rasyncmap & (1 << c))) {
-        lwkt_reltoken(&tty_token);
-       return 0;
-    }
-
-    crit_enter();
-    if (sc->sc_flags & SC_ESCAPED) {
-       sc->sc_flags &= ~SC_ESCAPED;
-       c ^= PPP_TRANS;
-    } else if (c == PPP_ESCAPE) {
-       sc->sc_flags |= SC_ESCAPED;
-        crit_exit();
-       lwkt_reltoken(&tty_token);
-       return 0;
-    }
-    crit_exit();
-
-    /*
-     * Initialize buffer on first octet received.
-     * First octet could be address or protocol (when compressing
-     * address/control).
-     * Second octet is control.
-     * Third octet is first or second (when compressing protocol)
-     * octet of protocol.
-     * Fourth octet is second octet of protocol.
-     */
-    if (sc->sc_ilen == 0) {
-       /* reset the first input mbuf */
-       if (sc->sc_m == NULL) {
-           pppgetm(sc);
-           if (sc->sc_m == NULL) {
-               if (sc->sc_flags & SC_DEBUG)
-                   kprintf("%s: no input mbufs!\n", sc->sc_if.if_xname);
-               goto flush;
-           }
-       }
-       m = sc->sc_m;
-       m->m_len = 0;
-       m->m_data = M_DATASTART(sc->sc_m);
-       sc->sc_mc = m;
-       sc->sc_mp = mtod(m, char *);
-       sc->sc_fcs = PPP_INITFCS;
-       if (c != PPP_ALLSTATIONS) {
-           if (sc->sc_flags & SC_REJ_COMP_AC) {
-               if (sc->sc_flags & SC_DEBUG)
-                   kprintf("%s: garbage received: 0x%x (need 0xFF)\n",
-                          sc->sc_if.if_xname, c);
-               goto flush;
-           }
-           *sc->sc_mp++ = PPP_ALLSTATIONS;
-           *sc->sc_mp++ = PPP_UI;
-           sc->sc_ilen += 2;
-           m->m_len += 2;
-       }
-    }
-    if (sc->sc_ilen == 1 && c != PPP_UI) {
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: missing UI (0x3), got 0x%x\n",
-                  sc->sc_if.if_xname, c);
-       goto flush;
-    }
-    if (sc->sc_ilen == 2 && (c & 1) == 1) {
-       /* a compressed protocol */
-       *sc->sc_mp++ = 0;
-       sc->sc_ilen++;
-       sc->sc_mc->m_len++;
-    }
-    if (sc->sc_ilen == 3 && (c & 1) == 0) {
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: bad protocol %x\n", sc->sc_if.if_xname,
-                  (sc->sc_mp[-1] << 8) + c);
-       goto flush;
-    }
-
-    /* packet beyond configured mru? */
-    if (++sc->sc_ilen > sc->sc_mru + PPP_HDRLEN + PPP_FCSLEN) {
-       if (sc->sc_flags & SC_DEBUG)
-           kprintf("%s: packet too big\n", sc->sc_if.if_xname);
-       goto flush;
-    }
-
-    /* is this mbuf full? */
-    m = sc->sc_mc;
-    if (M_TRAILINGSPACE(m) <= 0) {
-       if (m->m_next == NULL) {
-           pppgetm(sc);
-           if (m->m_next == NULL) {
-               if (sc->sc_flags & SC_DEBUG)
-                   kprintf("%s: too few input mbufs!\n", sc->sc_if.if_xname);
-               goto flush;
-           }
-       }
-       sc->sc_mc = m = m->m_next;
-       m->m_len = 0;
-       m->m_data = M_DATASTART(m);
-       sc->sc_mp = mtod(m, char *);
-    }
-
-    ++m->m_len;
-    *sc->sc_mp++ = c;
-    sc->sc_fcs = PPP_FCS(sc->sc_fcs, c);
-    lwkt_reltoken(&tty_token);
-    return 0;
-
- flush:
-    if (!(sc->sc_flags & SC_FLUSH)) {
-       crit_enter();
-       IFNET_STAT_INC(&sc->sc_if, ierrors, 1);
-       sc->sc_stats.ppp_ierrors++;
-       sc->sc_flags |= SC_FLUSH;
-       crit_exit();
-       if (sc->sc_flags & SC_LOG_FLUSH)
-           ppplogchar(sc, c);
-    }
-    lwkt_reltoken(&tty_token);
-    return 0;
-}
-
-#define MAX_DUMP_BYTES 128
-
-static void
-ppplogchar(struct ppp_softc *sc, int c)
-{
-    char *hexstr;
-
-    if (c >= 0)
-       sc->sc_rawin[sc->sc_rawin_count++] = c;
-    if (sc->sc_rawin_count >= sizeof(sc->sc_rawin)
-       || (c < 0 && sc->sc_rawin_count > 0)) {
-       hexstr = kmalloc(HEX_NCPYLEN(sc->sc_rawin_count), M_TEMP, M_WAITOK | M_ZERO);
-       kprintf("%s input: %s", sc->sc_if.if_xname, hexncpy(sc->sc_rawin,
-               sc->sc_rawin_count, hexstr, HEX_NCPYLEN(sc->sc_rawin_count), " "));
-       sc->sc_rawin_count = 0;
-       kfree(hexstr, M_TEMP);
-    }
-}
index f791521..87e0a0b 100644 (file)
  * 400910 - routing table is only available on netisr_ncpus
  * 500000 - 5.0 release
  * 500100 - 5.1 development
+ * 500101 - kernel ppp removal
  */
 #undef __DragonFly_version
-#define __DragonFly_version 500100     /* propagated to newvers */
+#define __DragonFly_version 500101     /* propagated to newvers */
 
 #include <sys/_null.h>
 
index 7150d1e..ec193fa 100644 (file)
@@ -1,7 +1,7 @@
 .\" -*- nroff -*-
 .\" manual page [] for chat 1.8
 .\" $FreeBSD: src/usr.bin/chat/chat.8,v 1.15.2.3 2003/02/24 22:37:41 trhodes Exp $
-.Dd September 27, 1996
+.Dd October 17, 2017
 .Dt CHAT 8
 .Os
 .Sh NAME
 The
 .Nm
 program defines a conversational exchange between the computer and the modem.
-Its primary purpose is to establish the
-connection between the Point-to-Point Protocol Daemon
-.Xr ( pppd 8 )
-and the remote's
-.Xr pppd 8
-process.
 .Sh OPTIONS
 The following options are provided:
 .Bl -tag -width ".Fl U Ar phone_number" -offset indent
@@ -90,9 +84,10 @@ The
 .Nm
 program will then log all text received from the
 modem and the output strings sent to the modem to the stderr device.
-This
-device is usually the local console at the station running the chat or
-pppd program.
+This device is usually the local console at the station running the chat or
+the
+.Xr ppp 8
+program.
 .It Fl s
 Use stderr.
 All log messages from
@@ -287,12 +282,6 @@ The
 .Dq SAY
 directive allows the script to send strings to the user
 at the terminal via standard error.
-If
-.Nm
-is being run by
-pppd, and pppd is running as a daemon (detached from its controlling
-terminal), standard error will normally be redirected to the file
-.Pa /etc/ppp/connect-errors .
 .Pp
 .Dq SAY
 strings must be enclosed in single or double quotes.
index 57755e2..d601564 100644 (file)
@@ -69,7 +69,7 @@ srcdirs /usr/src/usr.sbin
 
 progs ac accton amd arp bad144 catman chown chroot config config.new cron
 progs dev_mkdb diskpart edquota flcopy gettable grfinfo hilinfo htable inetd
-progs iostat iteconfig kvm_mkdb mtree named portmap pppd
+progs iostat iteconfig kvm_mkdb mtree named portmap
 progs pstat pwd_mkdb quot quotaon rarpd rbootd repquota rmt rpc.bootparamd
 progs rwhod sa spray sysctl syslogd tcpdump
 progs traceroute trpt update vipw vnconfig ypbind yppoll ypset
index 67f9fb6..66157a6 100644 (file)
@@ -52,7 +52,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd April 10, 2007
+.Dd October 17, 2017
 .Dt RFCOMM_SPPD 1
 .Os
 .Sh NAME
@@ -183,23 +183,11 @@ can be used to communicate with the remote serial port on the
 server, e.g. with the use of
 .Pp
 .Dl cu -l /dev/ttyp1
-.Pp
-In order to use
-.Nm
-to automatically create a secured link for
-.Xr pppd 8 ,
-use
-.Dl pty Qo rfcomm_sppd -a 00:01:02:03:04:05 -s DUN -m secure Qc
-.Pp
-in your
-.Xr pppd 8
-configuration file.
 .Sh SEE ALSO
 .Xr bluetooth 3 ,
 .Xr bluetooth 4 ,
 .Xr pty 4 ,
 .Xr btconfig 8 ,
-.Xr pppd 8 ,
 .Xr sdpd 8
 .Sh HISTORY
 The
index 8007bc4..4d20c3f 100644 (file)
@@ -77,7 +77,6 @@ SUBDIR= 802_11 \
        pflogd \
        powerd \
        pppctl \
-       pppstats \
        prefix \
        procctl \
        pstat \
@@ -146,7 +145,6 @@ SUBDIR= 802_11 \
 # Uses lib[re]ssl but can build without it
 #
 SUBDIR+=ppp \
-       pppd \
        tcpdump
 
 # from old secure/
index 1a3c969..b5ef751 100644 (file)
@@ -27,7 +27,7 @@ changecom(,)dnl
 .\"
 .\" $FreeBSD: src/usr.sbin/ppp/ppp.8.m4,v 1.301.2.1 2002/09/01 02:12:31 brian Exp $
 .\"
-.Dd June 20, 2015
+.Dd October 17, 2017
 .Dt PPP 8
 .Os
 .Sh NAME
@@ -43,16 +43,8 @@ changecom(,)dnl
 .Sh DESCRIPTION
 This is a user process
 .Em PPP
-software package.
-Normally,
-.Em PPP
-is implemented as a part of the kernel (e.g., as managed by
-.Xr pppd 8 )
-and it's thus somewhat hard to debug and/or modify its behaviour.
-However, in this implementation
-.Em PPP
-is done as a user process with the help of the
-tunnel device driver (tun).
+software package with the help of the tunnel device driver
+.Xr ( tun 4 ).
 .Pp
 The
 .Fl nat
@@ -2661,7 +2653,7 @@ program.
 Note: There is a problem negotiating
 .Ar deflate
 capabilities with
-.Xr pppd 8
+.Nm pppd
 - a
 .Em PPP
 implementation available under many operating systems.
@@ -2694,7 +2686,7 @@ Default: Disabled and Denied.
 This is a variance of the
 .Ar deflate
 option, allowing negotiation with the
-.Xr pppd 8
+.Nm pppd
 program.
 Refer to the
 .Ar deflate
@@ -2829,7 +2821,7 @@ acts as the authenticatee with both protocols
 the protocols are used alternately in response to challenges.
 .Pp
 Note: If only LANMan is enabled,
-.Xr pppd 8
+.Nm pppd
 (version 2.3.5) misbehaves when acting as authenticatee.
 It provides both
 the NT and the LANMan answers, but also suggests that only the NT answer
@@ -5839,7 +5831,6 @@ ifdef({LOCALRAD},{},{.Xr libradius 3 ,
 .Xr named 8 ,
 .Xr ping 8 ,
 .Xr pppctl 8 ,
-.Xr pppd 8 ,
 .Xr pppoe 8 ,
 .Xr route 8 ,
 .Xr sshd 8 ,
diff --git a/usr.sbin/pppd/Makefile b/usr.sbin/pppd/Makefile
deleted file mode 100644 (file)
index e97171c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-# $FreeBSD: src/usr.sbin/pppd/Makefile,v 1.19.2.2 2001/08/19 03:32:43 kris Exp $
-
-CFLAGS+= -DHAVE_PATHS_H
-
-PROG=  pppd
-SRCS=  main.c magic.c fsm.c lcp.c ipcp.c upap.c chap.c ccp.c \
-       demand.c auth.c options.c sys-bsd.c
-MAN=   pppd.8
-BINMODE=4550
-BINOWN=        root
-BINGRP=        dialer
-WARNS?=        2
-
-LDADD= -lcrypt -lutil -lmd
-DPADD= ${LIBCRYPT} ${LIBUTIL} ${LIBMD}
-
-# Callback Control Protocol
-CFLAGS+=-DCBCP_SUPPORT
-SRCS+= cbcp.c
-
-# Filter support
-CFLAGS+=-DPPP_FILTER -I${.CURDIR}/../../contrib/libpcap
-CFLAGS+=-include ${.CURDIR}/../../lib/libpcap/config.h
-LDADD+=        -lpcap
-DPADD+=        ${LIBPCAP}
-
-# MS-CHAP support.  Requires the DES library.
-.if !defined(NO_CRYPT)
-CFLAGS+=       -DCHAPMS
-SRCS+=         chap_ms.c
-LDADD+=                -lprivate_crypto
-DPADD+=                ${LIBRECRYPTO}
-LDFLAGS+=      ${PRIVATELIB_LDFLAGS}
-CFLAGS+=       -I${.CURDIR}/../../crypto/libressl/include
-.endif
-
-# XXX sys/md5.h shim errata for bootstrap REMOVE_OPENSSL_FILES
-CFLAGS+= -I${_SHLIBDIRPREFIX}/usr/include/priv
-
-.include <bsd.prog.mk>
diff --git a/usr.sbin/pppd/RELNOTES b/usr.sbin/pppd/RELNOTES
deleted file mode 100644 (file)
index 12d9c7f..0000000
+++ /dev/null
@@ -1,724 +0,0 @@
-This is the README file for ppp-2.3, a package which implements the
-Point-to-Point Protocol (PPP) to provide Internet connections over
-serial lines.
-
-
-Introduction.
-*************
-
-The Point-to-Point Protocol (PPP) provides a standard way to establish
-a network connection over a serial link.  At present, this package
-supports IP and the protocols layered above IP, such as TCP and UDP.
-The Linux port of this package also has support for IPX.
-
-This software consists of two parts:
-
-- Kernel code, which establishes a network interface and passes
-packets between the serial port, the kernel networking code and the
-PPP daemon (pppd).  This code is implemented using STREAMS modules on
-SunOS 4.x, Solaris 2.x, System V Release 4, and OSF/1, and as a
-line discipline under Ultrix, NextStep, NetBSD, FreeBSD, and Linux.
-
-- The PPP daemon (pppd), which negotiates with the peer to establish
-the link and sets up the ppp network interface.  Pppd includes support
-for authentication, so you can control which other systems may make a
-PPP connection and what IP addresses they may use.
-
-
-Installation.
-*************
-
-The file SETUP contains general information about setting up your
-system for using PPP.  There is also a README file for each supported
-system, which contains more specific details for installing PPP on
-that system.  The supported systems, and the corresponding README
-files, are:
-
-       Digital Unix (OSF/1)            README.osf
-       Linux                           README.linux
-       NetBSD, FreeBSD                 README.bsd
-       NeXTStep                        README.next
-       Solaris 2                       README.sol2
-       SunOS 4.x                       README.sunos4
-       System V Release 4              README.svr4
-       Ultrix 4.x                      README.ultrix
-
-Unfortunately, AIX 4 is no longer supported, since I don't have a
-maintainer for the AIX 4 port.  If you want to volunteer, contact me.
-The Ultrix port is untested, as I no longer have access to an Ultrix
-box.
-
-In each case you start by running the ./configure script.  This works
-out which operating system you are using and creates symbolic links to
-the appropriate makefiles.  You then run `make' to compile the
-user-level code, and (as root) `make install' to install the
-user-level programs pppd, chat and pppstats.
-
-The procedures for installing the kernel code vary from system to
-system.  On some systems, the kernel code can be loaded into a running
-kernel using a `modload' facility.  On others, the kernel image has to
-be recompiled and the system rebooted.  See the README.* files for
-details.
-
-N.B. Since 2.3.0, leaving the permitted IP addresses column of the
-pap-secrets or chap-secrets file empty means that no addresses are
-permitted.  You need to put a "*" in that column to allow the peer to
-use any IP address.  (This only applies where the peer is
-authenticating itself to you, of course.)
-
-
-What's new in ppp-2.3.5.
-************************
-
-* Minor corrections to the Digital UNIX and NetBSD ports.
-
-* A workaround to avoid tickling a bug in the `se' serial port driver
-on Sun PCI Ultra machines running Solaris.
-
-* Fixed a bug in the negotiation of the Microsoft WINS server address
-option.
-
-* Fixed a bug in the Linux port where it would fail for kernel
-versions above 2.1.99.
-
-
-What was new in ppp-2.3.4.
-**************************
-
-* The NeXT port has been updated, thanks to Steve Perkins.
-
-* ppp-2.3.4 compiles and works under Solaris 2.6, using either gcc or
-cc.
-
-* With the Solaris, SVR4 and SunOS ports, you can control the choice
-of C compiler, C compiler options, and installation directories by
-editing the svr4/Makedefs or sunos4/Makedefs file.
-
-* Until now, we have been using the number 24 to identify Deflate
-compression in the CCP negotiations, which was the number in the draft
-RFC describing Deflate.  The number actually assigned to Deflate is
-26.  The code has been changed to use 26, but to allow the use of 24
-for now for backwards compatibility.  (This can be disabled with the
-`nodeflatedraft' option to pppd.)
-
-* Fixed some bugs in the linux driver and deflate compressor which
-were causing compression problems, including corrupting long
-incompressible packets sometimes.
-
-* Fixes to the PAM and shadow password support in pppd, from Al
-Longyear and others.
-
-* Pppd now sets some environment variables for scripts it invokes
-(ip-up/down, auth-ip/down), giving information about the connection.
-The variables it sets are PEERNAME, IPLOCAL, IPREMOTE, UID, DEVICE,
-SPEED, and IFNAME.
-
-* Pppd now has an `updetach' option, which will cause it to detach
-from its controlling terminal once the link has come up (i.e. once it
-is available for IP traffic).
-
-
-What was new in ppp-2.3.3.
-**************************
-
-* Fixed compilation problems under SunOS.
-
-* Fixed a bug introduced into chat in 2.3.2, and compilation problems
-introduced into the MS-CHAP implementation in 2.3.2.
-
-* The linux kernel driver has been updated for recent 2.1-series
-kernel changes, and it now will ask kerneld to load compression
-modules when required, if the kernel is configured to support kerneld.
-
-* Pppd should now compile correctly under linux on systems with glibc.
-
-
-What was new in ppp-2.3.2.
-**************************
-
-* In 2.3.1, I made a change which was intended to make pppd able to
-detect loss of CD during or immediately after the connection script
-runs.  Unfortunately, this had the side-effect that the connection
-script wouldn't work at all on some systems.  This change has been
-reversed.
-
-* Fix compilation problems in the Linux kernel driver.
-
-
-What was new in ppp-2.3.1.
-**************************
-
-* Enhancements to chat, thanks to Francis Demierre.  Chat can now
-accept comments in the chat script file, and has new SAY, HANGUP,
-CLR_ABORT and CLR_REPORT keywords.
-
-* Fixed a bug which causes 2.3.0 to crash Solaris systems.
-
-* Bug-fixes and restructuring of the Linux kernel driver.
-
-* The holdoff behaviour of pppd has been changed slightly: now, if
-the link comes up for IP (or other network protocol) traffic, we
-consider that the link has been successfully established, and don't
-enforce the holdoff period after the link goes down.
-
-* Pppd should now correctly wait for CD (carrier detect) from the
-modem, even when the serial port initially had CLOCAL set, and it
-should also detect loss of CD during or immediately after the
-connection script runs.
-
-* Under linux, pppd will work with older 2.2.0* version kernel
-drivers, although demand-dialling is not supported with them.
-
-* Minor bugfixes for pppd.
-
-
-What was new in ppp-2.3.
-************************
-
-* Demand-dialling.  Pppd now has a mode where it will establish the
-network interface immediately when it starts, but not actually bring
-the link up until it sees some data to be sent.  Look for the demand
-option description in the pppd man page.  Demand-dialling is not
-supported under Ultrix or NeXTStep.
-
-* Idle timeout.  Pppd will optionally terminate the link if no data
-packets are sent or received within a certain time interval.
-
-* Pppd now runs the /etc/ppp/auth-up script, if it exists, when the
-peer successfully authenticates itself, and /etc/ppp/auth-down when
-the connection is subsequently terminated.  This can be useful for
-accounting purposes.
-
-* A new packet compression scheme, Deflate, has been implemented.
-This uses the same compression method as `gzip'.  This method is free
-of patent or copyright restrictions, and it achieves better
-compression than BSD-Compress.  It does consume more CPU cycles for
-compression than BSD-Compress, but this shouldn't be a problem for
-links running at 100kbit/s or less.
-
-* There is no code in this distribution which is covered by Brad
-Clements' restrictive copyright notice.  The STREAMS modules for SunOS
-and OSF/1 have been rewritten, based on the Solaris 2 modules, which
-were written from scratch without any Clements code.
-
-* Pppstats has been reworked to clean up the output format somewhat.
-It also has a new -d option which displays data rate in kbyte/s for
-those columns which would normally display bytes.
-
-* Pppd options beginning with - or + have been renamed, e.g. -ip
-became noip, +chap became require-chap, etc.  The old options are
-still accepted for compatibility but may be removed in future.
-
-* Pppd now has some options (such as the new `noauth' option) which
-can only be specified if it is being run by root, or in an
-"privileged" options file: /etc/ppp/options or an options file in the
-/etc/ppp/peers directory.  There is a new "call" option to read
-options from a file in /etc/ppp/peers, making it possible for non-root
-users to make unauthenticated connections, but only to certain trusted
-peers.  My intention is to make the `auth' option the default in a
-future release.
-
-* Several minor new features have been added to pppd, including the
-maxconnect and welcome options.  Pppd will now terminate the
-connection when there are no network control protocols running.  The
-allowed IP address(es) field in the secrets files can now specify
-subnets (with a notation like 123.45.67.89/24) and addresses which are
-not acceptable (put a ! on the front).
-
-* Numerous bugs have been fixed (no doubt some have been introduced :-)
-Thanks to those who reported bugs in ppp-2.2.
-
-
-Patents.
-********
-
-The BSD-Compress algorithm used for packet compression is the same as
-that used in the Unix "compress" command.  It is apparently covered by
-U.S. patents 4,814,746 (owned by IBM) and 4,558,302 (owned by Unisys),
-and corresponding patents in various other countries (but not
-Australia).  If this is of concern, you can build the package without
-including BSD-Compress.  To do this, edit net/ppp-comp.h to change the
-definition of DO_BSD_COMPRESS to 0.  The bsd-comp.c files are then no
-longer needed, so the references to bsd-comp.o may optionally be
-removed from the Makefiles.
-
-
-Contacts.
-*********
-
-The comp.protocols.ppp newsgroup is a useful place to get help if you
-have trouble getting your ppp connections to work.  Please do not send
-me questions of the form "please help me get connected to my ISP" -
-I'm sorry, but I simply do not have the time to answer all the
-questions like this that I get.
-
-If you find bugs in this package, please report them to the maintainer
-for the port for the operating system you are using:
-
-Digital Unix (OSF/1)   Farrell Woods <ftw@zk3.dec.com>
-Linux                  Al Longyear <longyear@pobox.com>
-NetBSD                 Matthew Green <mrg@eterna.com.au
-FreeBSD                        Peter Wemm <peter@haywire.DIALix.COM>
-NeXTStep               Steve Perkins <perkins@cps.msu.edu>
-Solaris 2              Paul Mackerras <Paul.Mackerras@cs.anu.edu.au>
-SunOS 4.x              Paul Mackerras <Paul.Mackerras@cs.anu.edu.au>
-System V Release 4     Matthias Apitz <Matthias.Apitz@SOFTCON.de>
-Ultrix 4.x             Paul Mackerras (for want of anybody better :-)
-
-
-Copyrights:
-***********
-
-All of the code can be freely used and redistributed.
-
-
-Distribution:
-*************
-
-The primary site for releases of this software is:
-
-       ftp://cs.anu.edu.au/pub/software/ppp/
-
--------------------------
-This is the README file for ppp-2.2, a package which implements the
-Point-to-Point Protocol (PPP) to provide Internet connections over
-serial lines.
-
-
-Introduction.
-*************
-
-The Point-to-Point Protocol (PPP) provides a standard way to transmit
-datagrams over a serial link, as well as a standard way for the
-machines at either end of the link (the `peers') to negotiate various
-optional characteristics of the link.  Using PPP, a serial link can be
-used to transmit Internet Protocol (IP) datagrams, allowing TCP/IP
-connections between the peers.  PPP is defined in several RFC (Request
-For Comments) documents, in particular RFCs 1661, 1662, 1332 and 1334.
-Other RFCs describe standard ways to transmit datagrams from other
-network protocols (e.g., DECnet, OSI, Appletalk), but this package
-only supports IP.
-
-This software consists of two parts:
-
-- Kernel code, which establishes a network interface and passes
-packets between the serial port, the kernel networking code and the
-PPP daemon (pppd).  This code is implemented using STREAMS modules on
-SunOS 4.x, AIX 4.1 and OSF/1, and as a line discipline under Ultrix,
-NextStep, NetBSD, FreeBSD, and Linux.
-
-- The PPP daemon (pppd), which negotiates with the peer to establish
-the link and sets up the ppp network interface.  Pppd includes support
-for authentication, so you can control which other systems may make a
-PPP connection and what IP addresses they may use.
-
-
-What is new in ppp-2.2.
-***********************
-
-* More systems are now supported:
-
-  AIX 4, thanks to Charlie Wick,
-  OSF/1 on DEC Alpha, thanks to Steve Tate (srt@zaphod.csci.unt.edu),
-  NextStep 3.2 and 3.3, thanks to Philip-Andrew Prindeville
-       (philipp@res.enst.fr) and Steve Perkins (perkins@cps.msu.edu),
-  Solaris 2,
-
-in addition to NetBSD 1.0, SunOS 4.x, Ultrix 4.x, FreeBSD 2.0, and
-Linux.
-
-* Packet compression has been implemented.  This version implements
-CCP (Compression Control Protocol) and the BSD-Compress compression
-scheme according to the current draft RFCs.  This means that incoming
-and outgoing packets can be compressed with the LZW scheme (same as
-the `compress' command) using a code size of up to 15 bits.
-
-* Some bug fixes to the LCP protocol code.  In particular, pppd now
-correctly replies with a Configure-NAK (instead of a Configure-Reject)
-if the peer asks for CHAP and pppd is willing to do PAP but not CHAP.
-
-* The ip-up and ip-down scripts are now run with the real user ID set
-to root, and with an empty environment.  Clearing the environment
-fixes a security hole.
-
-* The kernel code on NetBSD, FreeBSD, NextStep and Ultrix has been
-restructured to make it easier to implement PPP over devices other
-than asynchronous tty ports (for example, synchronous serial ports).
-
-* pppd now looks at the list of interfaces in the system to determine
-what the netmask should be.  In most cases, this should eliminate the
-need to use the `netmask' option.
-
-* There is a new `papcrypt' option to pppd, which specifies that
-secrets in /etc/ppp/pap-secrets used for authenticating the peer are
-encrypted, so pppd always encrypts the peer's password before
-comparing it with the secret from /etc/ppp/pap-secrets.  This gives
-better security.
-
-
-Patents.
-********
-
-The BSD-Compress algorithm used for packet compression is the same as
-that used in the Unix "compress" command.  It is apparently covered by
-U.S. patents 4,814,746 (owned by IBM) and 4,558,302 (owned by Unisys),
-and corresponding patents in various other countries (but not
-Australia).  If this is of concern, you can build the package without
-including BSD-Compress.  To do this, edit net/ppp-comp.h to change the
-definition of DO_BSD_COMPRESS to 0.  The bsd-comp.c files are then no
-longer needed, so the references to bsd-comp.o may optionally be
-removed from the Makefiles.
-
-
-Contacts.
-*********
-
-Bugs in the the SunOS, NetBSD and Ultrix ports and bugs in pppd, chat
-or pppstats should be reported to:
-
-       paulus@cs.anu.edu.au
-       Paul Mackerras
-       Dept. of Computer Science
-       Australian National University
-       Canberra  ACT  0200
-       AUSTRALIA
-
-Bugs in other ports should be reported to the maintainer for that port
-(see the appropriate README.* file) or to the above.  Unfortunately,
-Charlie Wick is not in a position to provide support for the AIX 4
-port, so if you find bugs in it, send them to me.
-
-Thanks to:
-
-       Brad Parker  (brad@fcr.com)
-       Greg Christy (gmc@quotron.com)
-       Drew D. Perkins (ddp@andrew.cmu.edu)
-       Rick Adams (rick@seismo.ARPA)
-       Chris Torek (chris@mimsy.umd.edu, umcp-cs!chris).
-
-
-Copyrights:
-
-Most of the code can be freely used and redistributed.  The STREAMS
-code for SunOS 4.x, OSF/1 and AIX 4 is under a more restrictive
-copyright:
-
-       This code is Copyright (C) 1989, 1990 By Brad K. Clements, 
-       All Rights Reserved.
-
-       You may use this code for your personal use, to provide a non-profit
-       service to others, or to use as a test platform for a commercial
-       implementation.
-
-       You may NOT use this code in a commercial product, nor to provide a 
-       commercial service, nor may you sell this code without express
-       written permission of the author.
-
-       Otherwise, Enjoy!
-
-This copyright applies to (parts of) the following files:
-
-       sunos/ppp_async.c
-       sunos/ppp_if.c
-       aix4/ppp_async.c
-       aix4/ppp_if.c
-       net/ppp_str.h
-       pppd/sys-str.c
-       pppd/sys-osf.c
-       pppd/sys-aix4.c
--------------------------
-               pppd-2.1.1 release notes
-               Paul Mackerras   27 May 1994
-
-This file details the new and changed features in pppd since version 1.3.
-Briefly:
-       - the protocol code has been updated to conform with
-         RFCs 1548, 1549, 1332 and 1334
-       - security has been improved
-       - functionality has been improved in various ways.
-
-
-NEW FEATURES
-
-* The option negotiation automaton has been updated to RFC1548.  LCP
-now rejects the Quality Protocol option, since LQR is not implemented
-yet.  IPCP now uses the IP-Address option, and falls back to the old
-IP-Addresses option if the IP-Address option is rejected.  IPCP also
-uses the new form of the VJ-Compression option.
-
-RFC1548 defines the "passive" option to mean that the automaton
-outputs configure-request packets initially, but does not close down
-if no answer is received.  A valid configure-request received will
-restart the negotiation.  The "silent" option has been added with the
-old meaning of "passive", i.e. the automaton will not output
-configure-requests until it receives a valid one from the peer.
-
-* More systems are supported: in addition to SunOS 4.x and BSD/Net-2
-derived systems, Ultrix and Linux are supported, thanks to Robert
-Olsson, Per Sundstrom, Michael Callahan and Al Longyear.
-
-* Options can be taken from files as well as the command line.  pppd
-reads options from the files /etc/ppp/options and ~/.ppprc before
-looking at the command line, and /etc/ppp/options.<ttyname> after
-interpreting the options on the command line.  An options file is
-parsed into a series of words, delimited by whitespace.  Whitespace
-can be included in a word by enclosing the word in quotes (").
-Backslash (\) quotes the following character.  A hash (#) starts a
-comment, which continues until the end of the line.  In addition, the
-`file' option causes pppd to read options from a file.  pppd will
-report and error and exit if ~/.ppprc or the file given as the
-argument to the `file' option cannot be read by the user who invoked
-pppd.
-
-* On those systems, such as NetBSD, where the serial line speed is
-stored in the termios structure in bits per second (i.e. B9600 ==
-9600), it is possible to set any speed.
-
-* If desired, pppd will output LCP echo-request frames periodically
-while the link is up, and take the link down if no replies are
-received to a user-configurable number of echo-requests.  This can be
-used to detect that the serial connection has been broken on those
-systems which don't have hardware modem control lines.
-
-AUTHENTICATION
-
-Previous versions of pppd have provided no control over which IP
-addresses the peer can use.  Thus it is possible for the peer to
-impersonate another host on the local network, leading to various
-security holes.  In addition, the authentication mechanisms were quite
-weak: if the peer refused to agree to authenticate, pppd would print a
-warning message but still allow the link to come up.  The CHAP
-implementation also appeared to be quite broken (has anybody actually
-used it?).  
-
-This new version of pppd addresses these problems.  My aim has been to
-provide system administrators with sufficient access control that PPP
-access to a server machine can be provided to legitimate users without
-fear of compromising the security of the server or the network it's
-on.  In part this is provided by the /etc/ppp/options file, where the
-administrator can place options to require authentication which cannot
-be disabled by users.  Thus the new pppd can made setuid-root and run
-by users.
-
-The behaviour where pppd refuses to run unless the /etc/ppp/options
-file is present and readable by pppd is now the default behaviour.  If
-you really want pppd to run without the presence of the
-/etc/ppp/options file, you will have to include -DREQ_SYSOPTIONS=0 on
-the compilation command line.
-
-The options related to authentication are:
-
-    auth       Require authentication from the peer.  If neither
-               +chap or +pap is also given, either CHAP or PAP
-               authentication will be accepted.
-    +chap      Require CHAP authentication from the peer.
-    +pap       Require PAP authentication from the peer.
-    -chap      Don't agree to authenticate ourselves with the peer
-               using CHAP.
-    -pap       Don't agree to authenticate ourselves using PAP.
-    +ua <f>    Get username and password for authenticating ourselves
-               with the peer using PAP from file <f>.
-    name <n>   Use <n> as the local name for authentication.
-    usehostname        Use this machine's hostname as the local name for
-               authentication.
-    remotename <n>  Use <n> as the name of the peer for authentication.
-    login      If the peer authenticates using PAP, check the
-               supplied username and password against the system
-               password database, and make a wtmp entry.
-    user <n>   Use <n> as the username for authenticating ourselves
-               using PAP.
-
-The defaults are to agree to authenticate if requested, and to not
-require authentication from the peer.  However, pppd will not agree to
-authenticate itself with a particular protocol if it has no secrets
-which could be used to do so.
-
-Authentication is based on secrets, which are selected from secrets
-files (/etc/ppp/pap-secrets for PAP, /etc/ppp/chap-secrets for CHAP).
-Both secrets files have the same format, and both can store secrets
-for several combinations of server (authenticating peer) and client
-(peer being authenticated).  Note that each end can be both a server
-and client, and that different protocols can be used in the two
-directions if desired.
-
-A secrets file is parsed into words as for a options file.  A secret
-is specified by a line containing at least 3 words, in the order
-client, server, secret.  Any following words on the same line are
-taken to be a list of acceptable IP addresses for that client.  If
-there are only 3 words on the line, it is assumed that any IP address
-is OK; to disallow all IP addresses, use "-".  If the secret starts
-with an `@', what follows is assumed to be the name of a file from
-which to read the secret.  A "*" as the client or server name matches
-any name.  When selecting a secret, pppd takes the best match, i.e.
-the match with the fewest wildcards.
-
-Thus a secrets file contains both secrets for use in authenticating
-other hosts, plus secrets which we use for authenticating ourselves to
-others.  Which secret to use is chosen based on the names of the host
-(the `local name') and its peer (the `remote name').  The local name
-is set as follows:
-
-       if the `usehostname' option is given,
-       then the local name is the hostname of this machine
-               (with the domain appended, if given)
-
-       else if the `name' option is given,
-       then use the argument of the first `name' option seen
-
-       else if the local IP address is specified with a
-               host name (e.g. `sirius:')
-       then use that host name
-
-       else use the hostname of this machine
-               (with the domain appended, if given)
-
-When authenticating ourselves using PAP, there is also a `username'
-which is the local name by default, but can be set with the `user'
-option or the `+ua' option.
-
-The remote name is set as follows:
-
-       if the `remotename' option is given,
-       then use the argument of the last `remotename' option seen
-
-       else if the remote IP address is specified with a
-               host name (e.g. `avago:')
-       then use that host name
-
-       else the remote name is the null string "".
-
-Secrets are selected from the PAP secrets file as follows:
-
-- For authenticating the peer, look for a secret with client ==
-username specified in the PAP authenticate-request, and server ==
-local name.
-
-- For authenticating ourselves to the peer, look for a secret with
-client == our username, server == remote name.
-
-When authenticating the peer with PAP, a secret of "" matches any
-password supplied by the peer.  If the password doesn't match the
-secret, the password is encrypted using crypt() and checked against
-the secret again; thus secrets for authenticating the peer can be
-stored in encrypted form.  If the `login' option was specified, the
-username and password are also checked against the system password
-database.  Thus, the system administrator can set up the pap-secrets
-file to allow PPP access only to certain users, and to restrict the
-set of IP addresses that each user can use.
-
-Secrets are selected from the CHAP secrets file as follows:
-
-- For authenticating the peer, look for a secret with client == name
-specified in the CHAP-Response message, and server == local name.
-
-- For authenticating ourselves to the peer, look for a secret with
-client == local name, and server == name specified in the
-CHAP-Challenge message.
-
-Authentication must be satisfactorily completed before IPCP (or any
-other Network Control Protocol) can be started.  If authentication
-fails, pppd will terminated the link (by closing LCP).  If IPCP
-negotiates an unacceptable IP address for the remote host, IPCP will
-be closed.  IP packets cannot be sent or received until IPCP is
-successfully opened.
-
-(some examples needed here perhaps)
-
-
-ROUTING
-
-Setting the addresses on a ppp interface is sufficient to create a
-host route to the remote end of the link.  Sometimes it is desirable
-to add a default route through the remote host, as in the case of a
-machine whose only connection to the Internet is through the ppp
-interface.  The `defaultroute' option causes pppd to create such a
-default route when IPCP comes up, and delete it when the link is
-terminated.
-
-In some cases it is desirable to use proxy ARP, for example on a
-server machine connected to a LAN, in order to allow other hosts to
-communicate with the remote host.  The `proxyarp' option causes pppd
-to look for a network interface (an interface supporting broadcast and
-ARP, which is up and not a point-to-point or loopback interface) on
-the same subnet as the remote host.  If found, pppd creates a
-permanent, published ARP entry with the IP address of the remote host
-and the hardware address of the network interface found.
-
-
-OTHER NEW AND CHANGED OPTIONS
-
-    modem              Use modem control lines (not fully implemented
-                       yet)
-    local              Don't use modem control lines
-    persist            Keep reopening connection (not fully
-                       implemented yet)
-
-    lcp-restart <n>    Set timeout for LCP retransmissions to <n>
-                       seconds (default 3 seconds)
-    lcp-max-terminate <n> Set maximum number of LCP terminate-request
-                       transmissions (default 2)
-    lcp-max-configure <n> Set maximum number of LCP configure-request
-                       transmissions (default 10)
-    lcp-max-failure <n>        Set maximum number of LCP configure-Naks sent
-                       before converting to configure-rejects
-                       (default 10)
-
-    ipcp-restart <n>   Set timeout for IPCP retransmissions to <n>
-                       seconds (default 3 seconds)
-    ipcp-max-terminate <n> Set maximum number of IPCP
-                       terminate-request transmissions (default 2)
-    ipcp-max-configure <n> Set maximum number of IPCP
-                       configure-request transmissions (default 10)
-    ipcp-max-failure <n> Set maximum number of IPCP configure-Naks
-                       sent before converting to configure-rejects
-                       (default 10)
-
-    upap-restart <n>   Set timeout for PAP retransmissions to
-                       <n> seconds (default 3 seconds)
-    upap-max-authreq <n> Set maximum number of Authenticate-request
-                       retransmissions (default 10)
-
-    chap-restart <n>   Set timeout for CHAP retransmissions to
-                       <n> seconds (default 3 seconds)
-    chap-max-challenge <n> Set maximum number of CHAP Challenge
-                       retransmissions (default 10)
-    chap-interval <n>  Set the interval between CHAP rechallenges
-                       (default 0, meaning infinity)
-
-The -ua option no longer exists.
-
-
-SOFTWARE RESTRUCTURING
-
-Many of the source files for pppd have changed significantly from
-ppp-1.3, upon which it is based.  In particular:
-
-- the macros for system-dependent operations in pppd.h have mostly
-been removed.  Instead these operations are performed by procedures in
-sys-bsd.c (for BSD-4.4ish systems like NetBSD, 386BSD, etc.) or
-sys-str.c (for SunOS-based systems using STREAMS).  (I got sick of
-having to recompile everything every time I wanted to change one of
-those horrible macros.)
-
-- most of the system-dependent code in main.c has also been removed to
-sys-bsd.c and sys-str.c.
-
-- the option processing code in main.c has been removed to options.c.
-
-- the authentication code in main.c has been removed to auth.c, which
-also contains substantial amounts of new code.
-
-- fsm.c has changed significantly, and lcp.c, ipcp.c, and upap.c have
-changed somewhat.  chap.c has also changed significantly.
-
-
-STILL TO DO
-
-* sort out appropriate modem control and implement the persist option
-properly; add an `answer' option for auto-answering a modem.
-
-* add an inactivity timeout and demand dialing.
-
-* implement link quality monitoring.
-
-* implement other network control protocols.
diff --git a/usr.sbin/pppd/auth.c b/usr.sbin/pppd/auth.c
deleted file mode 100644 (file)
index 8b6979d..0000000
+++ /dev/null
@@ -1,1584 +0,0 @@
-/*
- * auth.c - PPP authentication and phase control.
- *
- * Copyright (c) 1993 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Australian National University.  The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $FreeBSD: src/usr.sbin/pppd/auth.c,v 1.24.2.2 2002/03/12 08:55:22 maxim Exp $
- */
-
-#include <stdio.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <paths.h>
-#include <pwd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <utmp.h>
-#include <err.h>
-#include <fcntl.h>
-#if defined(_PATH_LASTLOG) && defined(_linux_)
-#include <lastlog.h>
-#endif
-#include <libutil.h>
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/time.h>
-
-#ifdef USE_PAM
-#include <security/pam_appl.h>
-#endif
-
-#ifdef HAS_SHADOW
-#include <shadow.h>
-#ifndef PW_PPP
-#define PW_PPP PW_LOGIN
-#endif
-#endif
-
-#include "pppd.h"
-#include "fsm.h"
-#include "lcp.h"
-#include "ipcp.h"
-#include "upap.h"
-#include "chap.h"
-#ifdef CBCP_SUPPORT
-#include "cbcp.h"
-#endif
-#include "pathnames.h"
-
-/* Used for storing a sequence of words.  Usually malloced. */
-struct wordlist {
-    struct wordlist    *next;
-    char               word[1];
-};
-
-/* Bits in scan_authfile return value */
-#define NONWILD_SERVER 1
-#define NONWILD_CLIENT 2
-
-#define ISWILD(word)   (word[0] == '*' && word[1] == 0)
-
-#define FALSE  0
-#define TRUE   1
-
-/* The name by which the peer authenticated itself to us. */
-char peer_authname[MAXNAMELEN];
-
-/* Records which authentication operations haven't completed yet. */
-static int auth_pending[NUM_PPP];
-
-/* Set if we have successfully called plogin() */
-static int logged_in;
-
-/* Set if not wild or blank */
-static int non_wildclient;
-
-/* Set if we have run the /etc/ppp/auth-up script. */
-static int did_authup;
-
-/* List of addresses which the peer may use. */
-static struct wordlist *addresses[NUM_PPP];
-
-/* Number of network protocols which we have opened. */
-static int num_np_open;
-
-/* Number of network protocols which have come up. */
-static int num_np_up;
-
-/* Set if we got the contents of passwd[] from the pap-secrets file. */
-static int passwd_from_file;
-
-/* Bits in auth_pending[] */
-#define PAP_WITHPEER   1
-#define PAP_PEER       2
-#define CHAP_WITHPEER  4
-#define CHAP_PEER      8
-
-extern char *crypt(const char *, const char *);
-
-/* Prototypes for procedures local to this file. */
-
-static void network_phase(int);
-static void check_idle(void *);
-static void connect_time_expired(void *);
-static int  plogin(char *, char *, char **, int *);
-static void plogout(void);
-static int  null_login(int);
-static int  get_pap_passwd(char *);
-static int  have_pap_secret(void);
-static int  have_chap_secret(char *, char *, u_int32_t);
-static int  ip_addr_check(u_int32_t, struct wordlist *);
-static int  scan_authfile(FILE *, char *, char *, u_int32_t, char *,
-                              struct wordlist **, char *);
-static void free_wordlist(struct wordlist *);
-static void auth_set_ip_addr(int);
-static void auth_script(char *);
-static void set_allowed_addrs(int, struct wordlist *);
-
-/*
- * An Open on LCP has requested a change from Dead to Establish phase.
- * Do what's necessary to bring the physical layer up.
- */
-void
-link_required(int unit)
-{
-}
-
-/*
- * LCP has terminated the link; go to the Dead phase and take the
- * physical layer down.
- */
-void
-link_terminated(int unit)
-{
-    extern     time_t  etime, stime;
-    extern     int     minutes;
-
-    if (phase == PHASE_DEAD)
-       return;
-    if (logged_in)
-       plogout();
-    phase = PHASE_DEAD;
-    etime = time(NULL);
-    minutes = (etime-stime)/60;
-    syslog(LOG_NOTICE, "Connection terminated, connected for %d minutes\n",
-       minutes > 1 ? minutes : 1);
-}
-
-/*
- * LCP has gone down; it will either die or try to re-establish.
- */
-void
-link_down(int unit)
-{
-    int i;
-    struct protent *protp;
-
-    if (did_authup) {
-       auth_script(_PATH_AUTHDOWN);
-       did_authup = 0;
-    }
-    for (i = 0; (protp = protocols[i]) != NULL; ++i) {
-       if (!protp->enabled_flag)
-           continue;
-        if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
-           (*protp->lowerdown)(unit);
-        if (protp->protocol < 0xC000 && protp->close != NULL)
-           (*protp->close)(unit, "LCP down");
-    }
-    num_np_open = 0;
-    num_np_up = 0;
-    if (phase != PHASE_DEAD)
-       phase = PHASE_TERMINATE;
-}
-
-/*
- * The link is established.
- * Proceed to the Dead, Authenticate or Network phase as appropriate.
- */
-void
-link_established(int unit)
-{
-    int auth;
-    lcp_options *wo = &lcp_wantoptions[unit];
-    lcp_options *go = &lcp_gotoptions[unit];
-    lcp_options *ho = &lcp_hisoptions[unit];
-    int i;
-    struct protent *protp;
-
-    /*
-     * Tell higher-level protocols that LCP is up.
-     */
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-        if (protp->protocol != PPP_LCP && protp->enabled_flag
-           && protp->lowerup != NULL)
-           (*protp->lowerup)(unit);
-
-    if (auth_required && !(go->neg_chap || go->neg_upap)) {
-       /*
-        * We wanted the peer to authenticate itself, and it refused:
-        * treat it as though it authenticated with PAP using a username
-        * of "" and a password of "".  If that's not OK, boot it out.
-        */
-       if (!wo->neg_upap || !null_login(unit)) {
-           syslog(LOG_WARNING, "peer refused to authenticate");
-           lcp_close(unit, "peer refused to authenticate");
-           return;
-       }
-    }
-
-    phase = PHASE_AUTHENTICATE;
-    auth = 0;
-    if (go->neg_chap) {
-       ChapAuthPeer(unit, our_name, go->chap_mdtype);
-       auth |= CHAP_PEER;
-    } else if (go->neg_upap) {
-       upap_authpeer(unit);
-       auth |= PAP_PEER;
-    }
-    if (ho->neg_chap) {
-       ChapAuthWithPeer(unit, user, ho->chap_mdtype);
-       auth |= CHAP_WITHPEER;
-    } else if (ho->neg_upap) {
-       if (passwd[0] == 0) {
-           passwd_from_file = 1;
-           if (!get_pap_passwd(passwd))
-               syslog(LOG_ERR, "No secret found for PAP login");
-       }
-       upap_authwithpeer(unit, user, passwd);
-       auth |= PAP_WITHPEER;
-    }
-    auth_pending[unit] = auth;
-
-    if (!auth)
-       network_phase(unit);
-}
-
-/*
- * Proceed to the network phase.
- */
-static void
-network_phase(int unit)
-{
-    int i;
-    struct protent *protp;
-    lcp_options *go = &lcp_gotoptions[unit];
-
-    /*
-     * If the peer had to authenticate, run the auth-up script now.
-     */
-    if ((go->neg_chap || go->neg_upap) && !did_authup) {
-       auth_script(_PATH_AUTHUP);
-       did_authup = 1;
-    }
-
-#ifdef CBCP_SUPPORT
-    /*
-     * If we negotiated callback, do it now.
-     */
-    if (go->neg_cbcp) {
-       phase = PHASE_CALLBACK;
-       (*cbcp_protent.open)(unit);
-       return;
-    }
-#endif
-
-    phase = PHASE_NETWORK;
-#if 0
-    if (!demand)
-       set_filters(&pass_filter, &active_filter);
-#endif
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-        if (protp->protocol < 0xC000 && protp->enabled_flag
-           && protp->open != NULL) {
-           (*protp->open)(unit);
-           if (protp->protocol != PPP_CCP)
-               ++num_np_open;
-       }
-
-    if (num_np_open == 0)
-       /* nothing to do */
-       lcp_close(0, "No network protocols running");
-}
-
-/*
- * The peer has failed to authenticate himself using `protocol'.
- */
-void
-auth_peer_fail(int unit, int protocol)
-{
-    /*
-     * Authentication failure: take the link down
-     */
-    lcp_close(unit, "Authentication failed");
-}
-
-/*
- * The peer has been successfully authenticated using `protocol'.
- */
-void
-auth_peer_success(int unit, int protocol, char *name, int namelen)
-{
-    int bit;
-
-    switch (protocol) {
-    case PPP_CHAP:
-       bit = CHAP_PEER;
-       break;
-    case PPP_PAP:
-       bit = PAP_PEER;
-       break;
-    default:
-       syslog(LOG_WARNING, "auth_peer_success: unknown protocol %x",
-              protocol);
-       return;
-    }
-
-    /*
-     * Save the authenticated name of the peer for later.
-     */
-    if (namelen > sizeof(peer_authname) - 1)
-       namelen = sizeof(peer_authname) - 1;
-    BCOPY(name, peer_authname, namelen);
-    peer_authname[namelen] = 0;
-
-    /*
-     * If we have overridden addresses based on auth info
-     * then set that information now before continuing.
-     */
-    auth_set_ip_addr(unit);
-
-    script_setenv("PEERNAME", peer_authname);
-
-    /*
-     * If there is no more authentication still to be done,
-     * proceed to the network (or callback) phase.
-     */
-    if ((auth_pending[unit] &= ~bit) == 0)
-        network_phase(unit);
-}
-
-/*
- * We have failed to authenticate ourselves to the peer using `protocol'.
- */
-void
-auth_withpeer_fail(int unit, int protocol)
-{
-    if (passwd_from_file)
-       BZERO(passwd, MAXSECRETLEN);
-    /*
-     * We've failed to authenticate ourselves to our peer.
-     * He'll probably take the link down, and there's not much
-     * we can do except wait for that.
-     */
-}
-
-/*
- * We have successfully authenticated ourselves with the peer using `protocol'.
- */
-void
-auth_withpeer_success(int unit, int protocol)
-{
-    int bit;
-
-    switch (protocol) {
-    case PPP_CHAP:
-       bit = CHAP_WITHPEER;
-       break;
-    case PPP_PAP:
-       if (passwd_from_file)
-           BZERO(passwd, MAXSECRETLEN);
-       bit = PAP_WITHPEER;
-       break;
-    default:
-       syslog(LOG_WARNING, "auth_peer_success: unknown protocol %x",
-              protocol);
-       bit = 0;
-    }
-
-    /*
-     * If we have overridden addresses based on auth info
-     * then set that information now before continuing.
-     */
-    auth_set_ip_addr(unit);
-
-    /*
-     * If there is no more authentication still being done,
-     * proceed to the network (or callback) phase.
-     */
-    if ((auth_pending[unit] &= ~bit) == 0)
-       network_phase(unit);
-}
-
-
-/*
- * np_up - a network protocol has come up.
- */
-void
-np_up(int unit, int proto)
-{
-    if (num_np_up == 0) {
-       /*
-        * At this point we consider that the link has come up successfully.
-        */
-       need_holdoff = 0;
-
-       if (idle_time_limit > 0)
-           TIMEOUT(check_idle, NULL, idle_time_limit);
-
-       /*
-        * Set a timeout to close the connection once the maximum
-        * connect time has expired.
-        */
-       if (maxconnect > 0)
-           TIMEOUT(connect_time_expired, 0, maxconnect);
-
-       /*
-        * Detach now, if the updetach option was given.
-        */
-       if (nodetach == -1)
-           detach();
-    }
-    ++num_np_up;
-}
-
-/*
- * np_down - a network protocol has gone down.
- */
-void
-np_down(int unit, int proto)
-{
-    if (--num_np_up == 0 && idle_time_limit > 0) {
-       UNTIMEOUT(check_idle, NULL);
-    }
-}
-
-/*
- * np_finished - a network protocol has finished using the link.
- */
-void
-np_finished(int unit, int proto)
-{
-    if (--num_np_open <= 0) {
-       /* no further use for the link: shut up shop. */
-       lcp_close(0, "No network protocols running");
-    }
-}
-
-/*
- * check_idle - check whether the link has been idle for long
- * enough that we can shut it down.
- */
-static void
-check_idle(void *arg)
-{
-    struct ppp_idle idle;
-    time_t itime;
-
-    if (!get_idle_time(0, &idle))
-       return;
-    itime = MIN(idle.xmit_idle, idle.recv_idle);
-    if (itime >= idle_time_limit) {
-       /* link is idle: shut it down. */
-       syslog(LOG_INFO, "Terminating connection due to lack of activity.");
-       lcp_close(0, "Link inactive");
-    } else {
-       TIMEOUT(check_idle, NULL, idle_time_limit - itime);
-    }
-}
-
-/*
- * connect_time_expired - log a message and close the connection.
- */
-static void
-connect_time_expired(void *arg)
-{
-    syslog(LOG_INFO, "Connect time expired");
-    lcp_close(0, "Connect time expired");      /* Close connection */
-}
-
-/*
- * auth_check_options - called to check authentication options.
- */
-void
-auth_check_options(void)
-{
-    lcp_options *wo = &lcp_wantoptions[0];
-    int can_auth;
-    ipcp_options *ipwo = &ipcp_wantoptions[0];
-    u_int32_t remote;
-
-    /* Default our_name to hostname, and user to our_name */
-    if (our_name[0] == 0 || usehostname)
-       strcpy(our_name, hostname);
-    if (user[0] == 0)
-       strcpy(user, our_name);
-
-    /* If authentication is required, ask peer for CHAP or PAP. */
-    if (auth_required && !wo->neg_chap && !wo->neg_upap) {
-       wo->neg_chap = 1;
-       wo->neg_upap = 1;
-    }
-
-    /*
-     * Check whether we have appropriate secrets to use
-     * to authenticate the peer.
-     */
-    can_auth = wo->neg_upap && (uselogin || have_pap_secret());
-    if (!can_auth && wo->neg_chap) {
-       remote = ipwo->accept_remote? 0: ipwo->hisaddr;
-       can_auth = have_chap_secret(remote_name, our_name, remote);
-    }
-
-    if (auth_required && !can_auth) {
-       option_error("peer authentication required but no suitable secret(s) found\n");
-       if (remote_name[0] == 0)
-           option_error("for authenticating any peer to us (%s)\n", our_name);
-       else
-           option_error("for authenticating peer %s to us (%s)\n",
-                        remote_name, our_name);
-       exit(1);
-    }
-
-    /*
-     * Check whether the user tried to override certain values
-     * set by root.
-     */
-    if (!auth_required && auth_req_info.priv > 0) {
-       if (!default_device && devnam_info.priv == 0) {
-           option_error("can't override device name when noauth option used");
-           exit(1);
-       }
-       if ((connector != NULL && connector_info.priv == 0)
-           || (disconnector != NULL && disconnector_info.priv == 0)
-           || (welcomer != NULL && welcomer_info.priv == 0)) {
-           option_error("can't override connect, disconnect or welcome");
-           option_error("option values when noauth option used");
-           exit(1);
-       }
-    }
-}
-
-/*
- * auth_reset - called when LCP is starting negotiations to recheck
- * authentication options, i.e. whether we have appropriate secrets
- * to use for authenticating ourselves and/or the peer.
- */
-void
-auth_reset(int unit)
-{
-    lcp_options *go = &lcp_gotoptions[unit];
-    lcp_options *ao = &lcp_allowoptions[0];
-    ipcp_options *ipwo = &ipcp_wantoptions[0];
-    u_int32_t remote;
-
-    ao->neg_upap = !refuse_pap && (passwd[0] != 0 || get_pap_passwd(NULL));
-    ao->neg_chap = !refuse_chap
-       && have_chap_secret(user, remote_name, (u_int32_t)0);
-
-    if (go->neg_upap && !uselogin && !have_pap_secret())
-       go->neg_upap = 0;
-    if (go->neg_chap) {
-       remote = ipwo->accept_remote? 0: ipwo->hisaddr;
-       if (!have_chap_secret(remote_name, our_name, remote))
-           go->neg_chap = 0;
-    }
-}
-
-
-/*
- * check_passwd - Check the user name and passwd against the PAP secrets
- * file.  If requested, also check against the system password database,
- * and login the user if OK.
- *
- * returns:
- *     UPAP_AUTHNAK: Authentication failed.
- *     UPAP_AUTHACK: Authentication succeeded.
- * In either case, msg points to an appropriate message.
- */
-int
-check_passwd(int unit, char *auser, int userlen, char *apasswd, int passwdlen,
-            char **msg, int *msglen)
-{
-    int ret;
-    char *filename;
-    FILE *f;
-    struct wordlist *addrs;
-    u_int32_t remote;
-    ipcp_options *ipwo = &ipcp_wantoptions[unit];
-    char passwd[256], user[256];
-    char secret[MAXWORDLEN];
-    static int attempts = 0;
-    int len;
-    char *cryptpw;
-
-    /*
-     * Make copies of apasswd and auser, then null-terminate them.
-     */
-    len = MIN(passwdlen, sizeof(passwd) - 1);
-    BCOPY(apasswd, passwd, len);
-    passwd[len] = '\0';
-    len = MIN(userlen, sizeof(user) - 1);
-    BCOPY(auser, user, len);
-    user[len] = '\0';
-    *msg = NULL;
-
-    /*
-     * Open the file of pap secrets and scan for a suitable secret
-     * for authenticating this user.
-     */
-    filename = _PATH_UPAPFILE;
-    addrs = NULL;
-    ret = UPAP_AUTHACK;
-    f = fopen(filename, "r");
-    if (f == NULL) {
-       syslog(LOG_ERR, "Can't open PAP password file %s: %m", filename);
-       ret = UPAP_AUTHNAK;
-
-    } else {
-       check_access(f, filename);
-       remote = ipwo->accept_remote? 0: ipwo->hisaddr;
-       if (scan_authfile(f, user, our_name, remote,
-           secret, &addrs, filename) < 0) {
-               warn("no PAP secret found for %s", user);
-       } else {
-           if (secret[0] != 0) {
-               /* password given in pap-secrets - must match */
-               cryptpw = crypt(passwd, secret);
-
-               if ((cryptpap || strcmp(passwd, secret) != 0)
-                   && (cryptpw == NULL || strcmp(cryptpw, secret) != 0)) {
-                       ret = UPAP_AUTHNAK;
-                       warn("PAP authentication failure for %s", user);
-               }
-           }
-       }
-       fclose(f);
-    }
-
-    if (uselogin && ret == UPAP_AUTHACK) {
-       ret = plogin(user, passwd, msg, msglen);
-       if (ret == UPAP_AUTHNAK) {
-           syslog(LOG_WARNING, "PAP login failure for %s", user);
-       }
-    }
-
-    if (ret == UPAP_AUTHNAK) {
-        if (*msg == NULL)
-           *msg = "Login incorrect";
-       *msglen = strlen(*msg);
-       /*
-        * Frustrate passwd stealer programs.
-        * Allow 10 tries, but start backing off after 3 (stolen from login).
-        * On 10'th, drop the connection.
-        */
-       if (attempts++ >= 10) {
-           syslog(LOG_WARNING, "%d LOGIN FAILURES ON %s, %s",
-                  attempts, devnam, user);
-           quit();
-       }
-       if (attempts > 3)
-           sleep((u_int) (attempts - 3) * 5);
-       if (addrs != NULL)
-           free_wordlist(addrs);
-
-    } else {
-       attempts = 0;                   /* Reset count */
-       if (*msg == NULL)
-           *msg = "Login ok";
-       *msglen = strlen(*msg);
-       set_allowed_addrs(unit, addrs);
-    }
-
-    BZERO(passwd, sizeof(passwd));
-    BZERO(secret, sizeof(secret));
-
-    return ret;
-}
-
-/*
- * Check if an "entry" is in the file "fname" - used by ppplogin.
- * Taken from libexec/ftpd/ftpd.c
- * Returns: 0 if not found, 1 if found, 2 if file can't be opened for reading.
- */
-static int
-checkfile(char *fname, char *name)
-{
-       FILE *fd;
-       int found = 0;
-       char *p, line[BUFSIZ];
-
-       if ((fd = fopen(fname, "r")) != NULL) {
-               while (fgets(line, sizeof(line), fd) != NULL)
-                       if ((p = strchr(line, '\n')) != NULL) {
-                               *p = '\0';
-                               if (line[0] == '#')
-                                       continue;
-                               if (strcmp(line, name) == 0) {
-                                       found = 1;
-                                       break;
-                               }
-                       }
-               fclose(fd);
-       } else {
-               return(2);
-       }
-       return (found);
-}
-
-/*
- * This function is needed for PAM.
- */
-
-#ifdef USE_PAM
-static char *PAM_username = "";
-static char *PAM_password = "";
-
-#ifdef PAM_ESTABLISH_CRED       /* new PAM defines :(^ */
-#define MY_PAM_STRERROR(err_code)  (char *) pam_strerror(pamh,err_code)
-#else
-#define MY_PAM_STRERROR(err_code)  (char *) pam_strerror(err_code)
-#endif
-
-static int pam_conv (int num_msg,
-                     const struct pam_message **msg,
-                     struct pam_response **resp,
-                     void *appdata_ptr)
-{
-    int count = 0, replies = 0;
-    struct pam_response *reply = NULL;
-    int size = 0;
-
-    for (count = 0; count < num_msg; count++)
-      {
-       size += sizeof (struct pam_response);
-       reply = realloc (reply, size); /* ANSI: is malloc() if reply==NULL */
-       if (!reply)
-           return PAM_CONV_ERR;
-
-       switch (msg[count]->msg_style)
-         {
-       case PAM_PROMPT_ECHO_ON:
-           reply[replies].resp_retcode = PAM_SUCCESS;
-           reply[replies++].resp = strdup(PAM_username); /* never NULL */
-           break;
-
-       case PAM_PROMPT_ECHO_OFF:
-           reply[replies].resp_retcode = PAM_SUCCESS;
-           reply[replies++].resp = strdup(PAM_password); /* never NULL */
-           break;
-
-       case PAM_TEXT_INFO:
-           reply[replies].resp_retcode = PAM_SUCCESS;
-           reply[replies++].resp = NULL;
-           break;
-
-       case PAM_ERROR_MSG:
-       default:
-           free (reply);
-           return PAM_CONV_ERR;
-         }
-      }
-
-    if (resp)
-        *resp = reply;
-    else
-        free (reply);
-
-    return PAM_SUCCESS;
-}
-#endif
-
-/*
- * plogin - Check the user name and password against the system
- * password database, and login the user if OK.
- *
- * returns:
- *     UPAP_AUTHNAK: Login failed.
- *     UPAP_AUTHACK: Login succeeded.
- * In either case, msg points to an appropriate message.
- *
- * UPAP_AUTHACK should only be returned *after* wtmp and utmp are updated.
- */
-
-static int
-plogin(char *user, char *passwd, char **msg, int *msglen)
-{
-
-#ifdef USE_PAM
-
-    struct pam_conv pam_conversation;
-    pam_handle_t *pamh;
-    int pam_error;
-/*
- * Fill the pam_conversion structure
- */
-    memset (&pam_conversation, '\0', sizeof (struct pam_conv));
-    pam_conversation.conv = &pam_conv;
-
-    pam_error = pam_start ("ppp", user, &pam_conversation, &pamh);
-
-    if (pam_error != PAM_SUCCESS) {
-        *msg = MY_PAM_STRERROR (pam_error);
-       return UPAP_AUTHNAK;
-    }
-/*
- * Define the fields for the credintial validation
- */
-    pam_set_item (pamh, PAM_TTY, devnam);
-    PAM_username = user;
-    PAM_password = passwd;
-/*
- * Validate the user
- */
-    pam_error = pam_authenticate (pamh, PAM_SILENT);
-    if (pam_error == PAM_SUCCESS) {
-        pam_error = pam_acct_mgmt (pamh, PAM_SILENT);
-
-       /* start a session for this user. Session closed when link ends. */
-       if (pam_error == PAM_SUCCESS)
-          pam_open_session (pamh, PAM_SILENT);
-    }
-
-    *msg = MY_PAM_STRERROR (pam_error);
-
-    PAM_username =
-    PAM_password = "";
-/*
- * Clean up the mess
- */
-    pam_end (pamh, pam_error);
-
-    if (pam_error != PAM_SUCCESS)
-        return UPAP_AUTHNAK;
-/*
- * Use the non-PAM methods directly
- */
-#else /* #ifdef USE_PAM */
-
-    struct passwd *pw;
-    struct utmp utmp;
-    struct timeval tp;
-    char *tty, *cryptpw;
-
-#ifdef HAS_SHADOW
-    struct spwd *spwd;
-    struct spwd *getspnam();
-#endif
-
-    pw = getpwnam(user);
-    endpwent();
-    if (pw == NULL) {
-       return (UPAP_AUTHNAK);
-    }
-/*
- * Check that the user is not listed in /etc/ppp/ppp.deny
- * and that the user's shell is listed in /etc/ppp/ppp.shells
- * if /etc/ppp/ppp.shells exists.
- */
-
-    if (checkfile(_PATH_PPPDENY, user) == 1) {
-               syslog(LOG_WARNING, "upap user %s: login denied in %s",
-                       user, _PATH_PPPDENY);
-               return (UPAP_AUTHNAK);
-    }
-
-    if (checkfile(_PATH_PPPSHELLS, pw->pw_shell) == 0) {
-               syslog(LOG_WARNING, "upap user %s: shell %s not in %s",
-                       user, pw->pw_shell, _PATH_PPPSHELLS);
-               return (UPAP_AUTHNAK);
-    }
-
-#ifdef HAS_SHADOW
-    spwd = getspnam(user);
-    endspent();
-    if (spwd) {
-       /* check the age of the password entry */
-       long now = time(NULL) / 86400L;
-
-       if ((spwd->sp_expire > 0 && now >= spwd->sp_expire)
-           || ((spwd->sp_max >= 0 && spwd->sp_max < 10000)
-               && spwd->sp_lstchg >= 0
-               && now >= spwd->sp_lstchg + spwd->sp_max)) {
-           syslog(LOG_WARNING, "Password for %s has expired", user);
-           return (UPAP_AUTHNAK);
-       }
-       pw->pw_passwd = spwd->sp_pwdp;
-    }
-#endif
-
-    /*
-     * If no passwd, don't let them login.
-     */
-    if (pw->pw_passwd == NULL || *pw->pw_passwd == '\0' || passwd == NULL)
-       return (UPAP_AUTHNAK);
-    cryptpw = crypt(passwd, pw->pw_passwd);
-    if (cryptpw == NULL || strcmp(cryptpw, pw->pw_passwd) != 0)
-       return (UPAP_AUTHNAK);
-
-    if (pw->pw_expire) {
-       gettimeofday(&tp, NULL);
-       if (tp.tv_sec >= pw->pw_expire) {
-           syslog(LOG_INFO, "pap user %s account expired", user);
-           return (UPAP_AUTHNAK);
-       }
-    }
-
-    /* These functions are not enabled for PAM. The reason for this is that */
-    /* there is not necessarily a "passwd" entry for this user. That is     */
-    /* real purpose of 'PAM' -- to virtualize the account data from the     */
-    /* application. If you want to do the same thing, write the entry in    */
-    /* the 'session' hook.                                                  */
-
-    /* Log in wtmp and utmp using login() */
-
-    tty = devnam;
-    if (strncmp(tty, _PATH_DEV, sizeof _PATH_DEV - 1) == 0)
-       tty += 5;
-
-    if (logout(tty))           /* Already entered (by login?) */
-        logwtmp(tty, "", "");
-
-#if defined(_PATH_LASTLOG)
-    {
-           struct lastlog ll;
-           int fd;
-
-           if ((fd = open(_PATH_LASTLOG, O_RDWR, 0)) >= 0) {
-               lseek(fd, (off_t)(pw->pw_uid * sizeof(ll)), SEEK_SET);
-               memset((void *)&ll, 0, sizeof(ll));
-               time(&ll.ll_time);
-               strncpy(ll.ll_line, tty, sizeof(ll.ll_line));
-               write(fd, (char *)&ll, sizeof(ll));
-               close(fd);
-           }
-    }
-#endif
-
-    memset((void *)&utmp, 0, sizeof(utmp));
-    time(&utmp.ut_time);
-    strncpy(utmp.ut_name, user, sizeof(utmp.ut_name));
-    strncpy(utmp.ut_host, ":PPP", sizeof(utmp.ut_host));
-    strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
-    login(&utmp);              /* This logs us in wtmp too */
-
-#endif /* #ifdef USE_PAM */
-
-    syslog(LOG_INFO, "user %s logged in", user);
-    logged_in = TRUE;
-
-    return (UPAP_AUTHACK);
-}
-
-/*
- * plogout - Logout the user.
- */
-static void
-plogout(void)
-{
-#ifdef USE_PAM
-    struct pam_conv pam_conversation;
-    pam_handle_t *pamh;
-    int pam_error;
-/*
- * Fill the pam_conversion structure. The PAM specification states that the
- * session must be able to be closed by a totally different handle from which
- * it was created. Hold the PAM group to their own specification!
- */
-    memset (&pam_conversation, '\0', sizeof (struct pam_conv));
-    pam_conversation.conv = &pam_conv;
-
-    pam_error = pam_start ("ppp", user, &pam_conversation, &pamh);
-    if (pam_error == PAM_SUCCESS) {
-        pam_set_item (pamh, PAM_TTY, devnam);
-        pam_close_session (pamh, PAM_SILENT);
-       pam_end (pamh, PAM_SUCCESS);
-    }
-
-#else
-    char *tty;
-
-    tty = devnam;
-    if (strncmp(tty, _PATH_DEV, sizeof _PATH_DEV - 1) == 0)
-       tty += 5;
-    logwtmp(tty, "", "");              /* Wipe out wtmp logout entry */
-    logout(tty);                       /* Wipe out utmp */
-#endif
-
-    logged_in = FALSE;
-}
-
-
-/*
- * null_login - Check if a username of "" and a password of "" are
- * acceptable, and iff so, set the list of acceptable IP addresses
- * and return 1.
- */
-static int
-null_login(int unit)
-{
-    char *filename;
-    FILE *f;
-    int i, ret;
-    struct wordlist *addrs;
-    char secret[MAXWORDLEN];
-
-    /*
-     * Open the file of pap secrets and scan for a suitable secret.
-     * We don't accept a wildcard client.
-     */
-    filename = _PATH_UPAPFILE;
-    addrs = NULL;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-    check_access(f, filename);
-
-    i = scan_authfile(f, "", our_name, (u_int32_t)0, secret, &addrs, filename);
-    ret = i >= 0 && (i & NONWILD_CLIENT) != 0 && secret[0] == 0;
-    BZERO(secret, sizeof(secret));
-
-    if (ret)
-       set_allowed_addrs(unit, addrs);
-    else
-       free_wordlist(addrs);
-
-    fclose(f);
-    return ret;
-}
-
-
-/*
- * get_pap_passwd - get a password for authenticating ourselves with
- * our peer using PAP.  Returns 1 on success, 0 if no suitable password
- * could be found.
- */
-static int
-get_pap_passwd(char *passwd)
-{
-    char *filename;
-    FILE *f;
-    int ret;
-    struct wordlist *addrs;
-    char secret[MAXWORDLEN];
-
-    filename = _PATH_UPAPFILE;
-    addrs = NULL;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-    check_access(f, filename);
-    ret = scan_authfile(f, user,
-                       remote_name[0]? remote_name: NULL,
-                       (u_int32_t)0, secret, NULL, filename);
-    fclose(f);
-    if (ret < 0)
-       return 0;
-    if (passwd != NULL) {
-       strncpy(passwd, secret, MAXSECRETLEN);
-       passwd[MAXSECRETLEN-1] = 0;
-    }
-    BZERO(secret, sizeof(secret));
-    return 1;
-}
-
-
-/*
- * have_pap_secret - check whether we have a PAP file with any
- * secrets that we could possibly use for authenticating the peer.
- */
-static int
-have_pap_secret(void)
-{
-    FILE *f;
-    int ret;
-    char *filename;
-    ipcp_options *ipwo = &ipcp_wantoptions[0];
-    u_int32_t remote;
-
-    filename = _PATH_UPAPFILE;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-
-    remote = ipwo->accept_remote? 0: ipwo->hisaddr;
-    ret = scan_authfile(f, NULL, our_name, remote, NULL, NULL, filename);
-    fclose(f);
-    if (ret < 0)
-       return 0;
-
-    return 1;
-}
-
-
-/*
- * have_chap_secret - check whether we have a CHAP file with a
- * secret that we could possibly use for authenticating `client'
- * on `server'.  Either can be the null string, meaning we don't
- * know the identity yet.
- */
-static int
-have_chap_secret(char *client, char *server, u_int32_t remote)
-{
-    FILE *f;
-    int ret;
-    char *filename;
-
-    filename = _PATH_CHAPFILE;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-
-    if (client[0] == 0)
-       client = NULL;
-    else if (server[0] == 0)
-       server = NULL;
-
-    ret = scan_authfile(f, client, server, remote, NULL, NULL, filename);
-    fclose(f);
-    if (ret < 0)
-       return 0;
-
-    return 1;
-}
-
-
-/*
- * get_secret - open the CHAP secret file and return the secret
- * for authenticating the given client on the given server.
- * (We could be either client or server).
- */
-int
-get_secret(int unit, char *client, char *server, char *secret, int *secret_len,
-          int save_addrs)
-{
-    FILE *f;
-    int ret, len;
-    char *filename;
-    struct wordlist *addrs;
-    char secbuf[MAXWORDLEN];
-
-    filename = _PATH_CHAPFILE;
-    addrs = NULL;
-    secbuf[0] = 0;
-
-    f = fopen(filename, "r");
-    if (f == NULL) {
-       syslog(LOG_ERR, "Can't open chap secret file %s: %m", filename);
-       return 0;
-    }
-    check_access(f, filename);
-
-    ret = scan_authfile(f, client, server, (u_int32_t)0,
-                       secbuf, &addrs, filename);
-    fclose(f);
-    if (ret < 0)
-       return 0;
-
-    if (save_addrs)
-       set_allowed_addrs(unit, addrs);
-
-    len = strlen(secbuf);
-    if (len > MAXSECRETLEN) {
-       syslog(LOG_ERR, "Secret for %s on %s is too long", client, server);
-       len = MAXSECRETLEN;
-    }
-    BCOPY(secbuf, secret, len);
-    BZERO(secbuf, sizeof(secbuf));
-    *secret_len = len;
-
-    return 1;
-}
-
-/*
- * set_allowed_addrs() - set the list of allowed addresses.
- */
-static void
-set_allowed_addrs(int unit, struct wordlist *addrs)
-{
-    if (addresses[unit] != NULL)
-       free_wordlist(addresses[unit]);
-    addresses[unit] = addrs;
-
-    /*
-     * If there's only one authorized address we might as well
-     * ask our peer for that one right away
-     */
-    if (addrs != NULL && addrs->next == NULL) {
-       char *p = addrs->word;
-       struct ipcp_options *wo = &ipcp_wantoptions[unit];
-       u_int32_t a;
-       struct hostent *hp;
-
-       if (*p != '!' && *p != '-' && strchr(p, '/') == NULL) {
-           hp = gethostbyname(p);
-           if (hp != NULL && hp->h_addrtype == AF_INET)
-               a = *(u_int32_t *)hp->h_addr;
-           else
-               a = inet_addr(p);
-           if (a != (u_int32_t) -1)
-               wo->hisaddr = a;
-       }
-    }
-}
-
-static void
-auth_set_ip_addr(int unit)
-{
-    struct wordlist *addrs;
-
-    if (non_wildclient && (addrs = addresses[unit]) != NULL) {
-       for (; addrs != NULL; addrs = addrs->next) {
-           /* Look for address overrides, and set them if we have any */
-           if (strchr(addrs->word, ':') != NULL) {
-               if (setipaddr(addrs->word))
-                   break;
-           }
-       }
-    }
-}
-
-/*
- * auth_ip_addr - check whether the peer is authorized to use
- * a given IP address.  Returns 1 if authorized, 0 otherwise.
- */
-int
-auth_ip_addr(int unit, u_int32_t addr)
-{
-    return ip_addr_check(addr, addresses[unit]);
-}
-
-static int
-ip_addr_check(u_int32_t addr, struct wordlist *addrs)
-{
-    int x, y;
-    u_int32_t a, mask, ah;
-    int accept;
-    char *ptr_word, *ptr_mask;
-    struct hostent *hp;
-    struct netent *np;
-
-    /* don't allow loopback or multicast address */
-    if (bad_ip_adrs(addr))
-       return 0;
-
-    if (addrs == NULL)
-       return !auth_required;          /* no addresses authorized */
-
-    x = y = 0;
-    for (; addrs != NULL; addrs = addrs->next) {
-       y++;
-       /* "-" means no addresses authorized, "*" means any address allowed */
-       ptr_word = addrs->word;
-       if (strcmp(ptr_word, "-") == 0)
-           break;
-       if (strcmp(ptr_word, "*") == 0)
-           return 1;
-
-       /*
-        * A colon in the string means that we wish to force a specific
-        * local:remote address, but we ignore these for now.
-        */
-       if (strchr(addrs->word, ':') != NULL)
-           x++;
-       else {
-
-       accept = 1;
-       if (*ptr_word == '!') {
-           accept = 0;
-           ++ptr_word;
-       }
-
-       mask = ~ (u_int32_t) 0;
-       ptr_mask = strchr (ptr_word, '/');
-       if (ptr_mask != NULL) {
-           int bit_count;
-
-           bit_count = (int) strtol (ptr_mask+1, NULL, 10);
-           if (bit_count <= 0 || bit_count > 32) {
-               syslog (LOG_WARNING,
-                       "invalid address length %s in auth. address list",
-                       ptr_mask);
-               continue;
-           }
-           *ptr_mask = '\0';
-           mask <<= 32 - bit_count;
-       }
-
-       hp = gethostbyname(ptr_word);
-       if (hp != NULL && hp->h_addrtype == AF_INET) {
-           a = *(u_int32_t *)hp->h_addr;
-       } else {
-           np = getnetbyname (ptr_word);
-           if (np != NULL && np->n_addrtype == AF_INET) {
-               a = htonl (np->n_net);
-               if (ptr_mask == NULL) {
-                   /* calculate appropriate mask for net */
-                   ah = ntohl(a);
-                   if (IN_CLASSA(ah))
-                       mask = IN_CLASSA_NET;
-                   else if (IN_CLASSB(ah))
-                       mask = IN_CLASSB_NET;
-                   else if (IN_CLASSC(ah))
-                       mask = IN_CLASSC_NET;
-               }
-           } else {
-               a = inet_addr (ptr_word);
-           }
-       }
-
-       if (ptr_mask != NULL)
-           *ptr_mask = '/';
-
-       if (a == (u_int32_t)-1L)
-           syslog (LOG_WARNING,
-                   "unknown host %s in auth. address list",
-                   addrs->word);
-       else
-           /* Here a and addr are in network byte order,
-              and mask is in host order. */
-           if (((addr ^ a) & htonl(mask)) == 0)
-               return accept;
-    }  /* else */
-    }
-    return x == y;                     /* not in list => can't have it */
-}
-
-/*
- * bad_ip_adrs - return 1 if the IP address is one we don't want
- * to use, such as an address in the loopback net or a multicast address.
- * addr is in network byte order.
- */
-int
-bad_ip_adrs(u_int32_t addr)
-{
-    addr = ntohl(addr);
-    return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
-       || IN_MULTICAST(addr) || IN_BADCLASS(addr);
-}
-
-/*
- * check_access - complain if a secret file has too-liberal permissions.
- */
-void
-check_access(FILE *f, char *filename)
-{
-    struct stat sbuf;
-
-    if (fstat(fileno(f), &sbuf) < 0) {
-       syslog(LOG_WARNING, "cannot stat secret file %s: %m", filename);
-    } else if ((sbuf.st_mode & (S_IRWXG | S_IRWXO)) != 0) {
-       syslog(LOG_WARNING, "Warning - secret file %s has world and/or group access", filename);
-    }
-}
-
-
-/*
- * scan_authfile - Scan an authorization file for a secret suitable
- * for authenticating `client' on `server'.  The return value is -1
- * if no secret is found, otherwise >= 0.  The return value has
- * NONWILD_CLIENT set if the secret didn't have "*" for the client, and
- * NONWILD_SERVER set if the secret didn't have "*" for the server.
- * Any following words on the line (i.e. address authorization
- * info) are placed in a wordlist and returned in *addrs.  
- */
-static int
-scan_authfile(FILE *f, char *client, char *server, u_int32_t ipaddr,
-             char *secret, struct wordlist **addrs, char *filename)
-{
-    int newline, xxx;
-    int got_flag, best_flag;
-    FILE *sf;
-    struct wordlist *ap, *addr_list, *alist, *alast;
-    char word[MAXWORDLEN];
-    char atfile[MAXWORDLEN];
-    char lsecret[MAXWORDLEN];
-
-    if (addrs != NULL)
-       *addrs = NULL;
-    addr_list = NULL;
-    if (!getword(f, word, &newline, filename))
-       return -1;              /* file is empty??? */
-    newline = 1;
-    best_flag = -1;
-    for (;;) {
-       /*
-        * Skip until we find a word at the start of a line.
-        */
-       while (!newline && getword(f, word, &newline, filename))
-           ;
-       if (!newline)
-           break;              /* got to end of file */
-
-       /*
-        * Got a client - check if it's a match or a wildcard.
-        */
-       got_flag = 0;
-       if (client != NULL && strcmp(word, client) != 0 && !ISWILD(word)) {
-           newline = 0;
-           continue;
-       }
-       if (!ISWILD(word))
-           got_flag = NONWILD_CLIENT;
-
-       /*
-        * Now get a server and check if it matches.
-        */
-       if (!getword(f, word, &newline, filename))
-           break;
-       if (newline)
-           continue;
-       if (server != NULL && strcmp(word, server) != 0 && !ISWILD(word))
-           continue;
-       if (!ISWILD(word))
-           got_flag |= NONWILD_SERVER;
-
-       /*
-        * Got some sort of a match - see if it's better than what
-        * we have already.
-        */
-       if (got_flag <= best_flag)
-           continue;
-
-       /*
-        * Get the secret.
-        */
-       if (!getword(f, word, &newline, filename))
-           break;
-       if (newline)
-           continue;
-
-       /*
-        * Special syntax: @filename means read secret from file.
-        */
-       if (word[0] == '@') {
-           strcpy(atfile, word+1);
-           if ((sf = fopen(atfile, "r")) == NULL) {
-               syslog(LOG_WARNING, "can't open indirect secret file %s",
-                      atfile);
-               continue;
-           }
-           check_access(sf, atfile);
-           if (!getword(sf, word, &xxx, atfile)) {
-               syslog(LOG_WARNING, "no secret in indirect secret file %s",
-                      atfile);
-               fclose(sf);
-               continue;
-           }
-           fclose(sf);
-       }
-       if (secret != NULL)
-           strcpy(lsecret, word);
-
-       /*
-        * Now read address authorization info and make a wordlist.
-        */
-       alist = alast = NULL;
-       for (;;) {
-           if (!getword(f, word, &newline, filename) || newline)
-               break;
-           ap = (struct wordlist *) malloc(sizeof(struct wordlist)
-                                           + strlen(word));
-           if (ap == NULL)
-               novm("authorized addresses");
-           ap->next = NULL;
-           strcpy(ap->word, word);
-           if (alist == NULL)
-               alist = ap;
-           else
-               alast->next = ap;
-           alast = ap;
-       }
-
-       /*
-        * Check if the given IP address is allowed by the wordlist.
-        */
-       if (ipaddr != 0 && !ip_addr_check(ipaddr, alist)) {
-           free_wordlist(alist);
-           continue;
-       }
-
-       /*
-        * This is the best so far; remember it.
-        */
-       best_flag = got_flag;
-       if (addr_list)
-           free_wordlist(addr_list);
-       addr_list = alist;
-       if (secret != NULL)
-           strcpy(secret, lsecret);
-
-       if (!newline)
-           break;
-    }
-
-    if (addrs != NULL)
-       *addrs = addr_list;
-    else if (addr_list != NULL)
-       free_wordlist(addr_list);
-
-    non_wildclient = (best_flag & NONWILD_CLIENT) && client != NULL &&
-      *client != '\0';
-    return best_flag;
-}
-
-/*
- * free_wordlist - release memory allocated for a wordlist.
- */
-static void
-free_wordlist(struct wordlist *wp)
-{
-    struct wordlist *next;
-
-    while (wp != NULL) {
-       next = wp->next;
-       free(wp);
-       wp = next;
-    }
-}
-
-/*
- * auth_script - execute a script with arguments
- * interface-name peer-name real-user tty speed
- */
-static void
-auth_script(char *script)
-{
-    char strspeed[32];
-    struct passwd *pw;
-    char struid[32];
-    char *user_name;
-    char *argv[8];
-
-    if ((pw = getpwuid(getuid())) != NULL && pw->pw_name != NULL)
-       user_name = pw->pw_name;
-    else {
-       sprintf(struid, "%d", getuid());
-       user_name = struid;
-    }
-    sprintf(strspeed, "%d", baud_rate);
-
-    argv[0] = script;
-    argv[1] = ifname;
-    argv[2] = peer_authname;
-    argv[3] = user_name;
-    argv[4] = devnam;
-    argv[5] = strspeed;
-    argv[6] = NULL;
-
-    run_program(script, argv, 0);
-}
diff --git a/usr.sbin/pppd/cbcp.c b/usr.sbin/pppd/cbcp.c
deleted file mode 100644 (file)
index 4ef23b0..0000000
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * cbcp - Call Back Configuration Protocol.
- *
- * Copyright (c) 1995 Pedro Roque Marques
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Pedro Roque Marques.  The name of the author may not be used to
- * endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $FreeBSD: src/usr.sbin/pppd/cbcp.c,v 1.4 1999/08/28 01:19:00 peter Exp $
- * $DragonFly: src/usr.sbin/pppd/cbcp.c,v 1.6 2005/11/24 23:42:54 swildner Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <syslog.h>
-
-#include "pppd.h"
-#include "cbcp.h"
-#include "fsm.h"
-#include "lcp.h"
-#include "ipcp.h"
-
-/*
- * Protocol entry points.
- */
-static void cbcp_init     (int unit);
-static void cbcp_open     (int unit);
-static void cbcp_lowerup  (int unit);
-static void cbcp_input    (int unit, u_char *pkt, int len);
-static void cbcp_protrej  (int unit);
-static int  cbcp_printpkt (u_char *pkt, int len,
-                               void (*printer)(void *, char *, ...),
-                               void *arg);
-
-struct protent cbcp_protent = {
-    PPP_CBCP,
-    cbcp_init,
-    cbcp_input,
-    cbcp_protrej,
-    cbcp_lowerup,
-    NULL,
-    cbcp_open,
-    NULL,
-    cbcp_printpkt,
-    NULL,
-    0,
-    "CBCP",
-    NULL,
-    NULL,
-    NULL
-};
-
-cbcp_state cbcp[NUM_PPP];      
-
-/* internal prototypes */
-
-static void cbcp_recvreq(cbcp_state *us, char *pckt, int len);
-static void cbcp_resp(cbcp_state *us);
-static void cbcp_up(cbcp_state *us);
-static void cbcp_recvack(cbcp_state *us, char *pckt, int len);
-static void cbcp_send(cbcp_state *us, u_char code, u_char *buf, int len);
-
-/* init state */
-static void
-cbcp_init(int iface)
-{
-    cbcp_state *us;
-
-    us = &cbcp[iface];
-    memset(us, 0, sizeof(cbcp_state));
-    us->us_unit = iface;
-    us->us_type |= (1 << CB_CONF_NO);
-}
-
-/* lower layer is up */
-static void
-cbcp_lowerup(int iface)
-{
-    cbcp_state *us = &cbcp[iface];
-
-    syslog(LOG_DEBUG, "cbcp_lowerup");
-    syslog(LOG_DEBUG, "want: %d", us->us_type);
-
-    if (us->us_type == CB_CONF_USER)
-        syslog(LOG_DEBUG, "phone no: %s", us->us_number);
-}
-
-static void
-cbcp_open(int unit)
-{
-    syslog(LOG_DEBUG, "cbcp_open");
-}
-
-/* process an incomming packet */
-static void
-cbcp_input(int unit, u_char *inpacket, int pktlen)
-{
-    u_char *inp;
-    u_char code, id;
-    u_short len;
-
-    cbcp_state *us = &cbcp[unit];
-
-    inp = inpacket;
-
-    if (pktlen < CBCP_MINLEN) {
-        syslog(LOG_ERR, "CBCP packet is too small");
-       return;
-    }
-
-    GETCHAR(code, inp);
-    GETCHAR(id, inp);
-    GETSHORT(len, inp);
-
-    if (len < CBCP_MINLEN || len > pktlen) {
-        syslog(LOG_ERR, "CBCP packet: invalid length");
-        return;
-    }
-
-    len -= CBCP_MINLEN;
-    switch(code) {
-    case CBCP_REQ:
-        us->us_id = id;
-       cbcp_recvreq(us, inp, len);
-       break;
-
-    case CBCP_RESP:
-       syslog(LOG_DEBUG, "CBCP_RESP received");
-       break;
-
-    case CBCP_ACK:
-       if (id != us->us_id)
-           syslog(LOG_DEBUG, "id doesn't match: expected %d recv %d",
-                  us->us_id, id);
-
-       cbcp_recvack(us, inp, len);
-       break;
-
-    default:
-       break;
-    }
-}
-
-/* protocol was rejected by foe */
-void
-cbcp_protrej(int iface)
-{
-}
-
-char *cbcp_codenames[] = {
-    "Request", "Response", "Ack"
-};
-
-char *cbcp_optionnames[] = {
-    "NoCallback",
-    "UserDefined",
-    "AdminDefined",
-    "List"
-};
-
-/* pretty print a packet */
-static int
-cbcp_printpkt(u_char *p, int plen, void (*printer)(void *, char *, ...),
-             void *arg)
-{
-    int code, opt, id, len, olen, delay;
-    u_char *pstart;
-
-    if (plen < HEADERLEN)
-       return 0;
-    pstart = p;
-    GETCHAR(code, p);
-    GETCHAR(id, p);
-    GETSHORT(len, p);
-    if (len < HEADERLEN || len > plen)
-       return 0;
-
-    if (code >= 1 && code <= sizeof(cbcp_codenames) / sizeof(char *))
-       printer(arg, " %s", cbcp_codenames[code-1]);
-    else
-       printer(arg, " code=0x%x", code); 
-
-    printer(arg, " id=0x%x", id);
-    len -= HEADERLEN;
-
-    switch (code) {
-    case CBCP_REQ:
-    case CBCP_RESP:
-    case CBCP_ACK:
-        while(len >= 2) {
-           GETCHAR(opt, p);
-           GETCHAR(olen, p);
-
-           if (olen < 2 || olen > len) {
-               break;
-           }
-
-           printer(arg, " <");
-           len -= olen;
-
-           if (opt >= 1 && opt <= sizeof(cbcp_optionnames) / sizeof(char *))
-               printer(arg, " %s", cbcp_optionnames[opt-1]);
-           else
-               printer(arg, " option=0x%x", opt); 
-
-           if (olen > 2) {
-               GETCHAR(delay, p);
-               printer(arg, " delay = %d", delay);
-           }
-
-           if (olen > 3) {
-               int addrt;
-               char str[256];
-
-               GETCHAR(addrt, p);
-               memcpy(str, p, olen - 4);
-               str[olen - 4] = 0;
-               printer(arg, " number = %s", str);
-           }
-           printer(arg, ">");
-           break;
-       }
-
-    default:
-       break;
-    }
-
-    for (; len > 0; --len) {
-       GETCHAR(code, p);
-       printer(arg, " %.2x", code);
-    }
-
-    return p - pstart;
-}
-
-/* received CBCP request */
-static void
-cbcp_recvreq(cbcp_state *us, char *pckt, int pcktlen)
-{
-    u_char type, opt_len, delay, addr_type;
-    char address[256];
-    int len = pcktlen;
-
-    address[0] = 0;
-
-    while (len > 1) {
-        syslog(LOG_DEBUG, "length: %d", len);
-
-       GETCHAR(type, pckt);
-       GETCHAR(opt_len, pckt);
-
-       if (len < opt_len)
-               break;
-       len -= opt_len;
-
-       if (opt_len > 2)
-           GETCHAR(delay, pckt);
-
-       us->us_allowed |= (1 << type);
-
-       switch(type) {
-       case CB_CONF_NO:
-           syslog(LOG_DEBUG, "no callback allowed");
-           break;
-
-       case CB_CONF_USER:
-           syslog(LOG_DEBUG, "user callback allowed");
-           if (opt_len > 4) {
-               GETCHAR(addr_type, pckt);
-               memcpy(address, pckt, opt_len - 4);
-               address[opt_len - 4] = 0;
-               if (address[0])
-                   syslog(LOG_DEBUG, "address: %s", address);
-           }
-           break;
-
-       case CB_CONF_ADMIN:
-           syslog(LOG_DEBUG, "user admin defined allowed");
-           break;
-
-       case CB_CONF_LIST:
-           break;
-       }
-    }
-
-    cbcp_resp(us);
-}
-
-static void
-cbcp_resp(cbcp_state *us)
-{
-    u_char cb_type;
-    u_char buf[256];
-    u_char *bufp = buf;
-    int len = 0;
-
-    cb_type = us->us_allowed & us->us_type;
-    syslog(LOG_DEBUG, "cbcp_resp cb_type=%d", cb_type);
-
-#if 0
-    if (!cb_type)
-        lcp_down(us->us_unit);
-#endif
-
-    if (cb_type & ( 1 << CB_CONF_USER ) ) {
-       syslog(LOG_DEBUG, "cbcp_resp CONF_USER");
-       PUTCHAR(CB_CONF_USER, bufp);
-       len = 3 + 1 + strlen(us->us_number) + 1;
-       PUTCHAR(len , bufp);
-       PUTCHAR(5, bufp); /* delay */
-       PUTCHAR(1, bufp);
-       BCOPY(us->us_number, bufp, strlen(us->us_number) + 1);
-       cbcp_send(us, CBCP_RESP, buf, len);
-       return;
-    }
-
-    if (cb_type & ( 1 << CB_CONF_ADMIN ) ) {
-       syslog(LOG_DEBUG, "cbcp_resp CONF_ADMIN");
-        PUTCHAR(CB_CONF_ADMIN, bufp);
-       len = 3;
-       PUTCHAR(len, bufp);
-       PUTCHAR(5, bufp); /* delay */
-       cbcp_send(us, CBCP_RESP, buf, len);
-       return;
-    }
-
-    if (cb_type & ( 1 << CB_CONF_NO ) ) {
-        syslog(LOG_DEBUG, "cbcp_resp CONF_NO");
-       PUTCHAR(CB_CONF_NO, bufp);
-       len = 2;
-       PUTCHAR(len , bufp);
-       cbcp_send(us, CBCP_RESP, buf, len);
-       (*ipcp_protent.open)(us->us_unit);
-       return;
-    }
-}
-
-static void
-cbcp_send(cbcp_state *us, u_char code, u_char *buf, int len)
-{
-    u_char *outp;
-    int outlen;
-
-    outp = outpacket_buf;
-
-    outlen = 4 + len;
-    
-    MAKEHEADER(outp, PPP_CBCP);
-
-    PUTCHAR(code, outp);
-    PUTCHAR(us->us_id, outp);
-    PUTSHORT(outlen, outp);
-    
-    if (len)
-        BCOPY(buf, outp, len);
-
-    output(us->us_unit, outpacket_buf, outlen + PPP_HDRLEN);
-}
-
-static void
-cbcp_recvack(cbcp_state *us, char *pckt, int len)
-{
-    u_char type, delay, addr_type;
-    int opt_len;
-    char address[256];
-
-    if (len > 1) {
-        GETCHAR(type, pckt);
-       GETCHAR(opt_len, pckt);
-     
-       if (opt_len > len)
-               return;
-
-       if (opt_len > 2)
-           GETCHAR(delay, pckt);
-
-       if (opt_len > 4) {
-           GETCHAR(addr_type, pckt);
-           memcpy(address, pckt, opt_len - 4);
-           address[opt_len - 4] = 0;
-           if (address[0])
-               syslog(LOG_DEBUG, "peer will call: %s", address);
-       }
-    }
-
-    cbcp_up(us);
-}
-
-extern int persist;
-
-/* ok peer will do callback */
-static void
-cbcp_up(cbcp_state *us)
-{
-    persist = 0;
-    lcp_close(0, "Call me back, please");
-}
diff --git a/usr.sbin/pppd/cbcp.h b/usr.sbin/pppd/cbcp.h
deleted file mode 100644 (file)
index c2ab3f6..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef CBCP_H
-#define CBCP_H
-
-typedef struct cbcp_state {
-    int    us_unit;    /* Interface unit number */
-    u_char us_id;              /* Current id */
-    u_char us_allowed;
-    int    us_type;
-    char   *us_number;    /* Telefone Number */
-} cbcp_state;
-
-extern cbcp_state cbcp[];
-
-extern struct protent cbcp_protent;
-
-#define CBCP_MINLEN 4
-
-#define CBCP_REQ    1
-#define CBCP_RESP   2
-#define CBCP_ACK    3
-
-#define CB_CONF_NO     1
-#define CB_CONF_USER   2
-#define CB_CONF_ADMIN  3
-#define CB_CONF_LIST   4
-#endif
diff --git a/usr.sbin/pppd/ccp.c b/usr.sbin/pppd/ccp.c
deleted file mode 100644 (file)
index 369baa3..0000000
+++ /dev/null
@@ -1,1070 +0,0 @@
-/*
- * ccp.c - PPP Compression Control Protocol.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- *
- * $FreeBSD: src/usr.sbin/pppd/ccp.c,v 1.10 1999/08/28 01:19:00 peter Exp $
- * $DragonFly: src/usr.sbin/pppd/ccp.c,v 1.5 2005/11/24 23:42:54 swildner Exp $
- */
-
-#include <string.h>
-#include <syslog.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-
-#include "pppd.h"
-#include "fsm.h"
-#include "ccp.h"
-#include <net/ppp_layer/ppp_comp.h>
-
-/*
- * Protocol entry points from main code.
- */
-static void ccp_init(int unit);
-static void ccp_open(int unit);
-static void ccp_close(int unit, char *);
-static void ccp_lowerup(int unit);
-static void ccp_lowerdown(int);
-static void ccp_input(int unit, u_char *pkt, int len);
-static void ccp_protrej(int unit);
-static int  ccp_printpkt(u_char *pkt, int len,
-                             void (*printer)(void *, char *, ...),
-                             void *arg);
-static void ccp_datainput(int unit, u_char *pkt, int len);
-
-struct protent ccp_protent = {
-    PPP_CCP,
-    ccp_init,
-    ccp_input,
-    ccp_protrej,
-    ccp_lowerup,
-    ccp_lowerdown,
-    ccp_open,
-    ccp_close,
-    ccp_printpkt,
-    ccp_datainput,
-    1,
-    "CCP",
-    NULL,
-    NULL,
-    NULL
-};
-
-fsm ccp_fsm[NUM_PPP];
-ccp_options ccp_wantoptions[NUM_PPP];  /* what to request the peer to use */
-ccp_options ccp_gotoptions[NUM_PPP];   /* what the peer agreed to do */
-ccp_options ccp_allowoptions[NUM_PPP]; /* what we'll agree to do */
-ccp_options ccp_hisoptions[NUM_PPP];   /* what we agreed to do */
-
-/*
- * Callbacks for fsm code.
- */
-static void ccp_resetci(fsm *);
-static int  ccp_cilen(fsm *);
-static void ccp_addci(fsm *, u_char *, int *);
-static int  ccp_ackci(fsm *, u_char *, int);
-static int  ccp_nakci(fsm *, u_char *, int);
-static int  ccp_rejci(fsm *, u_char *, int);
-static int  ccp_reqci(fsm *, u_char *, int *, int);
-static void ccp_up(fsm *);
-static void ccp_down(fsm *);
-static int  ccp_extcode(fsm *, int, int, u_char *, int);
-static void ccp_rack_timeout(void *);
-static char *method_name(ccp_options *, ccp_options *);
-
-static fsm_callbacks ccp_callbacks = {
-    ccp_resetci,
-    ccp_cilen,
-    ccp_addci,
-    ccp_ackci,
-    ccp_nakci,
-    ccp_rejci,
-    ccp_reqci,
-    ccp_up,
-    ccp_down,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    ccp_extcode,
-    "CCP"
-};
-
-/*
- * Do we want / did we get any compression?
- */
-#define ANY_COMPRESS(opt)      ((opt).deflate || (opt).bsd_compress \
-                                || (opt).predictor_1 || (opt).predictor_2)
-
-/*
- * Local state (mainly for handling reset-reqs and reset-acks).
- */
-static int ccp_localstate[NUM_PPP];
-#define RACK_PENDING   1       /* waiting for reset-ack */
-#define RREQ_REPEAT    2       /* send another reset-req if no reset-ack */
-
-#define RACKTIMEOUT    1       /* second */
-
-static int all_rejected[NUM_PPP];      /* we rejected all peer's options */
-
-/*
- * ccp_init - initialize CCP.
- */
-static void
-ccp_init(int unit)
-{
-    fsm *f = &ccp_fsm[unit];
-
-    f->unit = unit;
-    f->protocol = PPP_CCP;
-    f->callbacks = &ccp_callbacks;
-    fsm_init(f);
-
-    memset(&ccp_wantoptions[unit],  0, sizeof(ccp_options));
-    memset(&ccp_gotoptions[unit],   0, sizeof(ccp_options));
-    memset(&ccp_allowoptions[unit], 0, sizeof(ccp_options));
-    memset(&ccp_hisoptions[unit],   0, sizeof(ccp_options));
-
-    ccp_wantoptions[0].deflate = 1;
-    ccp_wantoptions[0].deflate_size = DEFLATE_MAX_SIZE;
-    ccp_wantoptions[0].deflate_correct = 1;
-    ccp_wantoptions[0].deflate_draft = 1;
-    ccp_allowoptions[0].deflate = 1;
-    ccp_allowoptions[0].deflate_size = DEFLATE_MAX_SIZE;
-    ccp_allowoptions[0].deflate_correct = 1;
-    ccp_allowoptions[0].deflate_draft = 1;
-
-    ccp_wantoptions[0].bsd_compress = 1;
-    ccp_wantoptions[0].bsd_bits = BSD_MAX_BITS;
-    ccp_allowoptions[0].bsd_compress = 1;
-    ccp_allowoptions[0].bsd_bits = BSD_MAX_BITS;
-
-    ccp_allowoptions[0].predictor_1 = 1;
-}
-
-/*
- * ccp_open - CCP is allowed to come up.
- */
-static void
-ccp_open(int unit)
-{
-    fsm *f = &ccp_fsm[unit];
-
-    if (f->state != OPENED)
-       ccp_flags_set(unit, 1, 0);
-
-    /*
-     * Find out which compressors the kernel supports before
-     * deciding whether to open in silent mode.
-     */
-    ccp_resetci(f);
-    if (!ANY_COMPRESS(ccp_gotoptions[unit]))
-       f->flags |= OPT_SILENT;
-
-    fsm_open(f);
-}
-
-/*
- * ccp_close - Terminate CCP.
- */
-static void
-ccp_close(int unit, char *reason)
-{
-    ccp_flags_set(unit, 0, 0);
-    fsm_close(&ccp_fsm[unit], reason);
-}
-
-/*
- * ccp_lowerup - we may now transmit CCP packets.
- */
-static void
-ccp_lowerup(int unit)
-{
-    fsm_lowerup(&ccp_fsm[unit]);
-}
-
-/*
- * ccp_lowerdown - we may not transmit CCP packets.
- */
-static void
-ccp_lowerdown(int unit)
-{
-    fsm_lowerdown(&ccp_fsm[unit]);
-}
-
-/*
- * ccp_input - process a received CCP packet.
- */
-static void
-ccp_input(int unit, u_char *p, int len)
-{
-    fsm *f = &ccp_fsm[unit];
-    int oldstate;
-
-    /*
-     * Check for a terminate-request so we can print a message.
-     */
-    oldstate = f->state;
-    fsm_input(f, p, len);
-    if (oldstate == OPENED && p[0] == TERMREQ && f->state != OPENED)
-       syslog(LOG_NOTICE, "Compression disabled by peer.");
-
-    /*
-     * If we get a terminate-ack and we're not asking for compression,
-     * close CCP.
-     */
-    if (oldstate == REQSENT && p[0] == TERMACK
-       && !ANY_COMPRESS(ccp_gotoptions[unit]))
-       ccp_close(unit, "No compression negotiated");
-}
-
-/*
- * Handle a CCP-specific code.
- */
-static int
-ccp_extcode(fsm *f, int code, int id, u_char *p, int len)
-{
-    switch (code) {
-    case CCP_RESETREQ:
-       if (f->state != OPENED)
-           break;
-       /* send a reset-ack, which the transmitter will see and
-          reset its compression state. */
-       fsm_sdata(f, CCP_RESETACK, id, NULL, 0);
-       break;
-
-    case CCP_RESETACK:
-       if (ccp_localstate[f->unit] & RACK_PENDING && id == f->reqid) {
-           ccp_localstate[f->unit] &= ~(RACK_PENDING | RREQ_REPEAT);
-           UNTIMEOUT(ccp_rack_timeout, f);
-       }
-       break;
-
-    default:
-       return 0;
-    }
-
-    return 1;
-}
-
-/*
- * ccp_protrej - peer doesn't talk CCP.
- */
-static void
-ccp_protrej(int unit)
-{
-    ccp_flags_set(unit, 0, 0);
-    fsm_lowerdown(&ccp_fsm[unit]);
-}
-
-/*
- * ccp_resetci - initialize at start of negotiation.
- */
-static void
-ccp_resetci(fsm *f)
-{
-    ccp_options *go = &ccp_gotoptions[f->unit];
-    u_char opt_buf[16];
-
-    *go = ccp_wantoptions[f->unit];
-    all_rejected[f->unit] = 0;
-
-    /*
-     * Check whether the kernel knows about the various
-     * compression methods we might request.
-     */
-    if (go->bsd_compress) {
-       opt_buf[0] = CI_BSD_COMPRESS;
-       opt_buf[1] = CILEN_BSD_COMPRESS;
-       opt_buf[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, BSD_MIN_BITS);
-       if (ccp_test(f->unit, opt_buf, CILEN_BSD_COMPRESS, 0) <= 0)
-           go->bsd_compress = 0;
-    }
-    if (go->deflate) {
-       if (go->deflate_correct) {
-           opt_buf[0] = CI_DEFLATE;
-           opt_buf[1] = CILEN_DEFLATE;
-           opt_buf[2] = DEFLATE_MAKE_OPT(DEFLATE_MIN_SIZE);
-           opt_buf[3] = DEFLATE_CHK_SEQUENCE;
-           if (ccp_test(f->unit, opt_buf, CILEN_DEFLATE, 0) <= 0)
-               go->deflate_correct = 0;
-       }
-       if (go->deflate_draft) {
-           opt_buf[0] = CI_DEFLATE_DRAFT;
-           opt_buf[1] = CILEN_DEFLATE;
-           opt_buf[2] = DEFLATE_MAKE_OPT(DEFLATE_MIN_SIZE);
-           opt_buf[3] = DEFLATE_CHK_SEQUENCE;
-           if (ccp_test(f->unit, opt_buf, CILEN_DEFLATE, 0) <= 0)
-               go->deflate_draft = 0;
-       }
-       if (!go->deflate_correct && !go->deflate_draft)
-           go->deflate = 0;
-    }
-    if (go->predictor_1) {
-       opt_buf[0] = CI_PREDICTOR_1;
-       opt_buf[1] = CILEN_PREDICTOR_1;
-       if (ccp_test(f->unit, opt_buf, CILEN_PREDICTOR_1, 0) <= 0)
-           go->predictor_1 = 0;
-    }
-    if (go->predictor_2) {
-       opt_buf[0] = CI_PREDICTOR_2;
-       opt_buf[1] = CILEN_PREDICTOR_2;
-       if (ccp_test(f->unit, opt_buf, CILEN_PREDICTOR_2, 0) <= 0)
-           go->predictor_2 = 0;
-    }
-}
-
-/*
- * ccp_cilen - Return total length of our configuration info.
- */
-static int
-ccp_cilen(fsm *f)
-{
-    ccp_options *go = &ccp_gotoptions[f->unit];
-
-    return (go->bsd_compress? CILEN_BSD_COMPRESS: 0)
-       + (go->deflate? CILEN_DEFLATE: 0)
-       + (go->predictor_1? CILEN_PREDICTOR_1: 0)
-       + (go->predictor_2? CILEN_PREDICTOR_2: 0);
-}
-
-/*
- * ccp_addci - put our requests in a packet.
- */
-static void
-ccp_addci(fsm *f, u_char *p, int *lenp)
-{
-    int res;
-    ccp_options *go = &ccp_gotoptions[f->unit];
-    u_char *p0 = p;
-
-    /*
-     * Add the compression types that we can receive, in decreasing
-     * preference order.  Get the kernel to allocate the first one
-     * in case it gets Acked.
-     */
-    if (go->deflate) {
-       p[0] = go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT;
-       p[1] = CILEN_DEFLATE;
-       p[2] = DEFLATE_MAKE_OPT(go->deflate_size);
-       p[3] = DEFLATE_CHK_SEQUENCE;
-       for (;;) {
-           res = ccp_test(f->unit, p, CILEN_DEFLATE, 0);
-           if (res > 0) {
-               p += CILEN_DEFLATE;
-               break;
-           }
-           if (res < 0 || go->deflate_size <= DEFLATE_MIN_SIZE) {
-               go->deflate = 0;
-               break;
-           }
-           --go->deflate_size;
-           p[2] = DEFLATE_MAKE_OPT(go->deflate_size);
-       }
-       if (p != p0 && go->deflate_correct && go->deflate_draft) {
-           p[0] = CI_DEFLATE_DRAFT;
-           p[1] = CILEN_DEFLATE;
-           p[2] = p[2 - CILEN_DEFLATE];
-           p[3] = DEFLATE_CHK_SEQUENCE;
-           p += CILEN_DEFLATE;
-       }
-    }
-    if (go->bsd_compress) {
-       p[0] = CI_BSD_COMPRESS;
-       p[1] = CILEN_BSD_COMPRESS;
-       p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);
-       if (p != p0) {
-           p += CILEN_BSD_COMPRESS;    /* not the first option */
-       } else {
-           for (;;) {
-               res = ccp_test(f->unit, p, CILEN_BSD_COMPRESS, 0);
-               if (res > 0) {
-                   p += CILEN_BSD_COMPRESS;
-                   break;
-               }
-               if (res < 0 || go->bsd_bits <= BSD_MIN_BITS) {
-                   go->bsd_compress = 0;
-                   break;
-               }
-               --go->bsd_bits;
-               p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);
-           }
-       }
-    }
-    /* XXX Should Predictor 2 be preferable to Predictor 1? */
-    if (go->predictor_1) {
-       p[0] = CI_PREDICTOR_1;
-       p[1] = CILEN_PREDICTOR_1;
-       if (p == p0 && ccp_test(f->unit, p, CILEN_PREDICTOR_1, 0) <= 0) {
-           go->predictor_1 = 0;
-       } else {
-           p += CILEN_PREDICTOR_1;
-       }
-    }
-    if (go->predictor_2) {
-       p[0] = CI_PREDICTOR_2;
-       p[1] = CILEN_PREDICTOR_2;
-       if (p == p0 && ccp_test(f->unit, p, CILEN_PREDICTOR_2, 0) <= 0) {
-           go->predictor_2 = 0;
-       } else {
-           p += CILEN_PREDICTOR_2;
-       }
-    }
-
-    go->method = (p > p0)? p0[0]: -1;
-
-    *lenp = p - p0;
-}
-
-/*
- * ccp_ackci - process a received configure-ack, and return
- * 1 iff the packet was OK.
- */
-static int
-ccp_ackci(fsm *f, u_char *p, int len)
-{
-    ccp_options *go = &ccp_gotoptions[f->unit];
-    u_char *p0 = p;
-
-    if (go->deflate) {
-       if (len < CILEN_DEFLATE
-           || p[0] != (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
-           || p[1] != CILEN_DEFLATE
-           || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-           || p[3] != DEFLATE_CHK_SEQUENCE)
-           return 0;
-       p += CILEN_DEFLATE;
-       len -= CILEN_DEFLATE;
-       /* XXX Cope with first/fast ack */
-       if (len == 0)
-           return 1;
-       if (go->deflate_correct && go->deflate_draft) {
-           if (len < CILEN_DEFLATE
-               || p[0] != CI_DEFLATE_DRAFT
-               || p[1] != CILEN_DEFLATE
-               || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-               || p[3] != DEFLATE_CHK_SEQUENCE)
-               return 0;
-           p += CILEN_DEFLATE;
-           len -= CILEN_DEFLATE;
-       }
-    }
-    if (go->bsd_compress) {
-       if (len < CILEN_BSD_COMPRESS
-           || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD_COMPRESS
-           || p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))
-           return 0;
-       p += CILEN_BSD_COMPRESS;
-       len -= CILEN_BSD_COMPRESS;
-       /* XXX Cope with first/fast ack */
-       if (p == p0 && len == 0)
-           return 1;
-    }
-    if (go->predictor_1) {
-       if (len < CILEN_PREDICTOR_1
-           || p[0] != CI_PREDICTOR_1 || p[1] != CILEN_PREDICTOR_1)
-           return 0;
-       p += CILEN_PREDICTOR_1;
-       len -= CILEN_PREDICTOR_1;
-       /* XXX Cope with first/fast ack */
-       if (p == p0 && len == 0)
-           return 1;
-    }
-    if (go->predictor_2) {
-       if (len < CILEN_PREDICTOR_2
-           || p[0] != CI_PREDICTOR_2 || p[1] != CILEN_PREDICTOR_2)
-           return 0;
-       p += CILEN_PREDICTOR_2;
-       len -= CILEN_PREDICTOR_2;
-       /* XXX Cope with first/fast ack */
-       if (p == p0 && len == 0)
-           return 1;
-    }
-
-    if (len != 0)
-       return 0;
-    return 1;
-}
-
-/*
- * ccp_nakci - process received configure-nak.
- * Returns 1 iff the nak was OK.
- */
-static int
-ccp_nakci(fsm *f, u_char *p, int len)
-{
-    ccp_options *go = &ccp_gotoptions[f->unit];
-    ccp_options no;            /* options we've seen already */
-    ccp_options try;           /* options to ask for next time */
-
-    memset(&no, 0, sizeof(no));
-    try = *go;
-
-    if (go->deflate && len >= CILEN_DEFLATE
-       && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
-       && p[1] == CILEN_DEFLATE) {
-       no.deflate = 1;
-       /*
-        * Peer wants us to use a different code size or something.
-        * Stop asking for Deflate if we don't understand his suggestion.
-        */
-       if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL
-           || DEFLATE_SIZE(p[2]) < DEFLATE_MIN_SIZE
-           || p[3] != DEFLATE_CHK_SEQUENCE)
-           try.deflate = 0;
-       else if (DEFLATE_SIZE(p[2]) < go->deflate_size)
-           try.deflate_size = DEFLATE_SIZE(p[2]);
-       p += CILEN_DEFLATE;
-       len -= CILEN_DEFLATE;
-       if (go->deflate_correct && go->deflate_draft
-           && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT
-           && p[1] == CILEN_DEFLATE) {
-           p += CILEN_DEFLATE;
-           len -= CILEN_DEFLATE;
-       }
-    }
-
-    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS
-       && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {
-       no.bsd_compress = 1;
-       /*
-        * Peer wants us to use a different number of bits
-        * or a different version.
-        */
-       if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION)
-           try.bsd_compress = 0;
-       else if (BSD_NBITS(p[2]) < go->bsd_bits)
-           try.bsd_bits = BSD_NBITS(p[2]);
-       p += CILEN_BSD_COMPRESS;
-       len -= CILEN_BSD_COMPRESS;
-    }
-
-    /*
-     * Predictor-1 and 2 have no options, so they can't be Naked.
-     *
-     * XXX What should we do with any remaining options?
-     */
-
-    if (len != 0)
-       return 0;
-
-    if (f->state != OPENED)
-       *go = try;
-    return 1;
-}
-
-/*
- * ccp_rejci - reject some of our suggested compression methods.
- */
-static int
-ccp_rejci(fsm *f, u_char *p, int len)
-{
-    ccp_options *go = &ccp_gotoptions[f->unit];
-    ccp_options try;           /* options to request next time */
-
-    try = *go;
-
-    /*
-     * Cope with empty configure-rejects by ceasing to send
-     * configure-requests.
-     */
-    if (len == 0 && all_rejected[f->unit])
-       return -1;
-
-    if (go->deflate && len >= CILEN_DEFLATE
-       && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
-       && p[1] == CILEN_DEFLATE) {
-       if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-      &nb