Remove IPX support.
IPX was a network transport protocol in Novell's NetWare network operating system from late 80s and then 90s. The NetWare itself switched to TCP/IP as default transport in 1998. Later, in this century the Novell Open Enterprise Server became successor of Novell NetWare. The last release that claimed to still support IPX was OES 2 in 2007. Routing equipment vendors (e.g. Cisco) discontinued support for IPX in 2011. Thus, IPX won't be supported in FreeBSD 11.0-RELEASE.
This commit is contained in:
parent
a4fb4957a5
commit
d494babace
@ -1486,7 +1486,7 @@ _prebuild_libs= ${_kerberos5_lib_libasn1} \
|
||||
${_lib_atf} \
|
||||
lib/libbz2 ${_libcom_err} lib/libcrypt \
|
||||
lib/libelf lib/libexpat \
|
||||
${_lib_libgssapi} ${_lib_libipx} \
|
||||
${_lib_libgssapi} \
|
||||
lib/libkiconv lib/libkvm lib/liblzma lib/libmd lib/libnv \
|
||||
${_lib_libcapsicum} \
|
||||
lib/ncurses/ncurses lib/ncurses/ncursesw \
|
||||
@ -1588,10 +1588,6 @@ kerberos5/lib/libheimsqlite__L: lib/libthr__L
|
||||
_lib_libgssapi= lib/libgssapi
|
||||
.endif
|
||||
|
||||
.if ${MK_IPX} != "no"
|
||||
_lib_libipx= lib/libipx
|
||||
.endif
|
||||
|
||||
.if ${MK_KERBEROS} != "no"
|
||||
_kerberos5_lib= kerberos5/lib
|
||||
_kerberos5_lib_libasn1= kerberos5/lib/libasn1
|
||||
|
@ -38,6 +38,30 @@
|
||||
# xargs -n1 | sort | uniq -d;
|
||||
# done
|
||||
|
||||
# 20140314: Remove IPX/SPX
|
||||
OLD_LIBS+=lib/libipx.so.5
|
||||
OLD_FILES+=usr/include/netipx/ipx.h
|
||||
OLD_FILES+=usr/include/netipx/ipx_if.h
|
||||
OLD_FILES+=usr/include/netipx/ipx_pcb.h
|
||||
OLD_FILES+=usr/include/netipx/ipx_var.h
|
||||
OLD_FILES+=usr/include/netipx/spx.h
|
||||
OLD_FILES+=usr/include/netipx/spx_debug.h
|
||||
OLD_FILES+=usr/include/netipx/spx_timer.h
|
||||
OLD_FILES+=usr/include/netipx/spx_var.h
|
||||
OLD_DIRS+=usr/include/netipx
|
||||
OLD_FILES+=usr/lib/libipx.a
|
||||
OLD_FILES+=usr/lib/libipx.so
|
||||
OLD_FILES+=usr/lib/libipx_p.a
|
||||
OLD_FILES+=usr/lib32/libipx.a
|
||||
OLD_FILES+=usr/lib32/libipx.so
|
||||
OLD_LIBS+=usr/lib32/libipx.so.5
|
||||
OLD_FILES+=usr/lib32/libipx_p.a
|
||||
OLD_FILES+=usr/sbin/IPXrouted
|
||||
OLD_FILES+=usr/share/man/man3/ipx.3.gz
|
||||
OLD_FILES+=usr/share/man/man3/ipx_addr.3.gz
|
||||
OLD_FILES+=usr/share/man/man3/ipx_ntoa.3.gz
|
||||
OLD_FILES+=usr/share/man/man8/IPXrouted.8.gz
|
||||
|
||||
# 20140223: Remove libyaml
|
||||
OLD_FILES+=usr/lib/private/libyaml.a
|
||||
OLD_FILES+=usr/lib/private/libyaml.so
|
||||
|
@ -59,7 +59,6 @@ LINE("libhammer", "HAMMER Filesystem Userland Library (libhammer, \\-lhammer)")
|
||||
LINE("libi386", "i386 Architecture Library (libi386, \\-li386)")
|
||||
LINE("libintl", "Internationalized Message Handling Library (libintl, \\-lintl)")
|
||||
LINE("libipsec", "IPsec Policy Control Library (libipsec, \\-lipsec)")
|
||||
LINE("libipx", "IPX Address Conversion Support Library (libipx, \\-lipx)")
|
||||
LINE("libiscsi", "iSCSI protocol library (libiscsi, \\-liscsi)")
|
||||
LINE("libisns", "Internet Storage Name Service Library (libisns, \\-lisns)")
|
||||
LINE("libjail", "Jail Library (libjail, \\-ljail)")
|
||||
|
@ -212,7 +212,6 @@ cloned_interfaces="" # List of cloned network interfaces to create.
|
||||
#cloned_interfaces="gif0 gif1 gif2 gif3" # Pre-cloning GENERIC config.
|
||||
#ifconfig_lo0="inet 127.0.0.1" # default loopback device configuration.
|
||||
#ifconfig_lo0_alias0="inet 127.0.0.254 netmask 0xffffffff" # Sample alias entry.
|
||||
#ifconfig_ed0_ipx="ipx 0x00010010" # Sample IPX address family entry.
|
||||
#ifconfig_ed0_ipv6="inet6 2001:db8:1::1 prefixlen 64" # Sample IPv6 addr entry
|
||||
#ifconfig_ed0_alias0="inet6 2001:db8:2::1 prefixlen 64" # Sample IPv6 alias
|
||||
#ifconfig_fxp0_name="net0" # Change interface name from fxp0 to net0.
|
||||
@ -382,9 +381,6 @@ mrouted_program="/usr/local/sbin/mrouted" # Name of IPv4 multicast
|
||||
# install it from package or
|
||||
# port.
|
||||
mrouted_flags="" # Flags for multicast routing daemon.
|
||||
ipxgateway_enable="NO" # Set to YES to enable IPX routing.
|
||||
ipxrouted_enable="NO" # Set to YES to run the IPX routing daemon.
|
||||
ipxrouted_flags="" # Flags for IPX routing daemon.
|
||||
arpproxy_all="NO" # replaces obsolete kernel option ARP_PROXYALL.
|
||||
forward_sourceroute="NO" # do source routing (only if gateway_enable is set to "YES")
|
||||
accept_sourceroute="NO" # accept source routed packets to us
|
||||
|
@ -275,8 +275,6 @@
|
||||
..
|
||||
netipsec
|
||||
..
|
||||
netipx
|
||||
..
|
||||
netnatm
|
||||
api
|
||||
..
|
||||
|
@ -51,7 +51,6 @@ ifn_start()
|
||||
if ! noafif $ifn; then
|
||||
afexists inet && ipv4_up ${ifn} && cfg=0
|
||||
afexists inet6 && ipv6_up ${ifn} && cfg=0
|
||||
afexists ipx && ipx_up ${ifn} && cfg=0
|
||||
fi
|
||||
childif_create ${ifn} && cfg=0
|
||||
|
||||
@ -71,7 +70,6 @@ ifn_stop()
|
||||
[ -z "$ifn" ] && err 1 "ifn_stop called without an interface"
|
||||
|
||||
if ! noafif $ifn; then
|
||||
afexists ipx && ipx_down ${ifn} && cfg=0
|
||||
afexists inet6 && ipv6_down ${ifn} && cfg=0
|
||||
afexists inet && ipv4_down ${ifn} && cfg=0
|
||||
fi
|
||||
@ -495,9 +493,6 @@ afexists()
|
||||
inet|inet6)
|
||||
check_kern_features ${_af}
|
||||
;;
|
||||
ipx)
|
||||
${SYSCTL_N} net.ipx > /dev/null 2>&1
|
||||
;;
|
||||
atm)
|
||||
if [ -x /sbin/atmconfig ]; then
|
||||
/sbin/atmconfig diag list > /dev/null 2>&1
|
||||
@ -1096,7 +1091,6 @@ ifalias_af_common()
|
||||
case $ifconfig_args in
|
||||
inet\ *) _iaf=inet ;;
|
||||
inet6\ *) _iaf=inet6 ;;
|
||||
ipx\ *) _iaf=ipx ;;
|
||||
link\ *) _iaf=link ;;
|
||||
ether\ *) _iaf=ether ;;
|
||||
esac
|
||||
@ -1146,7 +1140,7 @@ ifalias_af_common()
|
||||
_tmpargs=
|
||||
for _c in `get_if_var $_if ifconfig_IF_aliases` $_aliasn; do
|
||||
case $_c in
|
||||
inet|inet6|ipx|link|ether)
|
||||
inet|inet6|link|ether)
|
||||
case $_tmpargs in
|
||||
${_af}\ *)
|
||||
eval ifalias_af_common_handler $_if $_af $_action $_tmpargs && _ret=0
|
||||
@ -1520,55 +1514,6 @@ ng_create_one()
|
||||
done
|
||||
}
|
||||
|
||||
# ipx_up ifn
|
||||
# Configure any IPX addresses for interface $ifn. Returns 0 if
|
||||
# IPX arguments were found and configured; returns 1 otherwise.
|
||||
#
|
||||
ipx_up()
|
||||
{
|
||||
local ifn
|
||||
ifn="$1"
|
||||
|
||||
# ifconfig_IF_ipx
|
||||
ifconfig_args=`_ifconfig_getargs $ifn ipx`
|
||||
if [ -n "${ifconfig_args}" ]; then
|
||||
${IFCONFIG_CMD} ${ifn} ${ifconfig_args}
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# ipx_down ifn
|
||||
# Remove IPX addresses for interface $ifn. Returns 0 if IPX
|
||||
# addresses were found and unconfigured. It returns 1, otherwise.
|
||||
#
|
||||
ipx_down()
|
||||
{
|
||||
local _if _ifs _ret ipxList oldifs _ipx
|
||||
_if=$1
|
||||
_ifs="^"
|
||||
_ret=1
|
||||
ipxList="`${IFCONFIG_CMD} ${_if} | grep 'ipx ' | tr "\n" "$_ifs"`"
|
||||
oldifs="$IFS"
|
||||
|
||||
IFS="$_ifs"
|
||||
for _ipx in $ipxList ; do
|
||||
# get rid of extraneous line
|
||||
[ -z "$_ipx" ] && break
|
||||
|
||||
_ipx=`expr "$_ipx" : '.*\(ipx [0-9a-h]\{1,8\}H*\.[0-9a-h]\{1,12\}\).*'`
|
||||
|
||||
IFS="$oldifs"
|
||||
${IFCONFIG_CMD} ${_if} ${_ipx} delete
|
||||
IFS="$_ifs"
|
||||
_ret=0
|
||||
done
|
||||
IFS="$oldifs"
|
||||
|
||||
return $_ret
|
||||
}
|
||||
|
||||
# ifnet_rename [ifname]
|
||||
# Rename interfaces if ifconfig_IF_name is defined.
|
||||
#
|
||||
|
@ -29,7 +29,7 @@
|
||||
#
|
||||
# keyword/section A B C D Comment
|
||||
#
|
||||
# addr - + - - IP or IPX address of SMB server
|
||||
# addr - + - - IP address of SMB server
|
||||
# charsets + + + + local:remote charset pair
|
||||
# nbns + + - - address of NetBIOS name server (WINS)
|
||||
# nbscope + + - - NetBIOS scope
|
||||
|
@ -63,7 +63,6 @@ FILES= DAEMON \
|
||||
ipmon \
|
||||
ipnat \
|
||||
ipsec \
|
||||
${_ipxrouted} \
|
||||
iscsictl \
|
||||
iscsid \
|
||||
jail \
|
||||
@ -165,10 +164,6 @@ FILES= DAEMON \
|
||||
zfs \
|
||||
zvol
|
||||
|
||||
.if ${MK_IPX} != "no"
|
||||
_ipxrouted= ipxrouted
|
||||
.endif
|
||||
|
||||
.if ${MK_OFED} != "no"
|
||||
_opensm= opensm
|
||||
.endif
|
||||
|
@ -1,19 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
# PROVIDE: ipxrouted
|
||||
# REQUIRE: SERVERS
|
||||
# BEFORE: DAEMON
|
||||
# KEYWORD: nojail
|
||||
|
||||
. /etc/rc.subr
|
||||
|
||||
name="ipxrouted"
|
||||
rcvar="ipxrouted_enable"
|
||||
command="/usr/sbin/IPXrouted"
|
||||
command_args="> /dev/null 2>&1"
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command "$1"
|
@ -33,7 +33,7 @@ routing_start()
|
||||
esac
|
||||
|
||||
case $_af in
|
||||
inet|inet6|ipx|atm)
|
||||
inet|inet6|atm)
|
||||
if afexists $_af; then
|
||||
setroutes $_cmd $_af $_if
|
||||
else
|
||||
@ -41,7 +41,7 @@ routing_start()
|
||||
fi
|
||||
;;
|
||||
""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
|
||||
for _a in inet inet6 ipx atm; do
|
||||
for _a in inet inet6 atm; do
|
||||
afexists $_a && setroutes $_cmd $_a $_if
|
||||
done
|
||||
;;
|
||||
@ -62,7 +62,7 @@ routing_stop()
|
||||
esac
|
||||
|
||||
case $_af in
|
||||
inet|inet6|ipx|atm)
|
||||
inet|inet6|atm)
|
||||
if afexists $_af; then
|
||||
eval static_${_af} delete $_if
|
||||
# When $_if is specified, do not flush routes.
|
||||
@ -74,7 +74,7 @@ routing_stop()
|
||||
fi
|
||||
;;
|
||||
""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
|
||||
for _a in inet inet6 ipx atm; do
|
||||
for _a in inet inet6 atm; do
|
||||
afexists $_a || continue
|
||||
eval static_${_a} delete $_if
|
||||
# When $_if is specified, do not flush routes.
|
||||
@ -127,11 +127,6 @@ routing_stop_atm()
|
||||
return 0
|
||||
}
|
||||
|
||||
routing_stop_ipx()
|
||||
{
|
||||
return 0
|
||||
}
|
||||
|
||||
static_inet()
|
||||
{
|
||||
local _action _if _skip
|
||||
@ -290,11 +285,6 @@ static_atm()
|
||||
fi
|
||||
}
|
||||
|
||||
static_ipx()
|
||||
{
|
||||
:
|
||||
}
|
||||
|
||||
ropts_init()
|
||||
{
|
||||
if [ -z "${_ropts_initdone}" ]; then
|
||||
@ -387,20 +377,5 @@ options_atm()
|
||||
[ -n "${_ropts_initdone}" ] && echo '.'
|
||||
}
|
||||
|
||||
options_ipx()
|
||||
{
|
||||
_ropts_initdone=
|
||||
|
||||
if checkyesno ipxgateway_enable; then
|
||||
ropts_init ipx
|
||||
echo -n ' gateway=YES'
|
||||
${SYSCTL} net.ipx.ipx.ipxforwarding=1 > /dev/null
|
||||
else
|
||||
${SYSCTL} net.ipx.ipx.ipxforwarding=0 > /dev/null
|
||||
fi
|
||||
|
||||
[ -n "${_ropts_initdone}" ] && echo '.'
|
||||
}
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command "$@"
|
||||
|
@ -86,7 +86,6 @@
|
||||
.\" XXX ds doc-str-Lb-libgeom Userland API Library for kernel GEOM subsystem (libgeom, \-lgeom)
|
||||
.ds doc-str-Lb-libi386 Bibliothèque de l'architecture i386 (libi386, \-li386)
|
||||
.ds doc-str-Lb-libipsec Bibliothèque de contrôle de politique IPsec (libipsec, \-lipsec)
|
||||
.ds doc-str-Lb-libipx Bibliothèque de support des conversions des adresses IPX (libipx, \-lipx)
|
||||
.ds doc-str-Lb-libkvm Bibliothèque d'accès aux données du noyau (libkvm, \-lkvm)
|
||||
.ds doc-str-Lb-libm Bibliothèque mathématique (libm, \-lm)
|
||||
.ds doc-str-Lb-libmd Bibliothèque de support des signatures (MD4, MD5, etc.) (libmd, \-lmd)
|
||||
|
@ -86,7 +86,6 @@
|
||||
.ds doc-str-Lb-libgeom ðÏÌØÚÏ×ÁÔÅÌØÓËÁÑ API ÂÉÂÌÉÏÔÅËÁ ÐÏÄÓÉÓÔÅÍÙ ÑÄÒÁ GEOM (libgeom, \-lgeom)
|
||||
.ds doc-str-Lb-libi386 âÉÂÌÉÏÔÅËÁ ÁÒÈÉÔÅËÔÕÒÙ i386 (libi386, \-li386)
|
||||
.ds doc-str-Lb-libipsec âÉÂÌÉÏÔÅËÁ ÕÐÒÁ×ÌÅÎÉÑ IPsec Policy (libipsec, \-lipsec)
|
||||
.ds doc-str-Lb-libipx Библиотека поддержки конверсии адресов IPX (libipx, \-lipx)
|
||||
.ds doc-str-Lb-libkvm âÉÂÌÉÏÔÅËÁ ÄÏÓÔÕÐÁ Ë ÄÁÎÎÙÍ ÑÄÒÁ (libkvm, \-lkvm)
|
||||
.ds doc-str-Lb-libm âÉÂÌÉÏÔÅËÁ ÍÁÔÅÍÁÔÉÞÅÓËÉÈ ÆÕÎËÃÉÊ (libm, \-lm)
|
||||
.\" XXX ds doc-str-Lb-libmd Message Digest (MD4, MD5, É Ô.Ä.) Support Library (libmd, \-lmd)
|
||||
|
@ -37,9 +37,7 @@ LHDRS= aio.h errno.h fcntl.h linker_set.h poll.h stdatomic.h stdint.h \
|
||||
syslog.h ucontext.h
|
||||
|
||||
LDIRS= bsm cam geom net net80211 netatalk netgraph netinet netinet6 \
|
||||
netipsec ${_netipx} netnatm netsmb \
|
||||
nfs nfsclient nfsserver \
|
||||
sys vm
|
||||
netipsec netnatm netsmb nfs nfsclient nfsserver sys vm
|
||||
|
||||
LSUBDIRS= cam/ata cam/scsi \
|
||||
dev/acpica dev/agp dev/an dev/bktr dev/ciss dev/filemon dev/firewire \
|
||||
@ -76,11 +74,6 @@ INCS+= hesiod.h
|
||||
LSUBSUBDIRS+= netgraph/bluetooth/include
|
||||
.endif
|
||||
|
||||
# XXX unconditionally needed by <netsmb/netbios.h>
|
||||
#.if ${MK_IPX} != "no"
|
||||
_netipx= netipx
|
||||
#.endif
|
||||
|
||||
# Handle the #define aliases for libiconv
|
||||
.if ${MK_ICONV} == "yes"
|
||||
INCS+= iconv.h
|
||||
|
@ -88,7 +88,6 @@ SUBDIR= ${SUBDIR_ORDERED} \
|
||||
${_libgssapi} \
|
||||
${_librpcsec_gss} \
|
||||
libipsec \
|
||||
${_libipx} \
|
||||
libjail \
|
||||
libkiconv \
|
||||
liblzma \
|
||||
@ -183,10 +182,6 @@ _librpcsec_gss= librpcsec_gss
|
||||
_libiconv_modules= libiconv_modules
|
||||
.endif
|
||||
|
||||
.if ${MK_IPX} != "no"
|
||||
_libipx= libipx
|
||||
.endif
|
||||
|
||||
.if ${MK_LDNS} != "no"
|
||||
_libldns= libldns
|
||||
.endif
|
||||
|
@ -1,11 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
LIB= ipx
|
||||
SHLIBDIR?= /lib
|
||||
SRCS= ipx_addr.c ipx_ntoa.c
|
||||
MAN= ipx.3
|
||||
MLINKS+=ipx.3 ipx_addr.3 ipx.3 ipx_ntoa.3
|
||||
|
||||
WARNS?= 2
|
||||
|
||||
.include <bsd.lib.mk>
|
125
lib/libipx/ipx.3
125
lib/libipx/ipx.3
@ -1,125 +0,0 @@
|
||||
.\" Copyright (c) 1986, 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.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd June 4, 1993
|
||||
.Dt IPX 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ipx_addr ,
|
||||
.Nm ipx_ntoa
|
||||
.Nd IPX address conversion routines
|
||||
.Sh LIBRARY
|
||||
.Lb libipx
|
||||
.Sh SYNOPSIS
|
||||
.In sys/types.h
|
||||
.In netipx/ipx.h
|
||||
.Ft struct ipx_addr
|
||||
.Fn ipx_addr "const char *cp"
|
||||
.Ft char *
|
||||
.Fn ipx_ntoa "struct ipx_addr ipx"
|
||||
.Sh DESCRIPTION
|
||||
The routine
|
||||
.Fn ipx_addr
|
||||
interprets character strings representing
|
||||
.Tn IPX
|
||||
addresses, returning binary information suitable
|
||||
for use in system calls.
|
||||
The routine
|
||||
.Fn ipx_ntoa
|
||||
takes
|
||||
.Tn IPX
|
||||
addresses and returns
|
||||
.Tn ASCII
|
||||
strings representing the address in a
|
||||
notation in common use:
|
||||
.Bd -ragged -offset indent
|
||||
<network number>.<host number>.<port number>
|
||||
.Ed
|
||||
.Pp
|
||||
Trailing zero fields are suppressed, and each number is printed in hexadecimal,
|
||||
in a format suitable for input to
|
||||
.Fn ipx_addr .
|
||||
Any fields lacking super-decimal digits will have a
|
||||
trailing
|
||||
.Ql H
|
||||
appended.
|
||||
.Pp
|
||||
An effort has been made to ensure that
|
||||
.Fn ipx_addr
|
||||
be compatible with most formats in common use.
|
||||
It will first separate an address into 1 to 3 fields using a single delimiter
|
||||
chosen from
|
||||
period
|
||||
.Ql \&. ,
|
||||
colon
|
||||
.Ql \&:
|
||||
or pound-sign
|
||||
.Ql \&# .
|
||||
Each field is then examined for byte separators (colon or period).
|
||||
If there are byte separators, each subfield separated is taken to be
|
||||
a small hexadecimal number, and the entirety is taken as a network-byte-ordered
|
||||
quantity to be zero extended in the high-network-order bytes.
|
||||
Next, the field is inspected for hyphens, in which case
|
||||
the field is assumed to be a number in decimal notation
|
||||
with hyphens separating the millennia.
|
||||
Next, the field is assumed to be a number:
|
||||
It is interpreted
|
||||
as hexadecimal if there is a leading
|
||||
.Ql 0x
|
||||
(as in C),
|
||||
a trailing
|
||||
.Ql H
|
||||
(as in Mesa), or there are any super-decimal digits present.
|
||||
It is interpreted as octal if there is a leading
|
||||
.Ql 0
|
||||
and there are no super-octal digits.
|
||||
Otherwise, it is converted as a decimal number.
|
||||
.Sh RETURN VALUES
|
||||
None.
|
||||
(See
|
||||
.Sx BUGS . )
|
||||
.Sh SEE ALSO
|
||||
.\" .Xr ns 4 ,
|
||||
.Xr hosts 5 ,
|
||||
.Xr networks 5
|
||||
.Sh HISTORY
|
||||
The precursor
|
||||
.Fn ns_addr
|
||||
and
|
||||
.Fn ns_toa
|
||||
functions appeared in
|
||||
.Bx 4.3 .
|
||||
.Sh BUGS
|
||||
The string returned by
|
||||
.Fn ipx_ntoa
|
||||
resides in a static memory area.
|
||||
The function
|
||||
.Fn ipx_addr
|
||||
should diagnose improperly formed input, and there should be an unambiguous
|
||||
way to recognize this.
|
@ -1,227 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1986, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* J.Q. Johnson.
|
||||
*
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)ipx_addr.c";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netipx/ipx.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static struct ipx_addr addr, zero_addr;
|
||||
|
||||
static void Field(), cvtbase();
|
||||
|
||||
struct ipx_addr
|
||||
ipx_addr(name)
|
||||
const char *name;
|
||||
{
|
||||
char separator;
|
||||
char *hostname, *socketname, *cp;
|
||||
char buf[50];
|
||||
|
||||
(void)strncpy(buf, name, sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
|
||||
/*
|
||||
* First, figure out what he intends as a field separator.
|
||||
* Despite the way this routine is written, the preferred
|
||||
* form 2-272.AA001234H.01777, i.e. XDE standard.
|
||||
* Great efforts are made to ensure backwards compatibility.
|
||||
*/
|
||||
if ( (hostname = strchr(buf, '#')) )
|
||||
separator = '#';
|
||||
else {
|
||||
hostname = strchr(buf, '.');
|
||||
if ((cp = strchr(buf, ':')) &&
|
||||
((hostname && cp < hostname) || (hostname == 0))) {
|
||||
hostname = cp;
|
||||
separator = ':';
|
||||
} else
|
||||
separator = '.';
|
||||
}
|
||||
if (hostname)
|
||||
*hostname++ = 0;
|
||||
|
||||
addr = zero_addr;
|
||||
Field(buf, addr.x_net.c_net, 4);
|
||||
if (hostname == 0)
|
||||
return (addr); /* No separator means net only */
|
||||
|
||||
socketname = strchr(hostname, separator);
|
||||
if (socketname) {
|
||||
*socketname++ = 0;
|
||||
Field(socketname, (u_char *)&addr.x_port, 2);
|
||||
}
|
||||
|
||||
Field(hostname, addr.x_host.c_host, 6);
|
||||
|
||||
return (addr);
|
||||
}
|
||||
|
||||
static void
|
||||
Field(buf, out, len)
|
||||
char *buf;
|
||||
u_char *out;
|
||||
int len;
|
||||
{
|
||||
char *bp = buf;
|
||||
int i, ibase, base16 = 0, base10 = 0, clen = 0;
|
||||
int hb[6], *hp;
|
||||
char *fmt;
|
||||
|
||||
/*
|
||||
* first try 2-273#2-852-151-014#socket
|
||||
*/
|
||||
if ((*buf != '-') &&
|
||||
(1 < (i = sscanf(buf, "%d-%d-%d-%d-%d",
|
||||
&hb[0], &hb[1], &hb[2], &hb[3], &hb[4])))) {
|
||||
cvtbase(1000L, 256, hb, i, out, len);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* try form 8E1#0.0.AA.0.5E.E6#socket
|
||||
*/
|
||||
if (1 < (i = sscanf(buf,"%x.%x.%x.%x.%x.%x",
|
||||
&hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
|
||||
cvtbase(256L, 256, hb, i, out, len);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* try form 8E1#0:0:AA:0:5E:E6#socket
|
||||
*/
|
||||
if (1 < (i = sscanf(buf,"%x:%x:%x:%x:%x:%x",
|
||||
&hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
|
||||
cvtbase(256L, 256, hb, i, out, len);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* This is REALLY stretching it but there was a
|
||||
* comma notation separating shorts -- definitely non-standard
|
||||
*/
|
||||
if (1 < (i = sscanf(buf,"%x,%x,%x",
|
||||
&hb[0], &hb[1], &hb[2]))) {
|
||||
hb[0] = htons(hb[0]); hb[1] = htons(hb[1]);
|
||||
hb[2] = htons(hb[2]);
|
||||
cvtbase(65536L, 256, hb, i, out, len);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Need to decide if base 10, 16 or 8 */
|
||||
while (*bp) switch (*bp++) {
|
||||
|
||||
case '0': case '1': case '2': case '3': case '4': case '5':
|
||||
case '6': case '7': case '-':
|
||||
break;
|
||||
|
||||
case '8': case '9':
|
||||
base10 = 1;
|
||||
break;
|
||||
|
||||
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
|
||||
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
|
||||
base16 = 1;
|
||||
break;
|
||||
|
||||
case 'x': case 'X':
|
||||
*--bp = '0';
|
||||
base16 = 1;
|
||||
break;
|
||||
|
||||
case 'h': case 'H':
|
||||
base16 = 1;
|
||||
/* FALLTHROUGH */
|
||||
|
||||
default:
|
||||
*--bp = 0; /* Ends Loop */
|
||||
}
|
||||
if (base16) {
|
||||
fmt = "%3x";
|
||||
ibase = 4096;
|
||||
} else if (base10 == 0 && *buf == '0') {
|
||||
fmt = "%3o";
|
||||
ibase = 512;
|
||||
} else {
|
||||
fmt = "%3d";
|
||||
ibase = 1000;
|
||||
}
|
||||
|
||||
for (bp = buf; *bp++; ) clen++;
|
||||
if (clen == 0) clen++;
|
||||
if (clen > 18) clen = 18;
|
||||
i = ((clen - 1) / 3) + 1;
|
||||
bp = clen + buf - 3;
|
||||
hp = hb + i - 1;
|
||||
|
||||
while (hp > hb) {
|
||||
(void)sscanf(bp, fmt, hp);
|
||||
bp[0] = 0;
|
||||
hp--;
|
||||
bp -= 3;
|
||||
}
|
||||
(void)sscanf(buf, fmt, hp);
|
||||
cvtbase((long)ibase, 256, hb, i, out, len);
|
||||
}
|
||||
|
||||
static void
|
||||
cvtbase(oldbase,newbase,input,inlen,result,reslen)
|
||||
long oldbase;
|
||||
int newbase;
|
||||
int input[];
|
||||
int inlen;
|
||||
unsigned char result[];
|
||||
int reslen;
|
||||
{
|
||||
int d, e;
|
||||
long sum;
|
||||
|
||||
e = 1;
|
||||
while (e > 0 && reslen > 0) {
|
||||
d = 0; e = 0; sum = 0;
|
||||
/* long division: input=input/newbase */
|
||||
while (d < inlen) {
|
||||
sum = sum*oldbase + (long) input[d];
|
||||
e += (sum > 0);
|
||||
input[d++] = sum / newbase;
|
||||
sum %= newbase;
|
||||
}
|
||||
result[--reslen] = sum; /* accumulate remainder */
|
||||
}
|
||||
for (d=0; d < reslen; d++)
|
||||
result[d] = 0;
|
||||
}
|
@ -1,99 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1986, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)ipx_ntoa.c";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netipx/ipx.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static char *spectHex(char *);
|
||||
|
||||
char *
|
||||
ipx_ntoa(addr)
|
||||
struct ipx_addr addr;
|
||||
{
|
||||
static char obuf[40];
|
||||
union { union ipx_net net_e; u_long long_e; } net;
|
||||
u_short port = htons(addr.x_port);
|
||||
char *cp;
|
||||
char *cp2;
|
||||
u_char *up = addr.x_host.c_host;
|
||||
u_char *uplim = up + 6;
|
||||
|
||||
net.net_e = addr.x_net;
|
||||
sprintf(obuf, "%lx", (u_long)ntohl(net.long_e));
|
||||
cp = spectHex(obuf);
|
||||
cp2 = cp + 1;
|
||||
while (*up==0 && up < uplim) up++;
|
||||
if (up == uplim) {
|
||||
if (port) {
|
||||
sprintf(cp, ".0");
|
||||
cp += 2;
|
||||
}
|
||||
} else {
|
||||
sprintf(cp, ".%x", *up++);
|
||||
while (up < uplim) {
|
||||
while (*cp) cp++;
|
||||
sprintf(cp, "%02x", *up++);
|
||||
}
|
||||
cp = spectHex(cp2);
|
||||
}
|
||||
if (port) {
|
||||
sprintf(cp, ".%x", port);
|
||||
spectHex(cp + 1);
|
||||
}
|
||||
return (obuf);
|
||||
}
|
||||
|
||||
static char *
|
||||
spectHex(p0)
|
||||
char *p0;
|
||||
{
|
||||
int ok = 0;
|
||||
int nonzero = 0;
|
||||
char *p = p0;
|
||||
for (; *p; p++) switch (*p) {
|
||||
|
||||
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
|
||||
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
|
||||
ok = 1;
|
||||
case '1': case '2': case '3': case '4': case '5':
|
||||
case '6': case '7': case '8': case '9':
|
||||
nonzero = 1;
|
||||
}
|
||||
if (nonzero && !ok) { *p++ = 'H'; *p = 0; }
|
||||
return (p);
|
||||
}
|
@ -31,7 +31,6 @@
|
||||
|
||||
buildopts -DWITHOUT_PAM -DRELEASE_CRUNCH -DPPP_NO_NETGRAPH
|
||||
buildopts -DTRACEROUTE_NO_IPSEC -DNO_INET6
|
||||
buildopts -DWITHOUT_IPX
|
||||
|
||||
# Directories where to look for sources of various binaries.
|
||||
# @__CWD__@ is a magic keyword in the picobsd's (Makefile.conf)
|
||||
|
@ -31,7 +31,6 @@
|
||||
|
||||
buildopts -DWITHOUT_PAM -DRELEASE_CRUNCH -DPPP_NO_NETGRAPH
|
||||
buildopts -DTRACEROUTE_NO_IPSEC -DNO_INET6
|
||||
buildopts -DWITHOUT_IPX
|
||||
|
||||
# Directories where to look for sources of various binaries.
|
||||
# @__CWD__@ is a magic keyword in the picobsd's (Makefile.conf)
|
||||
|
@ -119,9 +119,6 @@ CRUNCH_PROGS_sbin+= zpool
|
||||
# CRUNCH_PROGS+= devd
|
||||
|
||||
CRUNCH_LIBS+= -lalias -lcam -lcurses -ldevstat -lipsec
|
||||
.if ${MK_IPX} != "no"
|
||||
CRUNCH_LIBS+= -lipx
|
||||
.endif
|
||||
.if ${MK_ZFS} != "no"
|
||||
CRUNCH_LIBS+= -lavl -ljail -lzfs_core -lzfs -lnvpair -lpthread -luutil -lumem
|
||||
.endif
|
||||
|
@ -53,11 +53,6 @@ CFLAGS+= -DINET6
|
||||
.if ${MK_INET_SUPPORT} != "no"
|
||||
CFLAGS+= -DINET
|
||||
.endif
|
||||
.if ${MK_IPX_SUPPORT} != "no" && !defined(RELEASE_CRUNCH)
|
||||
SRCS+= af_ipx.c # IPX support
|
||||
DPADD+= ${LIBIPX}
|
||||
LDADD+= -lipx
|
||||
.endif
|
||||
.if ${MK_JAIL} != "no" && !defined(RELEASE_CRUNCH) && !defined(RESCUE)
|
||||
CFLAGS+= -DJAIL
|
||||
DPADD+= ${LIBJAIL}
|
||||
|
@ -1,118 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1983, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ifaddrs.h>
|
||||
|
||||
#include <net/if_var.h>
|
||||
#define IPTUNNEL
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
|
||||
#include "ifconfig.h"
|
||||
|
||||
static struct ifaliasreq ipx_addreq;
|
||||
static struct ifreq ipx_ridreq;
|
||||
|
||||
static void
|
||||
ipx_status(int s __unused, const struct ifaddrs *ifa)
|
||||
{
|
||||
struct sockaddr_ipx *sipx, null_sipx;
|
||||
|
||||
sipx = (struct sockaddr_ipx *)ifa->ifa_addr;
|
||||
if (sipx == NULL)
|
||||
return;
|
||||
|
||||
printf("\tipx %s ", ipx_ntoa(sipx->sipx_addr));
|
||||
|
||||
if (ifa->ifa_flags & IFF_POINTOPOINT) {
|
||||
sipx = (struct sockaddr_ipx *)ifa->ifa_dstaddr;
|
||||
if (sipx == NULL) {
|
||||
memset(&null_sipx, 0, sizeof(null_sipx));
|
||||
sipx = &null_sipx;
|
||||
}
|
||||
printf("--> %s ", ipx_ntoa(sipx->sipx_addr));
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
#define SIPX(x) ((struct sockaddr_ipx *) &(x))
|
||||
struct sockaddr_ipx *sipxtab[] = {
|
||||
SIPX(ipx_ridreq.ifr_addr), SIPX(ipx_addreq.ifra_addr),
|
||||
SIPX(ipx_addreq.ifra_mask), SIPX(ipx_addreq.ifra_broadaddr)
|
||||
};
|
||||
|
||||
static void
|
||||
ipx_getaddr(const char *addr, int which)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = sipxtab[which];
|
||||
|
||||
sipx->sipx_family = AF_IPX;
|
||||
sipx->sipx_len = sizeof(*sipx);
|
||||
sipx->sipx_addr = ipx_addr(addr);
|
||||
if (which == MASK)
|
||||
printf("Attempt to set IPX netmask will be ineffectual\n");
|
||||
}
|
||||
|
||||
static void
|
||||
ipx_postproc(int s, const struct afswtch *afp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static struct afswtch af_ipx = {
|
||||
.af_name = "ipx",
|
||||
.af_af = AF_IPX,
|
||||
.af_status = ipx_status,
|
||||
.af_getaddr = ipx_getaddr,
|
||||
.af_postproc = ipx_postproc,
|
||||
.af_difaddr = SIOCDIFADDR,
|
||||
.af_aifaddr = SIOCAIFADDR,
|
||||
.af_ridreq = &ipx_ridreq,
|
||||
.af_addreq = &ipx_addreq,
|
||||
};
|
||||
|
||||
static __constructor void
|
||||
ipx_ctor(void)
|
||||
{
|
||||
af_register(&af_ipx);
|
||||
}
|
@ -159,12 +159,8 @@ supported are
|
||||
.Dq inet ,
|
||||
.Dq inet6 ,
|
||||
.Dq atalk ,
|
||||
.Dq ipx ,
|
||||
.\" .Dq iso ,
|
||||
and
|
||||
.Dq link .
|
||||
.\" and
|
||||
.\" .Dq ns .
|
||||
The default if available is
|
||||
.Dq inet
|
||||
or otherwise
|
||||
@ -309,12 +305,6 @@ using the
|
||||
kernel configuration option, or the
|
||||
.Va net.fibs
|
||||
tunable.
|
||||
.It Cm ipdst
|
||||
This is used to specify an Internet host who is willing to receive
|
||||
IP packets encapsulating IPX packets bound for a remote network.
|
||||
An apparent point to point link is constructed, and
|
||||
the address specified will be taken as the IPX address and network
|
||||
of the destination.
|
||||
.It Cm maclabel Ar label
|
||||
If Mandatory Access Control support is enabled in the kernel,
|
||||
set the MAC label to
|
||||
|
@ -740,20 +740,6 @@ setifbroadaddr(const char *addr, int dummy __unused, int s,
|
||||
afp->af_getaddr(addr, DSTADDR);
|
||||
}
|
||||
|
||||
static void
|
||||
setifipdst(const char *addr, int dummy __unused, int s,
|
||||
const struct afswtch *afp)
|
||||
{
|
||||
const struct afswtch *inet;
|
||||
|
||||
inet = af_getbyname("inet");
|
||||
if (inet == NULL)
|
||||
return;
|
||||
inet->af_getaddr(addr, DSTADDR);
|
||||
clearaddr = 0;
|
||||
newaddr = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
notealias(const char *addr, int param, int s, const struct afswtch *afp)
|
||||
{
|
||||
@ -1176,7 +1162,6 @@ static struct cmd basic_cmds[] = {
|
||||
DEF_CMD_ARG("netmask", setifnetmask),
|
||||
DEF_CMD_ARG("metric", setifmetric),
|
||||
DEF_CMD_ARG("broadcast", setifbroadaddr),
|
||||
DEF_CMD_ARG("ipdst", setifipdst),
|
||||
DEF_CMD_ARG2("tunnel", settunnel),
|
||||
DEF_CMD("-tunnel", 0, deletetunnel),
|
||||
DEF_CMD("deletetunnel", 0, deletetunnel),
|
||||
|
@ -487,7 +487,6 @@ The next-hop gateway should be reachable through a different route.
|
||||
.Xr netintro 4 ,
|
||||
.Xr route 4 ,
|
||||
.Xr arp 8 ,
|
||||
.Xr IPXrouted 8 ,
|
||||
.Xr routed 8
|
||||
.\".Xr XNSrouted 8
|
||||
.Sh HISTORY
|
||||
|
@ -122,7 +122,6 @@ MAN= aac.4 \
|
||||
dummynet.4 \
|
||||
ed.4 \
|
||||
edsc.4 \
|
||||
ef.4 \
|
||||
ehci.4 \
|
||||
em.4 \
|
||||
en.4 \
|
||||
|
@ -1,111 +0,0 @@
|
||||
.\"
|
||||
.\" Copyright (c) 1999, Boris Popov
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd June 20, 1999
|
||||
.Dt EF 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ef
|
||||
.Nd "pseudo-device driver providing support for multiple Ethernet frame types"
|
||||
.Sh SYNOPSIS
|
||||
.Cd "device ef"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
pseudo-device driver clones each Ethernet type device with four
|
||||
additional interfaces.
|
||||
Each of them is capable to send or receive only
|
||||
one predefined frame type.
|
||||
.Pp
|
||||
Names for the new interfaces are created by adding a
|
||||
.Ar fN
|
||||
suffix to an existing device name.
|
||||
Where
|
||||
.Ar N
|
||||
is a device unit which can have one of the following values:
|
||||
.Bd -literal -offset indent
|
||||
0 interface with an Ethernet_II frame
|
||||
1 interface with a Novell Ethernet_802.3 frame
|
||||
2 interface with an Ethernet_802.2 frame
|
||||
3 interface with an Ethernet_802.2/SNAP frame support.
|
||||
.Ed
|
||||
.Pp
|
||||
For example, device
|
||||
.Ar ed0
|
||||
will be populated with four devices:
|
||||
.Ar ed0f0 ,
|
||||
.Ar ed0f1 ,
|
||||
.Ar ed0f2
|
||||
and
|
||||
.Ar ed0f3 .
|
||||
.Pp
|
||||
After that, each device can be configured as usual:
|
||||
.Dl # ifconfig ed0f1 ipx 0x105
|
||||
This will configure IPX protocol with network number
|
||||
.Ar 0x105
|
||||
and
|
||||
.Ar Ethernet_802.3
|
||||
frame type.
|
||||
.Pp
|
||||
Please note that it is impossible to configure the IPX protocol on the parent
|
||||
.Ar ed0
|
||||
device after the
|
||||
.Ar if_ef.ko
|
||||
driver has been loaded.
|
||||
.Pp
|
||||
If the parent interface is not configured for any other protocol
|
||||
(IP for example), subinterfaces will not function.
|
||||
To avoid that, the parent interface should be
|
||||
manually marked as
|
||||
.Dq up :
|
||||
.Dl # ifconfig ed0 up
|
||||
.Sh EXAMPLES
|
||||
The
|
||||
.Nm
|
||||
driver can be loaded via the
|
||||
.Xr loader.conf 5
|
||||
file:
|
||||
.Dl if_ef_load="YES"
|
||||
.Pp
|
||||
In this case, ordinary interface configuration commands can be used
|
||||
in the
|
||||
.Xr rc.conf 5
|
||||
file:
|
||||
.Dl network_interfaces="ed2 lo0 tun0 ed2f0 ed2f1"
|
||||
.Dl ifconfig_ed2f0_ipx="ipx 0x101"
|
||||
.Dl ifconfig_ed2f1_ipx="ipx 0x102"
|
||||
.Sh DIAGNOSTICS
|
||||
None.
|
||||
.Sh SEE ALSO
|
||||
.Xr ipx 3 ,
|
||||
.Xr ifconfig 8
|
||||
.Sh AUTHORS
|
||||
.An Boris Popov Aq bp@FreeBSD.org .
|
||||
.Sh CAVEATS
|
||||
Avoid to configure the parent Ethernet device for the IPX protocol, after the
|
||||
.Nm
|
||||
driver is loaded.
|
@ -1270,7 +1270,7 @@ sending frames out of the interface.
|
||||
.It INTERFACE
|
||||
This node is also a system networking interface.
|
||||
It has hooks representing
|
||||
each protocol family (IP, AppleTalk, IPX, etc.) and appears in the output of
|
||||
each protocol family (IP, AppleTalk, etc.) and appears in the output of
|
||||
.Xr ifconfig 8 .
|
||||
The interfaces are named
|
||||
.Dq Li ng0 ,
|
||||
|
@ -70,7 +70,7 @@ Packets transmitted via the interface flow out the corresponding
|
||||
protocol-specific hook.
|
||||
Similarly, packets received on a hook appear on the interface as
|
||||
packets received into the corresponding protocol stack.
|
||||
The currently supported protocols are IP, IPv6, AppleTalk, IPX, ATM,
|
||||
The currently supported protocols are IP, IPv6, AppleTalk, ATM,
|
||||
NATM, and NS.
|
||||
.Pp
|
||||
An
|
||||
@ -90,8 +90,6 @@ Transmission and reception of IP packets.
|
||||
Transmission and reception of IPv6 packets.
|
||||
.It Va atalk
|
||||
Transmission and reception of AppleTalk packets.
|
||||
.It Va ipx
|
||||
Transmission and reception of IPX packets.
|
||||
.It Va atm
|
||||
Transmission and reception of ATM packets.
|
||||
.It Va natm
|
||||
|
@ -82,7 +82,7 @@ Possible keywords may include:
|
||||
.Bl -column ".Va retry_count" ".Sy Section"
|
||||
.It Sy "Keyword Section Comment"
|
||||
.It Sy " A B C D"
|
||||
.It Va addr Ta "- + - -" Ta "IP or IPX address of SMB server"
|
||||
.It Va addr Ta "- + - -" Ta "IP address of SMB server"
|
||||
.It Va charsets Ta "- + + +" Ta "local:remote charset pair"
|
||||
.It Va nbns Ta "+ + - -" Ta "address of NetBIOS name server (WINS)"
|
||||
.It Va nbscope Ta "+ + - -" Ta "NetBIOS scope"
|
||||
@ -141,13 +141,6 @@ used on a password:
|
||||
.Bd -literal -offset indent
|
||||
smbutil crypt
|
||||
.Ed
|
||||
.Sh COMPATIBILITY
|
||||
At the time of this writing, the
|
||||
.Tn IPX
|
||||
protocol remains unsupported.
|
||||
Future
|
||||
.Fx
|
||||
releases are expected to support this.
|
||||
.Sh SEE ALSO
|
||||
.Xr smbutil 1 ,
|
||||
.Xr mount_smbfs 8
|
||||
|
@ -2845,27 +2845,6 @@ If
|
||||
is set to
|
||||
.Dq Li YES
|
||||
this is the list of interfaces to use.
|
||||
.It Va ipxgateway_enable
|
||||
.Pq Vt bool
|
||||
If set to
|
||||
.Dq Li YES ,
|
||||
enable the routing of IPX traffic.
|
||||
.It Va ipxrouted_enable
|
||||
.Pq Vt bool
|
||||
If set to
|
||||
.Dq Li YES ,
|
||||
run the
|
||||
.Xr IPXrouted 8
|
||||
daemon at system boot time.
|
||||
.It Va ipxrouted_flags
|
||||
.Pq Vt str
|
||||
If
|
||||
.Va ipxrouted_enable
|
||||
is set to
|
||||
.Dq Li YES ,
|
||||
these are the flags to pass to the
|
||||
.Xr IPXrouted 8
|
||||
daemon.
|
||||
.It Va arpproxy_all
|
||||
.Pq Vt bool
|
||||
If set to
|
||||
|
@ -1,7 +1,7 @@
|
||||
.\" DO NOT EDIT-- this file is automatically generated.
|
||||
.\" from FreeBSD: head/tools/build/options/makeman 255964 2013-10-01 07:22:04Z des
|
||||
.\" $FreeBSD$
|
||||
.Dd February 22, 2014
|
||||
.Dd March 5, 2014
|
||||
.Dt SRC.CONF 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -448,10 +448,6 @@ Set to not build GPIB bus support.
|
||||
Set to not build
|
||||
.Xr gpioctl 8
|
||||
as part of the base system.
|
||||
.It Va WITH_GPL_DTC
|
||||
.\" from FreeBSD: head/tools/build/options/WITH_GPL_DTC 246262 2013-02-02 22:42:46Z dim
|
||||
Set to build the GPL'd version of the device tree compiler from elinux.org,
|
||||
instead of the BSD licensed one.
|
||||
.It Va WITHOUT_GROFF
|
||||
.\" from FreeBSD: head/tools/build/options/WITHOUT_GROFF 218941 2011-02-22 08:13:49Z uqs
|
||||
Set to not build
|
||||
@ -524,18 +520,6 @@ Set to not build IP Filter package.
|
||||
.It Va WITHOUT_IPFW
|
||||
.\" from FreeBSD: head/tools/build/options/WITHOUT_IPFW 183242 2008-09-21 22:02:26Z sam
|
||||
Set to not build IPFW tools.
|
||||
.It Va WITHOUT_IPX
|
||||
.\" from FreeBSD: head/tools/build/options/WITHOUT_IPX 156932 2006-03-21 07:50:50Z ru
|
||||
Set to not build programs and libraries related to IPX networking.
|
||||
When set, it also enforces the following options:
|
||||
.Pp
|
||||
.Bl -item -compact
|
||||
.It
|
||||
.Va WITHOUT_IPX_SUPPORT
|
||||
.El
|
||||
.It Va WITHOUT_IPX_SUPPORT
|
||||
.\" from FreeBSD: head/tools/build/options/WITHOUT_IPX_SUPPORT 156932 2006-03-21 07:50:50Z ru
|
||||
Set to build some programs without IPX support.
|
||||
.It Va WITHOUT_JAIL
|
||||
.\" from FreeBSD: head/tools/build/options/WITHOUT_JAIL 249966 2013-04-27 04:09:09Z eadler
|
||||
Set to not build tools for the support of jails; e.g.,
|
||||
|
@ -297,8 +297,6 @@ see
|
||||
kernel key-management service;
|
||||
see
|
||||
.Xr ipsec 4
|
||||
.It Pa netipx/
|
||||
IPX/SPX protocol stacks
|
||||
.It Pa netnatm/
|
||||
NATM include files;
|
||||
see
|
||||
|
@ -204,8 +204,6 @@ Appletalk phase 1
|
||||
Appletalk phase 2
|
||||
.It Dv NETISR_ARP
|
||||
ARP
|
||||
.It Dv NETISR_IPX
|
||||
IPX/SPX
|
||||
.It Dv NETISR_IPV6
|
||||
IPv6
|
||||
.It Dv NETISR_NATM
|
||||
|
@ -67,9 +67,6 @@ LIBHEIMNTLM?= ${DESTDIR}${LIBDIR}/libheimntlm.a
|
||||
LIBHEIMSQLITE?= ${DESTDIR}${LIBDIR}/libheimsqlite.a
|
||||
LIBHX509?= ${DESTDIR}${LIBDIR}/libhx509.a
|
||||
LIBIPSEC?= ${DESTDIR}${LIBDIR}/libipsec.a
|
||||
.if ${MK_IPX} != "no"
|
||||
LIBIPX?= ${DESTDIR}${LIBDIR}/libipx.a
|
||||
.endif
|
||||
LIBJAIL?= ${DESTDIR}${LIBDIR}/libjail.a
|
||||
LIBKADM5CLNT?= ${DESTDIR}${LIBDIR}/libkadm5clnt.a
|
||||
LIBKADM5SRV?= ${DESTDIR}${LIBDIR}/libkadm5srv.a
|
||||
|
@ -297,7 +297,6 @@ __DEFAULT_YES_OPTIONS = \
|
||||
INSTALLLIB \
|
||||
IPFILTER \
|
||||
IPFW \
|
||||
IPX \
|
||||
JAIL \
|
||||
KDUMP \
|
||||
KERBEROS \
|
||||
@ -572,7 +571,6 @@ MK_TESTS:= no
|
||||
GNU \
|
||||
INET \
|
||||
INET6 \
|
||||
IPX \
|
||||
KERBEROS \
|
||||
KVM \
|
||||
NETGRAPH \
|
||||
|
@ -10,7 +10,7 @@ SUBDIR= boot
|
||||
# Directories to include in cscope name file and TAGS.
|
||||
CSCOPEDIRS= boot bsm cam cddl compat conf contrib crypto ddb dev fs gdb \
|
||||
geom gnu isa kern libkern modules net net80211 netatalk \
|
||||
netgraph netinet netinet6 netipsec netipx netnatm netpfil \
|
||||
netgraph netinet netinet6 netipsec netnatm netpfil \
|
||||
netsmb nfs nfsclient nfsserver nlm ofed opencrypto \
|
||||
pci rpc security sys ufs vm xdr xen ${CSCOPE_ARCHDIR}
|
||||
.if !defined(CSCOPE_ARCHDIR)
|
||||
|
@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include "opt_cpu.h"
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_isa.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_maxmem.h"
|
||||
|
@ -606,8 +606,6 @@ options IPSEC #IP security (requires device crypto)
|
||||
#
|
||||
options IPSEC_NAT_T #NAT-T support, UDP encap of ESP
|
||||
|
||||
options IPX #IPX/SPX communications protocols
|
||||
|
||||
options NETATALK #Appletalk communications protocols
|
||||
options NETATALKDEBUG #Appletalk debugging
|
||||
|
||||
@ -886,14 +884,6 @@ options XBONEHACK
|
||||
device faith
|
||||
device stf
|
||||
|
||||
# The `ef' device provides support for multiple ethernet frame types
|
||||
# specified via ETHER_* options. See ef(4) for details.
|
||||
device ef
|
||||
options ETHER_II # enable Ethernet_II frame
|
||||
options ETHER_8023 # enable Ethernet_802.3 (Novell) frame
|
||||
options ETHER_8022 # enable Ethernet_802.2 frame
|
||||
options ETHER_SNAP # enable Ethernet_802.2/SNAP frame
|
||||
|
||||
# The pf packet filter consists of three devices:
|
||||
# The `pf' device provides /dev/pf and the firewall code itself.
|
||||
# The `pflog' device provides the pflog0 interface which logs packets.
|
||||
|
@ -3087,7 +3087,6 @@ net/if_dead.c standard
|
||||
net/if_debug.c optional ddb
|
||||
net/if_disc.c optional disc
|
||||
net/if_edsc.c optional edsc
|
||||
net/if_ef.c optional ef
|
||||
net/if_enc.c optional enc ipsec inet | enc ipsec inet6
|
||||
net/if_epair.c optional epair
|
||||
net/if_ethersubr.c optional ether
|
||||
@ -3365,16 +3364,6 @@ netipsec/xform_ipcomp.c optional ipsec inet | ipsec inet6
|
||||
netipsec/xform_ipip.c optional ipsec inet | ipsec inet6
|
||||
netipsec/xform_tcp.c optional ipsec inet tcp_signature | \
|
||||
ipsec inet6 tcp_signature
|
||||
netipx/ipx.c optional ipx
|
||||
netipx/ipx_cksum.c optional ipx
|
||||
netipx/ipx_input.c optional ipx
|
||||
netipx/ipx_outputfl.c optional ipx
|
||||
netipx/ipx_pcb.c optional ipx
|
||||
netipx/ipx_proto.c optional ipx
|
||||
netipx/ipx_usrreq.c optional ipx
|
||||
netipx/spx_debug.c optional ipx
|
||||
netipx/spx_reass.c optional ipx
|
||||
netipx/spx_usrreq.c optional ipx
|
||||
netnatm/natm.c optional natm
|
||||
netnatm/natm_pcb.c optional natm
|
||||
netnatm/natm_proto.c optional natm
|
||||
|
@ -398,10 +398,6 @@ DEV_PFLOG opt_pf.h
|
||||
DEV_PFSYNC opt_pf.h
|
||||
DEV_VLAN opt_vlan.h
|
||||
DUMMYNET opt_ipdn.h
|
||||
ETHER_8022 opt_ef.h
|
||||
ETHER_8023 opt_ef.h
|
||||
ETHER_II opt_ef.h
|
||||
ETHER_SNAP opt_ef.h
|
||||
INET opt_inet.h
|
||||
INET6 opt_inet6.h
|
||||
IPDIVERT
|
||||
@ -419,7 +415,6 @@ IPSEC_DEBUG opt_ipsec.h
|
||||
IPSEC_FILTERTUNNEL opt_ipsec.h
|
||||
IPSEC_NAT_T opt_ipsec.h
|
||||
IPSTEALTH
|
||||
IPX
|
||||
KRPC
|
||||
LIBALIAS
|
||||
LIBMBPOOL
|
||||
|
@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include "opt_cpu.h"
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_isa.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_maxmem.h"
|
||||
|
@ -40,7 +40,6 @@ COMM= ${SYS}/dev/advansys/*.[ch] \
|
||||
${SYS}/netinet/*.[ch] \
|
||||
${SYS}/netinet6/*.[ch] \
|
||||
${SYS}/netipsec/*.[ch] \
|
||||
${SYS}/netipx/*.[ch] \
|
||||
${SYS}/netnatm/*.[ch] \
|
||||
${SYS}/nfs/*.[ch] \
|
||||
${SYS}/nfsclient/*.[ch] \
|
||||
@ -59,7 +58,6 @@ COMMDIR1= ${SYS}/conf \
|
||||
${SYS}/netinet \
|
||||
${SYS}/netinet6 \
|
||||
${SYS}/netipsec \
|
||||
${SYS}/netipx \
|
||||
${SYS}/netnatm \
|
||||
${SYS}/nfs \
|
||||
${SYS}/pci \
|
||||
|
@ -3743,12 +3743,6 @@ prison_priv_check(struct ucred *cred, int priv)
|
||||
case PRIV_NETINET_BINDANY:
|
||||
|
||||
#ifdef notyet
|
||||
/*
|
||||
* IPX/SPX privileges.
|
||||
*/
|
||||
case PRIV_NETIPX_RESERVEDPORT:
|
||||
case PRIV_NETIPX_RAW:
|
||||
|
||||
/*
|
||||
* NCP privileges.
|
||||
*/
|
||||
|
@ -222,7 +222,6 @@
|
||||
./etc/rc.d/ipmon
|
||||
./etc/rc.d/ipnat
|
||||
./etc/rc.d/ipsec
|
||||
./etc/rc.d/ipxrouted
|
||||
./etc/rc.d/jail
|
||||
./etc/rc.d/kadmind
|
||||
./etc/rc.d/kerberos
|
||||
@ -437,7 +436,6 @@
|
||||
./lib/libbsdxml.so.4
|
||||
./lib/libgeom.so.5
|
||||
./lib/libipsec.so.4
|
||||
./lib/libipx.so.5
|
||||
./lib/libjail.so.1
|
||||
./lib/libkiconv.so.4
|
||||
./lib/libpcap.so.7
|
||||
|
@ -136,7 +136,6 @@ SUBDIR= \
|
||||
if_bridge \
|
||||
if_disc \
|
||||
if_edsc \
|
||||
if_ef \
|
||||
if_epair \
|
||||
if_faith \
|
||||
if_gif \
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
KMOD= arcnet
|
||||
SRCS= if_arcsubr.c
|
||||
SRCS+= opt_inet.h opt_inet6.h opt_ipx.h opt_ofed.h
|
||||
SRCS+= opt_inet.h opt_inet6.h opt_ofed.h
|
||||
|
||||
EXPORT_SYMS= arc_frag_init \
|
||||
arc_frag_next \
|
||||
@ -22,9 +22,6 @@ opt_inet.h:
|
||||
|
||||
opt_inet6.h:
|
||||
echo "#define INET6 1" > ${.TARGET}
|
||||
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
.endif
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -1,36 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${.CURDIR}/../../net
|
||||
|
||||
KMOD= if_ef
|
||||
SRCS= if_ef.c opt_ipx.h opt_inet.h opt_ef.h
|
||||
|
||||
.if defined(EFDEBUG)
|
||||
CFLAGS+= -DEF_DEBUG
|
||||
.endif
|
||||
|
||||
.if !defined(KERNBUILDDIR)
|
||||
# If you need only a limited number of frames, uncomment the needed ones.
|
||||
# This will reduce the number of visible devices. Note that the module
|
||||
# will support all frames by default, i.e., when all are commented here.
|
||||
#ETHER_II=
|
||||
#ETHER_8023=
|
||||
#ETHER_8022=
|
||||
#ETHER_SNAP=
|
||||
|
||||
opt_inet.h:
|
||||
echo "#define INET 1" > ${.TARGET}
|
||||
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
|
||||
opt_ef.h:
|
||||
:> ${.TARGET}
|
||||
.for frame in ETHER_II ETHER_8023 ETHER_8022 ETHER_SNAP
|
||||
.if defined(${frame})
|
||||
echo "#define ${frame} 1" >> ${.TARGET}
|
||||
.endif
|
||||
.endfor
|
||||
.endif
|
||||
|
||||
.include <bsd.kmod.mk>
|
@ -3,7 +3,7 @@
|
||||
.PATH: ${.CURDIR}/../../net
|
||||
|
||||
KMOD= if_tun
|
||||
SRCS= if_tun.c opt_atalk.h opt_inet.h opt_inet6.h opt_ipx.h
|
||||
SRCS= if_tun.c opt_atalk.h opt_inet.h opt_inet6.h
|
||||
|
||||
.if !defined(KERNBUILDDIR)
|
||||
opt_atalk.h:
|
||||
@ -14,9 +14,6 @@ opt_inet.h:
|
||||
|
||||
opt_inet6.h:
|
||||
echo "#define INET6 1" > ${.TARGET}
|
||||
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
.endif
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -2,7 +2,7 @@
|
||||
# $Whistle: Makefile,v 1.2 1999/01/19 19:39:21 archie Exp $
|
||||
|
||||
KMOD= ng_iface
|
||||
SRCS= ng_iface.c opt_atalk.h opt_inet.h opt_inet6.h opt_ipx.h
|
||||
SRCS= ng_iface.c opt_atalk.h opt_inet.h opt_inet6.h
|
||||
|
||||
.if !defined(KERNBUILDDIR)
|
||||
opt_atalk.h:
|
||||
@ -13,9 +13,6 @@ opt_inet.h:
|
||||
|
||||
opt_inet6.h:
|
||||
echo "#define INET6 1" > ${.TARGET}
|
||||
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
.endif
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -10,8 +10,7 @@
|
||||
KMOD= smbfs
|
||||
|
||||
SRCS= vnode_if.h \
|
||||
opt_inet.h opt_ipx.h \
|
||||
opt_netsmb.h \
|
||||
opt_inet.h opt_netsmb.h \
|
||||
iconv_converter_if.h \
|
||||
md4c.c \
|
||||
smb_conn.c smb_dev.c smb_trantcp.c smb_smb.c smb_subr.c smb_rq.c \
|
||||
@ -27,9 +26,6 @@ SRCS+= des_enc.S
|
||||
SRCS+= des_enc.c
|
||||
.endif
|
||||
|
||||
# Build with IPX support (1|0)
|
||||
SMB_IPX?= 0
|
||||
|
||||
# Build with INET support (1|0)
|
||||
SMB_INET?= 1
|
||||
|
||||
@ -44,11 +40,6 @@ CFLAGS+= -DVNPRINT
|
||||
opt_inet.h:
|
||||
echo "#define INET 1" > ${.TARGET}
|
||||
.endif
|
||||
|
||||
.if ${SMB_IPX} > 0
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
.endif
|
||||
.endif
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
KMOD= sppp
|
||||
SRCS= if_spppfr.c if_spppsubr.c slcompress.c
|
||||
SRCS+= opt_inet.h opt_inet6.h opt_ipx.h
|
||||
SRCS+= opt_inet.h opt_inet6.h
|
||||
|
||||
EXPORT_SYMS= sppp_attach \
|
||||
sppp_detach \
|
||||
@ -21,9 +21,6 @@ opt_inet.h:
|
||||
|
||||
opt_inet6.h:
|
||||
echo "#define INET6 1" > ${.TARGET}
|
||||
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
.endif
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -13,7 +13,7 @@ SRCS= ieee80211.c ieee80211_action.c ieee80211_ageq.c \
|
||||
ieee80211_ht.c ieee80211_hwmp.c ieee80211_adhoc.c ieee80211_hostap.c \
|
||||
ieee80211_monitor.c ieee80211_sta.c ieee80211_wds.c ieee80211_ddb.c \
|
||||
ieee80211_tdma.c ieee80211_superg.c
|
||||
SRCS+= bus_if.h device_if.h opt_ddb.h opt_inet.h opt_inet6.h opt_ipx.h \
|
||||
SRCS+= bus_if.h device_if.h opt_ddb.h opt_inet.h opt_inet6.h \
|
||||
opt_tdma.h opt_wlan.h
|
||||
|
||||
.if !defined(KERNBUILDDIR)
|
||||
@ -23,8 +23,6 @@ opt_wlan.h:
|
||||
echo "#define IEEE80211_SUPPORT_MESH 1" >> ${.TARGET}
|
||||
opt_inet.h:
|
||||
echo "#define INET 1" > ${.TARGET}
|
||||
opt_ipx.h:
|
||||
echo "#define IPX 1" > ${.TARGET}
|
||||
# override to get ddb support?
|
||||
opt_ddb.h:
|
||||
:> ${.TARGET}
|
||||
|
@ -40,7 +40,6 @@
|
||||
*/
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -77,11 +76,6 @@
|
||||
#include <netinet6/nd6.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#define ARCNET_ALLOW_BROKEN_ARP
|
||||
|
||||
static struct mbuf *arc_defrag(struct ifnet *, struct mbuf *);
|
||||
@ -94,7 +88,6 @@ u_int8_t arcbroadcastaddr = 0;
|
||||
|
||||
#define senderr(e) { error = (e); goto bad;}
|
||||
#define SIN(s) ((const struct sockaddr_in *)(s))
|
||||
#define SIPX(s) ((const struct sockaddr_ipx *)(s))
|
||||
|
||||
/*
|
||||
* ARCnet output routine.
|
||||
@ -177,15 +170,6 @@ arc_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
|
||||
atype = ARCTYPE_INET6;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
adst = SIPX(dst)->sipx_addr.x_host.c_host[5];
|
||||
atype = ARCTYPE_IPX;
|
||||
if (adst == 0xff)
|
||||
adst = arcbroadcastaddr;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case AF_UNSPEC:
|
||||
{
|
||||
const struct arc_header *ah;
|
||||
@ -601,12 +585,6 @@ arc_input(struct ifnet *ifp, struct mbuf *m)
|
||||
m_adj(m, ARC_HDRNEWLEN);
|
||||
isr = NETISR_IPV6;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case ARCTYPE_IPX:
|
||||
m_adj(m, ARC_HDRNEWLEN);
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
m_freem(m);
|
||||
@ -688,26 +666,6 @@ arc_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
ifp->if_init(ifp->if_softc); /* before arpwhohas */
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
/*
|
||||
* XXX This code is probably wrong
|
||||
*/
|
||||
case AF_IPX:
|
||||
{
|
||||
struct ipx_addr *ina = &(IA_SIPX(ifa)->sipx_addr);
|
||||
|
||||
if (ipx_nullhost(*ina))
|
||||
ina->x_host.c_host[5] = ARC_LLADDR(ifp);
|
||||
else
|
||||
arc_storelladdr(ifp, ina->x_host.c_host[5]);
|
||||
|
||||
/*
|
||||
* Set new address
|
||||
*/
|
||||
ifp->if_init(ifp->if_softc);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
ifp->if_init(ifp->if_softc);
|
||||
|
603
sys/net/if_ef.c
603
sys/net/if_ef.c
@ -1,603 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1999, 2000 Boris Popov
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_ef.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/sockio.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/module.h>
|
||||
|
||||
#include <net/ethernet.h>
|
||||
#include <net/if_llc.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_types.h>
|
||||
#include <net/netisr.h>
|
||||
#include <net/bpf.h>
|
||||
#include <net/vnet.h>
|
||||
|
||||
#ifdef INET
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/in_var.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
/* If none of the supported layers is enabled explicitly enable them all */
|
||||
#if !defined(ETHER_II) && !defined(ETHER_8023) && !defined(ETHER_8022) && \
|
||||
!defined(ETHER_SNAP)
|
||||
#define ETHER_II 1
|
||||
#define ETHER_8023 1
|
||||
#define ETHER_8022 1
|
||||
#define ETHER_SNAP 1
|
||||
#endif
|
||||
|
||||
/* internal frame types */
|
||||
#define ETHER_FT_EII 0 /* Ethernet_II - default */
|
||||
#define ETHER_FT_8023 1 /* 802.3 (Novell) */
|
||||
#define ETHER_FT_8022 2 /* 802.2 */
|
||||
#define ETHER_FT_SNAP 3 /* SNAP */
|
||||
#define EF_NFT 4 /* total number of frame types */
|
||||
|
||||
#ifdef EF_DEBUG
|
||||
#define EFDEBUG(format, args...) printf("%s: "format, __func__ ,## args)
|
||||
#else
|
||||
#define EFDEBUG(format, args...)
|
||||
#endif
|
||||
|
||||
#define EFERROR(format, args...) printf("%s: "format, __func__ ,## args)
|
||||
|
||||
struct efnet {
|
||||
struct ifnet *ef_ifp;
|
||||
struct ifnet *ef_pifp;
|
||||
int ef_frametype;
|
||||
};
|
||||
|
||||
struct ef_link {
|
||||
SLIST_ENTRY(ef_link) el_next;
|
||||
struct ifnet *el_ifp; /* raw device for this clones */
|
||||
struct efnet *el_units[EF_NFT]; /* our clones */
|
||||
};
|
||||
|
||||
static SLIST_HEAD(ef_link_head, ef_link) efdev = {NULL};
|
||||
static int efcount;
|
||||
|
||||
extern int (*ef_inputp)(struct ifnet*, struct ether_header *eh, struct mbuf *m);
|
||||
extern int (*ef_outputp)(struct ifnet *ifp, struct mbuf **mp,
|
||||
const struct sockaddr *dst, short *tp, int *hlen);
|
||||
|
||||
/*
|
||||
static void ef_reset (struct ifnet *);
|
||||
*/
|
||||
static int ef_attach(struct efnet *sc);
|
||||
static int ef_detach(struct efnet *sc);
|
||||
static void ef_init(void *);
|
||||
static int ef_ioctl(struct ifnet *, u_long, caddr_t);
|
||||
static void ef_start(struct ifnet *);
|
||||
static int ef_input(struct ifnet*, struct ether_header *, struct mbuf *);
|
||||
static int ef_output(struct ifnet *ifp, struct mbuf **mp,
|
||||
const struct sockaddr *dst, short *tp, int *hlen);
|
||||
|
||||
static int ef_load(void);
|
||||
static int ef_unload(void);
|
||||
|
||||
/*
|
||||
* Install the interface, most of structure initialization done in ef_clone()
|
||||
*/
|
||||
static int
|
||||
ef_attach(struct efnet *sc)
|
||||
{
|
||||
struct ifnet *ifp = sc->ef_ifp;
|
||||
|
||||
ifp->if_start = ef_start;
|
||||
ifp->if_init = ef_init;
|
||||
ifp->if_snd.ifq_maxlen = ifqmaxlen;
|
||||
ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
|
||||
/*
|
||||
* Attach the interface
|
||||
*/
|
||||
ether_ifattach(ifp, IF_LLADDR(sc->ef_pifp));
|
||||
|
||||
ifp->if_resolvemulti = 0;
|
||||
ifp->if_type = IFT_XETHER;
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
|
||||
EFDEBUG("%s: attached\n", ifp->if_xname);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is for _testing_only_, just removes interface from interfaces list
|
||||
*/
|
||||
static int
|
||||
ef_detach(struct efnet *sc)
|
||||
{
|
||||
struct ifnet *ifp = sc->ef_ifp;
|
||||
|
||||
ether_ifdetach(ifp);
|
||||
if_free(ifp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ef_init(void *foo) {
|
||||
return;
|
||||
}
|
||||
|
||||
static int
|
||||
ef_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
{
|
||||
struct efnet *sc = ifp->if_softc;
|
||||
struct ifaddr *ifa = (struct ifaddr*)data;
|
||||
int error;
|
||||
|
||||
EFDEBUG("IOCTL %ld for %s\n", cmd, ifp->if_xname);
|
||||
error = 0;
|
||||
switch (cmd) {
|
||||
case SIOCSIFFLAGS:
|
||||
error = 0;
|
||||
break;
|
||||
case SIOCSIFADDR:
|
||||
if (sc->ef_frametype == ETHER_FT_8023 &&
|
||||
ifa->ifa_addr->sa_family != AF_IPX) {
|
||||
error = EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
ifp->if_flags |= IFF_UP;
|
||||
/* FALL THROUGH */
|
||||
default:
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Currently packet prepared in the ether_output(), but this can be a better
|
||||
* place.
|
||||
*/
|
||||
static void
|
||||
ef_start(struct ifnet *ifp)
|
||||
{
|
||||
struct efnet *sc = (struct efnet*)ifp->if_softc;
|
||||
struct ifnet *p;
|
||||
struct mbuf *m;
|
||||
int error;
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
p = sc->ef_pifp;
|
||||
|
||||
EFDEBUG("\n");
|
||||
for (;;) {
|
||||
IF_DEQUEUE(&ifp->if_snd, m);
|
||||
if (m == 0)
|
||||
break;
|
||||
BPF_MTAP(ifp, m);
|
||||
error = p->if_transmit(p, m);
|
||||
if (error) {
|
||||
ifp->if_oerrors++;
|
||||
continue;
|
||||
}
|
||||
ifp->if_opackets++;
|
||||
}
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Inline functions do not put additional overhead to procedure call or
|
||||
* parameter passing but simplify the code
|
||||
*/
|
||||
static int __inline
|
||||
ef_inputEII(struct mbuf *m, struct ether_header *eh, u_short ether_type)
|
||||
{
|
||||
int isr;
|
||||
|
||||
switch(ether_type) {
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX:
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef INET
|
||||
case ETHERTYPE_IP:
|
||||
if ((m = ip_fastforward(m)) == NULL)
|
||||
return (0);
|
||||
isr = NETISR_IP;
|
||||
break;
|
||||
|
||||
case ETHERTYPE_ARP:
|
||||
isr = NETISR_ARP;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return (EPROTONOSUPPORT);
|
||||
}
|
||||
netisr_dispatch(isr, m);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int __inline
|
||||
ef_inputSNAP(struct mbuf *m, struct ether_header *eh, struct llc* l,
|
||||
u_short ether_type)
|
||||
{
|
||||
int isr;
|
||||
|
||||
switch(ether_type) {
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX:
|
||||
m_adj(m, 8);
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return (EPROTONOSUPPORT);
|
||||
}
|
||||
netisr_dispatch(isr, m);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int __inline
|
||||
ef_input8022(struct mbuf *m, struct ether_header *eh, struct llc* l,
|
||||
u_short ether_type)
|
||||
{
|
||||
int isr;
|
||||
|
||||
switch(ether_type) {
|
||||
#ifdef IPX
|
||||
case 0xe0:
|
||||
m_adj(m, 3);
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return (EPROTONOSUPPORT);
|
||||
}
|
||||
netisr_dispatch(isr, m);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called from ether_input()
|
||||
*/
|
||||
static int
|
||||
ef_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
|
||||
{
|
||||
u_short ether_type;
|
||||
int ft = -1;
|
||||
struct efnet *efp;
|
||||
struct ifnet *eifp;
|
||||
struct llc *l;
|
||||
struct ef_link *efl;
|
||||
int isr;
|
||||
|
||||
ether_type = ntohs(eh->ether_type);
|
||||
l = NULL;
|
||||
if (ether_type < ETHERMTU) {
|
||||
l = mtod(m, struct llc*);
|
||||
if (l->llc_dsap == 0xff && l->llc_ssap == 0xff) {
|
||||
/*
|
||||
* Novell's "802.3" frame
|
||||
*/
|
||||
ft = ETHER_FT_8023;
|
||||
} else if (l->llc_dsap == 0xaa && l->llc_ssap == 0xaa) {
|
||||
/*
|
||||
* 802.2/SNAP
|
||||
*/
|
||||
ft = ETHER_FT_SNAP;
|
||||
ether_type = ntohs(l->llc_un.type_snap.ether_type);
|
||||
} else if (l->llc_dsap == l->llc_ssap) {
|
||||
/*
|
||||
* 802.3/802.2
|
||||
*/
|
||||
ft = ETHER_FT_8022;
|
||||
ether_type = l->llc_ssap;
|
||||
}
|
||||
} else
|
||||
ft = ETHER_FT_EII;
|
||||
|
||||
if (ft == -1) {
|
||||
EFDEBUG("Unrecognised ether_type %x\n", ether_type);
|
||||
return EPROTONOSUPPORT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if interface configured for the given frame
|
||||
*/
|
||||
efp = NULL;
|
||||
SLIST_FOREACH(efl, &efdev, el_next) {
|
||||
if (efl->el_ifp == ifp) {
|
||||
efp = efl->el_units[ft];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (efp == NULL) {
|
||||
EFDEBUG("Can't find if for %d\n", ft);
|
||||
return EPROTONOSUPPORT;
|
||||
}
|
||||
eifp = efp->ef_ifp;
|
||||
if ((eifp->if_flags & IFF_UP) == 0)
|
||||
return EPROTONOSUPPORT;
|
||||
eifp->if_ibytes += m->m_pkthdr.len + sizeof (*eh);
|
||||
m->m_pkthdr.rcvif = eifp;
|
||||
|
||||
BPF_MTAP2(eifp, eh, ETHER_HDR_LEN, m);
|
||||
/*
|
||||
* Now we ready to adjust mbufs and pass them to protocol intr's
|
||||
*/
|
||||
switch(ft) {
|
||||
case ETHER_FT_EII:
|
||||
return (ef_inputEII(m, eh, ether_type));
|
||||
#ifdef IPX
|
||||
case ETHER_FT_8023: /* only IPX can be here */
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
case ETHER_FT_SNAP:
|
||||
return (ef_inputSNAP(m, eh, l, ether_type));
|
||||
case ETHER_FT_8022:
|
||||
return (ef_input8022(m, eh, l, ether_type));
|
||||
default:
|
||||
EFDEBUG("No support for frame %d and proto %04x\n",
|
||||
ft, ether_type);
|
||||
return (EPROTONOSUPPORT);
|
||||
}
|
||||
netisr_dispatch(isr, m);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
ef_output(struct ifnet *ifp, struct mbuf **mp, const struct sockaddr *dst,
|
||||
short *tp, int *hlen)
|
||||
{
|
||||
struct efnet *sc = (struct efnet*)ifp->if_softc;
|
||||
struct mbuf *m = *mp;
|
||||
u_char *cp;
|
||||
short type;
|
||||
|
||||
if (ifp->if_type != IFT_XETHER)
|
||||
return ENETDOWN;
|
||||
switch (sc->ef_frametype) {
|
||||
case ETHER_FT_EII:
|
||||
#ifdef IPX
|
||||
type = htons(ETHERTYPE_IPX);
|
||||
#else
|
||||
return EPFNOSUPPORT;
|
||||
#endif
|
||||
break;
|
||||
case ETHER_FT_8023:
|
||||
type = htons(m->m_pkthdr.len);
|
||||
break;
|
||||
case ETHER_FT_8022:
|
||||
M_PREPEND(m, ETHER_HDR_LEN + 3, M_WAITOK);
|
||||
/*
|
||||
* Ensure that ethernet header and next three bytes
|
||||
* will fit into single mbuf
|
||||
*/
|
||||
m = m_pullup(m, ETHER_HDR_LEN + 3);
|
||||
if (m == NULL) {
|
||||
*mp = NULL;
|
||||
return ENOBUFS;
|
||||
}
|
||||
m_adj(m, ETHER_HDR_LEN);
|
||||
type = htons(m->m_pkthdr.len);
|
||||
cp = mtod(m, u_char *);
|
||||
*cp++ = 0xE0;
|
||||
*cp++ = 0xE0;
|
||||
*cp++ = 0x03;
|
||||
*hlen += 3;
|
||||
break;
|
||||
case ETHER_FT_SNAP:
|
||||
M_PREPEND(m, 8, M_WAITOK);
|
||||
type = htons(m->m_pkthdr.len);
|
||||
cp = mtod(m, u_char *);
|
||||
bcopy("\xAA\xAA\x03\x00\x00\x00\x81\x37", cp, 8);
|
||||
*hlen += 8;
|
||||
break;
|
||||
default:
|
||||
return EPFNOSUPPORT;
|
||||
}
|
||||
*mp = m;
|
||||
*tp = type;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create clone from the given interface
|
||||
*/
|
||||
static int
|
||||
ef_clone(struct ef_link *efl, int ft)
|
||||
{
|
||||
struct efnet *efp;
|
||||
struct ifnet *eifp;
|
||||
struct ifnet *ifp = efl->el_ifp;
|
||||
|
||||
efp = (struct efnet*)malloc(sizeof(struct efnet), M_IFADDR,
|
||||
M_WAITOK | M_ZERO);
|
||||
if (efp == NULL)
|
||||
return ENOMEM;
|
||||
efp->ef_pifp = ifp;
|
||||
efp->ef_frametype = ft;
|
||||
eifp = efp->ef_ifp = if_alloc(IFT_ETHER);
|
||||
if (eifp == NULL) {
|
||||
free(efp, M_IFADDR);
|
||||
return (ENOSPC);
|
||||
}
|
||||
snprintf(eifp->if_xname, IFNAMSIZ,
|
||||
"%sf%d", ifp->if_xname, efp->ef_frametype);
|
||||
eifp->if_dname = "ef";
|
||||
eifp->if_dunit = IF_DUNIT_NONE;
|
||||
eifp->if_softc = efp;
|
||||
if (ifp->if_ioctl)
|
||||
eifp->if_ioctl = ef_ioctl;
|
||||
efl->el_units[ft] = efp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ef_load(void)
|
||||
{
|
||||
VNET_ITERATOR_DECL(vnet_iter);
|
||||
struct ifnet *ifp;
|
||||
struct efnet *efp;
|
||||
struct ef_link *efl = NULL, *efl_temp;
|
||||
int error = 0, d;
|
||||
|
||||
VNET_LIST_RLOCK();
|
||||
VNET_FOREACH(vnet_iter) {
|
||||
CURVNET_SET(vnet_iter);
|
||||
|
||||
/*
|
||||
* XXXRW: The following loop walks the ifnet list while
|
||||
* modifying it, something not well-supported by ifnet
|
||||
* locking. To avoid lock upgrade/recursion issues, manually
|
||||
* acquire a write lock of ifnet_sxlock here, rather than a
|
||||
* read lock, so that when if_alloc() recurses the lock, we
|
||||
* don't panic. This structure, in which if_ef automatically
|
||||
* attaches to all ethernet interfaces, should be replaced
|
||||
* with a model like that found in if_vlan, in which
|
||||
* interfaces are explicitly configured, which would avoid
|
||||
* this (and other) problems.
|
||||
*/
|
||||
sx_xlock(&ifnet_sxlock);
|
||||
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
|
||||
if (ifp->if_type != IFT_ETHER) continue;
|
||||
EFDEBUG("Found interface %s\n", ifp->if_xname);
|
||||
efl = (struct ef_link*)malloc(sizeof(struct ef_link),
|
||||
M_IFADDR, M_WAITOK | M_ZERO);
|
||||
if (efl == NULL) {
|
||||
error = ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
efl->el_ifp = ifp;
|
||||
#ifdef ETHER_II
|
||||
error = ef_clone(efl, ETHER_FT_EII);
|
||||
if (error) break;
|
||||
#endif
|
||||
#ifdef ETHER_8023
|
||||
error = ef_clone(efl, ETHER_FT_8023);
|
||||
if (error) break;
|
||||
#endif
|
||||
#ifdef ETHER_8022
|
||||
error = ef_clone(efl, ETHER_FT_8022);
|
||||
if (error) break;
|
||||
#endif
|
||||
#ifdef ETHER_SNAP
|
||||
error = ef_clone(efl, ETHER_FT_SNAP);
|
||||
if (error) break;
|
||||
#endif
|
||||
efcount++;
|
||||
SLIST_INSERT_HEAD(&efdev, efl, el_next);
|
||||
}
|
||||
sx_xunlock(&ifnet_sxlock);
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
VNET_LIST_RUNLOCK();
|
||||
if (error) {
|
||||
if (efl)
|
||||
SLIST_INSERT_HEAD(&efdev, efl, el_next);
|
||||
SLIST_FOREACH_SAFE(efl, &efdev, el_next, efl_temp) {
|
||||
for (d = 0; d < EF_NFT; d++)
|
||||
if (efl->el_units[d]) {
|
||||
if (efl->el_units[d]->ef_pifp != NULL)
|
||||
if_free(efl->el_units[d]->ef_pifp);
|
||||
free(efl->el_units[d], M_IFADDR);
|
||||
}
|
||||
free(efl, M_IFADDR);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
SLIST_FOREACH(efl, &efdev, el_next) {
|
||||
for (d = 0; d < EF_NFT; d++) {
|
||||
efp = efl->el_units[d];
|
||||
if (efp)
|
||||
ef_attach(efp);
|
||||
}
|
||||
}
|
||||
ef_inputp = ef_input;
|
||||
ef_outputp = ef_output;
|
||||
EFDEBUG("Loaded\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ef_unload(void)
|
||||
{
|
||||
struct efnet *efp;
|
||||
struct ef_link *efl;
|
||||
int d;
|
||||
|
||||
ef_inputp = NULL;
|
||||
ef_outputp = NULL;
|
||||
SLIST_FOREACH(efl, &efdev, el_next) {
|
||||
for (d = 0; d < EF_NFT; d++) {
|
||||
efp = efl->el_units[d];
|
||||
if (efp) {
|
||||
ef_detach(efp);
|
||||
}
|
||||
}
|
||||
}
|
||||
EFDEBUG("Unloaded\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
if_ef_modevent(module_t mod, int type, void *data)
|
||||
{
|
||||
switch ((modeventtype_t)type) {
|
||||
case MOD_LOAD:
|
||||
return ef_load();
|
||||
case MOD_UNLOAD:
|
||||
return ef_unload();
|
||||
default:
|
||||
return EOPNOTSUPP;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static moduledata_t if_ef_mod = {
|
||||
"if_ef", if_ef_modevent, NULL
|
||||
};
|
||||
|
||||
DECLARE_MODULE(if_ef, if_ef_mod, SI_SUB_PSEUDO, SI_ORDER_MIDDLE);
|
@ -33,7 +33,6 @@
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_netgraph.h"
|
||||
#include "opt_mbuf_profiling.h"
|
||||
|
||||
@ -79,11 +78,6 @@
|
||||
#include <netinet6/nd6.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
int (*ef_inputp)(struct ifnet*, struct ether_header *eh, struct mbuf *m);
|
||||
int (*ef_outputp)(struct ifnet *ifp, struct mbuf **mp,
|
||||
const struct sockaddr *dst, short *tp, int *hlen);
|
||||
@ -249,18 +243,6 @@ ether_output(struct ifnet *ifp, struct mbuf *m,
|
||||
type = htons(ETHERTYPE_IPV6);
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
if (ef_outputp) {
|
||||
error = ef_outputp(ifp, &m, dst, &type, &hlen);
|
||||
if (error)
|
||||
goto bad;
|
||||
} else
|
||||
type = htons(ETHERTYPE_IPX);
|
||||
bcopy(&((const struct sockaddr_ipx *)dst)->sipx_addr.x_host,
|
||||
edst, sizeof (edst));
|
||||
break;
|
||||
#endif
|
||||
#ifdef NETATALK
|
||||
case AF_APPLETALK:
|
||||
{
|
||||
@ -811,13 +793,6 @@ ether_demux(struct ifnet *ifp, struct mbuf *m)
|
||||
isr = NETISR_ARP;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX:
|
||||
if (ef_inputp && ef_inputp(ifp, eh, m) == 0)
|
||||
return;
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef INET6
|
||||
case ETHERTYPE_IPV6:
|
||||
isr = NETISR_IPV6;
|
||||
@ -832,10 +807,6 @@ ether_demux(struct ifnet *ifp, struct mbuf *m)
|
||||
break;
|
||||
#endif /* NETATALK */
|
||||
default:
|
||||
#ifdef IPX
|
||||
if (ef_inputp && ef_inputp(ifp, eh, m) == 0)
|
||||
return;
|
||||
#endif /* IPX */
|
||||
#if defined(NETATALK)
|
||||
if (ether_type > ETHERMTU)
|
||||
goto discard;
|
||||
@ -1079,31 +1050,6 @@ ether_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
ifp->if_init(ifp->if_softc); /* before arpwhohas */
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
/*
|
||||
* XXX - This code is probably wrong
|
||||
*/
|
||||
case AF_IPX:
|
||||
{
|
||||
struct ipx_addr *ina = &(IA_SIPX(ifa)->sipx_addr);
|
||||
|
||||
if (ipx_nullhost(*ina))
|
||||
ina->x_host =
|
||||
*(union ipx_host *)
|
||||
IF_LLADDR(ifp);
|
||||
else {
|
||||
bcopy((caddr_t) ina->x_host.c_host,
|
||||
(caddr_t) IF_LLADDR(ifp),
|
||||
ETHER_ADDR_LEN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set new address
|
||||
*/
|
||||
ifp->if_init(ifp->if_softc);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
ifp->if_init(ifp->if_softc);
|
||||
|
@ -39,7 +39,6 @@
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -72,11 +71,6 @@
|
||||
#include <netinet6/nd6.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#ifdef DECNET
|
||||
#include <netdnet/dn.h>
|
||||
#endif
|
||||
@ -184,13 +178,6 @@ fddi_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
|
||||
type = htons(ETHERTYPE_IPV6);
|
||||
break;
|
||||
#endif /* INET6 */
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
type = htons(ETHERTYPE_IPX);
|
||||
bcopy(&((const struct sockaddr_ipx *)dst)->sipx_addr.x_host,
|
||||
edst, FDDI_ADDR_LEN);
|
||||
break;
|
||||
#endif /* IPX */
|
||||
#ifdef NETATALK
|
||||
case AF_APPLETALK: {
|
||||
struct at_ifaddr *aa;
|
||||
@ -518,11 +505,6 @@ fddi_input(ifp, m)
|
||||
isr = NETISR_IPV6;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX:
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef DECNET
|
||||
case ETHERTYPE_DECNET:
|
||||
isr = NETISR_DECNET;
|
||||
@ -639,31 +621,6 @@ fddi_ioctl (ifp, command, data)
|
||||
ifp->if_init(ifp->if_softc);
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
/*
|
||||
* XXX - This code is probably wrong
|
||||
*/
|
||||
case AF_IPX: {
|
||||
struct ipx_addr *ina;
|
||||
|
||||
ina = &(IA_SIPX(ifa)->sipx_addr);
|
||||
|
||||
if (ipx_nullhost(*ina)) {
|
||||
ina->x_host = *(union ipx_host *)
|
||||
IF_LLADDR(ifp);
|
||||
} else {
|
||||
bcopy((caddr_t) ina->x_host.c_host,
|
||||
(caddr_t) IF_LLADDR(ifp),
|
||||
ETHER_ADDR_LEN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set new address
|
||||
*/
|
||||
ifp->if_init(ifp->if_softc);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ifp->if_init(ifp->if_softc);
|
||||
|
@ -42,7 +42,6 @@
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -76,11 +75,6 @@
|
||||
#include <netinet6/nd6.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#include <security/mac/mac_framework.h>
|
||||
|
||||
static const u_char iso88025_broadcastaddr[ISO88025_ADDR_LEN] =
|
||||
@ -171,30 +165,6 @@ iso88025_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif /* INET */
|
||||
#ifdef IPX
|
||||
/*
|
||||
* XXX - This code is probably wrong
|
||||
*/
|
||||
case AF_IPX: {
|
||||
struct ipx_addr *ina;
|
||||
|
||||
ina = &(IA_SIPX(ifa)->sipx_addr);
|
||||
|
||||
if (ipx_nullhost(*ina))
|
||||
ina->x_host = *(union ipx_host *)
|
||||
IF_LLADDR(ifp);
|
||||
else
|
||||
bcopy((caddr_t) ina->x_host.c_host,
|
||||
(caddr_t) IF_LLADDR(ifp),
|
||||
ISO88025_ADDR_LEN);
|
||||
|
||||
/*
|
||||
* Set new address
|
||||
*/
|
||||
ifp->if_init(ifp->if_softc);
|
||||
}
|
||||
break;
|
||||
#endif /* IPX */
|
||||
default:
|
||||
ifp->if_init(ifp->if_softc);
|
||||
break;
|
||||
@ -328,25 +298,6 @@ iso88025_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
|
||||
snap_type = ETHERTYPE_IPV6;
|
||||
break;
|
||||
#endif /* INET6 */
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
{
|
||||
u_int8_t *cp;
|
||||
|
||||
bcopy((caddr_t)&(satoipx_addr(dst).x_host), (caddr_t)edst,
|
||||
ISO88025_ADDR_LEN);
|
||||
|
||||
M_PREPEND(m, 3, M_WAITOK);
|
||||
m = m_pullup(m, 3);
|
||||
if (m == 0)
|
||||
senderr(ENOBUFS);
|
||||
cp = mtod(m, u_int8_t *);
|
||||
*cp++ = ETHERTYPE_IPX_8022;
|
||||
*cp++ = ETHERTYPE_IPX_8022;
|
||||
*cp++ = LLC_UI;
|
||||
}
|
||||
break;
|
||||
#endif /* IPX */
|
||||
case AF_UNSPEC:
|
||||
{
|
||||
const struct iso88025_sockaddr_data *sd;
|
||||
@ -546,19 +497,6 @@ iso88025_input(ifp, m)
|
||||
l = mtod(m, struct llc *);
|
||||
|
||||
switch (l->llc_dsap) {
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX_8022: /* Thanks a bunch Novell */
|
||||
if ((l->llc_control != LLC_UI) ||
|
||||
(l->llc_ssap != ETHERTYPE_IPX_8022)) {
|
||||
ifp->if_noproto++;
|
||||
goto dropanyway;
|
||||
}
|
||||
|
||||
th->iso88025_shost[0] &= ~(TR_RII);
|
||||
m_adj(m, 3);
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif /* IPX */
|
||||
case LLC_SNAP_LSAP: {
|
||||
u_int16_t type;
|
||||
if ((l->llc_control != LLC_UI) ||
|
||||
@ -591,12 +529,6 @@ iso88025_input(ifp, m)
|
||||
isr = NETISR_ARP;
|
||||
break;
|
||||
#endif /* INET */
|
||||
#ifdef IPX_SNAP /* XXX: Not supported! */
|
||||
case ETHERTYPE_IPX:
|
||||
th->iso88025_shost[0] &= ~(TR_RII);
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif /* IPX_SNAP */
|
||||
#ifdef INET6
|
||||
case ETHERTYPE_IPV6:
|
||||
th->iso88025_shost[0] &= ~(TR_RII);
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -64,11 +63,6 @@
|
||||
#include <netinet/in_var.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#ifdef INET6
|
||||
#ifndef INET
|
||||
#include <netinet/in.h>
|
||||
@ -273,7 +267,6 @@ looutput(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
|
||||
#endif
|
||||
m->m_pkthdr.csum_flags &= ~LO_CSUM_FEATURES6;
|
||||
break;
|
||||
case AF_IPX:
|
||||
case AF_APPLETALK:
|
||||
break;
|
||||
default:
|
||||
@ -368,11 +361,6 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
|
||||
isr = NETISR_IPV6;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef NETATALK
|
||||
case AF_APPLETALK:
|
||||
isr = NETISR_ATALK2;
|
||||
|
@ -28,7 +28,6 @@
|
||||
#if defined(__FreeBSD__)
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
#endif
|
||||
|
||||
#ifdef NetBSD1_3
|
||||
@ -85,11 +84,6 @@
|
||||
# include <net/ethertypes.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#include <net/if_sppp.h>
|
||||
|
||||
/*
|
||||
@ -266,11 +260,6 @@ drop: ++ifp->if_ierrors;
|
||||
isr = NETISR_IP;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX:
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef NETATALK
|
||||
case ETHERTYPE_AT:
|
||||
isr = NETISR_ATALK;
|
||||
@ -345,11 +334,6 @@ struct mbuf *sppp_fr_header (struct sppp *sp, struct mbuf *m,
|
||||
h[3] = FR_IP;
|
||||
return m;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
type = ETHERTYPE_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef NS
|
||||
case AF_NS:
|
||||
type = 0x8137;
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
@ -65,11 +64,6 @@
|
||||
|
||||
#include <netinet/if_ether.h>
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#include <net/if_sppp.h>
|
||||
|
||||
#define IOCTL_CMD_T u_long
|
||||
@ -671,14 +665,6 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
|
||||
isr = NETISR_IPV6;
|
||||
do_account++;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case PPP_IPX:
|
||||
/* IPX IPXCP not implemented yet */
|
||||
if (sp->pp_phase == PHASE_NETWORK)
|
||||
isr = NETISR_IPX;
|
||||
do_account++;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
@ -714,12 +700,6 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
|
||||
isr = NETISR_IPV6;
|
||||
do_account++;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case ETHERTYPE_IPX:
|
||||
isr = NETISR_IPX;
|
||||
do_account++;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
@ -983,12 +963,6 @@ nobufs: if (debug)
|
||||
rv = ENETDOWN;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX: /* Novell IPX Protocol */
|
||||
h->protocol = htons (sp->pp_mode == IFF_CISCO ?
|
||||
ETHERTYPE_IPX : PPP_IPX);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
m_freem (m);
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/priv.h>
|
||||
@ -906,11 +905,6 @@ tunwrite(struct cdev *dev, struct uio *uio, int flag)
|
||||
isr = NETISR_IPV6;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef NETATALK
|
||||
case AF_APPLETALK:
|
||||
isr = NETISR_ATALK2;
|
||||
|
@ -250,5 +250,4 @@
|
||||
#define IFT_ENC 0xf4
|
||||
#define IFT_PFLOG 0xf6
|
||||
#define IFT_PFSYNC 0xf7
|
||||
#define IFT_IPXIP 0xf9 /* IPX over IP tunneling; no longer used. */
|
||||
#endif /* !_NET_IF_TYPES_H_ */
|
||||
|
@ -56,7 +56,7 @@
|
||||
#define NETISR_ATALK2 5 /* Appletalk phase 2 */
|
||||
#define NETISR_ATALK1 6 /* Appletalk phase 1 */
|
||||
#define NETISR_ARP 7 /* same as AF_LINK */
|
||||
#define NETISR_IPX 8 /* same as AF_IPX */
|
||||
/* 8 was IPX */
|
||||
#define NETISR_ETHER 9 /* ethernet input */
|
||||
#define NETISR_IPV6 10
|
||||
#define NETISR_NATM 11
|
||||
|
@ -129,7 +129,6 @@ int (*carp_get_vhid_p)(struct ifaddr *);
|
||||
typedef struct {
|
||||
int ip_count; /* attached w/ AF_INET */
|
||||
int ip6_count; /* attached w/ AF_INET6 */
|
||||
int ipx_count; /* attached w/ AF_IPX */
|
||||
int any_count; /* total attached */
|
||||
} route_cb_t;
|
||||
static VNET_DEFINE(route_cb_t, route_cb);
|
||||
@ -294,9 +293,6 @@ rts_attach(struct socket *so, int proto, struct thread *td)
|
||||
case AF_INET6:
|
||||
V_route_cb.ip6_count++;
|
||||
break;
|
||||
case AF_IPX:
|
||||
V_route_cb.ipx_count++;
|
||||
break;
|
||||
}
|
||||
V_route_cb.any_count++;
|
||||
RTSOCK_UNLOCK();
|
||||
@ -337,9 +333,6 @@ rts_detach(struct socket *so)
|
||||
case AF_INET6:
|
||||
V_route_cb.ip6_count--;
|
||||
break;
|
||||
case AF_IPX:
|
||||
V_route_cb.ipx_count--;
|
||||
break;
|
||||
}
|
||||
V_route_cb.any_count--;
|
||||
RTSOCK_UNLOCK();
|
||||
|
@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
|
||||
*/
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_wlan.h"
|
||||
|
||||
#include <sys/endian.h>
|
||||
@ -54,11 +53,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <netinet/if_ether.h>
|
||||
#endif
|
||||
|
||||
#ifdef IPX
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#endif
|
||||
|
||||
#include <net80211/ieee80211_var.h>
|
||||
#include <net80211/ieee80211_ioctl.h>
|
||||
#include <net80211/ieee80211_regdomain.h>
|
||||
@ -3419,24 +3413,6 @@ ieee80211_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
}
|
||||
arp_ifinit(ifp, ifa);
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
/*
|
||||
* XXX - This code is probably wrong,
|
||||
* but has been copied many times.
|
||||
*/
|
||||
case AF_IPX: {
|
||||
struct ipx_addr *ina = &(IA_SIPX(ifa)->sipx_addr);
|
||||
|
||||
if (ipx_nullhost(*ina))
|
||||
ina->x_host = *(union ipx_host *)
|
||||
IF_LLADDR(ifp);
|
||||
else
|
||||
bcopy((caddr_t) ina->x_host.c_host,
|
||||
(caddr_t) IF_LLADDR(ifp),
|
||||
ETHER_ADDR_LEN);
|
||||
/* fall thru... */
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
if ((ifp->if_flags & IFF_UP) == 0) {
|
||||
|
@ -51,16 +51,12 @@
|
||||
#include <sys/syslog.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h> /* XXXGL: ipx? */
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
|
||||
#include <netatalk/at.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
|
||||
#include <netgraph/ng_message.h>
|
||||
#include <netgraph/netgraph.h>
|
||||
#include <netgraph/ng_parse.h>
|
||||
|
@ -43,7 +43,7 @@
|
||||
|
||||
/*
|
||||
* This node is also a system networking interface. It has
|
||||
* a hook for each protocol (IP, AppleTalk, IPX, etc). Packets
|
||||
* a hook for each protocol (IP, AppleTalk, etc). Packets
|
||||
* are simply relayed between the interface and the hooks.
|
||||
*
|
||||
* Interfaces are named ng0, ng1, etc. New nodes take the
|
||||
@ -55,7 +55,6 @@
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -105,7 +104,6 @@ const static struct iffam gFamilies[] = {
|
||||
{ AF_INET, NG_IFACE_HOOK_INET },
|
||||
{ AF_INET6, NG_IFACE_HOOK_INET6 },
|
||||
{ AF_APPLETALK, NG_IFACE_HOOK_ATALK },
|
||||
{ AF_IPX, NG_IFACE_HOOK_IPX },
|
||||
{ AF_ATM, NG_IFACE_HOOK_ATM },
|
||||
{ AF_NATM, NG_IFACE_HOOK_NATM },
|
||||
};
|
||||
@ -761,11 +759,6 @@ ng_iface_rcvdata(hook_p hook, item_p item)
|
||||
isr = NETISR_IPV6;
|
||||
break;
|
||||
#endif
|
||||
#ifdef IPX
|
||||
case AF_IPX:
|
||||
isr = NETISR_IPX;
|
||||
break;
|
||||
#endif
|
||||
#ifdef NETATALK
|
||||
case AF_APPLETALK:
|
||||
isr = NETISR_ATALK2;
|
||||
|
@ -55,7 +55,6 @@
|
||||
#define NG_IFACE_HOOK_INET "inet"
|
||||
#define NG_IFACE_HOOK_INET6 "inet6"
|
||||
#define NG_IFACE_HOOK_ATALK "atalk" /* AppleTalk phase 2 */
|
||||
#define NG_IFACE_HOOK_IPX "ipx"
|
||||
#define NG_IFACE_HOOK_ATM "atm"
|
||||
#define NG_IFACE_HOOK_NATM "natm"
|
||||
|
||||
|
@ -122,7 +122,6 @@ static const struct ng_ksocket_alias ng_ksocket_families[] = {
|
||||
{ "inet", PF_INET },
|
||||
{ "inet6", PF_INET6 },
|
||||
{ "atalk", PF_APPLETALK },
|
||||
{ "ipx", PF_IPX },
|
||||
{ "atm", PF_ATM },
|
||||
{ NULL, -1 },
|
||||
};
|
||||
@ -303,7 +302,6 @@ ng_ksocket_sockaddr_parse(const struct ng_parse_type *type,
|
||||
#if 0
|
||||
case PF_APPLETALK: /* XXX implement these someday */
|
||||
case PF_INET6:
|
||||
case PF_IPX:
|
||||
#endif
|
||||
|
||||
default:
|
||||
@ -367,7 +365,6 @@ ng_ksocket_sockaddr_unparse(const struct ng_parse_type *type,
|
||||
#if 0
|
||||
case PF_APPLETALK: /* XXX implement these someday */
|
||||
case PF_INET6:
|
||||
case PF_IPX:
|
||||
#endif
|
||||
|
||||
default:
|
||||
|
@ -32,7 +32,6 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_mrouting.h"
|
||||
#include "opt_ipsec.h"
|
||||
#include "opt_inet.h"
|
||||
|
@ -1,41 +0,0 @@
|
||||
$FreeBSD$
|
||||
|
||||
This protocol implements IPX/SPX over Ethernet_II frame type 0x8137.
|
||||
Please note: the SPX implementation may require further work and testing
|
||||
to insure proper operation.
|
||||
|
||||
Mike Mitchell, Network Engineer
|
||||
AMTECH Systems Corporation, Technology and Manufacturing
|
||||
8600 Jefferson Street, Albuquerque, New Mexico 87113 (505) 856-8000
|
||||
supervisor@alb.asctmd.com
|
||||
|
||||
John Hay
|
||||
Some Company
|
||||
Some Address
|
||||
jhay@mikom.csir.co.za
|
||||
|
||||
Adapted for multi-processor, multi-threaded network stack by Robert N. M.
|
||||
Watson, Computer Laboratory, University of Cambridge.
|
||||
|
||||
--- Copyright Information ---
|
||||
/*-
|
||||
|
||||
Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
The Regents of the University of California. All rights reserved.
|
||||
|
||||
Modifications Copyright (c) 1995, Mike Mitchell
|
||||
Modifications Copyright (c) 1995, John Hay
|
||||
Modifications Copyright (c) 2004-2009 Robert N. M. Watson
|
||||
|
||||
*/
|
||||
|
||||
--- TODO ---
|
||||
|
||||
(1) netipx default socket buffer sizes are very small by contemporary
|
||||
standards, and should be increased following testing and measurement.
|
||||
|
||||
(2) SPX will free the PCB and socket buffer memory on close(), which means
|
||||
close() in effects terminates the transfer of any outstanding buffered
|
||||
but unsent data. As with TCP, it should instead grab its own
|
||||
reference to the socket so that it is not released, as hold onto it
|
||||
until the data transfer is complete.
|
457
sys/netipx/ipx.c
457
sys/netipx/ipx.c
@ -1,457 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
* The Regents of the University of California.
|
||||
* Copyright (c) 2009 Robert N. M. Watson
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/rwlock.h>
|
||||
#include <sys/sockio.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/route.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
|
||||
/*
|
||||
* The IPX-layer address list is protected by ipx_ifaddr_rw.
|
||||
*/
|
||||
struct rwlock ipx_ifaddr_rw;
|
||||
struct ipx_ifaddrhead ipx_ifaddrhead;
|
||||
|
||||
static void ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia);
|
||||
static int ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
|
||||
struct sockaddr_ipx *sipx, int scrub);
|
||||
|
||||
/*
|
||||
* Generic internet control operations (ioctl's).
|
||||
*/
|
||||
int
|
||||
ipx_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
|
||||
struct thread *td)
|
||||
{
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
struct ipx_aliasreq *ifra = (struct ipx_aliasreq *)data;
|
||||
struct ipx_ifaddr *ia;
|
||||
struct ifaddr *ifa;
|
||||
int dstIsNew, hostIsNew;
|
||||
int error, priv;
|
||||
|
||||
/*
|
||||
* Find address for this interface, if it exists.
|
||||
*/
|
||||
if (ifp == NULL)
|
||||
return (EADDRNOTAVAIL);
|
||||
|
||||
IPX_IFADDR_RLOCK();
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if (ia->ia_ifp == ifp)
|
||||
break;
|
||||
}
|
||||
if (ia != NULL)
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
|
||||
error = 0;
|
||||
switch (cmd) {
|
||||
case SIOCGIFADDR:
|
||||
if (ia == NULL) {
|
||||
error = EADDRNOTAVAIL;
|
||||
goto out;
|
||||
}
|
||||
*(struct sockaddr_ipx *)&ifr->ifr_addr = ia->ia_addr;
|
||||
goto out;
|
||||
|
||||
case SIOCGIFBRDADDR:
|
||||
if (ia == NULL) {
|
||||
error = EADDRNOTAVAIL;
|
||||
goto out;
|
||||
}
|
||||
if ((ifp->if_flags & IFF_BROADCAST) == 0) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
*(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_broadaddr;
|
||||
goto out;
|
||||
|
||||
case SIOCGIFDSTADDR:
|
||||
if (ia == NULL) {
|
||||
error = EADDRNOTAVAIL;
|
||||
goto out;
|
||||
}
|
||||
if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
*(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_dstaddr;
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCAIFADDR:
|
||||
case SIOCDIFADDR:
|
||||
priv = (cmd == SIOCAIFADDR) ? PRIV_NET_ADDIFADDR :
|
||||
PRIV_NET_DELIFADDR;
|
||||
if (td && (error = priv_check(td, priv)) != 0)
|
||||
goto out;
|
||||
|
||||
IPX_IFADDR_RLOCK();
|
||||
if (ifra->ifra_addr.sipx_family == AF_IPX) {
|
||||
struct ipx_ifaddr *oia;
|
||||
|
||||
for (oia = ia; ia; ia = TAILQ_NEXT(ia, ia_link)) {
|
||||
if (ia->ia_ifp == ifp &&
|
||||
ipx_neteq(ia->ia_addr.sipx_addr,
|
||||
ifra->ifra_addr.sipx_addr))
|
||||
break;
|
||||
}
|
||||
if (oia != NULL && oia != ia)
|
||||
ifa_free(&oia->ia_ifa);
|
||||
if (ia != NULL && oia != ia)
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
if (cmd == SIOCDIFADDR && ia == NULL) {
|
||||
error = EADDRNOTAVAIL;
|
||||
goto out;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case SIOCSIFADDR:
|
||||
case SIOCSIFDSTADDR:
|
||||
if (td && (error = priv_check(td, PRIV_NET_SETLLADDR)) != 0)
|
||||
goto out;
|
||||
if (ia == NULL) {
|
||||
ifa = ifa_alloc(sizeof(struct ipx_ifaddr), M_WAITOK);
|
||||
ia = (struct ipx_ifaddr *)ifa;
|
||||
ia->ia_ifp = ifp;
|
||||
ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
|
||||
ifa->ifa_netmask = (struct sockaddr *)&ipx_netmask;
|
||||
ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
|
||||
if (ifp->if_flags & IFF_BROADCAST) {
|
||||
ia->ia_broadaddr.sipx_family = AF_IPX;
|
||||
ia->ia_broadaddr.sipx_len =
|
||||
sizeof(ia->ia_addr);
|
||||
ia->ia_broadaddr.sipx_addr.x_host =
|
||||
ipx_broadhost;
|
||||
}
|
||||
ifa_ref(&ia->ia_ifa); /* ipx_ifaddrhead */
|
||||
IPX_IFADDR_WLOCK();
|
||||
TAILQ_INSERT_TAIL(&ipx_ifaddrhead, ia, ia_link);
|
||||
IPX_IFADDR_WUNLOCK();
|
||||
|
||||
ifa_ref(&ia->ia_ifa); /* if_addrhead */
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link);
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (td && (error = priv_check(td, PRIV_NET_HWIOCTL)) != 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFDSTADDR:
|
||||
if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (ia->ia_flags & IFA_ROUTE) {
|
||||
rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
|
||||
ia->ia_flags &= ~IFA_ROUTE;
|
||||
}
|
||||
if (ifp->if_ioctl) {
|
||||
error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR,
|
||||
(void *)ia);
|
||||
if (error)
|
||||
goto out;
|
||||
}
|
||||
*(struct sockaddr *)&ia->ia_dstaddr = ifr->ifr_dstaddr;
|
||||
goto out;
|
||||
|
||||
case SIOCSIFADDR:
|
||||
error = ipx_ifinit(ifp, ia,
|
||||
(struct sockaddr_ipx *)&ifr->ifr_addr, 1);
|
||||
goto out;
|
||||
|
||||
case SIOCDIFADDR:
|
||||
ipx_ifscrub(ifp, ia);
|
||||
ifa = (struct ifaddr *)ia;
|
||||
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
ifa_free(ifa); /* if_addrhead */
|
||||
|
||||
IPX_IFADDR_WLOCK();
|
||||
TAILQ_REMOVE(&ipx_ifaddrhead, ia, ia_link);
|
||||
IPX_IFADDR_WUNLOCK();
|
||||
ifa_free(&ia->ia_ifa); /* ipx_ifaddrhead */
|
||||
goto out;
|
||||
|
||||
case SIOCAIFADDR:
|
||||
dstIsNew = 0;
|
||||
hostIsNew = 1;
|
||||
if (ia->ia_addr.sipx_family == AF_IPX) {
|
||||
if (ifra->ifra_addr.sipx_len == 0) {
|
||||
ifra->ifra_addr = ia->ia_addr;
|
||||
hostIsNew = 0;
|
||||
} else if (ipx_neteq(ifra->ifra_addr.sipx_addr,
|
||||
ia->ia_addr.sipx_addr))
|
||||
hostIsNew = 0;
|
||||
}
|
||||
if ((ifp->if_flags & IFF_POINTOPOINT) &&
|
||||
(ifra->ifra_dstaddr.sipx_family == AF_IPX)) {
|
||||
if (hostIsNew == 0)
|
||||
ipx_ifscrub(ifp, ia);
|
||||
ia->ia_dstaddr = ifra->ifra_dstaddr;
|
||||
dstIsNew = 1;
|
||||
}
|
||||
if (ifra->ifra_addr.sipx_family == AF_IPX &&
|
||||
(hostIsNew || dstIsNew))
|
||||
error = ipx_ifinit(ifp, ia, &ifra->ifra_addr, 0);
|
||||
goto out;
|
||||
|
||||
default:
|
||||
if (ifp->if_ioctl == NULL) {
|
||||
error = EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
error = ((*ifp->if_ioctl)(ifp, cmd, data));
|
||||
}
|
||||
|
||||
out:
|
||||
if (ia != NULL)
|
||||
ifa_free(&ia->ia_ifa);
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete any previous route for an old address.
|
||||
*/
|
||||
static void
|
||||
ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia)
|
||||
{
|
||||
|
||||
if (ia->ia_flags & IFA_ROUTE) {
|
||||
if (ifp->if_flags & IFF_POINTOPOINT) {
|
||||
rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
|
||||
} else
|
||||
rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0);
|
||||
ia->ia_flags &= ~IFA_ROUTE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize an interface's internet address and routing table entry.
|
||||
*/
|
||||
static int
|
||||
ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
|
||||
struct sockaddr_ipx *sipx, int scrub)
|
||||
{
|
||||
struct sockaddr_ipx oldaddr;
|
||||
int s = splimp(), error;
|
||||
|
||||
/*
|
||||
* Set up new addresses.
|
||||
*/
|
||||
oldaddr = ia->ia_addr;
|
||||
ia->ia_addr = *sipx;
|
||||
|
||||
/*
|
||||
* The convention we shall adopt for naming is that a supplied
|
||||
* address of zero means that "we don't care". Use the MAC address
|
||||
* of the interface. If it is an interface without a MAC address,
|
||||
* like a serial line, the address must be supplied.
|
||||
*
|
||||
* Give the interface a chance to initialize if this is its first
|
||||
* address, and to validate the address if necessary.
|
||||
*/
|
||||
if (ifp->if_ioctl != NULL &&
|
||||
(error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (void *)ia))) {
|
||||
ia->ia_addr = oldaddr;
|
||||
splx(s);
|
||||
return (error);
|
||||
}
|
||||
splx(s);
|
||||
ia->ia_ifa.ifa_metric = ifp->if_metric;
|
||||
|
||||
/*
|
||||
* Add route for the network.
|
||||
*/
|
||||
if (scrub) {
|
||||
ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
|
||||
ipx_ifscrub(ifp, ia);
|
||||
ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
|
||||
}
|
||||
if (ifp->if_flags & IFF_POINTOPOINT)
|
||||
rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
|
||||
else {
|
||||
ia->ia_broadaddr.sipx_addr.x_net = ia->ia_addr.sipx_addr.x_net;
|
||||
rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP);
|
||||
}
|
||||
ia->ia_flags |= IFA_ROUTE;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return address info for specified internet network.
|
||||
*/
|
||||
struct ipx_ifaddr *
|
||||
ipx_iaonnetof(struct ipx_addr *dst)
|
||||
{
|
||||
struct ipx_ifaddr *ia;
|
||||
struct ipx_addr *compare;
|
||||
struct ifnet *ifp;
|
||||
struct ipx_ifaddr *ia_maybe = NULL;
|
||||
union ipx_net net = dst->x_net;
|
||||
|
||||
IPX_IFADDR_LOCK_ASSERT();
|
||||
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if ((ifp = ia->ia_ifp) != NULL) {
|
||||
if (ifp->if_flags & IFF_POINTOPOINT) {
|
||||
compare = &satoipx_addr(ia->ia_dstaddr);
|
||||
if (ipx_hosteq(*dst, *compare))
|
||||
return (ia);
|
||||
if (ipx_neteqnn(net,
|
||||
ia->ia_addr.sipx_addr.x_net))
|
||||
ia_maybe = ia;
|
||||
} else {
|
||||
if (ipx_neteqnn(net,
|
||||
ia->ia_addr.sipx_addr.x_net))
|
||||
return (ia);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (ia_maybe);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_printhost(struct ipx_addr *addr)
|
||||
{
|
||||
u_short port;
|
||||
struct ipx_addr work = *addr;
|
||||
char *p; u_char *q;
|
||||
char *net = "", *host = "";
|
||||
char cport[10], chost[15], cnet[15];
|
||||
|
||||
port = ntohs(work.x_port);
|
||||
|
||||
if (ipx_nullnet(work) && ipx_nullhost(work)) {
|
||||
if (port)
|
||||
printf("*.%x", port);
|
||||
else
|
||||
printf("*.*");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ipx_wildnet(work))
|
||||
net = "any";
|
||||
else if (ipx_nullnet(work))
|
||||
net = "*";
|
||||
else {
|
||||
q = work.x_net.c_net;
|
||||
snprintf(cnet, sizeof(cnet), "%x%x%x%x",
|
||||
q[0], q[1], q[2], q[3]);
|
||||
for (p = cnet; *p == '0' && p < cnet + 8; p++)
|
||||
continue;
|
||||
net = p;
|
||||
}
|
||||
|
||||
if (ipx_wildhost(work))
|
||||
host = "any";
|
||||
else if (ipx_nullhost(work))
|
||||
host = "*";
|
||||
else {
|
||||
q = work.x_host.c_host;
|
||||
snprintf(chost, sizeof(chost), "%x%x%x%x%x%x",
|
||||
q[0], q[1], q[2], q[3], q[4], q[5]);
|
||||
for (p = chost; *p == '0' && p < chost + 12; p++)
|
||||
continue;
|
||||
host = p;
|
||||
}
|
||||
|
||||
if (port) {
|
||||
if (strcmp(host, "*") == 0) {
|
||||
host = "";
|
||||
snprintf(cport, sizeof(cport), "%x", port);
|
||||
} else
|
||||
snprintf(cport, sizeof(cport), ".%x", port);
|
||||
} else
|
||||
*cport = 0;
|
||||
|
||||
printf("%s.%s%s", net, host, cport);
|
||||
}
|
194
sys/netipx/ipx.h
194
sys/netipx/ipx.h
@ -1,194 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_IPX_H_
|
||||
#define _NETIPX_IPX_H_
|
||||
|
||||
/*
|
||||
* Constants and Structures
|
||||
*/
|
||||
|
||||
/*
|
||||
* Protocols
|
||||
*/
|
||||
#define IPXPROTO_UNKWN 0 /* Unknown */
|
||||
#define IPXPROTO_RI 1 /* RIP Routing Information */
|
||||
#define IPXPROTO_PXP 4 /* IPX Packet Exchange Protocol */
|
||||
#define IPXPROTO_SPX 5 /* SPX Sequenced Packet */
|
||||
#define IPXPROTO_NCP 17 /* NCP NetWare Core */
|
||||
#define IPXPROTO_NETBIOS 20 /* Propagated Packet */
|
||||
#define IPXPROTO_RAW 255 /* Placemarker*/
|
||||
#define IPXPROTO_MAX 256 /* Placemarker*/
|
||||
|
||||
/*
|
||||
* Port/Socket numbers: network standard functions
|
||||
*/
|
||||
|
||||
#define IPXPORT_RI 1 /* NS RIP Routing Information */
|
||||
#define IPXPORT_ECHO 2 /* NS Echo */
|
||||
#define IPXPORT_RE 3 /* NS Router Error */
|
||||
#define IPXPORT_NCP 0x0451 /* NW NCP Core Protocol */
|
||||
#define IPXPORT_SAP 0x0452 /* NW SAP Service Advertising */
|
||||
#define IPXPORT_RIP 0x0453 /* NW RIP Routing Information */
|
||||
#define IPXPORT_NETBIOS 0x0455 /* NW NetBIOS */
|
||||
#define IPXPORT_DIAGS 0x0456 /* NW Diagnostics */
|
||||
/*
|
||||
* Ports < IPXPORT_RESERVED are reserved for privileged
|
||||
*/
|
||||
#define IPXPORT_RESERVED 0x4000
|
||||
/*
|
||||
* Ports > IPXPORT_WELLKNOWN are reserved for privileged
|
||||
* processes (e.g. root).
|
||||
*/
|
||||
#define IPXPORT_WELLKNOWN 0x6000
|
||||
|
||||
/* flags passed to ipx_outputfl as last parameter */
|
||||
|
||||
#define IPX_FORWARDING 0x1 /* most of ipx header exists */
|
||||
#define IPX_ROUTETOIF 0x10 /* same as SO_DONTROUTE */
|
||||
#define IPX_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */
|
||||
|
||||
#define IPX_MAXHOPS 15
|
||||
|
||||
/* flags passed to get/set socket option */
|
||||
#define SO_HEADERS_ON_INPUT 1
|
||||
#define SO_HEADERS_ON_OUTPUT 2
|
||||
#define SO_DEFAULT_HEADERS 3
|
||||
#define SO_LAST_HEADER 4
|
||||
#define SO_IPXIP_ROUTE 5 /* No longer implemented. */
|
||||
#define SO_SEQNO 6
|
||||
#define SO_ALL_PACKETS 7
|
||||
#define SO_MTU 8
|
||||
#define SO_IPXTUN_ROUTE 9
|
||||
#define SO_IPX_CHECKSUM 10
|
||||
|
||||
/*
|
||||
* IPX addressing
|
||||
*/
|
||||
union ipx_host {
|
||||
u_char c_host[6];
|
||||
u_short s_host[3];
|
||||
};
|
||||
|
||||
union ipx_net {
|
||||
u_char c_net[4];
|
||||
u_short s_net[2];
|
||||
};
|
||||
|
||||
union ipx_net_u {
|
||||
union ipx_net net_e;
|
||||
u_long long_e;
|
||||
};
|
||||
|
||||
struct ipx_addr {
|
||||
union ipx_net x_net;
|
||||
union ipx_host x_host;
|
||||
u_short x_port;
|
||||
};
|
||||
|
||||
/*
|
||||
* Socket address
|
||||
*/
|
||||
struct sockaddr_ipx {
|
||||
u_char sipx_len;
|
||||
u_char sipx_family;
|
||||
struct ipx_addr sipx_addr;
|
||||
char sipx_zero[2];
|
||||
};
|
||||
#define sipx_port sipx_addr.x_port
|
||||
|
||||
/*
|
||||
* Definitions for IPX Internetwork Packet Exchange Protocol
|
||||
*/
|
||||
struct ipx {
|
||||
u_short ipx_sum; /* Checksum */
|
||||
u_short ipx_len; /* Length, in bytes, including header */
|
||||
u_char ipx_tc; /* Transport Control (i.e. hop count) */
|
||||
u_char ipx_pt; /* Packet Type (i.e. level 2 protocol) */
|
||||
struct ipx_addr ipx_dna; /* Destination Network Address */
|
||||
struct ipx_addr ipx_sna; /* Source Network Address */
|
||||
} __packed;
|
||||
|
||||
#define ipx_neteqnn(a,b) \
|
||||
(((a).s_net[0] == (b).s_net[0]) && ((a).s_net[1] == (b).s_net[1]))
|
||||
#define ipx_neteq(a,b) ipx_neteqnn((a).x_net, (b).x_net)
|
||||
#define satoipx_addr(sa) (((struct sockaddr_ipx *)&(sa))->sipx_addr)
|
||||
#define ipx_hosteqnh(s,t) ((s).s_host[0] == (t).s_host[0] && \
|
||||
(s).s_host[1] == (t).s_host[1] && (s).s_host[2] == (t).s_host[2])
|
||||
#define ipx_hosteq(s,t) (ipx_hosteqnh((s).x_host,(t).x_host))
|
||||
#define ipx_nullnet(x) (((x).x_net.s_net[0]==0) && ((x).x_net.s_net[1]==0))
|
||||
#define ipx_nullhost(x) (((x).x_host.s_host[0] == 0) && \
|
||||
((x).x_host.s_host[1] == 0) && ((x).x_host.s_host[2] == 0))
|
||||
#define ipx_wildnet(x) (((x).x_net.s_net[0] == 0xffff) && \
|
||||
((x).x_net.s_net[1] == 0xffff))
|
||||
#define ipx_wildhost(x) (((x).x_host.s_host[0] == 0xffff) && \
|
||||
((x).x_host.s_host[1] == 0xffff) && ((x).x_host.s_host[2] == 0xffff))
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
struct ipx_addr ipx_addr(const char *);
|
||||
char *ipx_ntoa(struct ipx_addr);
|
||||
__END_DECLS
|
||||
|
||||
#endif /* !_NETIPX_IPX_H_ */
|
@ -1,140 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1982, 1992, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_cksum.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/libkern.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
|
||||
|
||||
#define SUMADV sum += *w++
|
||||
|
||||
u_short
|
||||
ipx_cksum(struct mbuf *m, int len)
|
||||
{
|
||||
u_int32_t sum = 0;
|
||||
u_char *w;
|
||||
u_char oldtc;
|
||||
int mlen, words;
|
||||
struct ipx *ipx;
|
||||
union {
|
||||
u_char b[2];
|
||||
u_short w;
|
||||
} buf;
|
||||
|
||||
ipx = mtod(m, struct ipx*);
|
||||
oldtc = ipx->ipx_tc;
|
||||
ipx->ipx_tc = 0;
|
||||
w = (u_char *)&ipx->ipx_len;
|
||||
len -= 2;
|
||||
mlen = 2;
|
||||
|
||||
for(;;) {
|
||||
mlen = imin(m->m_len - mlen, len);
|
||||
words = mlen / 2;
|
||||
len -= mlen & ~1;
|
||||
while (words >= 16) {
|
||||
SUMADV; SUMADV; SUMADV; SUMADV;
|
||||
SUMADV; SUMADV; SUMADV; SUMADV;
|
||||
SUMADV; SUMADV; SUMADV; SUMADV;
|
||||
SUMADV; SUMADV; SUMADV; SUMADV;
|
||||
words -= 16;
|
||||
}
|
||||
while (words--)
|
||||
SUMADV;
|
||||
if (len == 0)
|
||||
break;
|
||||
mlen &= 1;
|
||||
if (mlen) {
|
||||
buf.b[0] = *w;
|
||||
if (--len == 0) {
|
||||
buf.b[1] = 0;
|
||||
sum += buf.w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m = m->m_next;
|
||||
if (m == NULL)
|
||||
break;
|
||||
w = mtod(m, u_char *);
|
||||
if (mlen) {
|
||||
buf.b[1] = *w;
|
||||
sum += buf.w;
|
||||
w++;
|
||||
if (--len == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ipx->ipx_tc = oldtc;
|
||||
|
||||
sum = (sum & 0xffff) + (sum >> 16);
|
||||
if (sum >= 0x10000)
|
||||
sum++;
|
||||
if (sum)
|
||||
sum = ~sum;
|
||||
return (sum);
|
||||
}
|
@ -1,129 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_if.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_IPX_IF_H_
|
||||
#define _NETIPX_IPX_IF_H_
|
||||
|
||||
/*
|
||||
* Interface address. One of these structures
|
||||
* is allocated for each interface with an internet address.
|
||||
* The ifaddr structure contains the protocol-independent part
|
||||
* of the structure and is assumed to be first.
|
||||
*/
|
||||
#ifdef _KERNEL
|
||||
struct ipx_ifaddr {
|
||||
struct ifaddr ia_ifa; /* protocol-independent info */
|
||||
#define ia_ifp ia_ifa.ifa_ifp
|
||||
#define ia_flags ia_ifa.ifa_flags
|
||||
TAILQ_ENTRY(ipx_ifaddr) ia_link; /* list of IPv6 addresses */
|
||||
struct sockaddr_ipx ia_addr; /* reserve space for my address */
|
||||
struct sockaddr_ipx ia_dstaddr; /* space for my broadcast address */
|
||||
#define ia_broadaddr ia_dstaddr
|
||||
struct sockaddr_ipx ia_netmask; /* space for my network mask */
|
||||
};
|
||||
#endif /* _KERNEL */
|
||||
|
||||
struct ipx_aliasreq {
|
||||
char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
||||
struct sockaddr_ipx ifra_addr;
|
||||
struct sockaddr_ipx ifra_broadaddr;
|
||||
#define ifra_dstaddr ifra_broadaddr
|
||||
};
|
||||
|
||||
/*
|
||||
* List of ipx_ifaddr's.
|
||||
*/
|
||||
TAILQ_HEAD(ipx_ifaddrhead, ipx_ifaddr);
|
||||
|
||||
/*
|
||||
* Given a pointer to an ipx_ifaddr (ifaddr),
|
||||
* return a pointer to the addr as a sockadd_ipx.
|
||||
*/
|
||||
|
||||
#define IA_SIPX(ia) (&(((struct ipx_ifaddr *)(ia))->ia_addr))
|
||||
|
||||
/* This is not the right place for this but where is? */
|
||||
|
||||
#define ETHERTYPE_IPX_8022 0x00e0 /* Ethernet_802.2 */
|
||||
#define ETHERTYPE_IPX_8023 0x0000 /* Ethernet_802.3 */
|
||||
#define ETHERTYPE_IPX_II 0x8137 /* Ethernet_II */
|
||||
#define ETHERTYPE_IPX_SNAP 0x8137 /* Ethernet_SNAP */
|
||||
|
||||
#define ETHERTYPE_IPX 0x8137 /* Only Ethernet_II Available */
|
||||
|
||||
#ifdef _KERNEL
|
||||
extern struct rwlock ipx_ifaddr_rw;
|
||||
extern struct ipx_ifaddrhead ipx_ifaddrhead;
|
||||
|
||||
#define IPX_IFADDR_LOCK_INIT() rw_init(&ipx_ifaddr_rw, "ipx_ifaddr_rw")
|
||||
#define IPX_IFADDR_LOCK_ASSERT() rw_assert(&ipx_ifaddr_rw, RA_LOCKED)
|
||||
#define IPX_IFADDR_RLOCK() rw_rlock(&ipx_ifaddr_rw)
|
||||
#define IPX_IFADDR_RUNLOCK() rw_runlock(&ipx_ifaddr_rw)
|
||||
#define IPX_IFADDR_WLOCK() rw_wlock(&ipx_ifaddr_rw)
|
||||
#define IPX_IFADDR_WUNLOCK() rw_wunlock(&ipx_ifaddr_rw)
|
||||
#define IPX_IFADDR_RLOCK_ASSERT() rw_assert(&ipx_ifaddr_rw, RA_WLOCKED)
|
||||
|
||||
struct ipx_ifaddr *ipx_iaonnetof(struct ipx_addr *dst);
|
||||
#endif
|
||||
|
||||
#endif /* !_NETIPX_IPX_IF_H_ */
|
@ -1,469 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
* The Regents of the University of California.
|
||||
* Copyright (c) 2004-2009 Robert N. M. Watson
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_input.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/random.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/rwlock.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/route.h>
|
||||
#include <net/netisr.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/spx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#include <netipx/ipx_pcb.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
|
||||
int ipxcksum = 0;
|
||||
SYSCTL_INT(_net_ipx_ipx, OID_AUTO, checksum, CTLFLAG_RW,
|
||||
&ipxcksum, 0, "Compute ipx checksum");
|
||||
|
||||
static int ipxprintfs = 0; /* printing forwarding information */
|
||||
SYSCTL_INT(_net_ipx_ipx, OID_AUTO, ipxprintfs, CTLFLAG_RW,
|
||||
&ipxprintfs, 0, "Printing forwarding information");
|
||||
|
||||
static int ipxforwarding = 0;
|
||||
SYSCTL_INT(_net_ipx_ipx, OID_AUTO, ipxforwarding, CTLFLAG_RW,
|
||||
&ipxforwarding, 0, "Enable ipx forwarding");
|
||||
|
||||
static int ipxnetbios = 0;
|
||||
SYSCTL_INT(_net_ipx, OID_AUTO, ipxnetbios, CTLFLAG_RW,
|
||||
&ipxnetbios, 0, "Propagate netbios over ipx");
|
||||
|
||||
static int ipx_do_route(struct ipx_addr *src, struct route *ro);
|
||||
static void ipx_undo_route(struct route *ro);
|
||||
static void ipx_forward(struct mbuf *m);
|
||||
static void ipxintr(struct mbuf *m);
|
||||
|
||||
const union ipx_net ipx_zeronet;
|
||||
|
||||
const union ipx_net ipx_broadnet = { .s_net[0] = 0xffff,
|
||||
.s_net[1] = 0xffff };
|
||||
const union ipx_host ipx_broadhost = { .s_host[0] = 0xffff,
|
||||
.s_host[1] = 0xffff,
|
||||
.s_host[2] = 0xffff };
|
||||
|
||||
struct ipxstat ipxstat;
|
||||
struct sockaddr_ipx ipx_netmask, ipx_hostmask;
|
||||
|
||||
/*
|
||||
* IPX protocol control block (pcb) lists.
|
||||
*/
|
||||
struct mtx ipxpcb_list_mtx;
|
||||
struct ipxpcbhead ipxpcb_list;
|
||||
struct ipxpcbhead ipxrawpcb_list;
|
||||
|
||||
static struct netisr_handler ipx_nh = {
|
||||
.nh_name = "ipx",
|
||||
.nh_handler = ipxintr,
|
||||
.nh_proto = NETISR_IPX,
|
||||
.nh_policy = NETISR_POLICY_SOURCE,
|
||||
};
|
||||
|
||||
long ipx_pexseq; /* Locked with ipxpcb_list_mtx. */
|
||||
|
||||
/*
|
||||
* IPX initialization.
|
||||
*/
|
||||
|
||||
void
|
||||
ipx_init(void)
|
||||
{
|
||||
|
||||
read_random(&ipx_pexseq, sizeof ipx_pexseq);
|
||||
|
||||
LIST_INIT(&ipxpcb_list);
|
||||
LIST_INIT(&ipxrawpcb_list);
|
||||
TAILQ_INIT(&ipx_ifaddrhead);
|
||||
|
||||
IPX_LIST_LOCK_INIT();
|
||||
IPX_IFADDR_LOCK_INIT();
|
||||
|
||||
ipx_netmask.sipx_len = 6;
|
||||
ipx_netmask.sipx_addr.x_net = ipx_broadnet;
|
||||
|
||||
ipx_hostmask.sipx_len = 12;
|
||||
ipx_hostmask.sipx_addr.x_net = ipx_broadnet;
|
||||
ipx_hostmask.sipx_addr.x_host = ipx_broadhost;
|
||||
|
||||
netisr_register(&ipx_nh);
|
||||
}
|
||||
|
||||
/*
|
||||
* IPX input routine. Pass to next level.
|
||||
*/
|
||||
static void
|
||||
ipxintr(struct mbuf *m)
|
||||
{
|
||||
struct ipx *ipx;
|
||||
struct ipxpcb *ipxp;
|
||||
struct ipx_ifaddr *ia;
|
||||
int len;
|
||||
|
||||
/*
|
||||
* If no IPX addresses have been set yet but the interfaces
|
||||
* are receiving, can't do anything with incoming packets yet.
|
||||
*/
|
||||
if (TAILQ_EMPTY(&ipx_ifaddrhead)) {
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
|
||||
ipxstat.ipxs_total++;
|
||||
|
||||
if ((m->m_flags & M_EXT || m->m_len < sizeof(struct ipx)) &&
|
||||
(m = m_pullup(m, sizeof(struct ipx))) == NULL) {
|
||||
ipxstat.ipxs_toosmall++;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Give any raw listeners a crack at the packet
|
||||
*/
|
||||
IPX_LIST_LOCK();
|
||||
LIST_FOREACH(ipxp, &ipxrawpcb_list, ipxp_list) {
|
||||
struct mbuf *m1 = m_copy(m, 0, (int)M_COPYALL);
|
||||
if (m1 != NULL) {
|
||||
IPX_LOCK(ipxp);
|
||||
ipx_input(m1, ipxp);
|
||||
IPX_UNLOCK(ipxp);
|
||||
}
|
||||
}
|
||||
IPX_LIST_UNLOCK();
|
||||
|
||||
ipx = mtod(m, struct ipx *);
|
||||
len = ntohs(ipx->ipx_len);
|
||||
/*
|
||||
* Check that the amount of data in the buffers
|
||||
* is as at least much as the IPX header would have us expect.
|
||||
* Trim mbufs if longer than we expect.
|
||||
* Drop packet if shorter than we expect.
|
||||
*/
|
||||
if (m->m_pkthdr.len < len) {
|
||||
ipxstat.ipxs_tooshort++;
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
if (m->m_pkthdr.len > len) {
|
||||
if (m->m_len == m->m_pkthdr.len) {
|
||||
m->m_len = len;
|
||||
m->m_pkthdr.len = len;
|
||||
} else
|
||||
m_adj(m, len - m->m_pkthdr.len);
|
||||
}
|
||||
if (ipxcksum && ipx->ipx_sum != 0xffff) {
|
||||
if (ipx->ipx_sum != ipx_cksum(m, len)) {
|
||||
ipxstat.ipxs_badsum++;
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Propagated (Netbios) packets (type 20) has to be handled
|
||||
* different. :-(
|
||||
*/
|
||||
if (ipx->ipx_pt == IPXPROTO_NETBIOS) {
|
||||
if (ipxnetbios) {
|
||||
ipx_output_type20(m);
|
||||
return;
|
||||
} else {
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Is this a directed broadcast?
|
||||
*/
|
||||
if (ipx_hosteqnh(ipx_broadhost,ipx->ipx_dna.x_host)) {
|
||||
if ((!ipx_neteq(ipx->ipx_dna, ipx->ipx_sna)) &&
|
||||
(!ipx_neteqnn(ipx->ipx_dna.x_net, ipx_broadnet)) &&
|
||||
(!ipx_neteqnn(ipx->ipx_sna.x_net, ipx_zeronet)) &&
|
||||
(!ipx_neteqnn(ipx->ipx_dna.x_net, ipx_zeronet)) ) {
|
||||
/*
|
||||
* If it is a broadcast to the net where it was
|
||||
* received from, treat it as ours.
|
||||
*/
|
||||
IPX_IFADDR_RLOCK();
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if ((ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif)
|
||||
&& ipx_neteq(ia->ia_addr.sipx_addr,
|
||||
ipx->ipx_dna)) {
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
goto ours;
|
||||
}
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
|
||||
/*
|
||||
* Look to see if I need to eat this packet.
|
||||
* Algorithm is to forward all young packets
|
||||
* and prematurely age any packets which will
|
||||
* by physically broadcasted.
|
||||
* Any very old packets eaten without forwarding
|
||||
* would die anyway.
|
||||
*
|
||||
* Suggestion of Bill Nesheim, Cornell U.
|
||||
*/
|
||||
if (ipx->ipx_tc < IPX_MAXHOPS) {
|
||||
ipx_forward(m);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Is this our packet? If not, forward.
|
||||
*/
|
||||
} else {
|
||||
IPX_IFADDR_RLOCK();
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if (ipx_hosteq(ipx->ipx_dna, ia->ia_addr.sipx_addr) &&
|
||||
(ipx_neteq(ipx->ipx_dna, ia->ia_addr.sipx_addr) ||
|
||||
ipx_neteqnn(ipx->ipx_dna.x_net, ipx_zeronet)))
|
||||
break;
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
if (ia == NULL) {
|
||||
ipx_forward(m);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ours:
|
||||
/*
|
||||
* Locate pcb for datagram.
|
||||
*/
|
||||
IPX_LIST_LOCK();
|
||||
ipxp = ipx_pcblookup(&ipx->ipx_sna, ipx->ipx_dna.x_port, IPX_WILDCARD);
|
||||
/*
|
||||
* Switch out to protocol's input routine.
|
||||
*/
|
||||
if (ipxp != NULL) {
|
||||
ipxstat.ipxs_delivered++;
|
||||
if ((ipxp->ipxp_flags & IPXP_ALL_PACKETS) == 0)
|
||||
switch (ipx->ipx_pt) {
|
||||
case IPXPROTO_SPX:
|
||||
IPX_LOCK(ipxp);
|
||||
/* Will release both locks. */
|
||||
spx_input(m, ipxp);
|
||||
return;
|
||||
}
|
||||
IPX_LOCK(ipxp);
|
||||
ipx_input(m, ipxp);
|
||||
IPX_UNLOCK(ipxp);
|
||||
} else
|
||||
m_freem(m);
|
||||
IPX_LIST_UNLOCK();
|
||||
}
|
||||
|
||||
void
|
||||
ipx_ctlinput(cmd, arg_as_sa, dummy)
|
||||
int cmd;
|
||||
struct sockaddr *arg_as_sa; /* XXX should be swapped with dummy */
|
||||
void *dummy;
|
||||
{
|
||||
|
||||
/* Currently, nothing. */
|
||||
}
|
||||
|
||||
/*
|
||||
* Forward a packet. If some error occurs drop the packet. IPX don't
|
||||
* have a way to return errors to the sender.
|
||||
*/
|
||||
|
||||
static struct route ipx_droute;
|
||||
static struct route ipx_sroute;
|
||||
|
||||
static void
|
||||
ipx_forward(struct mbuf *m)
|
||||
{
|
||||
struct ipx *ipx = mtod(m, struct ipx *);
|
||||
int error;
|
||||
int agedelta = 1;
|
||||
int flags = IPX_FORWARDING;
|
||||
int ok_there = 0;
|
||||
int ok_back = 0;
|
||||
|
||||
if (ipxforwarding == 0) {
|
||||
/* can't tell difference between net and host */
|
||||
ipxstat.ipxs_cantforward++;
|
||||
m_freem(m);
|
||||
goto cleanup;
|
||||
}
|
||||
ipx->ipx_tc++;
|
||||
if (ipx->ipx_tc > IPX_MAXHOPS) {
|
||||
ipxstat.ipxs_cantforward++;
|
||||
m_freem(m);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((ok_there = ipx_do_route(&ipx->ipx_dna,&ipx_droute)) == 0) {
|
||||
ipxstat.ipxs_noroute++;
|
||||
m_freem(m);
|
||||
goto cleanup;
|
||||
}
|
||||
/*
|
||||
* Here we think about forwarding broadcast packets,
|
||||
* so we try to insure that it doesn't go back out
|
||||
* on the interface it came in on. Also, if we
|
||||
* are going to physically broadcast this, let us
|
||||
* age the packet so we can eat it safely the second time around.
|
||||
*/
|
||||
if (ipx->ipx_dna.x_host.c_host[0] & 0x1) {
|
||||
struct ipx_ifaddr *ia;
|
||||
struct ifnet *ifp;
|
||||
|
||||
IPX_IFADDR_RLOCK();
|
||||
ia = ipx_iaonnetof(&ipx->ipx_dna);
|
||||
if (ia != NULL) {
|
||||
/* I'm gonna hafta eat this packet */
|
||||
agedelta += IPX_MAXHOPS - ipx->ipx_tc;
|
||||
ipx->ipx_tc = IPX_MAXHOPS;
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
if ((ok_back = ipx_do_route(&ipx->ipx_sna,&ipx_sroute)) == 0) {
|
||||
/* error = ENETUNREACH; He'll never get it! */
|
||||
ipxstat.ipxs_noroute++;
|
||||
m_freem(m);
|
||||
goto cleanup;
|
||||
}
|
||||
if (ipx_droute.ro_rt &&
|
||||
(ifp = ipx_droute.ro_rt->rt_ifp) &&
|
||||
ipx_sroute.ro_rt &&
|
||||
(ifp != ipx_sroute.ro_rt->rt_ifp)) {
|
||||
flags |= IPX_ALLOWBROADCAST;
|
||||
} else {
|
||||
ipxstat.ipxs_noroute++;
|
||||
m_freem(m);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* We don't need to recompute checksum because ipx_tc field
|
||||
* is ignored by checksum calculation routine, however
|
||||
* it may be desirable to reset checksum if ipxcksum == 0
|
||||
*/
|
||||
#if 0
|
||||
if (!ipxcksum)
|
||||
ipx->ipx_sum = 0xffff;
|
||||
#endif
|
||||
|
||||
error = ipx_outputfl(m, &ipx_droute, flags);
|
||||
if (error == 0) {
|
||||
ipxstat.ipxs_forward++;
|
||||
|
||||
if (ipxprintfs) {
|
||||
printf("forward: ");
|
||||
ipx_printhost(&ipx->ipx_sna);
|
||||
printf(" to ");
|
||||
ipx_printhost(&ipx->ipx_dna);
|
||||
printf(" hops %d\n", ipx->ipx_tc);
|
||||
}
|
||||
}
|
||||
cleanup:
|
||||
if (ok_there)
|
||||
ipx_undo_route(&ipx_droute);
|
||||
if (ok_back)
|
||||
ipx_undo_route(&ipx_sroute);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_do_route(struct ipx_addr *src, struct route *ro)
|
||||
{
|
||||
struct sockaddr_ipx *dst;
|
||||
|
||||
bzero((caddr_t)ro, sizeof(*ro));
|
||||
dst = (struct sockaddr_ipx *)&ro->ro_dst;
|
||||
|
||||
dst->sipx_len = sizeof(*dst);
|
||||
dst->sipx_family = AF_IPX;
|
||||
dst->sipx_addr = *src;
|
||||
dst->sipx_addr.x_port = 0;
|
||||
rtalloc_ign(ro, 0);
|
||||
if (ro->ro_rt == NULL || ro->ro_rt->rt_ifp == NULL) {
|
||||
return (0);
|
||||
}
|
||||
counter_u64_add(ro->ro_rt->rt_pksent, 1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
static void
|
||||
ipx_undo_route(struct route *ro)
|
||||
{
|
||||
|
||||
if (ro->ro_rt != NULL) {
|
||||
RTFREE(ro->ro_rt);
|
||||
}
|
||||
}
|
@ -1,288 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_outputfl.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/route.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
|
||||
int
|
||||
ipx_outputfl(struct mbuf *m0, struct route *ro, int flags)
|
||||
{
|
||||
struct ipx *ipx = mtod(m0, struct ipx *);
|
||||
struct ifnet *ifp = NULL;
|
||||
int error = 0;
|
||||
struct sockaddr_ipx *dst;
|
||||
struct route ipxroute;
|
||||
|
||||
/*
|
||||
* Route packet.
|
||||
*/
|
||||
if (ro == NULL) {
|
||||
ro = &ipxroute;
|
||||
bzero((caddr_t)ro, sizeof(*ro));
|
||||
}
|
||||
dst = (struct sockaddr_ipx *)&ro->ro_dst;
|
||||
if (ro->ro_rt == NULL) {
|
||||
dst->sipx_family = AF_IPX;
|
||||
dst->sipx_len = sizeof(*dst);
|
||||
dst->sipx_addr = ipx->ipx_dna;
|
||||
dst->sipx_addr.x_port = 0;
|
||||
/*
|
||||
* If routing to interface only,
|
||||
* short circuit routing lookup.
|
||||
*/
|
||||
if (flags & IPX_ROUTETOIF) {
|
||||
struct ipx_ifaddr *ia;
|
||||
|
||||
IPX_IFADDR_RLOCK();
|
||||
ia = ipx_iaonnetof(&ipx->ipx_dna);
|
||||
if (ia == NULL) {
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
ipxstat.ipxs_noroute++;
|
||||
error = ENETUNREACH;
|
||||
goto bad;
|
||||
}
|
||||
ifp = ia->ia_ifp;
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
goto gotif;
|
||||
}
|
||||
rtalloc_ign(ro, 0);
|
||||
} else if ((ro->ro_rt->rt_flags & RTF_UP) == 0) {
|
||||
/*
|
||||
* The old route has gone away; try for a new one.
|
||||
*/
|
||||
RTFREE(ro->ro_rt);
|
||||
ro->ro_rt = NULL;
|
||||
rtalloc_ign(ro, 0);
|
||||
}
|
||||
if (ro->ro_rt == NULL || (ifp = ro->ro_rt->rt_ifp) == NULL) {
|
||||
ipxstat.ipxs_noroute++;
|
||||
error = ENETUNREACH;
|
||||
goto bad;
|
||||
}
|
||||
counter_u64_add(ro->ro_rt->rt_pksent, 1);
|
||||
if (ro->ro_rt->rt_flags & (RTF_GATEWAY|RTF_HOST))
|
||||
dst = (struct sockaddr_ipx *)ro->ro_rt->rt_gateway;
|
||||
gotif:
|
||||
/*
|
||||
* Look for multicast addresses and
|
||||
* and verify user is allowed to send
|
||||
* such a packet.
|
||||
*/
|
||||
if (dst->sipx_addr.x_host.c_host[0]&1) {
|
||||
if ((ifp->if_flags & (IFF_BROADCAST | IFF_LOOPBACK)) == 0) {
|
||||
error = EADDRNOTAVAIL;
|
||||
goto bad;
|
||||
}
|
||||
if ((flags & IPX_ALLOWBROADCAST) == 0) {
|
||||
error = EACCES;
|
||||
goto bad;
|
||||
}
|
||||
m0->m_flags |= M_BCAST;
|
||||
}
|
||||
|
||||
if (htons(ipx->ipx_len) <= ifp->if_mtu) {
|
||||
ipxstat.ipxs_localout++;
|
||||
error = (*ifp->if_output)(ifp, m0,
|
||||
(struct sockaddr *)dst, ro);
|
||||
goto done;
|
||||
} else {
|
||||
ipxstat.ipxs_mtutoosmall++;
|
||||
error = EMSGSIZE;
|
||||
}
|
||||
bad:
|
||||
m_freem(m0);
|
||||
done:
|
||||
if (ro == &ipxroute && (flags & IPX_ROUTETOIF) == 0 &&
|
||||
ro->ro_rt != NULL) {
|
||||
RTFREE(ro->ro_rt);
|
||||
ro->ro_rt = NULL;
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* This will broadcast the type 20 (Netbios) packet to all the interfaces
|
||||
* that have ipx configured and isn't in the list yet.
|
||||
*/
|
||||
int
|
||||
ipx_output_type20(struct mbuf *m)
|
||||
{
|
||||
struct ipx *ipx;
|
||||
union ipx_net *nbnet;
|
||||
struct ipx_ifaddr *ia, *tia;
|
||||
int error = 0;
|
||||
struct mbuf *m1;
|
||||
int i;
|
||||
struct ifnet *ifp;
|
||||
struct sockaddr_ipx dst;
|
||||
|
||||
/*
|
||||
* We have to get to the 32 bytes after the ipx header also, so
|
||||
* that we can fill in the network address of the receiving
|
||||
* interface.
|
||||
*/
|
||||
if ((m->m_flags & M_EXT || m->m_len < (sizeof(struct ipx) + 32)) &&
|
||||
(m = m_pullup(m, sizeof(struct ipx) + 32)) == NULL) {
|
||||
ipxstat.ipxs_toosmall++;
|
||||
return (0);
|
||||
}
|
||||
ipx = mtod(m, struct ipx *);
|
||||
nbnet = (union ipx_net *)(ipx + 1);
|
||||
|
||||
if (ipx->ipx_tc >= 8)
|
||||
goto bad;
|
||||
/*
|
||||
* Now see if we have already seen this.
|
||||
*/
|
||||
tia = NULL;
|
||||
IPX_IFADDR_RLOCK();
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if (ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif) {
|
||||
if (tia == NULL)
|
||||
tia = ia;
|
||||
for (i=0; i < ipx->ipx_tc; i++, nbnet++) {
|
||||
if (ipx_neteqnn(ia->ia_addr.sipx_addr.x_net,
|
||||
*nbnet)) {
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
goto bad;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't route the packet if the interface where it come from
|
||||
* does not have an IPX address.
|
||||
*/
|
||||
if (tia == NULL) {
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add our receiving interface to the list.
|
||||
*/
|
||||
nbnet = (union ipx_net *)(ipx + 1);
|
||||
nbnet += ipx->ipx_tc;
|
||||
*nbnet = tia->ia_addr.sipx_addr.x_net;
|
||||
|
||||
/*
|
||||
* Increment the hop count.
|
||||
*/
|
||||
ipx->ipx_tc++;
|
||||
ipxstat.ipxs_forward++;
|
||||
|
||||
/*
|
||||
* Send to all directly connected ifaces not in list and
|
||||
* not to the one it came from.
|
||||
*/
|
||||
m->m_flags &= ~M_BCAST;
|
||||
bzero(&dst, sizeof(dst));
|
||||
dst.sipx_family = AF_IPX;
|
||||
dst.sipx_len = 12;
|
||||
dst.sipx_addr.x_host = ipx_broadhost;
|
||||
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if (ia->ia_ifa.ifa_ifp != m->m_pkthdr.rcvif) {
|
||||
nbnet = (union ipx_net *)(ipx + 1);
|
||||
for (i=0; i < ipx->ipx_tc; i++, nbnet++)
|
||||
if (ipx_neteqnn(ia->ia_addr.sipx_addr.x_net,
|
||||
*nbnet))
|
||||
goto skip_this;
|
||||
|
||||
/*
|
||||
* Insert the net address of the dest net and
|
||||
* calculate the new checksum if needed.
|
||||
*/
|
||||
ifp = ia->ia_ifa.ifa_ifp;
|
||||
dst.sipx_addr.x_net = ia->ia_addr.sipx_addr.x_net;
|
||||
ipx->ipx_dna.x_net = dst.sipx_addr.x_net;
|
||||
if(ipx->ipx_sum != 0xffff)
|
||||
ipx->ipx_sum = ipx_cksum(m, ntohs(ipx->ipx_len));
|
||||
|
||||
m1 = m_copym(m, 0, M_COPYALL, M_NOWAIT);
|
||||
if(m1) {
|
||||
error = (*ifp->if_output)(ifp, m1,
|
||||
(struct sockaddr *)&dst, NULL);
|
||||
/* XXX ipxstat.ipxs_localout++; */
|
||||
}
|
||||
skip_this: ;
|
||||
}
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
|
||||
bad:
|
||||
m_freem(m);
|
||||
return (error);
|
||||
}
|
@ -1,429 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
* The Regents of the University of California.
|
||||
* Copyright (c) 2004-2009 Robert N. M. Watson
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_pcb.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/route.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#include <netipx/ipx_pcb.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
|
||||
static struct ipx_addr zeroipx_addr;
|
||||
static u_short ipxpcb_lport_cache;
|
||||
|
||||
int
|
||||
ipx_pcballoc(struct socket *so, struct ipxpcbhead *head, struct thread *td)
|
||||
{
|
||||
struct ipxpcb *ipxp;
|
||||
|
||||
KASSERT(so->so_pcb == NULL, ("ipx_pcballoc: so_pcb != NULL"));
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
|
||||
ipxp = malloc(sizeof *ipxp, M_PCB, M_NOWAIT | M_ZERO);
|
||||
if (ipxp == NULL)
|
||||
return (ENOBUFS);
|
||||
IPX_LOCK_INIT(ipxp);
|
||||
ipxp->ipxp_socket = so;
|
||||
if (ipxcksum)
|
||||
ipxp->ipxp_flags |= IPXP_CHECKSUM;
|
||||
LIST_INSERT_HEAD(head, ipxp, ipxp_list);
|
||||
so->so_pcb = (caddr_t)ipxp;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_pcbbind(struct ipxpcb *ipxp, struct sockaddr *nam, struct thread *td)
|
||||
{
|
||||
struct sockaddr_ipx *sipx;
|
||||
u_short lport = 0;
|
||||
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
if (ipxp->ipxp_lport || !ipx_nullhost(ipxp->ipxp_laddr))
|
||||
return (EINVAL);
|
||||
if (nam == NULL)
|
||||
goto noname;
|
||||
sipx = (struct sockaddr_ipx *)nam;
|
||||
if (!ipx_nullhost(sipx->sipx_addr)) {
|
||||
int tport = sipx->sipx_port;
|
||||
|
||||
sipx->sipx_port = 0; /* yech... */
|
||||
if (ifa_ifwithaddr_check((struct sockaddr *)sipx) == 0)
|
||||
return (EADDRNOTAVAIL);
|
||||
sipx->sipx_port = tport;
|
||||
}
|
||||
lport = sipx->sipx_port;
|
||||
if (lport) {
|
||||
u_short aport = ntohs(lport);
|
||||
|
||||
if (aport < IPXPORT_RESERVED && td != NULL &&
|
||||
priv_check(td, PRIV_NETIPX_RESERVEDPORT))
|
||||
return (EACCES);
|
||||
if (ipx_pcblookup(&zeroipx_addr, lport, 0))
|
||||
return (EADDRINUSE);
|
||||
}
|
||||
ipxp->ipxp_laddr = sipx->sipx_addr;
|
||||
noname:
|
||||
if (lport == 0)
|
||||
do {
|
||||
ipxpcb_lport_cache++;
|
||||
if ((ipxpcb_lport_cache < IPXPORT_RESERVED) ||
|
||||
(ipxpcb_lport_cache >= IPXPORT_WELLKNOWN))
|
||||
ipxpcb_lport_cache = IPXPORT_RESERVED;
|
||||
lport = htons(ipxpcb_lport_cache);
|
||||
} while (ipx_pcblookup(&zeroipx_addr, lport, 0));
|
||||
ipxp->ipxp_lport = lport;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Connect from a socket to a specified address.
|
||||
* Both address and port must be specified in argument sipx.
|
||||
* If don't have a local address for this socket yet,
|
||||
* then pick one.
|
||||
*/
|
||||
int
|
||||
ipx_pcbconnect(struct ipxpcb *ipxp, struct sockaddr *nam, struct thread *td)
|
||||
{
|
||||
struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)nam;
|
||||
struct ipx_addr *dst;
|
||||
struct route *ro;
|
||||
struct ifnet *ifp;
|
||||
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
if (sipx->sipx_family != AF_IPX)
|
||||
return (EAFNOSUPPORT);
|
||||
if (sipx->sipx_port == 0 || ipx_nullhost(sipx->sipx_addr))
|
||||
return (EADDRNOTAVAIL);
|
||||
/*
|
||||
* If we haven't bound which network number to use as ours,
|
||||
* we will use the number of the outgoing interface.
|
||||
* This depends on having done a routing lookup, which
|
||||
* we will probably have to do anyway, so we might
|
||||
* as well do it now. On the other hand if we are
|
||||
* sending to multiple destinations we may have already
|
||||
* done the lookup, so see if we can use the route
|
||||
* from before. In any case, we only
|
||||
* chose a port number once, even if sending to multiple
|
||||
* destinations.
|
||||
*/
|
||||
ro = &ipxp->ipxp_route;
|
||||
dst = &satoipx_addr(ro->ro_dst);
|
||||
if (ipxp->ipxp_socket->so_options & SO_DONTROUTE)
|
||||
goto flush;
|
||||
if (!ipx_neteq(ipxp->ipxp_lastdst, sipx->sipx_addr))
|
||||
goto flush;
|
||||
if (!ipx_hosteq(ipxp->ipxp_lastdst, sipx->sipx_addr)) {
|
||||
if (ro->ro_rt != NULL && !(ro->ro_rt->rt_flags & RTF_HOST)) {
|
||||
/* can patch route to avoid rtalloc */
|
||||
*dst = sipx->sipx_addr;
|
||||
} else {
|
||||
flush:
|
||||
if (ro->ro_rt != NULL)
|
||||
RTFREE(ro->ro_rt);
|
||||
ro->ro_rt = NULL;
|
||||
}
|
||||
}/* else cached route is ok; do nothing */
|
||||
ipxp->ipxp_lastdst = sipx->sipx_addr;
|
||||
if ((ipxp->ipxp_socket->so_options & SO_DONTROUTE) == 0 && /*XXX*/
|
||||
(ro->ro_rt == NULL || ro->ro_rt->rt_ifp == NULL)) {
|
||||
/* No route yet, so try to acquire one */
|
||||
ro->ro_dst.sa_family = AF_IPX;
|
||||
ro->ro_dst.sa_len = sizeof(ro->ro_dst);
|
||||
*dst = sipx->sipx_addr;
|
||||
dst->x_port = 0;
|
||||
rtalloc_ign(ro, 0);
|
||||
}
|
||||
if (ipx_neteqnn(ipxp->ipxp_laddr.x_net, ipx_zeronet)) {
|
||||
struct ipx_ifaddr *ia = NULL;
|
||||
|
||||
/*
|
||||
* If route is known or can be allocated now,
|
||||
* our src addr is taken from the i/f, else punt.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If we found a route, use the address
|
||||
* corresponding to the outgoing interface
|
||||
*/
|
||||
if (ro->ro_rt != NULL && (ifp = ro->ro_rt->rt_ifp) != NULL) {
|
||||
IPX_IFADDR_RLOCK();
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if (ia->ia_ifp == ifp) {
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
break;
|
||||
}
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
}
|
||||
if (ia == NULL) {
|
||||
u_short fport = sipx->sipx_addr.x_port;
|
||||
sipx->sipx_addr.x_port = 0;
|
||||
ia = (struct ipx_ifaddr *)
|
||||
ifa_ifwithdstaddr((struct sockaddr *)sipx);
|
||||
sipx->sipx_addr.x_port = fport;
|
||||
if (ia == NULL) {
|
||||
IPX_IFADDR_RLOCK();
|
||||
ia = ipx_iaonnetof(&sipx->sipx_addr);
|
||||
if (ia != NULL)
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
}
|
||||
if (ia == NULL) {
|
||||
IPX_IFADDR_RLOCK();
|
||||
ia = TAILQ_FIRST(&ipx_ifaddrhead);
|
||||
if (ia != NULL)
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
}
|
||||
if (ia == NULL)
|
||||
return (EADDRNOTAVAIL);
|
||||
}
|
||||
ipxp->ipxp_laddr.x_net = satoipx_addr(ia->ia_addr).x_net;
|
||||
ifa_free(&ia->ia_ifa);
|
||||
}
|
||||
if (ipx_nullhost(ipxp->ipxp_laddr)) {
|
||||
struct ipx_ifaddr *ia = NULL;
|
||||
/*
|
||||
* If route is known or can be allocated now,
|
||||
* our src addr is taken from the i/f, else punt.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If we found a route, use the address
|
||||
* corresponding to the outgoing interface
|
||||
*/
|
||||
if (ro->ro_rt != NULL && (ifp = ro->ro_rt->rt_ifp) != NULL) {
|
||||
IPX_IFADDR_RLOCK();
|
||||
TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
|
||||
if (ia->ia_ifp == ifp) {
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
break;
|
||||
}
|
||||
}
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
}
|
||||
if (ia == NULL) {
|
||||
u_short fport = sipx->sipx_addr.x_port;
|
||||
sipx->sipx_addr.x_port = 0;
|
||||
ia = (struct ipx_ifaddr *)
|
||||
ifa_ifwithdstaddr((struct sockaddr *)sipx);
|
||||
sipx->sipx_addr.x_port = fport;
|
||||
if (ia == NULL) {
|
||||
IPX_IFADDR_RLOCK();
|
||||
ia = ipx_iaonnetof(&sipx->sipx_addr);
|
||||
if (ia != NULL)
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
}
|
||||
if (ia == NULL) {
|
||||
IPX_IFADDR_RLOCK();
|
||||
ia = TAILQ_FIRST(&ipx_ifaddrhead);
|
||||
if (ia != NULL)
|
||||
ifa_ref(&ia->ia_ifa);
|
||||
IPX_IFADDR_RUNLOCK();
|
||||
}
|
||||
if (ia == NULL)
|
||||
return (EADDRNOTAVAIL);
|
||||
}
|
||||
ipxp->ipxp_laddr.x_host = satoipx_addr(ia->ia_addr).x_host;
|
||||
ifa_free(&ia->ia_ifa);
|
||||
}
|
||||
if (ipx_pcblookup(&sipx->sipx_addr, ipxp->ipxp_lport, 0))
|
||||
return (EADDRINUSE);
|
||||
if (ipxp->ipxp_lport == 0)
|
||||
ipx_pcbbind(ipxp, (struct sockaddr *)NULL, td);
|
||||
|
||||
/* XXX just leave it zero if we can't find a route */
|
||||
|
||||
ipxp->ipxp_faddr = sipx->sipx_addr;
|
||||
/* Includes ipxp->ipxp_fport = sipx->sipx_port; */
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_pcbdisconnect(struct ipxpcb *ipxp)
|
||||
{
|
||||
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
ipxp->ipxp_faddr = zeroipx_addr;
|
||||
}
|
||||
|
||||
void
|
||||
ipx_pcbdetach(struct ipxpcb *ipxp)
|
||||
{
|
||||
struct socket *so = ipxp->ipxp_socket;
|
||||
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
so->so_pcb = NULL;
|
||||
ipxp->ipxp_socket = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ipx_pcbfree(struct ipxpcb *ipxp)
|
||||
{
|
||||
|
||||
KASSERT(ipxp->ipxp_socket == NULL,
|
||||
("ipx_pcbfree: ipxp_socket != NULL"));
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
if (ipxp->ipxp_route.ro_rt != NULL)
|
||||
RTFREE(ipxp->ipxp_route.ro_rt);
|
||||
LIST_REMOVE(ipxp, ipxp_list);
|
||||
IPX_LOCK_DESTROY(ipxp);
|
||||
free(ipxp, M_PCB);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_getsockaddr(struct ipxpcb *ipxp, struct sockaddr **nam)
|
||||
{
|
||||
struct sockaddr_ipx *sipx, ssipx;
|
||||
|
||||
sipx = &ssipx;
|
||||
bzero((caddr_t)sipx, sizeof(*sipx));
|
||||
sipx->sipx_len = sizeof(*sipx);
|
||||
sipx->sipx_family = AF_IPX;
|
||||
IPX_LOCK(ipxp);
|
||||
sipx->sipx_addr = ipxp->ipxp_laddr;
|
||||
IPX_UNLOCK(ipxp);
|
||||
*nam = sodupsockaddr((struct sockaddr *)sipx, M_WAITOK);
|
||||
}
|
||||
|
||||
void
|
||||
ipx_getpeeraddr(struct ipxpcb *ipxp, struct sockaddr **nam)
|
||||
{
|
||||
struct sockaddr_ipx *sipx, ssipx;
|
||||
|
||||
sipx = &ssipx;
|
||||
bzero(sipx, sizeof(*sipx));
|
||||
sipx->sipx_len = sizeof(*sipx);
|
||||
sipx->sipx_family = AF_IPX;
|
||||
IPX_LOCK(ipxp);
|
||||
sipx->sipx_addr = ipxp->ipxp_faddr;
|
||||
IPX_UNLOCK(ipxp);
|
||||
*nam = sodupsockaddr((struct sockaddr *)sipx, M_WAITOK);
|
||||
}
|
||||
|
||||
struct ipxpcb *
|
||||
ipx_pcblookup(struct ipx_addr *faddr, u_short lport, int wildp)
|
||||
{
|
||||
struct ipxpcb *ipxp, *match = NULL;
|
||||
int matchwild = 3, wildcard;
|
||||
u_short fport;
|
||||
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
|
||||
fport = faddr->x_port;
|
||||
LIST_FOREACH(ipxp, &ipxpcb_list, ipxp_list) {
|
||||
if (ipxp->ipxp_lport != lport)
|
||||
continue;
|
||||
wildcard = 0;
|
||||
if (ipx_nullhost(ipxp->ipxp_faddr)) {
|
||||
if (!ipx_nullhost(*faddr))
|
||||
wildcard++;
|
||||
} else {
|
||||
if (ipx_nullhost(*faddr))
|
||||
wildcard++;
|
||||
else {
|
||||
if (!ipx_hosteq(ipxp->ipxp_faddr, *faddr))
|
||||
continue;
|
||||
if (ipxp->ipxp_fport != fport) {
|
||||
if (ipxp->ipxp_fport != 0)
|
||||
continue;
|
||||
else
|
||||
wildcard++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wildcard && wildp == 0)
|
||||
continue;
|
||||
if (wildcard < matchwild) {
|
||||
match = ipxp;
|
||||
matchwild = wildcard;
|
||||
if (wildcard == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (match);
|
||||
}
|
@ -1,150 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
* The Regents of the University of California.
|
||||
* Copyright (c) 2004-2006 Robert N. M. Watson
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_pcb.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_IPX_PCB_H_
|
||||
#define _NETIPX_IPX_PCB_H_
|
||||
|
||||
/*
|
||||
* IPX protocol interface control block.
|
||||
*/
|
||||
struct ipxpcb {
|
||||
LIST_ENTRY(ipxpcb) ipxp_list;
|
||||
struct socket *ipxp_socket; /* back pointer to socket */
|
||||
struct ipx_addr ipxp_faddr; /* destination address */
|
||||
struct ipx_addr ipxp_laddr; /* socket's address */
|
||||
caddr_t ipxp_pcb; /* protocol specific stuff */
|
||||
struct route ipxp_route; /* routing information */
|
||||
struct ipx_addr ipxp_lastdst; /* validate cached route for dg socks*/
|
||||
short ipxp_flags;
|
||||
u_char ipxp_dpt; /* default packet type for ipx_output */
|
||||
u_char ipxp_rpt; /* last received packet type by ipx_input() */
|
||||
struct mtx ipxp_mtx;
|
||||
};
|
||||
|
||||
/*
|
||||
* Additional IPX pcb-related types and variables.
|
||||
*/
|
||||
LIST_HEAD(ipxpcbhead, ipxpcb);
|
||||
extern struct ipxpcbhead ipxpcb_list;
|
||||
extern struct ipxpcbhead ipxrawpcb_list;
|
||||
|
||||
#ifdef _KERNEL
|
||||
extern struct mtx ipxpcb_list_mtx;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IPX/SPX PCB flags.
|
||||
*/
|
||||
#define IPXP_IN_ABORT 0x1 /* Calling abort through socket. */
|
||||
#define IPXP_RAWIN 0x2 /* Show headers on input. */
|
||||
#define IPXP_RAWOUT 0x4 /* Show header on output. */
|
||||
#define IPXP_ALL_PACKETS 0x8 /* Turn off higher proto processing. */
|
||||
#define IPXP_CHECKSUM 0x10 /* Use checksum on this socket. */
|
||||
#define IPXP_DROPPED 0x20 /* Connection dropped. */
|
||||
#define IPXP_SPX 0x40 /* SPX PCB. */
|
||||
|
||||
#define IPX_WILDCARD 1
|
||||
|
||||
#define ipxp_lport ipxp_laddr.x_port
|
||||
#define ipxp_fport ipxp_faddr.x_port
|
||||
|
||||
#define sotoipxpcb(so) ((struct ipxpcb *)((so)->so_pcb))
|
||||
|
||||
/*
|
||||
* Nominal space allocated to an IPX socket.
|
||||
*/
|
||||
#define IPXSNDQ 16384
|
||||
#define IPXRCVQ 40960
|
||||
|
||||
#ifdef _KERNEL
|
||||
int ipx_pcballoc(struct socket *so, struct ipxpcbhead *head,
|
||||
struct thread *p);
|
||||
int ipx_pcbbind(struct ipxpcb *ipxp, struct sockaddr *nam,
|
||||
struct thread *p);
|
||||
int ipx_pcbconnect(struct ipxpcb *ipxp, struct sockaddr *nam,
|
||||
struct thread *p);
|
||||
void ipx_pcbdetach(struct ipxpcb *ipxp);
|
||||
void ipx_pcbdisconnect(struct ipxpcb *ipxp);
|
||||
void ipx_pcbfree(struct ipxpcb *ipxp);
|
||||
struct ipxpcb *ipx_pcblookup(struct ipx_addr *faddr, u_short lport, int wildp);
|
||||
void ipx_getpeeraddr(struct ipxpcb *ipxp, struct sockaddr **nam);
|
||||
void ipx_getsockaddr(struct ipxpcb *ipxp, struct sockaddr **nam);
|
||||
|
||||
#define IPX_LIST_LOCK_INIT() mtx_init(&ipxpcb_list_mtx, "ipx_list_mtx", \
|
||||
NULL, MTX_DEF | MTX_RECURSE)
|
||||
#define IPX_LIST_LOCK() mtx_lock(&ipxpcb_list_mtx)
|
||||
#define IPX_LIST_UNLOCK() mtx_unlock(&ipxpcb_list_mtx)
|
||||
#define IPX_LIST_LOCK_ASSERT() mtx_assert(&ipxpcb_list_mtx, MA_OWNED)
|
||||
|
||||
#define IPX_LOCK_INIT(ipx) mtx_init(&(ipx)->ipxp_mtx, "ipx_mtx", NULL, \
|
||||
MTX_DEF)
|
||||
#define IPX_LOCK_DESTROY(ipx) mtx_destroy(&(ipx)->ipxp_mtx)
|
||||
#define IPX_LOCK(ipx) mtx_lock(&(ipx)->ipxp_mtx)
|
||||
#define IPX_UNLOCK(ipx) mtx_unlock(&(ipx)->ipxp_mtx)
|
||||
#define IPX_LOCK_ASSERT(ipx) mtx_assert(&(ipx)->ipxp_mtx, MA_OWNED)
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* !_NETIPX_IPX_PCB_H_ */
|
@ -1,159 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_proto.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/domain.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <net/radix.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
#include <netipx/spx.h>
|
||||
|
||||
static struct pr_usrreqs nousrreqs;
|
||||
|
||||
/*
|
||||
* IPX protocol family: IPX, ERR, PXP, SPX, ROUTE.
|
||||
*/
|
||||
|
||||
static struct domain ipxdomain;
|
||||
|
||||
static struct protosw ipxsw[] = {
|
||||
{
|
||||
.pr_domain = &ipxdomain,
|
||||
.pr_init = ipx_init,
|
||||
.pr_usrreqs = &nousrreqs
|
||||
},
|
||||
{
|
||||
.pr_type = SOCK_DGRAM,
|
||||
.pr_domain = &ipxdomain,
|
||||
.pr_flags = PR_ATOMIC|PR_ADDR,
|
||||
.pr_ctlinput = ipx_ctlinput,
|
||||
.pr_ctloutput = ipx_ctloutput,
|
||||
.pr_usrreqs = &ipx_usrreqs
|
||||
},
|
||||
{
|
||||
.pr_type = SOCK_STREAM,
|
||||
.pr_domain = &ipxdomain,
|
||||
.pr_protocol = IPXPROTO_SPX,
|
||||
.pr_flags = PR_CONNREQUIRED|PR_WANTRCVD,
|
||||
.pr_ctlinput = spx_ctlinput,
|
||||
.pr_ctloutput = spx_ctloutput,
|
||||
.pr_init = spx_init,
|
||||
.pr_fasttimo = spx_fasttimo,
|
||||
.pr_slowtimo = spx_slowtimo,
|
||||
.pr_usrreqs = &spx_usrreqs
|
||||
},
|
||||
{
|
||||
.pr_type = SOCK_SEQPACKET,
|
||||
.pr_domain = &ipxdomain,
|
||||
.pr_protocol = IPXPROTO_SPX,
|
||||
.pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_ATOMIC,
|
||||
.pr_ctlinput = spx_ctlinput,
|
||||
.pr_ctloutput = spx_ctloutput,
|
||||
.pr_usrreqs = &spx_usrreq_sps
|
||||
},
|
||||
{
|
||||
.pr_type = SOCK_RAW,
|
||||
.pr_domain = &ipxdomain,
|
||||
.pr_protocol = IPXPROTO_RAW,
|
||||
.pr_flags = PR_ATOMIC|PR_ADDR,
|
||||
.pr_ctloutput = ipx_ctloutput,
|
||||
.pr_usrreqs = &ripx_usrreqs
|
||||
},
|
||||
};
|
||||
|
||||
extern int ipx_inithead(void **, int);
|
||||
|
||||
static struct domain ipxdomain = {
|
||||
.dom_family = AF_IPX,
|
||||
.dom_name = "network systems",
|
||||
.dom_protosw = ipxsw,
|
||||
.dom_protoswNPROTOSW = &ipxsw[sizeof(ipxsw)/sizeof(ipxsw[0])],
|
||||
.dom_rtattach = ipx_inithead,
|
||||
.dom_rtoffset = 16,
|
||||
.dom_maxrtkey = sizeof(struct sockaddr_ipx)
|
||||
};
|
||||
|
||||
|
||||
/* shim to adapt arguments */
|
||||
int
|
||||
ipx_inithead(void **head, int offset)
|
||||
{
|
||||
return rn_inithead(head, offset);
|
||||
}
|
||||
|
||||
DOMAIN_SET(ipx);
|
||||
SYSCTL_NODE(_net, PF_IPX, ipx, CTLFLAG_RW, 0,
|
||||
"IPX/SPX");
|
||||
|
||||
SYSCTL_NODE(_net_ipx, IPXPROTO_RAW, ipx, CTLFLAG_RW, 0, "IPX");
|
||||
static SYSCTL_NODE(_net_ipx, IPXPROTO_SPX, spx, CTLFLAG_RW, 0, "SPX");
|
@ -1,687 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
* The Regents of the University of California.
|
||||
* Copyright (c) 2004-2006 Robert N. M. Watson
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_usrreq.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_ipx.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/route.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_if.h>
|
||||
#include <netipx/ipx_pcb.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
|
||||
#include <security/mac/mac_framework.h>
|
||||
|
||||
/*
|
||||
* IPX protocol implementation.
|
||||
*/
|
||||
|
||||
static int ipxsendspace = IPXSNDQ;
|
||||
SYSCTL_INT(_net_ipx_ipx, OID_AUTO, ipxsendspace, CTLFLAG_RW,
|
||||
&ipxsendspace, 0, "Send buffer space");
|
||||
static int ipxrecvspace = IPXRCVQ;
|
||||
SYSCTL_INT(_net_ipx_ipx, OID_AUTO, ipxrecvspace, CTLFLAG_RW,
|
||||
&ipxrecvspace, 0, "Receive buffer space");
|
||||
|
||||
static void ipx_usr_abort(struct socket *so);
|
||||
static int ipx_attach(struct socket *so, int proto, struct thread *td);
|
||||
static int ipx_bind(struct socket *so, struct sockaddr *nam, struct thread *td);
|
||||
static int ipx_connect(struct socket *so, struct sockaddr *nam,
|
||||
struct thread *td);
|
||||
static void ipx_detach(struct socket *so);
|
||||
static int ipx_disconnect(struct socket *so);
|
||||
static int ipx_send(struct socket *so, int flags, struct mbuf *m,
|
||||
struct sockaddr *addr, struct mbuf *control,
|
||||
struct thread *td);
|
||||
static int ipx_shutdown(struct socket *so);
|
||||
static int ripx_attach(struct socket *so, int proto, struct thread *td);
|
||||
static int ipx_output(struct ipxpcb *ipxp, struct mbuf *m0);
|
||||
static void ipx_usr_close(struct socket *so);
|
||||
|
||||
struct pr_usrreqs ipx_usrreqs = {
|
||||
.pru_abort = ipx_usr_abort,
|
||||
.pru_attach = ipx_attach,
|
||||
.pru_bind = ipx_bind,
|
||||
.pru_connect = ipx_connect,
|
||||
.pru_control = ipx_control,
|
||||
.pru_detach = ipx_detach,
|
||||
.pru_disconnect = ipx_disconnect,
|
||||
.pru_peeraddr = ipx_peeraddr,
|
||||
.pru_send = ipx_send,
|
||||
.pru_shutdown = ipx_shutdown,
|
||||
.pru_sockaddr = ipx_sockaddr,
|
||||
.pru_close = ipx_usr_close,
|
||||
};
|
||||
|
||||
struct pr_usrreqs ripx_usrreqs = {
|
||||
.pru_abort = ipx_usr_abort,
|
||||
.pru_attach = ripx_attach,
|
||||
.pru_bind = ipx_bind,
|
||||
.pru_connect = ipx_connect,
|
||||
.pru_control = ipx_control,
|
||||
.pru_detach = ipx_detach,
|
||||
.pru_disconnect = ipx_disconnect,
|
||||
.pru_peeraddr = ipx_peeraddr,
|
||||
.pru_send = ipx_send,
|
||||
.pru_shutdown = ipx_shutdown,
|
||||
.pru_sockaddr = ipx_sockaddr,
|
||||
.pru_close = ipx_usr_close,
|
||||
};
|
||||
|
||||
/*
|
||||
* This may also be called for raw listeners.
|
||||
*/
|
||||
void
|
||||
ipx_input(struct mbuf *m, struct ipxpcb *ipxp)
|
||||
{
|
||||
struct ipx *ipx = mtod(m, struct ipx *);
|
||||
struct ifnet *ifp = m->m_pkthdr.rcvif;
|
||||
struct sockaddr_ipx ipx_ipx;
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_input: NULL ipxpcb"));
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
/*
|
||||
* Construct sockaddr format source address.
|
||||
* Stuff source address and datagram in user buffer.
|
||||
*/
|
||||
ipx_ipx.sipx_len = sizeof(ipx_ipx);
|
||||
ipx_ipx.sipx_family = AF_IPX;
|
||||
ipx_ipx.sipx_addr = ipx->ipx_sna;
|
||||
ipx_ipx.sipx_zero[0] = '\0';
|
||||
ipx_ipx.sipx_zero[1] = '\0';
|
||||
if (ipx_neteqnn(ipx->ipx_sna.x_net, ipx_zeronet) && ifp != NULL) {
|
||||
struct ifaddr *ifa;
|
||||
|
||||
for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa != NULL;
|
||||
ifa = TAILQ_NEXT(ifa, ifa_link)) {
|
||||
if (ifa->ifa_addr->sa_family == AF_IPX) {
|
||||
ipx_ipx.sipx_addr.x_net =
|
||||
IA_SIPX(ifa)->sipx_addr.x_net;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ipxp->ipxp_rpt = ipx->ipx_pt;
|
||||
if ((ipxp->ipxp_flags & IPXP_RAWIN) == 0) {
|
||||
m->m_len -= sizeof(struct ipx);
|
||||
m->m_pkthdr.len -= sizeof(struct ipx);
|
||||
m->m_data += sizeof(struct ipx);
|
||||
}
|
||||
#ifdef MAC
|
||||
if (mac_socket_check_deliver(ipxp->ipxp_socket, m) != 0) {
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (sbappendaddr(&ipxp->ipxp_socket->so_rcv,
|
||||
(struct sockaddr *)&ipx_ipx, m, NULL) == 0)
|
||||
m_freem(m);
|
||||
else
|
||||
sorwakeup(ipxp->ipxp_socket);
|
||||
}
|
||||
|
||||
/*
|
||||
* Drop connection, reporting
|
||||
* the specified error.
|
||||
*/
|
||||
void
|
||||
ipx_drop(struct ipxpcb *ipxp, int errno)
|
||||
{
|
||||
struct socket *so = ipxp->ipxp_socket;
|
||||
|
||||
IPX_LIST_LOCK_ASSERT();
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
/*
|
||||
* someday, in the IPX world
|
||||
* we will generate error protocol packets
|
||||
* announcing that the socket has gone away.
|
||||
*
|
||||
* XXX Probably never. IPX does not have error packets.
|
||||
*/
|
||||
/*if (TCPS_HAVERCVDSYN(tp->t_state)) {
|
||||
tp->t_state = TCPS_CLOSED;
|
||||
tcp_output(tp);
|
||||
}*/
|
||||
so->so_error = errno;
|
||||
ipx_pcbdisconnect(ipxp);
|
||||
soisdisconnected(so);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_output(struct ipxpcb *ipxp, struct mbuf *m0)
|
||||
{
|
||||
struct ipx *ipx;
|
||||
struct socket *so;
|
||||
int len = 0;
|
||||
struct route *ro;
|
||||
struct mbuf *m;
|
||||
struct mbuf *mprev = NULL;
|
||||
|
||||
IPX_LOCK_ASSERT(ipxp);
|
||||
|
||||
/*
|
||||
* Calculate data length.
|
||||
*/
|
||||
for (m = m0; m != NULL; m = m->m_next) {
|
||||
mprev = m;
|
||||
len += m->m_len;
|
||||
}
|
||||
/*
|
||||
* Make sure packet is actually of even length.
|
||||
*/
|
||||
|
||||
if (len & 1) {
|
||||
m = mprev;
|
||||
if ((m->m_flags & M_EXT) == 0 &&
|
||||
(m->m_len + m->m_data < &m->m_dat[MLEN])) {
|
||||
mtod(m, char*)[m->m_len++] = 0;
|
||||
} else {
|
||||
struct mbuf *m1 = m_get(M_NOWAIT, MT_DATA);
|
||||
|
||||
if (m1 == NULL) {
|
||||
m_freem(m0);
|
||||
return (ENOBUFS);
|
||||
}
|
||||
m1->m_len = 1;
|
||||
* mtod(m1, char *) = 0;
|
||||
m->m_next = m1;
|
||||
}
|
||||
m0->m_pkthdr.len++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in mbuf with extended IPX header
|
||||
* and addresses and length put into network format.
|
||||
*/
|
||||
m = m0;
|
||||
if (ipxp->ipxp_flags & IPXP_RAWOUT) {
|
||||
ipx = mtod(m, struct ipx *);
|
||||
} else {
|
||||
M_PREPEND(m, sizeof(struct ipx), M_NOWAIT);
|
||||
if (m == NULL)
|
||||
return (ENOBUFS);
|
||||
ipx = mtod(m, struct ipx *);
|
||||
ipx->ipx_tc = 0;
|
||||
ipx->ipx_pt = ipxp->ipxp_dpt;
|
||||
ipx->ipx_sna = ipxp->ipxp_laddr;
|
||||
ipx->ipx_dna = ipxp->ipxp_faddr;
|
||||
len += sizeof(struct ipx);
|
||||
}
|
||||
|
||||
ipx->ipx_len = htons((u_short)len);
|
||||
|
||||
if (ipxp->ipxp_flags & IPXP_CHECKSUM) {
|
||||
ipx->ipx_sum = ipx_cksum(m, len);
|
||||
} else
|
||||
ipx->ipx_sum = 0xffff;
|
||||
|
||||
/*
|
||||
* Output datagram.
|
||||
*/
|
||||
so = ipxp->ipxp_socket;
|
||||
if (so->so_options & SO_DONTROUTE)
|
||||
return (ipx_outputfl(m, (struct route *)NULL,
|
||||
(so->so_options & SO_BROADCAST) | IPX_ROUTETOIF));
|
||||
/*
|
||||
* Use cached route for previous datagram if
|
||||
* possible. If the previous net was the same
|
||||
* and the interface was a broadcast medium, or
|
||||
* if the previous destination was identical,
|
||||
* then we are ok.
|
||||
*
|
||||
* NB: We don't handle broadcasts because that
|
||||
* would require 3 subroutine calls.
|
||||
*/
|
||||
ro = &ipxp->ipxp_route;
|
||||
#ifdef ancient_history
|
||||
/*
|
||||
* I think that this will all be handled in ipx_pcbconnect!
|
||||
*/
|
||||
if (ro->ro_rt != NULL) {
|
||||
if(ipx_neteq(ipxp->ipxp_lastdst, ipx->ipx_dna)) {
|
||||
/*
|
||||
* This assumes we have no GH type routes
|
||||
*/
|
||||
if (ro->ro_rt->rt_flags & RTF_HOST) {
|
||||
if (!ipx_hosteq(ipxp->ipxp_lastdst, ipx->ipx_dna))
|
||||
goto re_route;
|
||||
|
||||
}
|
||||
if ((ro->ro_rt->rt_flags & RTF_GATEWAY) == 0) {
|
||||
struct ipx_addr *dst =
|
||||
&satoipx_addr(ro->ro_dst);
|
||||
dst->x_host = ipx->ipx_dna.x_host;
|
||||
}
|
||||
/*
|
||||
* Otherwise, we go through the same gateway
|
||||
* and dst is already set up.
|
||||
*/
|
||||
} else {
|
||||
re_route:
|
||||
RTFREE(ro->ro_rt);
|
||||
ro->ro_rt = NULL;
|
||||
}
|
||||
}
|
||||
ipxp->ipxp_lastdst = ipx->ipx_dna;
|
||||
#endif /* ancient_history */
|
||||
return (ipx_outputfl(m, ro, so->so_options & SO_BROADCAST));
|
||||
}
|
||||
|
||||
int
|
||||
ipx_ctloutput(struct socket *so, struct sockopt *sopt)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
int mask, error, optval;
|
||||
short soptval;
|
||||
struct ipx ioptval;
|
||||
long seq;
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_ctloutput: ipxp == NULL"));
|
||||
error = 0;
|
||||
|
||||
switch (sopt->sopt_dir) {
|
||||
case SOPT_GET:
|
||||
switch (sopt->sopt_name) {
|
||||
case SO_ALL_PACKETS:
|
||||
mask = IPXP_ALL_PACKETS;
|
||||
goto get_flags;
|
||||
|
||||
case SO_HEADERS_ON_INPUT:
|
||||
mask = IPXP_RAWIN;
|
||||
goto get_flags;
|
||||
|
||||
case SO_IPX_CHECKSUM:
|
||||
mask = IPXP_CHECKSUM;
|
||||
goto get_flags;
|
||||
|
||||
case SO_HEADERS_ON_OUTPUT:
|
||||
mask = IPXP_RAWOUT;
|
||||
get_flags:
|
||||
/* Unlocked read. */
|
||||
soptval = ipxp->ipxp_flags & mask;
|
||||
error = sooptcopyout(sopt, &soptval, sizeof soptval);
|
||||
break;
|
||||
|
||||
case SO_DEFAULT_HEADERS:
|
||||
ioptval.ipx_len = 0;
|
||||
ioptval.ipx_sum = 0;
|
||||
ioptval.ipx_tc = 0;
|
||||
IPX_LOCK(ipxp);
|
||||
ioptval.ipx_pt = ipxp->ipxp_dpt;
|
||||
ioptval.ipx_dna = ipxp->ipxp_faddr;
|
||||
ioptval.ipx_sna = ipxp->ipxp_laddr;
|
||||
IPX_UNLOCK(ipxp);
|
||||
error = sooptcopyout(sopt, &soptval, sizeof soptval);
|
||||
break;
|
||||
|
||||
case SO_SEQNO:
|
||||
IPX_LIST_LOCK();
|
||||
seq = ipx_pexseq;
|
||||
ipx_pexseq++;
|
||||
IPX_LIST_UNLOCK();
|
||||
error = sooptcopyout(sopt, &seq, sizeof seq);
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SOPT_SET:
|
||||
switch (sopt->sopt_name) {
|
||||
case SO_ALL_PACKETS:
|
||||
mask = IPXP_ALL_PACKETS;
|
||||
goto set_head;
|
||||
|
||||
case SO_HEADERS_ON_INPUT:
|
||||
mask = IPXP_RAWIN;
|
||||
goto set_head;
|
||||
|
||||
case SO_IPX_CHECKSUM:
|
||||
mask = IPXP_CHECKSUM;
|
||||
goto set_head;
|
||||
|
||||
case SO_HEADERS_ON_OUTPUT:
|
||||
mask = IPXP_RAWOUT;
|
||||
set_head:
|
||||
error = sooptcopyin(sopt, &optval, sizeof optval,
|
||||
sizeof optval);
|
||||
if (error)
|
||||
break;
|
||||
IPX_LOCK(ipxp);
|
||||
if (optval)
|
||||
ipxp->ipxp_flags |= mask;
|
||||
else
|
||||
ipxp->ipxp_flags &= ~mask;
|
||||
IPX_UNLOCK(ipxp);
|
||||
break;
|
||||
|
||||
case SO_DEFAULT_HEADERS:
|
||||
error = sooptcopyin(sopt, &ioptval, sizeof ioptval,
|
||||
sizeof ioptval);
|
||||
if (error)
|
||||
break;
|
||||
/* Unlocked write. */
|
||||
ipxp->ipxp_dpt = ioptval.ipx_pt;
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static void
|
||||
ipx_usr_abort(struct socket *so)
|
||||
{
|
||||
|
||||
/* XXXRW: Possibly ipx_disconnect() here? */
|
||||
soisdisconnected(so);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_attach(struct socket *so, int proto, struct thread *td)
|
||||
{
|
||||
#ifdef INVARIANTS
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
#endif
|
||||
int error;
|
||||
|
||||
KASSERT(ipxp == NULL, ("ipx_attach: ipxp != NULL"));
|
||||
error = soreserve(so, ipxsendspace, ipxrecvspace);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
IPX_LIST_LOCK();
|
||||
error = ipx_pcballoc(so, &ipxpcb_list, td);
|
||||
IPX_LIST_UNLOCK();
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
int error;
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_bind: ipxp == NULL"));
|
||||
IPX_LIST_LOCK();
|
||||
IPX_LOCK(ipxp);
|
||||
error = ipx_pcbbind(ipxp, nam, td);
|
||||
IPX_UNLOCK(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
return (error);
|
||||
}
|
||||
|
||||
static void
|
||||
ipx_usr_close(struct socket *so)
|
||||
{
|
||||
|
||||
/* XXXRW: Possibly ipx_disconnect() here? */
|
||||
soisdisconnected(so);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
int error;
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_connect: ipxp == NULL"));
|
||||
IPX_LIST_LOCK();
|
||||
IPX_LOCK(ipxp);
|
||||
if (!ipx_nullhost(ipxp->ipxp_faddr)) {
|
||||
error = EISCONN;
|
||||
goto out;
|
||||
}
|
||||
error = ipx_pcbconnect(ipxp, nam, td);
|
||||
if (error == 0)
|
||||
soisconnected(so);
|
||||
out:
|
||||
IPX_UNLOCK(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
return (error);
|
||||
}
|
||||
|
||||
static void
|
||||
ipx_detach(struct socket *so)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
|
||||
/* XXXRW: Should assert detached. */
|
||||
KASSERT(ipxp != NULL, ("ipx_detach: ipxp == NULL"));
|
||||
IPX_LIST_LOCK();
|
||||
IPX_LOCK(ipxp);
|
||||
ipx_pcbdetach(ipxp);
|
||||
ipx_pcbfree(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_disconnect(struct socket *so)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
int error;
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_disconnect: ipxp == NULL"));
|
||||
IPX_LIST_LOCK();
|
||||
IPX_LOCK(ipxp);
|
||||
error = 0;
|
||||
if (ipx_nullhost(ipxp->ipxp_faddr)) {
|
||||
error = ENOTCONN;
|
||||
goto out;
|
||||
}
|
||||
ipx_pcbdisconnect(ipxp);
|
||||
soisdisconnected(so);
|
||||
out:
|
||||
IPX_UNLOCK(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_peeraddr(struct socket *so, struct sockaddr **nam)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_peeraddr: ipxp == NULL"));
|
||||
ipx_getpeeraddr(ipxp, nam);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
|
||||
struct mbuf *control, struct thread *td)
|
||||
{
|
||||
int error;
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
struct ipx_addr laddr;
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipxp_send: ipxp == NULL"));
|
||||
/*
|
||||
* Attempt to only acquire the necessary locks: if the socket is
|
||||
* already connected, we don't need to hold the IPX list lock to be
|
||||
* used by ipx_pcbconnect() and ipx_pcbdisconnect(), just the IPX
|
||||
* pcb lock.
|
||||
*/
|
||||
#ifdef MAC
|
||||
mac_socket_create_mbuf(so, m);
|
||||
#endif
|
||||
if (nam != NULL) {
|
||||
IPX_LIST_LOCK();
|
||||
IPX_LOCK(ipxp);
|
||||
laddr = ipxp->ipxp_laddr;
|
||||
if (!ipx_nullhost(ipxp->ipxp_faddr)) {
|
||||
IPX_UNLOCK(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
error = EISCONN;
|
||||
goto send_release;
|
||||
}
|
||||
/*
|
||||
* Must block input while temporarily connected.
|
||||
*/
|
||||
error = ipx_pcbconnect(ipxp, nam, td);
|
||||
if (error) {
|
||||
IPX_UNLOCK(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
goto send_release;
|
||||
}
|
||||
} else {
|
||||
IPX_LOCK(ipxp);
|
||||
if (ipx_nullhost(ipxp->ipxp_faddr)) {
|
||||
IPX_UNLOCK(ipxp);
|
||||
error = ENOTCONN;
|
||||
goto send_release;
|
||||
}
|
||||
}
|
||||
error = ipx_output(ipxp, m);
|
||||
m = NULL;
|
||||
if (nam != NULL) {
|
||||
ipx_pcbdisconnect(ipxp);
|
||||
ipxp->ipxp_laddr = laddr;
|
||||
IPX_UNLOCK(ipxp);
|
||||
IPX_LIST_UNLOCK();
|
||||
} else
|
||||
IPX_UNLOCK(ipxp);
|
||||
|
||||
send_release:
|
||||
if (m != NULL)
|
||||
m_freem(m);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
ipx_shutdown(so)
|
||||
struct socket *so;
|
||||
{
|
||||
|
||||
KASSERT(so->so_pcb != NULL, ("ipx_shutdown: so_pcb == NULL"));
|
||||
socantsendmore(so);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
ipx_sockaddr(struct socket *so, struct sockaddr **nam)
|
||||
{
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
|
||||
KASSERT(ipxp != NULL, ("ipx_sockaddr: ipxp == NULL"));
|
||||
ipx_getsockaddr(ipxp, nam);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
ripx_attach(struct socket *so, int proto, struct thread *td)
|
||||
{
|
||||
int error = 0;
|
||||
struct ipxpcb *ipxp = sotoipxpcb(so);
|
||||
|
||||
KASSERT(ipxp == NULL, ("ripx_attach: ipxp != NULL"));
|
||||
|
||||
if (td != NULL) {
|
||||
error = priv_check(td, PRIV_NETIPX_RAW);
|
||||
if (error)
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* We hold the IPX list lock for the duration as address parameters
|
||||
* of the IPX pcb are changed. Since no one else holds a reference
|
||||
* to the ipxpcb yet, we don't need the ipxpcb lock here.
|
||||
*/
|
||||
IPX_LIST_LOCK();
|
||||
error = ipx_pcballoc(so, &ipxrawpcb_list, td);
|
||||
if (error)
|
||||
goto out;
|
||||
ipxp = sotoipxpcb(so);
|
||||
error = soreserve(so, ipxsendspace, ipxrecvspace);
|
||||
if (error)
|
||||
goto out;
|
||||
ipxp->ipxp_faddr.x_host = ipx_broadhost;
|
||||
ipxp->ipxp_flags = IPXP_RAWIN | IPXP_RAWOUT;
|
||||
out:
|
||||
IPX_LIST_UNLOCK();
|
||||
return (error);
|
||||
}
|
@ -1,129 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ipx_var.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_IPX_VAR_H_
|
||||
#define _NETIPX_IPX_VAR_H_
|
||||
|
||||
/*
|
||||
* IPX Kernel Structures and Variables
|
||||
*/
|
||||
struct ipxstat {
|
||||
u_long ipxs_total; /* total packets received */
|
||||
u_long ipxs_badsum; /* checksum bad */
|
||||
u_long ipxs_tooshort; /* packet too short */
|
||||
u_long ipxs_toosmall; /* not enough data */
|
||||
u_long ipxs_forward; /* packets forwarded */
|
||||
u_long ipxs_cantforward; /* packets rcvd for unreachable dest */
|
||||
u_long ipxs_delivered; /* datagrams delivered to upper level*/
|
||||
u_long ipxs_localout; /* total ipx packets generated here */
|
||||
u_long ipxs_odropped; /* lost packets due to nobufs, etc. */
|
||||
u_long ipxs_noroute; /* packets discarded due to no route */
|
||||
u_long ipxs_mtutoosmall; /* the interface mtu is too small */
|
||||
};
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
#ifdef SYSCTL_DECL
|
||||
SYSCTL_DECL(_net_ipx);
|
||||
SYSCTL_DECL(_net_ipx_ipx);
|
||||
#endif
|
||||
|
||||
extern int ipxcksum;
|
||||
extern long ipx_pexseq;
|
||||
extern struct ipxstat ipxstat;
|
||||
extern struct pr_usrreqs ipx_usrreqs;
|
||||
extern struct pr_usrreqs ripx_usrreqs;
|
||||
extern struct sockaddr_ipx ipx_netmask;
|
||||
extern struct sockaddr_ipx ipx_hostmask;
|
||||
|
||||
extern const union ipx_net ipx_zeronet;
|
||||
extern const union ipx_net ipx_broadnet;
|
||||
extern const union ipx_host ipx_broadhost;
|
||||
|
||||
struct ifnet;
|
||||
struct ipx_addr;
|
||||
struct ipxpcb;
|
||||
struct mbuf;
|
||||
struct thread;
|
||||
struct route;
|
||||
struct sockaddr;
|
||||
struct socket;
|
||||
struct sockopt;
|
||||
|
||||
u_short ipx_cksum(struct mbuf *m, int len);
|
||||
int ipx_control(struct socket *so, u_long cmd, caddr_t data,
|
||||
struct ifnet *ifp, struct thread *td);
|
||||
void ipx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy);
|
||||
int ipx_ctloutput(struct socket *so, struct sockopt *sopt);
|
||||
void ipx_drop(struct ipxpcb *ipxp, int errno);
|
||||
void ipx_init(void);
|
||||
void ipx_input(struct mbuf *m, struct ipxpcb *ipxp);
|
||||
int ipx_outputfl(struct mbuf *m0, struct route *ro, int flags);
|
||||
int ipx_output_type20(struct mbuf *);
|
||||
int ipx_peeraddr(struct socket *so, struct sockaddr **nam);
|
||||
void ipx_printhost(struct ipx_addr *addr);
|
||||
int ipx_sockaddr(struct socket *so, struct sockaddr **nam);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* !_NETIPX_IPX_VAR_H_ */
|
210
sys/netipx/spx.h
210
sys/netipx/spx.h
@ -1,210 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)spx.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_SPX_H_
|
||||
#define _NETIPX_SPX_H_
|
||||
|
||||
/*
|
||||
* Definitions for IPX style Sequenced Packet Protocol
|
||||
*/
|
||||
|
||||
struct spxhdr {
|
||||
u_char spx_cc; /* connection control */
|
||||
u_char spx_dt; /* datastream type */
|
||||
#define SPX_SP 0x80 /* system packet */
|
||||
#define SPX_SA 0x40 /* send acknowledgement */
|
||||
#define SPX_OB 0x20 /* attention (out of band data) */
|
||||
#define SPX_EM 0x10 /* end of message */
|
||||
u_short spx_sid; /* source connection identifier */
|
||||
u_short spx_did; /* destination connection identifier */
|
||||
u_short spx_seq; /* sequence number */
|
||||
u_short spx_ack; /* acknowledge number */
|
||||
u_short spx_alo; /* allocation number */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Definitions for NS(tm) Internet Datagram Protocol
|
||||
* containing a Sequenced Packet Protocol packet.
|
||||
*/
|
||||
struct spx {
|
||||
struct ipx si_i;
|
||||
struct spxhdr si_s;
|
||||
} __packed;
|
||||
struct spx_q {
|
||||
struct mbuf *sq_msi;
|
||||
struct spx *sq_si;
|
||||
LIST_ENTRY(spx_q) sq_entry;
|
||||
};
|
||||
#define SI(x) ((struct spx *)x)
|
||||
#define si_sum si_i.ipx_sum
|
||||
#define si_len si_i.ipx_len
|
||||
#define si_tc si_i.ipx_tc
|
||||
#define si_pt si_i.ipx_pt
|
||||
#define si_dna si_i.ipx_dna
|
||||
#define si_sna si_i.ipx_sna
|
||||
#define si_sport si_i.ipx_sna.x_port
|
||||
#define si_cc si_s.spx_cc
|
||||
#define si_dt si_s.spx_dt
|
||||
#define si_sid si_s.spx_sid
|
||||
#define si_did si_s.spx_did
|
||||
#define si_seq si_s.spx_seq
|
||||
#define si_ack si_s.spx_ack
|
||||
#define si_alo si_s.spx_alo
|
||||
|
||||
/*
|
||||
* SPX control block, one per connection
|
||||
*/
|
||||
struct spxpcb {
|
||||
LIST_HEAD(, spx_q) s_q; /* queue for out-of-order receipt */
|
||||
struct ipxpcb *s_ipxpcb; /* backpointer to internet pcb */
|
||||
u_char s_state;
|
||||
u_char s_flags;
|
||||
#define SF_ACKNOW 0x01 /* Ack peer immediately */
|
||||
#define SF_DELACK 0x02 /* Ack, but try to delay it */
|
||||
#define SF_HI 0x04 /* Show headers on input */
|
||||
#define SF_HO 0x08 /* Show headers on output */
|
||||
#define SF_PI 0x10 /* Packet (datagram) interface */
|
||||
#define SF_WIN 0x20 /* Window info changed */
|
||||
#define SF_RXT 0x40 /* Rxt info changed */
|
||||
#define SF_RVD 0x80 /* Calling from read usrreq routine */
|
||||
u_short s_mtu; /* Max packet size for this stream */
|
||||
/* use sequence fields in headers to store sequence numbers for this
|
||||
connection */
|
||||
struct ipx s_ipx;
|
||||
struct spxhdr s_shdr; /* prototype header to transmit */
|
||||
#define s_cc s_shdr.spx_cc /* connection control (for EM bit) */
|
||||
#define s_dt s_shdr.spx_dt /* datastream type */
|
||||
#define s_sid s_shdr.spx_sid /* source connection identifier */
|
||||
#define s_did s_shdr.spx_did /* destination connection identifier */
|
||||
#define s_seq s_shdr.spx_seq /* sequence number */
|
||||
#define s_ack s_shdr.spx_ack /* acknowledge number */
|
||||
#define s_alo s_shdr.spx_alo /* allocation number */
|
||||
#define s_dport s_ipx.ipx_dna.x_port /* where we are sending */
|
||||
struct spxhdr s_rhdr; /* last received header (in effect!)*/
|
||||
u_short s_rack; /* their acknowledge number */
|
||||
u_short s_ralo; /* their allocation number */
|
||||
u_short s_smax; /* highest packet # we have sent */
|
||||
u_short s_snxt; /* which packet to send next */
|
||||
|
||||
/* congestion control */
|
||||
#define CUNIT 1024 /* scaling for ... */
|
||||
int s_cwnd; /* Congestion-controlled window */
|
||||
/* in packets * CUNIT */
|
||||
short s_swnd; /* == tcp snd_wnd, in packets */
|
||||
short s_smxw; /* == tcp max_sndwnd */
|
||||
/* difference of two spx_seq's can be
|
||||
no bigger than a short */
|
||||
u_short s_swl1; /* == tcp snd_wl1 */
|
||||
u_short s_swl2; /* == tcp snd_wl2 */
|
||||
int s_cwmx; /* max allowable cwnd */
|
||||
int s_ssthresh; /* s_cwnd size threshold for
|
||||
* slow start exponential-to-
|
||||
* linear switch */
|
||||
/* transmit timing stuff
|
||||
* srtt and rttvar are stored as fixed point, for convenience in smoothing.
|
||||
* srtt has 3 bits to the right of the binary point, rttvar has 2.
|
||||
*/
|
||||
short s_idle; /* time idle */
|
||||
#define SPXT_NTIMERS 4
|
||||
short s_timer[SPXT_NTIMERS]; /* timers */
|
||||
short s_rxtshift; /* log(2) of rexmt exp. backoff */
|
||||
short s_rxtcur; /* current retransmit value */
|
||||
u_short s_rtseq; /* packet being timed */
|
||||
short s_rtt; /* timer for round trips */
|
||||
short s_srtt; /* averaged timer */
|
||||
short s_rttvar; /* variance in round trip time */
|
||||
char s_force; /* which timer expired */
|
||||
char s_dupacks; /* counter to intuit xmt loss */
|
||||
|
||||
/* out of band data */
|
||||
char s_oobflags;
|
||||
#define SF_SOOB 0x08 /* sending out of band data */
|
||||
#define SF_IOOB 0x10 /* receiving out of band data */
|
||||
char s_iobc; /* input characters */
|
||||
/* debug stuff */
|
||||
u_short s_want; /* Last candidate for sending */
|
||||
char s_outx; /* exit taken from spx_output */
|
||||
char s_inx; /* exit taken from spx_input */
|
||||
u_short s_flags2; /* more flags for testing */
|
||||
#define SF_NEWCALL 0x100 /* for new_recvmsg */
|
||||
#define SO_NEWCALL 10 /* for new_recvmsg */
|
||||
};
|
||||
|
||||
#define ipxtospxpcb(np) ((struct spxpcb *)(np)->ipxp_pcb)
|
||||
#define sotospxpcb(so) (ipxtospxpcb(sotoipxpcb(so)))
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
extern struct pr_usrreqs spx_usrreqs;
|
||||
extern struct pr_usrreqs spx_usrreq_sps;
|
||||
|
||||
void spx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy);
|
||||
int spx_ctloutput(struct socket *so, struct sockopt *sopt);
|
||||
void spx_fasttimo(void);
|
||||
void spx_init(void);
|
||||
void spx_input(struct mbuf *m, struct ipxpcb *ipxp);
|
||||
void spx_slowtimo(void);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* !_NETIPX_SPX_H_ */
|
@ -1,196 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)spx_debug.c
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "opt_tcpdebug.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/protosw.h>
|
||||
|
||||
#define TCPSTATES /* for logging */
|
||||
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/tcp_fsm.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
#include <netipx/spx.h>
|
||||
#define SPXTIMERS
|
||||
#include <netipx/spx_timer.h>
|
||||
#define SANAMES
|
||||
#include <netipx/spx_debug.h>
|
||||
|
||||
#ifdef INET
|
||||
#ifdef TCPDEBUG
|
||||
static int spxconsdebug = 0;
|
||||
static struct spx_debug spx_debug[SPX_NDEBUG];
|
||||
static int spx_debx;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* spx debug routines
|
||||
*/
|
||||
void
|
||||
spx_trace(short act, u_char ostate, struct spxpcb *sp, struct spx *si,
|
||||
int req)
|
||||
{
|
||||
#ifdef INET
|
||||
#ifdef TCPDEBUG
|
||||
u_short seq, ack, len, alo;
|
||||
int flags;
|
||||
struct spx_debug *sd = &spx_debug[spx_debx++];
|
||||
|
||||
if (spx_debx == SPX_NDEBUG)
|
||||
spx_debx = 0;
|
||||
sd->sd_time = iptime();
|
||||
sd->sd_act = act;
|
||||
sd->sd_ostate = ostate;
|
||||
sd->sd_cb = (caddr_t)sp;
|
||||
if (sp != NULL)
|
||||
sd->sd_sp = *sp;
|
||||
else
|
||||
bzero((caddr_t)&sd->sd_sp, sizeof(*sp));
|
||||
if (si != NULL)
|
||||
sd->sd_si = *si;
|
||||
else
|
||||
bzero((caddr_t)&sd->sd_si, sizeof(*si));
|
||||
sd->sd_req = req;
|
||||
if (spxconsdebug == 0)
|
||||
return;
|
||||
if (ostate >= TCP_NSTATES)
|
||||
ostate = 0;
|
||||
if (act >= SA_DROP)
|
||||
act = SA_DROP;
|
||||
if (sp != NULL)
|
||||
printf("%p %s:", (void *)sp, tcpstates[ostate]);
|
||||
else
|
||||
printf("???????? ");
|
||||
printf("%s ", spxnames[act]);
|
||||
switch (act) {
|
||||
|
||||
case SA_RESPOND:
|
||||
case SA_INPUT:
|
||||
case SA_OUTPUT:
|
||||
case SA_DROP:
|
||||
if (si == NULL)
|
||||
break;
|
||||
seq = si->si_seq;
|
||||
ack = si->si_ack;
|
||||
alo = si->si_alo;
|
||||
len = si->si_len;
|
||||
if (act == SA_OUTPUT) {
|
||||
seq = ntohs(seq);
|
||||
ack = ntohs(ack);
|
||||
alo = ntohs(alo);
|
||||
len = ntohs(len);
|
||||
}
|
||||
#ifndef lint
|
||||
#define p1(f) { printf("%s = %x, ", "f", f); }
|
||||
p1(seq); p1(ack); p1(alo); p1(len);
|
||||
#endif
|
||||
flags = si->si_cc;
|
||||
if (flags) {
|
||||
char *cp = "<";
|
||||
#ifndef lint
|
||||
#define pf(f) { if (flags & SPX_ ## f) { printf("%s%s", cp, "f"); cp = ","; } }
|
||||
pf(SP); pf(SA); pf(OB); pf(EM);
|
||||
#else
|
||||
cp = cp;
|
||||
#endif
|
||||
printf(">");
|
||||
}
|
||||
#ifndef lint
|
||||
#define p2(f) { printf("%s = %x, ", "f", si->si_ ## f); }
|
||||
p2(sid);p2(did);p2(dt);p2(pt);
|
||||
#endif
|
||||
ipx_printhost(&si->si_sna);
|
||||
ipx_printhost(&si->si_dna);
|
||||
|
||||
if (act == SA_RESPOND) {
|
||||
printf("ipx_len = %x, ",
|
||||
((struct ipx *)si)->ipx_len);
|
||||
}
|
||||
break;
|
||||
|
||||
case SA_USER:
|
||||
printf("%s", prurequests[req&0xff]);
|
||||
if ((req & 0xff) == PRU_SLOWTIMO)
|
||||
printf("<%s>", spxtimers[req>>8]);
|
||||
break;
|
||||
}
|
||||
if (sp)
|
||||
printf(" -> %s", tcpstates[sp->s_state]);
|
||||
/* print out internal state of sp !?! */
|
||||
printf("\n");
|
||||
if (sp == 0)
|
||||
return;
|
||||
#ifndef lint
|
||||
#define p3(f) { printf("%s = %x, ", "f", sp->s_ ## f); }
|
||||
printf("\t"); p3(rack);p3(ralo);p3(smax);p3(flags); printf("\n");
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
}
|
@ -1,103 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)spx_debug.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_SPX_DEBUG_H_
|
||||
#define _NETIPX_SPX_DEBUG_H_
|
||||
|
||||
struct spx_debug {
|
||||
u_long sd_time;
|
||||
short sd_act;
|
||||
short sd_ostate;
|
||||
caddr_t sd_cb;
|
||||
short sd_req;
|
||||
struct spx sd_si;
|
||||
struct spxpcb sd_sp;
|
||||
};
|
||||
|
||||
#define SA_INPUT 0
|
||||
#define SA_OUTPUT 1
|
||||
#define SA_USER 2
|
||||
#define SA_RESPOND 3
|
||||
#define SA_DROP 4
|
||||
|
||||
#ifdef SANAMES
|
||||
const char *spxnames[] =
|
||||
{ "input", "output", "user", "respond", "drop" };
|
||||
#endif
|
||||
|
||||
#define SPX_NDEBUG 100
|
||||
#ifndef _KERNEL
|
||||
/* XXX common variables for broken applications. */
|
||||
struct spx_debug spx_debug[SPX_NDEBUG];
|
||||
int spx_debx;
|
||||
#endif
|
||||
|
||||
#ifdef _KERNEL
|
||||
extern char *prurequests[];
|
||||
extern char *sanames[];
|
||||
|
||||
void spx_trace(short act, u_char ostate, struct spxpcb *sp, struct spx *si,
|
||||
int req);
|
||||
#endif
|
||||
|
||||
#endif /* !_NETIPX_SPX_DEBUG_H_ */
|
@ -1,451 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 1993
|
||||
* The Regents of the University of California.
|
||||
* Copyright (c) 2004-2009 Robert N. M. Watson
|
||||
* 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)spx_usrreq.h
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/protosw.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <net/route.h>
|
||||
#include <netinet/tcp_fsm.h>
|
||||
|
||||
#include <netipx/ipx.h>
|
||||
#include <netipx/ipx_pcb.h>
|
||||
#include <netipx/ipx_var.h>
|
||||
#include <netipx/spx.h>
|
||||
#include <netipx/spx_debug.h>
|
||||
#include <netipx/spx_timer.h>
|
||||
#include <netipx/spx_var.h>
|
||||
|
||||
static int spx_use_delack = 0;
|
||||
static int spxrexmtthresh = 3;
|
||||
|
||||
static MALLOC_DEFINE(M_SPXREASSQ, "spxreassq", "SPX reassembly queue entry");
|
||||
|
||||
/*
|
||||
* Flesh pending queued segments on SPX close.
|
||||
*/
|
||||
void
|
||||
spx_reass_flush(struct spxpcb *cb)
|
||||
{
|
||||
struct spx_q *q;
|
||||
|
||||
while ((q = LIST_FIRST(&cb->s_q)) != NULL) {
|
||||
LIST_REMOVE(q, sq_entry);
|
||||
m_freem(q->sq_msi);
|
||||
free(q, M_SPXREASSQ);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize SPX segment reassembly queue on SPX socket open.
|
||||
*/
|
||||
void
|
||||
spx_reass_init(struct spxpcb *cb)
|
||||
{
|
||||
|
||||
LIST_INIT(&cb->s_q);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is structurally similar to the tcp reassembly routine but its
|
||||
* function is somewhat different: it merely queues packets up, and
|
||||
* suppresses duplicates.
|
||||
*/
|
||||
int
|
||||
spx_reass(struct spxpcb *cb, struct mbuf *msi, struct spx *si)
|
||||
{
|
||||
struct spx_q *q, *q_new, *q_temp;
|
||||
struct mbuf *m;
|
||||
struct socket *so = cb->s_ipxpcb->ipxp_socket;
|
||||
char packetp = cb->s_flags & SF_HI;
|
||||
int incr;
|
||||
char wakeup = 0;
|
||||
|
||||
IPX_LOCK_ASSERT(cb->s_ipxpcb);
|
||||
|
||||
if (si == SI(0))
|
||||
goto present;
|
||||
|
||||
/*
|
||||
* Update our news from them.
|
||||
*/
|
||||
if (si->si_cc & SPX_SA)
|
||||
cb->s_flags |= (spx_use_delack ? SF_DELACK : SF_ACKNOW);
|
||||
if (SSEQ_GT(si->si_alo, cb->s_ralo))
|
||||
cb->s_flags |= SF_WIN;
|
||||
if (SSEQ_LEQ(si->si_ack, cb->s_rack)) {
|
||||
if ((si->si_cc & SPX_SP) && cb->s_rack != (cb->s_smax + 1)) {
|
||||
spxstat.spxs_rcvdupack++;
|
||||
|
||||
/*
|
||||
* If this is a completely duplicate ack and other
|
||||
* conditions hold, we assume a packet has been
|
||||
* dropped and retransmit it exactly as in
|
||||
* tcp_input().
|
||||
*/
|
||||
if (si->si_ack != cb->s_rack ||
|
||||
si->si_alo != cb->s_ralo)
|
||||
cb->s_dupacks = 0;
|
||||
else if (++cb->s_dupacks == spxrexmtthresh) {
|
||||
u_short onxt = cb->s_snxt;
|
||||
int cwnd = cb->s_cwnd;
|
||||
|
||||
cb->s_snxt = si->si_ack;
|
||||
cb->s_cwnd = CUNIT;
|
||||
cb->s_force = 1 + SPXT_REXMT;
|
||||
spx_output(cb, NULL);
|
||||
cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
|
||||
cb->s_rtt = 0;
|
||||
if (cwnd >= 4 * CUNIT)
|
||||
cb->s_cwnd = cwnd / 2;
|
||||
if (SSEQ_GT(onxt, cb->s_snxt))
|
||||
cb->s_snxt = onxt;
|
||||
return (1);
|
||||
}
|
||||
} else
|
||||
cb->s_dupacks = 0;
|
||||
goto update_window;
|
||||
}
|
||||
cb->s_dupacks = 0;
|
||||
|
||||
/*
|
||||
* If our correspondent acknowledges data we haven't sent TCP would
|
||||
* drop the packet after acking. We'll be a little more permissive.
|
||||
*/
|
||||
if (SSEQ_GT(si->si_ack, (cb->s_smax + 1))) {
|
||||
spxstat.spxs_rcvacktoomuch++;
|
||||
si->si_ack = cb->s_smax + 1;
|
||||
}
|
||||
spxstat.spxs_rcvackpack++;
|
||||
|
||||
/*
|
||||
* If transmit timer is running and timed sequence number was acked,
|
||||
* update smoothed round trip time. See discussion of algorithm in
|
||||
* tcp_input.c
|
||||
*/
|
||||
if (cb->s_rtt && SSEQ_GT(si->si_ack, cb->s_rtseq)) {
|
||||
spxstat.spxs_rttupdated++;
|
||||
if (cb->s_srtt != 0) {
|
||||
short delta;
|
||||
delta = cb->s_rtt - (cb->s_srtt >> 3);
|
||||
if ((cb->s_srtt += delta) <= 0)
|
||||
cb->s_srtt = 1;
|
||||
if (delta < 0)
|
||||
delta = -delta;
|
||||
delta -= (cb->s_rttvar >> 2);
|
||||
if ((cb->s_rttvar += delta) <= 0)
|
||||
cb->s_rttvar = 1;
|
||||
} else {
|
||||
/*
|
||||
* No rtt measurement yet.
|
||||
*/
|
||||
cb->s_srtt = cb->s_rtt << 3;
|
||||
cb->s_rttvar = cb->s_rtt << 1;
|
||||
}
|
||||
cb->s_rtt = 0;
|
||||
cb->s_rxtshift = 0;
|
||||
SPXT_RANGESET(cb->s_rxtcur,
|
||||
((cb->s_srtt >> 2) + cb->s_rttvar) >> 1,
|
||||
SPXTV_MIN, SPXTV_REXMTMAX);
|
||||
}
|
||||
|
||||
/*
|
||||
* If all outstanding data is acked, stop retransmit timer and
|
||||
* remember to restart (more output or persist). If there is more
|
||||
* data to be acked, restart retransmit timer, using current
|
||||
* (possibly backed-off) value;
|
||||
*/
|
||||
if (si->si_ack == cb->s_smax + 1) {
|
||||
cb->s_timer[SPXT_REXMT] = 0;
|
||||
cb->s_flags |= SF_RXT;
|
||||
} else if (cb->s_timer[SPXT_PERSIST] == 0)
|
||||
cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
|
||||
|
||||
/*
|
||||
* When new data is acked, open the congestion window. If the window
|
||||
* gives us less than ssthresh packets in flight, open exponentially
|
||||
* (maxseg at a time). Otherwise open linearly (maxseg^2 / cwnd at a
|
||||
* time).
|
||||
*/
|
||||
incr = CUNIT;
|
||||
if (cb->s_cwnd > cb->s_ssthresh)
|
||||
incr = max(incr * incr / cb->s_cwnd, 1);
|
||||
cb->s_cwnd = min(cb->s_cwnd + incr, cb->s_cwmx);
|
||||
|
||||
/*
|
||||
* Trim Acked data from output queue.
|
||||
*/
|
||||
SOCKBUF_LOCK(&so->so_snd);
|
||||
while ((m = so->so_snd.sb_mb) != NULL) {
|
||||
if (SSEQ_LT((mtod(m, struct spx *))->si_seq, si->si_ack))
|
||||
sbdroprecord_locked(&so->so_snd);
|
||||
else
|
||||
break;
|
||||
}
|
||||
sowwakeup_locked(so);
|
||||
cb->s_rack = si->si_ack;
|
||||
update_window:
|
||||
if (SSEQ_LT(cb->s_snxt, cb->s_rack))
|
||||
cb->s_snxt = cb->s_rack;
|
||||
if (SSEQ_LT(cb->s_swl1, si->si_seq) || ((cb->s_swl1 == si->si_seq &&
|
||||
(SSEQ_LT(cb->s_swl2, si->si_ack))) ||
|
||||
(cb->s_swl2 == si->si_ack && SSEQ_LT(cb->s_ralo, si->si_alo)))) {
|
||||
/* keep track of pure window updates */
|
||||
if ((si->si_cc & SPX_SP) && cb->s_swl2 == si->si_ack
|
||||
&& SSEQ_LT(cb->s_ralo, si->si_alo)) {
|
||||
spxstat.spxs_rcvwinupd++;
|
||||
spxstat.spxs_rcvdupack--;
|
||||
}
|
||||
cb->s_ralo = si->si_alo;
|
||||
cb->s_swl1 = si->si_seq;
|
||||
cb->s_swl2 = si->si_ack;
|
||||
cb->s_swnd = (1 + si->si_alo - si->si_ack);
|
||||
if (cb->s_swnd > cb->s_smxw)
|
||||
cb->s_smxw = cb->s_swnd;
|
||||
cb->s_flags |= SF_WIN;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this packet number is higher than that which we have allocated
|
||||
* refuse it, unless urgent.
|
||||
*/
|
||||
if (SSEQ_GT(si->si_seq, cb->s_alo)) {
|
||||
if (si->si_cc & SPX_SP) {
|
||||
spxstat.spxs_rcvwinprobe++;
|
||||
return (1);
|
||||
} else
|
||||
spxstat.spxs_rcvpackafterwin++;
|
||||
if (si->si_cc & SPX_OB) {
|
||||
if (SSEQ_GT(si->si_seq, cb->s_alo + 60))
|
||||
return (1); /* else queue this packet; */
|
||||
} else {
|
||||
#ifdef BROKEN
|
||||
/*
|
||||
* XXXRW: This is broken on at least one count:
|
||||
* spx_close() will free the ipxp and related parts,
|
||||
* which are then touched by spx_input() after the
|
||||
* return from spx_reass().
|
||||
*/
|
||||
/*struct socket *so = cb->s_ipxpcb->ipxp_socket;
|
||||
if (so->so_state && SS_NOFDREF) {
|
||||
spx_close(cb);
|
||||
} else
|
||||
would crash system*/
|
||||
#endif
|
||||
spx_istat.notyet++;
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If this is a system packet, we don't need to queue it up, and
|
||||
* won't update acknowledge #.
|
||||
*/
|
||||
if (si->si_cc & SPX_SP)
|
||||
return (1);
|
||||
|
||||
/*
|
||||
* We have already seen this packet, so drop.
|
||||
*/
|
||||
if (SSEQ_LT(si->si_seq, cb->s_ack)) {
|
||||
spx_istat.bdreas++;
|
||||
spxstat.spxs_rcvduppack++;
|
||||
if (si->si_seq == cb->s_ack - 1)
|
||||
spx_istat.lstdup++;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop through all packets queued up to insert in appropriate
|
||||
* sequence.
|
||||
*/
|
||||
q_new = malloc(sizeof(*q_new), M_SPXREASSQ, M_NOWAIT | M_ZERO);
|
||||
if (q_new == NULL)
|
||||
return (1);
|
||||
q_new->sq_si = si;
|
||||
q_new->sq_msi = msi;
|
||||
LIST_FOREACH(q, &cb->s_q, sq_entry) {
|
||||
if (si->si_seq == q->sq_si->si_seq) {
|
||||
free(q_new, M_SPXREASSQ);
|
||||
spxstat.spxs_rcvduppack++;
|
||||
return (1);
|
||||
}
|
||||
if (SSEQ_LT(si->si_seq, q->sq_si->si_seq)) {
|
||||
spxstat.spxs_rcvoopack++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (q != NULL)
|
||||
LIST_INSERT_BEFORE(q, q_new, sq_entry);
|
||||
else
|
||||
LIST_INSERT_HEAD(&cb->s_q, q_new, sq_entry);
|
||||
|
||||
/*
|
||||
* If this packet is urgent, inform process
|
||||
*/
|
||||
if (si->si_cc & SPX_OB) {
|
||||
cb->s_iobc = ((char *)si)[1 + sizeof(*si)];
|
||||
sohasoutofband(so);
|
||||
cb->s_oobflags |= SF_IOOB;
|
||||
}
|
||||
present:
|
||||
#define SPINC sizeof(struct spxhdr)
|
||||
SOCKBUF_LOCK(&so->so_rcv);
|
||||
|
||||
/*
|
||||
* Loop through all packets queued up to update acknowledge number,
|
||||
* and present all acknowledged data to user; if in packet interface
|
||||
* mode, show packet headers.
|
||||
*/
|
||||
LIST_FOREACH_SAFE(q, &cb->s_q, sq_entry, q_temp) {
|
||||
struct spx *qsi;
|
||||
struct mbuf *mqsi;
|
||||
|
||||
qsi = q->sq_si;
|
||||
mqsi = q->sq_msi;
|
||||
if (qsi->si_seq == cb->s_ack) {
|
||||
cb->s_ack++;
|
||||
if (qsi->si_cc & SPX_OB) {
|
||||
cb->s_oobflags &= ~SF_IOOB;
|
||||
if (so->so_rcv.sb_cc)
|
||||
so->so_oobmark = so->so_rcv.sb_cc;
|
||||
else
|
||||
so->so_rcv.sb_state |= SBS_RCVATMARK;
|
||||
}
|
||||
LIST_REMOVE(q, sq_entry);
|
||||
free(q, M_SPXREASSQ);
|
||||
wakeup = 1;
|
||||
spxstat.spxs_rcvpack++;
|
||||
#ifdef SF_NEWCALL
|
||||
if (cb->s_flags2 & SF_NEWCALL) {
|
||||
struct spxhdr *sp =
|
||||
mtod(mqsi, struct spxhdr *);
|
||||
u_char dt = sp->spx_dt;
|
||||
|
||||
spx_newchecks[4]++;
|
||||
if (dt != cb->s_rhdr.spx_dt) {
|
||||
struct mbuf *mm =
|
||||
m_getclr(M_NOWAIT, MT_CONTROL);
|
||||
spx_newchecks[0]++;
|
||||
if (mm != NULL) {
|
||||
u_short *s =
|
||||
mtod(mm, u_short *);
|
||||
cb->s_rhdr.spx_dt = dt;
|
||||
mm->m_len = 5; /*XXX*/
|
||||
s[0] = 5;
|
||||
s[1] = 1;
|
||||
*(u_char *)(&s[2]) = dt;
|
||||
sbappend_locked(&so->so_rcv, mm);
|
||||
}
|
||||
}
|
||||
if (sp->spx_cc & SPX_OB) {
|
||||
MCHTYPE(mqsi, MT_OOBDATA);
|
||||
spx_newchecks[1]++;
|
||||
so->so_oobmark = 0;
|
||||
so->so_rcv.sb_state &= ~SBS_RCVATMARK;
|
||||
}
|
||||
if (packetp == 0) {
|
||||
mqsi->m_data += SPINC;
|
||||
mqsi->m_len -= SPINC;
|
||||
mqsi->m_pkthdr.len -= SPINC;
|
||||
}
|
||||
if ((sp->spx_cc & SPX_EM) || packetp) {
|
||||
sbappendrecord_locked(&so->so_rcv,
|
||||
mqsi);
|
||||
spx_newchecks[9]++;
|
||||
} else
|
||||
sbappend_locked(&so->so_rcv, mqsi);
|
||||
} else
|
||||
#endif
|
||||
if (packetp)
|
||||
sbappendrecord_locked(&so->so_rcv, mqsi);
|
||||
else {
|
||||
cb->s_rhdr = *mtod(mqsi, struct spxhdr *);
|
||||
mqsi->m_data += SPINC;
|
||||
mqsi->m_len -= SPINC;
|
||||
mqsi->m_pkthdr.len -= SPINC;
|
||||
sbappend_locked(&so->so_rcv, mqsi);
|
||||
}
|
||||
} else
|
||||
break;
|
||||
}
|
||||
if (wakeup)
|
||||
sorwakeup_locked(so);
|
||||
else
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
return (0);
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1982, 1986, 1988, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)spx_timer.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_SPX_TIMER_H_
|
||||
#define _NETIPX_SPX_TIMER_H_
|
||||
|
||||
/*
|
||||
* Definitions of the SPX timers. These timers are counted
|
||||
* down PR_SLOWHZ times a second.
|
||||
*/
|
||||
#define SPXT_REXMT 0 /* retransmit */
|
||||
#define SPXT_PERSIST 1 /* retransmit persistence */
|
||||
#define SPXT_KEEP 2 /* keep alive */
|
||||
#define SPXT_2MSL 3 /* 2*msl quiet time timer */
|
||||
|
||||
/*
|
||||
* The SPXT_REXMT timer is used to force retransmissions.
|
||||
* The SPX has the SPXT_REXMT timer set whenever segments
|
||||
* have been sent for which ACKs are expected but not yet
|
||||
* received. If an ACK is received which advances tp->snd_una,
|
||||
* then the retransmit timer is cleared (if there are no more
|
||||
* outstanding segments) or reset to the base value (if there
|
||||
* are more ACKs expected). Whenever the retransmit timer goes off,
|
||||
* we retransmit one unacknowledged segment, and do a backoff
|
||||
* on the retransmit timer.
|
||||
*
|
||||
* The SPXT_PERSIST timer is used to keep window size information
|
||||
* flowing even if the window goes shut. If all previous transmissions
|
||||
* have been acknowledged (so that there are no retransmissions in progress),
|
||||
* and the window is too small to bother sending anything, then we start
|
||||
* the SPXT_PERSIST timer. When it expires, if the window is nonzero,
|
||||
* we go to transmit state. Otherwise, at intervals send a single byte
|
||||
* into the peer's window to force him to update our window information.
|
||||
* We do this at most as often as SPXT_PERSMIN time intervals,
|
||||
* but no more frequently than the current estimate of round-trip
|
||||
* packet time. The SPXT_PERSIST timer is cleared whenever we receive
|
||||
* a window update from the peer.
|
||||
*
|
||||
* The SPXT_KEEP timer is used to keep connections alive. If an
|
||||
* connection is idle (no segments received) for SPXTV_KEEP amount of time,
|
||||
* but not yet established, then we drop the connection. If the connection
|
||||
* is established, then we force the peer to send us a segment by sending:
|
||||
* <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK>
|
||||
* This segment is (deliberately) outside the window, and should elicit
|
||||
* an ack segment in response from the peer. If, despite the SPXT_KEEP
|
||||
* initiated segments we cannot elicit a response from a peer in SPXT_MAXIDLE
|
||||
* amount of time, then we drop the connection.
|
||||
*/
|
||||
|
||||
#define SPX_TTL 30 /* default time to live for SPX segs */
|
||||
/*
|
||||
* Time constants.
|
||||
*/
|
||||
#define SPXTV_MSL ( 15*PR_SLOWHZ) /* max seg lifetime */
|
||||
#define SPXTV_SRTTBASE 0 /* base roundtrip time;
|
||||
if 0, no idea yet */
|
||||
#define SPXTV_SRTTDFLT ( 3*PR_SLOWHZ) /* assumed RTT if no info */
|
||||
|
||||
#define SPXTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistence */
|
||||
#define SPXTV_PERSMAX ( 60*PR_SLOWHZ) /* maximum persist interval */
|
||||
|
||||
#define SPXTV_KEEP ( 75*PR_SLOWHZ) /* keep alive - 75 secs */
|
||||
#define SPXTV_MAXIDLE ( 8*SPXTV_KEEP) /* maximum allowable idle
|
||||
time before drop conn */
|
||||
|
||||
#define SPXTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */
|
||||
#define SPXTV_REXMTMAX ( 64*PR_SLOWHZ) /* max allowable REXMT value */
|
||||
|
||||
#define SPX_LINGERTIME 120 /* linger at most 2 minutes */
|
||||
|
||||
#define SPX_MAXRXTSHIFT 12 /* maximum retransmits */
|
||||
|
||||
#ifdef SPXTIMERS
|
||||
char *spxtimers[] =
|
||||
{ "REXMT", "PERSIST", "KEEP", "2MSL" };
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Force a time value to be in a certain range.
|
||||
*/
|
||||
#define SPXT_RANGESET(tv, value, tvmin, tvmax) { \
|
||||
(tv) = (value); \
|
||||
if ((tv) < (tvmin)) \
|
||||
(tv) = (tvmin); \
|
||||
else if ((tv) > (tvmax)) \
|
||||
(tv) = (tvmax); \
|
||||
}
|
||||
|
||||
#endif /* !_NETIPX_SPX_TIMER_H_ */
|
File diff suppressed because it is too large
Load Diff
@ -1,160 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1984, 1985, 1986, 1987, 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.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Copyright (c) 1995, Mike Mitchell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)spx_var.h
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _NETIPX_SPX_VAR_H_
|
||||
#define _NETIPX_SPX_VAR_H_
|
||||
|
||||
struct spxstat {
|
||||
long spxs_connattempt; /* connections initiated */
|
||||
long spxs_accepts; /* connections accepted */
|
||||
long spxs_connects; /* connections established */
|
||||
long spxs_drops; /* connections dropped */
|
||||
long spxs_conndrops; /* embryonic connections dropped */
|
||||
long spxs_closed; /* conn. closed (includes drops) */
|
||||
long spxs_segstimed; /* segs where we tried to get rtt */
|
||||
long spxs_rttupdated; /* times we succeeded */
|
||||
long spxs_delack; /* delayed acks sent */
|
||||
long spxs_timeoutdrop; /* conn. dropped in rxmt timeout */
|
||||
long spxs_rexmttimeo; /* retransmit timeouts */
|
||||
long spxs_persisttimeo; /* persist timeouts */
|
||||
long spxs_keeptimeo; /* keepalive timeouts */
|
||||
long spxs_keepprobe; /* keepalive probes sent */
|
||||
long spxs_keepdrops; /* connections dropped in keepalive */
|
||||
|
||||
long spxs_sndtotal; /* total packets sent */
|
||||
long spxs_sndpack; /* data packets sent */
|
||||
long spxs_sndbyte; /* data bytes sent */
|
||||
long spxs_sndrexmitpack; /* data packets retransmitted */
|
||||
long spxs_sndrexmitbyte; /* data bytes retransmitted */
|
||||
long spxs_sndacks; /* ack-only packets sent */
|
||||
long spxs_sndprobe; /* window probes sent */
|
||||
long spxs_sndurg; /* packets sent with URG only */
|
||||
long spxs_sndwinup; /* window update-only packets sent */
|
||||
long spxs_sndctrl; /* control (SYN|FIN|RST) packets sent */
|
||||
long spxs_sndvoid; /* couldn't find requested packet*/
|
||||
|
||||
long spxs_rcvtotal; /* total packets received */
|
||||
long spxs_rcvpack; /* packets received in sequence */
|
||||
long spxs_rcvbyte; /* bytes received in sequence */
|
||||
long spxs_rcvbadsum; /* packets received with ccksum errs */
|
||||
long spxs_rcvbadoff; /* packets received with bad offset */
|
||||
long spxs_rcvshort; /* packets received too short */
|
||||
long spxs_rcvduppack; /* duplicate-only packets received */
|
||||
long spxs_rcvdupbyte; /* duplicate-only bytes received */
|
||||
long spxs_rcvpartduppack; /* packets with some duplicate data */
|
||||
long spxs_rcvpartdupbyte; /* dup. bytes in part-dup. packets */
|
||||
long spxs_rcvoopack; /* out-of-order packets received */
|
||||
long spxs_rcvoobyte; /* out-of-order bytes received */
|
||||
long spxs_rcvpackafterwin; /* packets with data after window */
|
||||
long spxs_rcvbyteafterwin; /* bytes rcvd after window */
|
||||
long spxs_rcvafterclose; /* packets rcvd after "close" */
|
||||
long spxs_rcvwinprobe; /* rcvd window probe packets */
|
||||
long spxs_rcvdupack; /* rcvd duplicate acks */
|
||||
long spxs_rcvacktoomuch; /* rcvd acks for unsent data */
|
||||
long spxs_rcvackpack; /* rcvd ack packets */
|
||||
long spxs_rcvackbyte; /* bytes acked by rcvd acks */
|
||||
long spxs_rcvwinupd; /* rcvd window update packets */
|
||||
};
|
||||
struct spx_istat {
|
||||
short hdrops;
|
||||
short badsum;
|
||||
short badlen;
|
||||
short slotim;
|
||||
short fastim;
|
||||
short nonucn;
|
||||
short noconn;
|
||||
short notme;
|
||||
short wrncon;
|
||||
short bdreas;
|
||||
short gonawy;
|
||||
short notyet;
|
||||
short lstdup;
|
||||
struct spxstat newstats;
|
||||
};
|
||||
|
||||
#define SPX_ISSINCR 128
|
||||
/*
|
||||
* spx sequence numbers are 16 bit integers operated
|
||||
* on with modular arithmetic. These macros can be
|
||||
* used to compare such integers.
|
||||
*/
|
||||
#define SSEQ_LT(a,b) (((short)((a)-(b))) < 0)
|
||||
#define SSEQ_LEQ(a,b) (((short)((a)-(b))) <= 0)
|
||||
#define SSEQ_GT(a,b) (((short)((a)-(b))) > 0)
|
||||
#define SSEQ_GEQ(a,b) (((short)((a)-(b))) >= 0)
|
||||
|
||||
#ifdef _KERNEL
|
||||
/* Following was struct spxstat spxstat; */
|
||||
#ifndef spxstat
|
||||
#define spxstat spx_istat.newstats
|
||||
#endif
|
||||
extern struct spx_istat spx_istat;
|
||||
extern u_short spx_newchecks[50];
|
||||
|
||||
int spx_output(struct spxpcb *cb, struct mbuf *m0);
|
||||
int spx_reass(struct spxpcb *cb, struct mbuf *msi, struct spx *si);
|
||||
void spx_reass_flush(struct spxpcb *cb);
|
||||
void spx_reass_init(struct spxpcb *cb);
|
||||
#endif
|
||||
|
||||
#endif /* !_NETIPX_SPX_VAR_H_ */
|
@ -35,10 +35,6 @@
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#ifndef _NETIPX_IPX_H_
|
||||
#include <netipx/ipx.h>
|
||||
#endif
|
||||
|
||||
#define NMB_TCP_PORT 137
|
||||
|
||||
#define NBPROTO_TCPSSN 1 /* NETBIOS session over TCP */
|
||||
@ -114,7 +110,7 @@
|
||||
*/
|
||||
union nb_tran {
|
||||
struct sockaddr_in x_in;
|
||||
struct sockaddr_ipx x_ipx;
|
||||
/* struct sockaddr_ipx was here. */
|
||||
};
|
||||
|
||||
struct nb_name {
|
||||
|
@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include "opt_cpu.h"
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_inet.h"
|
||||
#include "opt_ipx.h"
|
||||
#include "opt_isa.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_maxmem.h"
|
||||
|
@ -2069,8 +2069,6 @@ biba_priv_check(struct ucred *cred, int priv)
|
||||
case PRIV_NETINET_RESERVEDPORT:
|
||||
case PRIV_NETINET_RAW:
|
||||
case PRIV_NETINET_REUSEPORT:
|
||||
case PRIV_NETIPX_RESERVEDPORT:
|
||||
case PRIV_NETIPX_RAW:
|
||||
break;
|
||||
|
||||
/*
|
||||
|
@ -1836,8 +1836,6 @@ lomac_priv_check(struct ucred *cred, int priv)
|
||||
case PRIV_NETINET_RESERVEDPORT:
|
||||
case PRIV_NETINET_RAW:
|
||||
case PRIV_NETINET_REUSEPORT:
|
||||
case PRIV_NETIPX_RESERVEDPORT:
|
||||
case PRIV_NETIPX_RAW:
|
||||
break;
|
||||
|
||||
/*
|
||||
|
@ -58,7 +58,7 @@
|
||||
* in the range 5 to 9.
|
||||
*/
|
||||
#undef __FreeBSD_version
|
||||
#define __FreeBSD_version 1100011 /* Master, propagated to newvers */
|
||||
#define __FreeBSD_version 1100012 /* Master, propagated to newvers */
|
||||
|
||||
/*
|
||||
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
|
||||
|
@ -391,12 +391,6 @@
|
||||
#define PRIV_NETINET_SETHDROPTS 505 /* Set certain IPv4/6 header options. */
|
||||
#define PRIV_NETINET_BINDANY 506 /* Allow bind to any address. */
|
||||
|
||||
/*
|
||||
* IPX/SPX privileges.
|
||||
*/
|
||||
#define PRIV_NETIPX_RESERVEDPORT 520 /* Bind low port number. */
|
||||
#define PRIV_NETIPX_RAW 521 /* Open netipx raw socket. */
|
||||
|
||||
/*
|
||||
* NCP privileges.
|
||||
*/
|
||||
|
@ -72,9 +72,6 @@ CRUNCH_SRCDIRS+= sbin
|
||||
|
||||
CRUNCH_LIBS+= -lalias -lcam -lcurses -ldevstat -lipsec
|
||||
# Don't forget this - ifconfig, etc -adrian
|
||||
.if ${MK_IPX} != "no"
|
||||
CRUNCH_LIBS+= -lipx
|
||||
.endif
|
||||
CRUNCH_LIBS+= -lgeom -lbsdxml -ljail -lkiconv -lmd -lsbuf -lufs
|
||||
|
||||
##################################################################
|
||||
|
@ -18,11 +18,9 @@ CRUNCH_LIBS+= -lwrap
|
||||
# netstat
|
||||
CRUNCH_PROGS_usr.bin+= netstat
|
||||
CRUNCH_LIBS+= -lmemstat -lnetgraph
|
||||
CRUNCH_BUILDOPTS_netstat=-DMK_IPX_SUPPORT=no
|
||||
|
||||
# ifconfig
|
||||
CRUNCH_PROGS_sbin+= ifconfig
|
||||
CRUNCH_BUILDOPTS_ifconfig=-DMK_IPX_SUPPORT=no
|
||||
|
||||
# wlan stuff
|
||||
CRUNCH_PROGS_usr.sbin+= wlandebug
|
||||
|
@ -2074,24 +2074,6 @@ OLD_FILES+=usr/share/man/man8/ipfwpcap.8.gz
|
||||
OLD_FILES+=usr/share/man/man8/natd.8.gz
|
||||
.endif
|
||||
|
||||
.if ${MK_IPX} == no
|
||||
OLD_LIBS+=lib/libipx.so.5
|
||||
OLD_FILES+=usr/lib/libipx.a
|
||||
OLD_FILES+=usr/lib/libipx.so
|
||||
OLD_FILES+=usr/lib/libipx_p.a
|
||||
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64"
|
||||
OLD_FILES+=usr/lib32/libipx.a
|
||||
OLD_FILES+=usr/lib32/libipx.so
|
||||
OLD_LIBS+=usr/lib32/libipx.so.5
|
||||
OLD_FILES+=usr/lib32/libipx_p.a
|
||||
.endif
|
||||
OLD_FILES+=usr/sbin/IPXrouted
|
||||
OLD_FILES+=usr/share/man/man3/ipx.3.gz
|
||||
OLD_FILES+=usr/share/man/man3/ipx_addr.3.gz
|
||||
OLD_FILES+=usr/share/man/man3/ipx_ntoa.3.gz
|
||||
OLD_FILES+=usr/share/man/man8/IPXrouted.8.gz
|
||||
.endif
|
||||
|
||||
.if ${MK_JAIL} == no
|
||||
OLD_FILES+=usr/sbin/jail
|
||||
OLD_FILES+=usr/sbin/jexec
|
||||
@ -3688,7 +3670,6 @@ OLD_FILES+=usr/lib/libheimbase_p.a
|
||||
OLD_FILES+=usr/lib/libheimsqlite_p.a
|
||||
OLD_FILES+=usr/lib/libhistory_p.a
|
||||
OLD_FILES+=usr/lib/libipsec_p.a
|
||||
OLD_FILES+=usr/lib/libipx_p.a
|
||||
OLD_FILES+=usr/lib/libjail_p.a
|
||||
OLD_FILES+=usr/lib/libkadm5clnt_p.a
|
||||
OLD_FILES+=usr/lib/libkadm5srv_p.a
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user