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:
Gleb Smirnoff 2014-03-14 02:58:48 +00:00
parent bc3f5ec90b
commit 2c284d9395
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=263140
142 changed files with 91 additions and 14071 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -275,8 +275,6 @@
..
netipsec
..
netipx
..
netnatm
api
..

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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);
}

View file

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

View file

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

View file

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

View file

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

View file

@ -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);
}

View file

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

View file

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

View file

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

View file

@ -122,7 +122,6 @@ MAN= aac.4 \
dummynet.4 \
ed.4 \
edsc.4 \
ef.4 \
ehci.4 \
em.4 \
en.4 \

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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.
*/

View file

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

View file

@ -136,7 +136,6 @@ SUBDIR= \
if_bridge \
if_disc \
if_edsc \
if_ef \
if_epair \
if_faith \
if_gif \

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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_ */

View file

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

View file

@ -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();

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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);
}

View file

@ -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_ */

View file

@ -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);
}

View file

@ -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_ */

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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_ */

View file

@ -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");

View file

@ -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);
}

View file

@ -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_ */

View file

@ -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_ */

View file

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

View file

@ -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_ */

View file

@ -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);
}

View file

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

View file

@ -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_ */

View file

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

View file

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

View file

@ -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;
/*

View file

@ -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;
/*

View file

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

View file

@ -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.
*/

View file

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

View file

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

View file

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