summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorHenning Brauer <henning@cvs.openbsd.org>2007-06-06 10:05:50 +0000
committerHenning Brauer <henning@cvs.openbsd.org>2007-06-06 10:05:50 +0000
commit8c03bb8e06bf7582a1f69cb41d627696dae03cca (patch)
tree62bbf09e28a065580d8fd80d8b3cc2f9fb07fb0b /sys
parent397bb4efff5f5ce0ddfbc4df19df010a55f83fd3 (diff)
bye bye
most of the IPX removal work done @ calgary airport
Diffstat (limited to 'sys')
-rw-r--r--sys/netipx/ipx.c377
-rw-r--r--sys/netipx/ipx.h250
-rw-r--r--sys/netipx/ipx_cksum.c209
-rw-r--r--sys/netipx/ipx_if.h100
-rw-r--r--sys/netipx/ipx_input.c490
-rw-r--r--sys/netipx/ipx_ip.c455
-rw-r--r--sys/netipx/ipx_ip.h71
-rw-r--r--sys/netipx/ipx_outputfl.c263
-rw-r--r--sys/netipx/ipx_pcb.c402
-rw-r--r--sys/netipx/ipx_pcb.h103
-rw-r--r--sys/netipx/ipx_proto.c94
-rw-r--r--sys/netipx/ipx_tun.c70
-rw-r--r--sys/netipx/ipx_usrreq.c608
-rw-r--r--sys/netipx/ipx_var.h83
-rw-r--r--sys/netipx/spx.h202
-rw-r--r--sys/netipx/spx_debug.c171
-rw-r--r--sys/netipx/spx_debug.h75
-rw-r--r--sys/netipx/spx_timer.h128
-rw-r--r--sys/netipx/spx_usrreq.c1815
-rw-r--r--sys/netipx/spx_var.h144
20 files changed, 0 insertions, 6110 deletions
diff --git a/sys/netipx/ipx.c b/sys/netipx/ipx.c
deleted file mode 100644
index 559e45d50e5..00000000000
--- a/sys/netipx/ipx.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* $OpenBSD: ipx.c,v 1.14 2006/03/05 21:48:57 miod Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx.c
- *
- * from FreeBSD Id: ipx.c,v 1.4 1996/03/11 15:13:46 davidg Exp
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/ioctl.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <net/if.h>
-#include <net/route.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-
-/*
- * Generic internet control operations (ioctl's).
- */
-/* ARGSUSED */
-int
-ipx_control(so, cmd, data, ifp)
- struct socket *so;
- u_long cmd;
- caddr_t data;
- struct ifnet *ifp;
-{
- struct ifreq *ifr = (struct ifreq *)data;
- struct ipx_aliasreq *ifra = (struct ipx_aliasreq *)data;
- struct ipx_ifaddr *ia;
- int dstIsNew, hostIsNew;
- int error = 0;
-
- /*
- * Find address for this interface, if it exists.
- */
- if (ifp)
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list)
- if (ia->ia_ifp == ifp)
- break;
-
- switch (cmd) {
- case SIOCAIFADDR:
- case SIOCDIFADDR:
- if (ifra->ifra_addr.sipx_family == AF_IPX)
- for (; ia != TAILQ_END(&ipx_ifaddr);
- ia = TAILQ_NEXT(ia, ia_list)) {
- if (ia->ia_ifp == ifp &&
- ipx_neteq(ia->ia_addr.sipx_addr,
- ifra->ifra_addr.sipx_addr))
- break;
- }
- if (cmd == SIOCDIFADDR && ia == 0)
- return (EADDRNOTAVAIL);
- /* FALLTHROUGH */
-
- case SIOCSIFADDR:
- case SIOCSIFDSTADDR:
- if ((so->so_state & SS_PRIV) == 0)
- return (EPERM);
-
- if (ia == (struct ipx_ifaddr *)NULL) {
- ia = (struct ipx_ifaddr *)
- malloc(sizeof(*ia), M_IFADDR, M_WAITOK);
- bzero((caddr_t)ia, sizeof(*ia));
- TAILQ_INSERT_TAIL(&ifp->if_addrlist,
- (struct ifaddr *)ia, ifa_list);
- TAILQ_INSERT_TAIL(&ipx_ifaddr, ia, ia_list);
- ia->ia_ifp = ifp;
- ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
-
- ia->ia_ifa.ifa_netmask =
- (struct sockaddr *)&ipx_netmask;
-
- ia->ia_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.ipx_host =
- ipx_broadhost;
- }
- }
- break;
-
- case SIOCSIFBRDADDR:
- if ((so->so_state & SS_PRIV) == 0)
- return (EPERM);
- /* FALLTHROUGH */
-
- case SIOCGIFADDR:
- case SIOCGIFDSTADDR:
- case SIOCGIFBRDADDR:
- if (ia == (struct ipx_ifaddr *)NULL)
- return (EADDRNOTAVAIL);
- break;
- }
-
- switch (cmd) {
-
- case SIOCGIFADDR:
- *(struct sockaddr_ipx *)&ifr->ifr_addr = ia->ia_addr;
- return (0);
-
- case SIOCGIFBRDADDR:
- if ((ifp->if_flags & IFF_BROADCAST) == 0)
- return (EINVAL);
- *(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_broadaddr;
- return (0);
-
- case SIOCGIFDSTADDR:
- if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
- return (EINVAL);
- *(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_dstaddr;
- return (0);
-
- case SIOCSIFDSTADDR:
- if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
- return (EINVAL);
- 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)
- return (error);
- }
- *(struct sockaddr *)&ia->ia_dstaddr = ifr->ifr_dstaddr;
- return (0);
-
- case SIOCSIFADDR:
- return (ipx_ifinit(ifp, ia,
- (struct sockaddr_ipx *)&ifr->ifr_addr, 1));
-
- case SIOCDIFADDR:
- ipx_ifscrub(ifp, ia);
- TAILQ_REMOVE(&ifp->if_addrlist, (struct ifaddr *)ia, ifa_list);
- TAILQ_REMOVE(&ipx_ifaddr, ia, ia_list);
- IFAFREE((&ia->ia_ifa));
- return (0);
-
- 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);
- return (error);
-
- default:
- if (ifp->if_ioctl == 0)
- return (EOPNOTSUPP);
- return ((*ifp->if_ioctl)(ifp, cmd, data));
- }
-}
-
-/*
- * Delete any previous route for an old address.
- */
-void
-ipx_ifscrub(ifp, ia)
- 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 IPX address
- * and routing table entry.
- */
-int
-ipx_ifinit(ifp, ia, sipx, scrub)
- struct ifnet *ifp;
- struct ipx_ifaddr *ia;
- struct sockaddr_ipx *sipx;
- int scrub;
-{
- struct sockaddr_ipx oldaddr;
- int s = splnet(), 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);
- }
- 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.ipx_net =
- ia->ia_addr.sipx_addr.ipx_net;
- rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP);
- }
- ia->ia_flags |= IFA_ROUTE;
- splx(s);
- return (0);
-}
-
-/*
- * Return address info for specified IPX network.
- */
-struct ipx_ifaddr *
-ipx_iaonnetof(dst)
- 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->ipx_net;
-
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list) {
- if ((ifp = ia->ia_ifp)) {
- 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.ipx_net))
- ia_maybe = ia;
- } else {
- if (ipx_neteqnn(net,
- ia->ia_addr.sipx_addr.ipx_net))
- return (ia);
- }
- }
- }
- return (ia_maybe);
-}
-
-void
-ipx_printhost(addr)
-register 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.ipx_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.ipx_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.ipx_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);
-}
-
diff --git a/sys/netipx/ipx.h b/sys/netipx/ipx.h
deleted file mode 100644
index 27908dffb59..00000000000
--- a/sys/netipx/ipx.h
+++ /dev/null
@@ -1,250 +0,0 @@
-/* $OpenBSD: ipx.h,v 1.18 2003/10/26 17:01:11 avsm Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx.h
- *
- * from FreeBSD Id: ipx.h,v 1.7 1996/01/30 22:58:48 mpp Exp
- */
-
-#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_FSP 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 */
-#define IPXPORT_SERIAL 0x0457 /* NW Serialization */
-#define IPXPORT_NLSP 0x9001 /* NW NLSP */
-#define IPXPORT_WAN 0x9004 /* NW IPXWAN */
-#define IPXPORT_PING 0x9086 /* NW IPX Ping */
-#define IPXPORT_MOBILE 0x9088 /* NW Mobile IPX Socket */
-/*
- * 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
-#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
- */
-#define IPX_HOSTADDRLEN 6
-#define IPX_NETADDRLEN 4
-
-typedef
-union ipx_host {
- u_int8_t c_host[IPX_HOSTADDRLEN] __packed;
- u_int16_t s_host[IPX_HOSTADDRLEN/2] __packed;
-} ipx_host_t;
-
-typedef
-union ipx_net {
- u_int8_t c_net[IPX_NETADDRLEN] __packed;
- u_int16_t s_net[IPX_NETADDRLEN/2] __packed;
- u_int32_t l_net __packed;
-} ipx_net_t;
-
-typedef u_int16_t ipx_port_t;
-
-typedef
-struct ipx_addr {
- ipx_net_t ipx_net __packed;
- ipx_host_t ipx_host __packed;
- ipx_port_t ipx_port __packed;
-} ipx_addr_t;
-
-/*
- * Socket address
- */
-struct sockaddr_ipx {
- u_int8_t sipx_len;
- u_int8_t sipx_family;
- u_int16_t sipx_type;
- struct ipx_addr sipx_addr;
-};
-#define sipx_net sipx_addr.ipx_net
-#define sipx_network sipx_addr.ipx_net.l_net
-#define sipx_node sipx_addr.ipx_host.c_host
-#define sipx_port sipx_addr.ipx_port
-
-/*
- * Definitions for IPX Internet Datagram Protocol
- */
-struct ipx {
- u_int16_t ipx_sum __packed; /* Checksum */
- u_int16_t ipx_len __packed; /* Length, in bytes, including header */
- u_int8_t ipx_tc __packed; /* Transport Control (i.e. hop count) */
- u_int8_t ipx_pt __packed; /* Packet Type (i.e. lev 2 protocol) */
- ipx_addr_t ipx_dna __packed; /* Destination Network Address */
- ipx_addr_t ipx_sna __packed; /* Source Network Address */
-};
-
-#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).ipx_net, (b).ipx_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).ipx_host,(t).ipx_host))
-#define ipx_nullnet(x) \
- (((x).ipx_net.s_net[0]==0) && ((x).ipx_net.s_net[1]==0))
-#define ipx_nullhost(x) (((x).ipx_host.s_host[0]==0) && \
- ((x).ipx_host.s_host[1]==0) && ((x).ipx_host.s_host[2]==0))
-#define ipx_wildnet(x) (((x).ipx_net.s_net[0]==0xffff) && \
- ((x).ipx_net.s_net[1]==0xffff))
-#define ipx_wildhost(x) (((x).ipx_host.s_host[0]==0xffff) && \
- ((x).ipx_host.s_host[1]==0xffff) && ((x).ipx_host.s_host[2]==0xffff))
-
-/*
- * Definitions for inet sysctl operations.
- *
- * Third level is protocol number.
- * Fourth level is desired variable within that protocol.
- */
-#define IPXPROTO_MAXID (IPXPROTO_SPX + 1) /* don't list to IPPROTO_MAX */
-
-#define CTL_IPXPROTO_NAMES { \
- { "ipx", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "spx", CTLTYPE_NODE }, \
-}
-
-#ifdef _KERNEL
-
-#define satosipx(a) ((struct sockaddr_ipx *)(a))
-#define sipxtosa(a) ((struct sockaddr *)(a))
-
-extern int ipxcksum;
-extern int ipxforwarding;
-extern int ipxnetbios;
-extern struct domain ipxdomain;
-extern struct sockaddr_ipx ipx_netmask;
-extern struct sockaddr_ipx ipx_hostmask;
-
-extern union ipx_net ipx_zeronet;
-extern union ipx_host ipx_zerohost;
-extern union ipx_net ipx_broadnet;
-extern union ipx_host ipx_broadhost;
-
-extern u_long ipx_pexseq;
-extern u_char ipxctlerrmap[];
-
-struct route;
-struct sockaddr;
-struct socket;
-struct ipxpcb;
-void ipx_abort(struct ipxpcb *ipxp);
-u_short ipx_cksum(struct mbuf *m, int len);
-int ipx_control(struct socket *so, u_long cmd, caddr_t data,
- struct ifnet *ifp);
-void *ipx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy);
-int ipx_ctloutput(int req, struct socket *so, int level, int name,
- struct mbuf **value);
-int ipx_do_route(struct ipx_addr *src, struct route *ro);
-void ipx_drop(struct ipxpcb *ipxp, int errno);
-void ipx_forward(struct mbuf *m);
-void ipx_init(void);
-void ipx_input(struct mbuf *, ...);
-void ipxintr(void);
-int ipx_output(struct mbuf *m0, ...);
-int ipx_outputfl(struct mbuf *m0, struct route *ro, int flags);
-int ipx_output_type20(struct mbuf *m);
-int ipx_raw_usrreq(struct socket *so, int req, struct mbuf *m,
- struct mbuf *nam, struct mbuf *control);
-void ipx_undo_route(struct route *ro);
-int ipx_usrreq(struct socket *so, int req, struct mbuf *m,
- struct mbuf *nam, struct mbuf *control);
-void ipx_watch_output(struct mbuf *m, struct ifnet *ifp);
-int ipx_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-void ipx_printhost(struct ipx_addr *addr);
-
-#endif /* _KERNEL */
-
-#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_ */
diff --git a/sys/netipx/ipx_cksum.c b/sys/netipx/ipx_cksum.c
deleted file mode 100644
index 5a0911af22b..00000000000
--- a/sys/netipx/ipx_cksum.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* $OpenBSD: ipx_cksum.c,v 1.6 2003/12/10 07:22:43 itojun Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_cksum.c
- *
- * from FreeBSD Id: ipx_cksum.c,v 1.3 1995/11/04 09:02:40 julian Exp
- */
-
-#include <sys/param.h>
-#include <sys/mbuf.h>
-
-#include <netipx/ipx.h>
-
-/*
- * Checksum routine for Internetwork Packet Exchange Packets (Big-Endian).
- *
- * This routine is very heavily used in the network
- * code and should be modified for each CPU to be as fast as possible.
- */
-
-#define ADDCARRY(x) { if ((x) > 65535) (x) -= 65535; }
-#define FOLD(x) {l_util.l = (x); (x) = l_util.s[0] + l_util.s[1]; ADDCARRY(x);}
-
-u_short
-ipx_cksum(m, len)
- struct mbuf *m;
- int len;
-{
- u_short *w;
- int sum = 0;
- int mlen = 0;
- int sum2;
-
- union {
- u_short s[2];
- long l;
- } l_util;
-
- for (;m && len; m = m->m_next) {
- if (m->m_len == 0)
- continue;
- /*
- * Each trip around loop adds in
- * word from one mbuf segment.
- */
- w = mtod(m, u_short *);
- if (mlen == -1) {
- /*
- * There is a byte left from the last segment;
- * ones-complement add it into the checksum.
- */
-#if BYTE_ORDER == BIG_ENDIAN
- sum += *(u_char *)w;
-#else
- sum += *(u_char *)w << 8;
-#endif
- sum += sum;
- w = (u_short *)(1 + (char *)w);
- mlen = m->m_len - 1;
- len--;
- FOLD(sum);
- } else
- mlen = m->m_len;
- if (len < mlen)
- mlen = len;
- len -= mlen;
- /*
- * We can do a 16 bit ones complement sum using
- * 32 bit arithmetic registers for adding,
- * with carries from the low added
- * into the high (by normal carry-chaining)
- * so long as we fold back before 16 carries have occurred.
- */
- if (1 & (long) w)
- goto uuuuglyy;
-#ifndef TINY
-/* -DTINY reduces the size from 1250 to 550, but slows it down by 22% */
- while ((mlen -= 32) >= 0) {
- sum += w[0]; sum += sum; sum += w[1]; sum += sum;
- sum += w[2]; sum += sum; sum += w[3]; sum += sum;
- sum += w[4]; sum += sum; sum += w[5]; sum += sum;
- sum += w[6]; sum += sum; sum += w[7]; sum += sum;
- FOLD(sum);
- sum += w[8]; sum += sum; sum += w[9]; sum += sum;
- sum += w[10]; sum += sum; sum += w[11]; sum += sum;
- sum += w[12]; sum += sum; sum += w[13]; sum += sum;
- sum += w[14]; sum += sum; sum += w[15]; sum += sum;
- FOLD(sum);
- w += 16;
- }
- mlen += 32;
-#endif
- while ((mlen -= 8) >= 0) {
- sum += w[0]; sum += sum; sum += w[1]; sum += sum;
- sum += w[2]; sum += sum; sum += w[3]; sum += sum;
- FOLD(sum);
- w += 4;
- }
- mlen += 8;
- while ((mlen -= 2) >= 0) {
- sum += *w++; sum += sum;
- }
- goto commoncase;
-uuuuglyy:
-#if BYTE_ORDER == BIG_ENDIAN
-#define ww(n) (((u_char *)w)[n + n + 1])
-#define vv(n) (((u_char *)w)[n + n])
-#else
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define vv(n) (((u_char *)w)[n + n + 1])
-#define ww(n) (((u_char *)w)[n + n])
-#endif
-#endif
- sum2 = 0;
-#ifndef TINY
- while ((mlen -= 32) >= 0) {
- sum += ww(0); sum += sum; sum += ww(1); sum += sum;
- sum += ww(2); sum += sum; sum += ww(3); sum += sum;
- sum += ww(4); sum += sum; sum += ww(5); sum += sum;
- sum += ww(6); sum += sum; sum += ww(7); sum += sum;
- FOLD(sum);
- sum += ww(8); sum += sum; sum += ww(9); sum += sum;
- sum += ww(10); sum += sum; sum += ww(11); sum += sum;
- sum += ww(12); sum += sum; sum += ww(13); sum += sum;
- sum += ww(14); sum += sum; sum += ww(15); sum += sum;
- FOLD(sum);
- sum2 += vv(0); sum2 += sum2; sum2 += vv(1); sum2 += sum2;
- sum2 += vv(2); sum2 += sum2; sum2 += vv(3); sum2 += sum2;
- sum2 += vv(4); sum2 += sum2; sum2 += vv(5); sum2 += sum2;
- sum2 += vv(6); sum2 += sum2; sum2 += vv(7); sum2 += sum2;
- FOLD(sum2);
- sum2 += vv(8); sum2 += sum2; sum2 += vv(9); sum2 += sum2;
- sum2 += vv(10); sum2 += sum2; sum2 += vv(11); sum2 += sum2;
- sum2 += vv(12); sum2 += sum2; sum2 += vv(13); sum2 += sum2;
- sum2 += vv(14); sum2 += sum2; sum2 += vv(15); sum2 += sum2;
- FOLD(sum2);
- w += 16;
- }
- mlen += 32;
-#endif
- while ((mlen -= 8) >= 0) {
- sum += ww(0); sum += sum; sum += ww(1); sum += sum;
- sum += ww(2); sum += sum; sum += ww(3); sum += sum;
- FOLD(sum);
- sum2 += vv(0); sum2 += sum2; sum2 += vv(1); sum2 += sum2;
- sum2 += vv(2); sum2 += sum2; sum2 += vv(3); sum2 += sum2;
- FOLD(sum2);
- w += 4;
- }
- mlen += 8;
- while ((mlen -= 2) >= 0) {
- sum += ww(0); sum += sum;
- sum2 += vv(0); sum2 += sum2;
- w++;
- }
- sum += (sum2 << 8);
-commoncase:
- if (mlen == -1) {
-#if BYTE_ORDER == BIG_ENDIAN
- sum += *(u_char *)w << 8;
-#else
- sum += *(u_char *)w;
-#endif
- }
- FOLD(sum);
- }
- if (mlen == -1) {
- /* We had an odd number of bytes to sum; assume a garbage
- byte of zero and clean up */
- sum += sum;
- FOLD(sum);
- }
- /*
- * sum has already been kept to low sixteen bits.
- * just examine result and exit.
- */
- if(sum==0xffff) sum = 0;
- return (sum);
-}
diff --git a/sys/netipx/ipx_if.h b/sys/netipx/ipx_if.h
deleted file mode 100644
index 01bf79be1ea..00000000000
--- a/sys/netipx/ipx_if.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $OpenBSD: ipx_if.h,v 1.6 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_if.h
- *
- * from FreeBSD Id: ipx_if.h,v 1.5 1995/11/24 12:25:05 bde Exp
- */
-
-#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.
- */
-
-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_list;/* list of IPX 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 */
-};
-
-struct ipx_aliasreq {
- char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
- struct sockaddr_ipx ifra_addr;
- struct sockaddr_ipx ifra_dstaddr;
-#define ifra_broadaddr ifra_dstaddr
-};
-/*
- * 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))
-
-#define IPX_ETHERTYPE_8023 0x0001 /* Ethernet_802.3 */
-#define IPX_ETHERTYPE_8022 0x0004 /* Ethernet_802.2 */
-#define IPX_ETHERTYPE_SNAP 0x0005 /* Ethernet_SNAP, internal use only */
-#define IPX_ETHERTYPE_8022TR 0x0011 /* Ethernet_802.2 w/ trailers */
-#define IPX_ETHERTYPE_II 0x8137 /* Ethernet_II */
-#define IPX_ETHERTYPE_IPX IPX_ETHERTYPE_II
-
-#ifdef IPXIP
-struct ipxip_req {
- struct sockaddr rq_ipx; /* must be ipx format destination */
- struct sockaddr rq_ip; /* must be ip format gateway */
- u_int16_t rq_flags;
-};
-#endif
-
-#ifdef _KERNEL
-TAILQ_HEAD(ipx_ifaddrhead, ipx_ifaddr);
-extern struct ifqueue ipxintrq; /* IPX input packet queue */
-extern struct ipx_ifaddrhead ipx_ifaddr;
-
-struct ipx_ifaddr *
- ipx_iaonnetof(struct ipx_addr *dst);
-int ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
- struct sockaddr_ipx *sipx, int scrub);
-void ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia);
-#endif
-
-#endif /* !_NETIPX_IPX_IF_H_ */
diff --git a/sys/netipx/ipx_input.c b/sys/netipx/ipx_input.c
deleted file mode 100644
index 5c6d5c61371..00000000000
--- a/sys/netipx/ipx_input.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/* $OpenBSD: ipx_input.c,v 1.21 2006/03/05 21:48:57 miod Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_input.c
- *
- * from FreeBSD Id: ipx_input.c,v 1.8 1996/03/11 15:13:48 davidg Exp
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/mbuf.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <net/if.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>
-
-#ifndef IPXPRINTFS
-#define IPXPRINTFS 1 /* printing forwarding information */
-#endif
-
-int ipxprintfs = IPXPRINTFS;
-int ipxcksum = 0;
-int ipxdonosocks = 0;
-int ipxforwarding = 0;
-int ipxnetbios = 0;
-
-union ipx_net ipx_zeronet;
-union ipx_host ipx_zerohost;
-
-union ipx_net ipx_broadnet;
-union ipx_host ipx_broadhost;
-
-struct ipxstat ipxstat;
-struct sockaddr_ipx ipx_netmask, ipx_hostmask;
-
-static u_int16_t allones[] = {0xffff, 0xffff, 0xffff};
-
-#ifndef IPXCBHASHSIZE
-#define IPXCBHASHSIZE 32
-#endif
-struct ipxpcbtable ipxrawcbtable;
-int ipxrawcbhashsize = IPXCBHASHSIZE;
-
-struct ipx_ifaddrhead ipx_ifaddr;
-struct ifqueue ipxintrq;
-int ipxqmaxlen = IFQ_MAXLEN;
-
-u_long ipx_pexseq;
-
-/*
- * IPX initialization.
- */
-
-void
-ipx_init()
-{
- ipx_broadnet = * (union ipx_net *) allones;
- ipx_broadhost = * (union ipx_host *) allones;
-
- ipx_pexseq = arc4random();
- ipxintrq.ifq_maxlen = ipxqmaxlen;
-
- ipx_netmask.sipx_len = 6;
- ipx_netmask.sipx_addr.ipx_net = ipx_broadnet;
-
- ipx_hostmask.sipx_len = 12;
- ipx_hostmask.sipx_addr.ipx_net = ipx_broadnet;
- ipx_hostmask.sipx_addr.ipx_host = ipx_broadhost;
-
- ipx_pcbinit(&ipxrawcbtable, ipxrawcbhashsize);
-
- TAILQ_INIT(&ipx_ifaddr);
-}
-
-/*
- * IPX input routine. Pass to next level.
- */
-void
-ipxintr()
-{
- struct ipx *ipx;
- struct mbuf *m;
- struct ipxpcb *ipxp;
- struct ipx_ifaddr *ia;
- int len, s;
-
-next:
- /*
- * Get next datagram off input queue and get IPX header
- * in first mbuf.
- */
- s = splnet();
- IF_DEQUEUE(&ipxintrq, m);
- splx(s);
- if (m == NULL) {
- return;
- }
-
- ipxstat.ipxs_total++;
-
- if ((m->m_flags & M_EXT || m->m_len < sizeof(struct ipx)) &&
- (m = m_pullup(m, sizeof(struct ipx))) == 0) {
- ipxstat.ipxs_toosmall++;
- goto next;
- }
-
- /*
- * Give any raw listeners a crack at the packet
- */
- CIRCLEQ_FOREACH(ipxp, &ipxrawcbtable.input_queue, ipxp_queue) {
- struct mbuf *m1 = m_copy(m, 0, (int)M_COPYALL);
- if (m1)
- ipx_input(m1, ipxp);
- }
-
- 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++;
- goto bad;
- }
- 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++;
- goto bad;
- }
- }
-
- /*
- * Propagated (Netbios) packets (type 20) has to be handled
- * different. :-(
- */
- if (ipx->ipx_pt == IPXPROTO_NETBIOS) {
- if (ipxnetbios) {
- ipx_output_type20(m);
- goto next;
- } else
- goto bad;
- }
-
- /*
- * Is this a directed broadcast?
- */
- if (ipx_hosteqnh(ipx_broadhost,ipx->ipx_dna.ipx_host)) {
- if ((!ipx_neteq(ipx->ipx_dna, ipx->ipx_sna)) &&
- (!ipx_neteqnn(ipx->ipx_dna.ipx_net, ipx_broadnet)) &&
- (!ipx_neteqnn(ipx->ipx_sna.ipx_net, ipx_zeronet)) &&
- (!ipx_neteqnn(ipx->ipx_dna.ipx_net, ipx_zeronet)) ) {
- /*
- * If it is a broadcast to the net where it was
- * received from, treat it as ours.
- */
- TAILQ_FOREACH(ia, &ipx->if_addr, ia_list)
- if((ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif) &&
- ipx_neteq(ia->ia_addr.sipx_addr,
- ipx->ipx_dna))
- goto ours;
-
- /*
- * 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);
- goto next;
- }
- }
- /*
- * Is this our packet? If not, forward.
- */
- } else {
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list)
- 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.ipx_net, ipx_zeronet)))
- break;
-
- if (ia == NULL) {
- ipx_forward(m);
- goto next;
- }
- }
-ours:
- /*
- * Locate pcb for datagram.
- */
- ipxp = ipx_pcblookup(&ipx->ipx_sna, ipx->ipx_dna.ipx_port,
- IPX_WILDCARD);
- /*
- * Switch out to protocol's input routine.
- */
- if (ipxp) {
- ipxstat.ipxs_delivered++;
- if ((ipxp->ipxp_flags & IPXP_ALL_PACKETS) == 0)
- switch (ipx->ipx_pt) {
-
- case IPXPROTO_SPX:
- spx_input(m, ipxp);
- goto next;
- }
- ipx_input(m, ipxp);
- } else
- goto bad;
-
- goto next;
-
-bad:
- m_freem(m);
- goto next;
-}
-
-void *
-ipx_ctlinput(cmd, arg_as_sa, dummy)
- int cmd;
- struct sockaddr *arg_as_sa; /* XXX should be swapped with dummy */
- void *dummy;
-{
- caddr_t arg = (/* XXX */ caddr_t)arg_as_sa;
- struct ipx_addr *ipx;
-
- if (cmd < 0 || cmd >= PRC_NCMDS)
- return NULL;
- switch (cmd) {
- struct sockaddr_ipx *sipx;
-
- case PRC_IFDOWN:
- case PRC_HOSTDEAD:
- case PRC_HOSTUNREACH:
- sipx = (struct sockaddr_ipx *)arg;
- if (sipx == NULL || sipx->sipx_family != AF_IPX)
- return NULL;
- ipx = &sipx->sipx_addr;
- break;
-
- default:
- break;
- }
- return NULL;
-}
-
-/*
- * Forward a packet. If some error occurs return the sender
- * an error packet. Note we can't always generate a meaningful
- * error message because the IPX errors don't have a large enough repetoire
- * of codes and types.
- */
-struct route ipx_droute;
-struct route ipx_sroute;
-
-void
-ipx_forward(m)
-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) {
- 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.ipx_host.c_host[0] & 0x1) {
- struct ipx_ifaddr *ia = ipx_iaonnetof(&ipx->ipx_dna);
- struct ifnet *ifp;
- if (ia) {
- /* I'm gonna hafta eat this packet */
- agedelta += IPX_MAXHOPS - ipx->ipx_tc;
- ipx->ipx_tc = IPX_MAXHOPS;
- }
- 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);
- }
- } else {
- switch (error) {
-
- case ENETUNREACH:
- case EHOSTDOWN:
- case EHOSTUNREACH:
- case ENETDOWN:
- case EPERM:
- ipxstat.ipxs_noroute++;
- break;
-
- case EMSGSIZE:
- ipxstat.ipxs_mtutoosmall++;
- break;
-
- case ENOBUFS:
- ipxstat.ipxs_odropped++;
- break;
- }
- m_freem(m);
- }
-cleanup:
- if (ok_there)
- ipx_undo_route(&ipx_droute);
- if (ok_back)
- ipx_undo_route(&ipx_sroute);
-}
-
-int
-ipx_do_route(src, ro)
-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.ipx_port = 0;
- rtalloc(ro);
- if (ro->ro_rt == 0 || ro->ro_rt->rt_ifp == 0) {
- return (0);
- }
- ro->ro_rt->rt_use++;
- return (1);
-}
-
-void
-ipx_undo_route(ro)
-register struct route *ro;
-{
- if (ro->ro_rt) {
- RTFREE(ro->ro_rt);
- }
-}
-
-void
-ipx_watch_output(m, ifp)
-struct mbuf *m;
-struct ifnet *ifp;
-{
- struct ipxpcb *ipxp;
- struct ifaddr *ifa;
- struct ipx_ifaddr *ia;
- /*
- * Give any raw listeners a crack at the packet
- */
- CIRCLEQ_FOREACH(ipxp, &ipxrawcbtable.ipxpt_queue, ipxp_queue) {
- struct mbuf *m0 = m_copy(m, 0, (int)M_COPYALL);
- if (m0) {
- struct ipx *ipx;
-
- M_PREPEND(m0, sizeof(*ipx), M_DONTWAIT);
- if (m0 == NULL)
- continue;
- ipx = mtod(m0, struct ipx *);
- ipx->ipx_sna.ipx_net = ipx_zeronet;
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list)
- if (ifp == ia->ia_ifp)
- break;
- if (ia == NULL)
- ipx->ipx_sna.ipx_host = ipx_zerohost;
- else
- ipx->ipx_sna.ipx_host =
- ia->ia_addr.sipx_addr.ipx_host;
-
- if (ifp && (ifp->if_flags & IFF_POINTOPOINT))
- TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
- if (ifa->ifa_addr->sa_family == AF_IPX) {
- ipx->ipx_sna = IA_SIPX(ifa)->sipx_addr;
- break;
- }
- }
- ipx->ipx_len = ntohl(m0->m_pkthdr.len);
- ipx_input(m0, ipxp);
- }
- }
-}
diff --git a/sys/netipx/ipx_ip.c b/sys/netipx/ipx_ip.c
deleted file mode 100644
index 738ecb744d0..00000000000
--- a/sys/netipx/ipx_ip.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/* $OpenBSD: ipx_ip.c,v 1.22 2006/06/15 10:08:34 pascoe Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_ip.c
- *
- * from FreeBSD Id: ipx_ip.c,v 1.7 1996/03/11 15:13:50 davidg Exp
- */
-
-/*
- * Software interface driver for encapsulating IPX in IP.
- */
-
-#ifdef IPXIP
-#ifndef INET
-#error The option IPXIP requires option INET.
-#endif
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/errno.h>
-#include <sys/ioctl.h>
-#include <sys/protosw.h>
-
-#include <net/if.h>
-#include <net/if_types.h>
-#include <net/netisr.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/in_var.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#include <netipx/ipx_ip.h>
-
-#include <sys/stdarg.h>
-
-struct ifnet ipxipif;
-struct ifnet_en *ipxip_list; /* list of all hosts and gateways or broadcast addrs */
-
-void
-ipxipprotoinit(void)
-{
- (void) ipxipattach();
-}
-
-struct ifnet_en *
-ipxipattach(void)
-{
- struct ifnet_en *m;
- struct ifnet *ifp;
-
- if (ipxipif.if_mtu == 0) {
- ifp = &ipxipif;
- snprintf(ifp->if_xname, sizeof ifp->if_xname, "ipx0");
- ifp->if_mtu = LOMTU;
- ifp->if_ioctl = ipxipioctl;
- ifp->if_output = ipxipoutput;
- ifp->if_start = ipxipstart;
- ifp->if_flags = IFF_POINTOPOINT;
- ifp->if_type = IFT_NSIP;
- }
-
- MALLOC((m), struct ifnet_en *, sizeof(*m), M_PCB, M_NOWAIT);
- if (m == NULL)
- return (NULL);
- bzero(m, sizeof(*m));
- m->ifen_next = ipxip_list;
- ipxip_list = m;
- ifp = &m->ifen_ifnet;
-
- snprintf(ifp->if_xname, sizeof ifp->if_xname, "ipx0");
- ifp->if_mtu = LOMTU;
- ifp->if_ioctl = ipxipioctl;
- ifp->if_output = ipxipoutput;
- ifp->if_start = ipxipstart;
- ifp->if_flags = IFF_POINTOPOINT;
- if_attach(ifp);
-
- return (m);
-}
-
-
-/*
- * Process an ioctl request.
- */
-/* ARGSUSED */
-int
-ipxipioctl(ifp, cmd, data)
- struct ifnet *ifp;
- u_long cmd;
- caddr_t data;
-{
- int error = 0;
- struct ifreq *ifr;
-
- switch (cmd) {
-
- case SIOCSIFADDR:
- ifp->if_flags |= IFF_UP;
- /* FALLTHROUGH */
-
- case SIOCSIFDSTADDR:
- /*
- * Everything else is done at a higher level.
- */
- break;
-
- case SIOCSIFFLAGS:
- ifr = (struct ifreq *)data;
- if ((ifr->ifr_flags & IFF_UP) == 0)
- error = ipxip_free(ifp);
-
- default:
- error = EINVAL;
- }
- return (error);
-}
-
-struct mbuf *ipxip_badlen;
-
-void
-ipxip_input( struct mbuf *m, ...)
-{
- struct ifnet *ifp;
- struct ip *ip;
- struct ipx *ipx;
- struct ifqueue *ifq = &ipxintrq;
- int len, s;
- va_list ap;
-
- va_start(ap, m);
- ifp = va_arg(ap, struct ifnet *);
- va_end(ap);
-
- /*
- * Get IP and IPX header together in first mbuf.
- */
- ipxipif.if_ipackets++;
- s = sizeof(struct ip) + sizeof(struct ipx);
- if (((m->m_flags & M_EXT) || m->m_len < s) &&
- (m = m_pullup(m, s)) == NULL) {
- ipxipif.if_ierrors++;
- return;
- }
- ip = mtod(m, struct ip *);
- if (ip->ip_hl > (sizeof(struct ip) >> 2)) {
- ip_stripoptions(m, (struct mbuf *)0);
- if (m->m_len < s) {
- if ((m = m_pullup(m, s)) == NULL) {
- ipxipif.if_ierrors++;
- return;
- }
- ip = mtod(m, struct ip *);
- }
- }
-
- /*
- * Make mbuf data length reflect IPX length.
- * If not enough data to reflect IPX length, drop.
- */
- m->m_data += sizeof(struct ip);
- m->m_len -= sizeof(struct ip);
- m->m_pkthdr.len -= sizeof(struct ip);
- ipx = mtod(m, struct ipx *);
- len = ntohs(ipx->ipx_len);
- if (len & 1)
- len++; /* Preserve Garbage Byte */
- if (ntohs(ip->ip_len) - (ip->ip_hl << 2) != len) {
- if (len > ntohs(ip->ip_len) - (ip->ip_hl << 2)) {
- ipxipif.if_ierrors++;
- if (ipxip_badlen)
- m_freem(ipxip_badlen);
- ipxip_badlen = m;
- return;
- }
- /* Any extra will be trimmed off by the IPX routines */
- }
-
- /*
- * Place interface pointer before the data
- * for the receiving protocol.
- */
- m->m_pkthdr.rcvif = ifp;
- /*
- * Deliver to IPX
- */
- s = splnet();
- if (IF_QFULL(ifq)) {
- IF_DROP(ifq);
- m_freem(m);
- splx(s);
- return;
- }
- IF_ENQUEUE(ifq, m);
- schednetisr(NETISR_IPX);
- splx(s);
- return;
-}
-
-/* ARGSUSED */
-int
-ipxipoutput(ifp, m, dst, rt)
- struct ifnet *ifp;
- struct mbuf *m;
- struct sockaddr *dst;
- struct rtentry *rt;
-{
- struct ifnet_en *ifn = (struct ifnet_en *)ifp;
- struct ip *ip;
- struct route *ro = &(ifn->ifen_route);
- int len = 0;
- struct ipx *ipx = mtod(m, struct ipx *);
- int error;
-
- ifn->ifen_ifnet.if_opackets++;
- ipxipif.if_opackets++;
-
- /*
- * Calculate data length and make space
- * for IP header.
- */
- len = ntohs(ipx->ipx_len);
- if (len & 1)
- len++; /* Preserve Garbage Byte */
- /* following clause not necessary on vax */
- if (3 & (long)m->m_data) {
- /* force longword alignment of ip hdr */
- struct mbuf *m0 = m_gethdr(M_DONTWAIT, MT_HEADER);
- if (m0 == NULL) {
- m_freem(m);
- return (ENOBUFS);
- }
- MH_ALIGN(m0, sizeof(struct ip));
- m0->m_flags = m->m_flags & M_COPYFLAGS;
- m0->m_next = m;
- m0->m_len = sizeof(struct ip);
- m0->m_pkthdr.len = m0->m_len + m->m_len;
- m0->m_pkthdr.tags = m->m_pkthdr.tags;
- m->m_flags &= ~M_PKTHDR;
- m_tag_init(m);
- } else {
- M_PREPEND(m, sizeof(struct ip), M_DONTWAIT);
- if (m == NULL)
- return (ENOBUFS);
- }
- /*
- * Fill in IP header.
- */
- ip = mtod(m, struct ip *);
- *(long *)ip = 0;
- ip->ip_p = IPPROTO_IDP;
- ip->ip_src = ifn->ifen_src;
- ip->ip_dst = ifn->ifen_dst;
- if (len + sizeof(struct ip) > IP_MAXPACKET) {
- m_freem(m);
- return EMSGSIZE;
- }
- ip->ip_len = htons(len + sizeof(struct ip));
- ip->ip_ttl = MAXTTL;
-
- /*
- * Output final datagram.
- */
- error = ip_output(m, NULL, ro, SO_BROADCAST, NULL, NULL);
- if (error) {
- ifn->ifen_ifnet.if_oerrors++;
- ifn->ifen_ifnet.if_ierrors = error;
- }
- return (error);
-}
-
-void
-ipxipstart(ifp)
- struct ifnet *ifp;
-{
- panic("ipxip_start called");
-}
-
-struct ifreq ifr_ipxip = {"ipx0"};
-
-int
-ipxip_route(m)
- struct mbuf *m;
-{
- struct ipxip_req *rq = mtod(m, struct ipxip_req *);
- struct sockaddr_ipx *ipx_dst = (struct sockaddr_ipx *)&rq->rq_ipx;
- struct sockaddr_in *ip_dst = (struct sockaddr_in *)&rq->rq_ip;
- struct route ro;
- struct ifnet_en *ifn;
- struct sockaddr_in *src;
-
- /*
- * First, make sure we already have an IPX address.
- */
- if (TAILQ_EMPTY(&ipx_ifaddr))
- return (EADDRNOTAVAIL);
- /*
- * Now, determine if we can get to the destination
- */
- bzero((caddr_t)&ro, sizeof(ro));
- ro.ro_dst = *(struct sockaddr *)ip_dst;
- rtalloc(&ro);
- if (ro.ro_rt == NULL || ro.ro_rt->rt_ifp == NULL) {
- return (ENETUNREACH);
- }
-
- /*
- * And see how he's going to get back to us:
- * i.e., what return ip address do we use?
- */
- {
- struct in_ifaddr *ia;
- struct ifnet *ifp = ro.ro_rt->rt_ifp;
-
- TAILQ_FOREACH(ia, &in_ifaddr, ia_list)
- if (ia->ia_ifp == ifp)
- break;
- if (ia == NULL)
- ia = TAILQ_FIRST(&in_ifaddr);
- if (ia == NULL) {
- RTFREE(ro.ro_rt);
- return (EADDRNOTAVAIL);
- }
- src = (struct sockaddr_in *)&ia->ia_addr;
- }
-
- /*
- * Is there a free (pseudo-)interface or space?
- */
- for (ifn = ipxip_list; ifn; ifn = ifn->ifen_next) {
- if ((ifn->ifen_ifnet.if_flags & IFF_UP) == 0)
- break;
- }
- if (ifn == NULL)
- ifn = ipxipattach();
- if (ifn == NULL) {
- RTFREE(ro.ro_rt);
- return (ENOBUFS);
- }
- ifn->ifen_route = ro;
- ifn->ifen_dst = ip_dst->sin_addr;
- ifn->ifen_src = src->sin_addr;
-
- /*
- * now configure this as a point to point link
- */
- ifr_ipxip.ifr_dstaddr = * (struct sockaddr *) ipx_dst;
- ipx_control((struct socket *)0, (int)SIOCSIFDSTADDR,
- (caddr_t)&ifr_ipxip, (struct ifnet *)ifn);
-
- satoipx_addr(ifr_ipxip.ifr_addr).ipx_host =
- TAILQ_FIRST(&ipx_ifaddr)->ia_addr.sipx_addr.ipx_host;
-
- return (ipx_control((struct socket *)0, (int)SIOCSIFADDR,
- (caddr_t)&ifr_ipxip, (struct ifnet *)ifn));
-}
-
-int
-ipxip_free(ifp)
- struct ifnet *ifp;
-{
- struct ifnet_en *ifn = (struct ifnet_en *)ifp;
- struct route *ro = & ifn->ifen_route;
-
- if (ro->ro_rt) {
- RTFREE(ro->ro_rt);
- ro->ro_rt = NULL;
- }
- ifp->if_flags &= ~IFF_UP;
- return (0);
-}
-
-void *
-ipxip_ctlinput(cmd, sa, dummy)
- int cmd;
- struct sockaddr *sa;
- void *dummy;
-{
- struct sockaddr_in *sin;
-
- if ((unsigned)cmd >= PRC_NCMDS)
- return NULL;
- if (sa->sa_family != AF_INET && sa->sa_family != AF_IMPLINK)
- return NULL;
- sin = (struct sockaddr_in *)sa;
- if (sin->sin_addr.s_addr == INADDR_ANY)
- return NULL;
-
- switch (cmd) {
-
- case PRC_ROUTEDEAD:
- case PRC_REDIRECT_NET:
- case PRC_REDIRECT_HOST:
- case PRC_REDIRECT_TOSNET:
- case PRC_REDIRECT_TOSHOST:
- ipxip_rtchange(&sin->sin_addr);
- break;
- }
- return NULL;
-}
-
-void
-ipxip_rtchange(dst)
- struct in_addr *dst;
-{
- struct ifnet_en *ifn;
-
- for (ifn = ipxip_list; ifn; ifn = ifn->ifen_next) {
- if (ifn->ifen_dst.s_addr == dst->s_addr &&
- ifn->ifen_route.ro_rt) {
- RTFREE(ifn->ifen_route.ro_rt);
- ifn->ifen_route.ro_rt = NULL;
- }
- }
-}
-#endif /* IPXIP */
diff --git a/sys/netipx/ipx_ip.h b/sys/netipx/ipx_ip.h
deleted file mode 100644
index 7abf42a86ac..00000000000
--- a/sys/netipx/ipx_ip.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $OpenBSD: ipx_ip.h,v 1.4 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipxip.h
- *
- * from FreeBSD Id: ipx_ip.h,v 1.5 1995/12/16 03:43:49 bde Exp
- */
-
-#ifndef _NETIPX_IPXIP_H_
-#define _NETIPX_IPXIP_H_
-
-struct ifnet_en {
- struct ifnet ifen_ifnet;
- struct route ifen_route;
- struct in_addr ifen_src;
- struct in_addr ifen_dst;
- struct ifnet_en *ifen_next;
-};
-
-#define LOMTU (1024+512) /* XXX this is TINY_LOMTU */
-
-#ifdef _KERNEL
-
-extern struct ifnet ipxipif;
-extern struct ifnet_en *ipxip_list;
-
-void ipxipprotoinit(void);
-struct ifnet_en * ipxipattach(void);
-void *ipxip_ctlinput(int cmd, struct sockaddr *sa, void *arg);
-int ipxip_free(struct ifnet *ifp);
-void ipxip_input(struct mbuf *m, ... );
-int ipxipioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
-int ipxipoutput(struct ifnet *ifp, struct mbuf *m,
- struct sockaddr *dst, struct rtentry *rt);
-int ipxip_route(struct mbuf *m);
-void ipxip_rtchange(struct in_addr *dst);
-void ipxipstart(struct ifnet *ifp);
-
-#endif /* _KERNEL */
-
-#endif /* !_NETIPX_IPXIP_H_ */
diff --git a/sys/netipx/ipx_outputfl.c b/sys/netipx/ipx_outputfl.c
deleted file mode 100644
index e6ca65ca22c..00000000000
--- a/sys/netipx/ipx_outputfl.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/* $OpenBSD: ipx_outputfl.c,v 1.8 2006/03/05 21:48:57 miod Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_outputfl.c
- *
- * from FreeBSD Id: ipx_outputfl.c,v 1.4 1996/03/11 15:13:52 davidg Exp
- */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/errno.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <net/if.h>
-#include <net/route.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#include <netipx/ipx_var.h>
-
-int ipx_copy_output = 0;
-
-int
-ipx_outputfl(m0, ro, flags)
- 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.ipx_port = 0;
- /*
- * If routing to interface only,
- * short circuit routing lookup.
- */
- if (flags & IPX_ROUTETOIF) {
- struct ipx_ifaddr *ia = ipx_iaonnetof(&ipx->ipx_dna);
-
- if (ia == NULL) {
- ipxstat.ipxs_noroute++;
- error = ENETUNREACH;
- goto bad;
- }
- ifp = ia->ia_ifp;
- goto gotif;
- }
- rtalloc(ro);
- } 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(ro);
- }
- if (ro->ro_rt == NULL || (ifp = ro->ro_rt->rt_ifp) == NULL) {
- ipxstat.ipxs_noroute++;
- error = ENETUNREACH;
- goto bad;
- }
- ro->ro_rt->rt_use++;
- 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
- * verify user is allowed to send
- * such a packet.
- */
- if (dst->sipx_addr.ipx_host.c_host[0] & 1) {
- if ((ifp->if_flags & IFF_BROADCAST) == 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++;
- if (ipx_copy_output) {
- ipx_watch_output(m0, ifp);
- }
- error = (*ifp->if_output)(ifp, m0, (struct sockaddr *)dst,
- ro->ro_rt);
- goto done;
- } else {
- ipxstat.ipxs_mtutoosmall++;
- error = EMSGSIZE;
- }
-bad:
- if (ipx_copy_output) {
- ipx_watch_output(m0, ifp);
- }
- m_freem(m0);
-done:
- if (ro == &ipxroute && (flags & IPX_ROUTETOIF) == 0 && ro->ro_rt) {
- 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(m)
- struct mbuf *m;
-{
- struct ipx *ipx;
- union ipx_net *nbnet;
- struct ipx_ifaddr *ia, *tia = NULL;
- 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.
- */
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list)
- 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.ipx_net,
- *nbnet))
- goto bad;
- }
- /*
- * Don't route the packet if the interface where it come from
- * does not have an IPX address.
- */
- if(tia == NULL)
- 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.ipx_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 = sizeof(dst);
- dst.sipx_addr.ipx_host = ipx_broadhost;
-
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list)
- 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.ipx_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.ipx_net = ia->ia_addr.sipx_addr.ipx_net;
- ipx->ipx_dna.ipx_net = dst.sipx_addr.ipx_net;
- m1 = m_copym(m, 0, M_COPYALL, M_DONTWAIT);
-
- if(ipx->ipx_sum != 0xffff)
- ipx->ipx_sum =
- ipx_cksum(m, ntohs(ipx->ipx_len));
- if(m1) {
- error = (*ifp->if_output)(ifp, m1,
- (struct sockaddr *)&dst, NULL);
- /* XXX ipxstat.ipxs_localout++; */
- }
-skip_this: ;
- }
-
-bad:
- m_freem(m);
- return (error);
-}
diff --git a/sys/netipx/ipx_pcb.c b/sys/netipx/ipx_pcb.c
deleted file mode 100644
index c6eef6355f2..00000000000
--- a/sys/netipx/ipx_pcb.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/* $OpenBSD: ipx_pcb.c,v 1.13 2006/05/18 21:27:25 miod Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_pcb.c
- *
- * from FreeBSD Id: ipx_pcb.c,v 1.5 1996/03/11 15:13:53 davidg Exp
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <net/if.h>
-#include <net/route.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#include <netipx/ipx_pcb.h>
-
-struct ipx_addr zeroipx_addr;
-
-#define IPXPCBHASH(table, faddr, fport, laddr, lport) \
- &(table)->ipxpt_hashtbl[(ntohl((faddr)->ipx_net.l_net) + \
- ntohs((fport)) + ntohs((lport))) & (table->ipxpt_hash)]
-
-void
-ipx_pcbinit(table, hashsize)
- struct ipxpcbtable *table;
- int hashsize;
-{
- CIRCLEQ_INIT(&table->ipxpt_queue);
- table->ipxpt_hashtbl =
- hashinit(hashsize, M_PCB, M_WAITOK, &table->ipxpt_hash);
- table->ipxpt_lport = 0;
-}
-
-int
-ipx_pcballoc(so, head)
- struct socket *so;
- struct ipxpcbtable *head;
-{
- struct ipxpcb *ipxp;
- int s;
-
- ipxp = malloc(sizeof(*ipxp), M_PCB, M_DONTWAIT);
- if (ipxp == NULL)
- return (ENOBUFS);
- bzero((caddr_t)ipxp, sizeof(*ipxp));
- ipxp->ipxp_socket = so;
- ipxp->ipxp_table = head;
- s = splnet();
- CIRCLEQ_INSERT_HEAD(&head->ipxpt_queue, ipxp, ipxp_queue);
- LIST_INSERT_HEAD(IPXPCBHASH(head, &ipxp->ipxp_faddr, ipxp->ipxp_fport,
- &ipxp->ipxp_laddr, ipxp->ipxp_lport), ipxp, ipxp_hash);
- splx(s);
- so->so_pcb = (caddr_t)ipxp;
- return (0);
-}
-
-int
-ipx_pcbbind(ipxp, nam)
- struct ipxpcb *ipxp;
- struct mbuf *nam;
-{
- struct sockaddr_ipx *sipx;
- u_short lport = 0;
-
- if (ipxp->ipxp_lport || !ipx_nullhost(ipxp->ipxp_laddr))
- return (EINVAL);
- if (nam == 0)
- goto noname;
- sipx = mtod(nam, struct sockaddr_ipx *);
- if (nam->m_len != sizeof(*sipx))
- return (EINVAL);
- if (!ipx_nullhost(sipx->sipx_addr)) {
- int tport = sipx->sipx_port;
-
- sipx->sipx_port = 0; /* yech... */
- if (ifa_ifwithaddr((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 &&
- (ipxp->ipxp_socket->so_state & SS_PRIV) == 0)
- return (EACCES);
- if (ipx_pcblookup(&zeroipx_addr, lport, 0))
- return (EADDRINUSE);
- }
- ipxp->ipxp_laddr = sipx->sipx_addr;
-noname:
- if (lport == 0)
- do {
- if ((ipxcbtable.ipxpt_lport++ < IPXPORT_RESERVED) ||
- (ipxcbtable.ipxpt_lport >= IPXPORT_WELLKNOWN))
- ipxcbtable.ipxpt_lport = IPXPORT_RESERVED;
- lport = htons(ipxcbtable.ipxpt_lport);
- } 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(ipxp, nam)
- struct ipxpcb *ipxp;
- struct mbuf *nam;
-{
- struct ipx_ifaddr *ia;
- struct sockaddr_ipx *sipx = mtod(nam, struct sockaddr_ipx *);
- struct ipx_addr *dst;
- struct route *ro;
- struct ifnet *ifp;
-
- if (nam->m_len != sizeof(*sipx))
- return (EINVAL);
- if (sipx->sipx_family != AF_IPX) {
-#ifdef DEBUG
- printf("ipx_connect: af=%x\n", sipx->sipx_family);
-#endif
- 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 && ! (ro->ro_rt->rt_flags & RTF_HOST)) {
- /* can patch route to avoid rtalloc */
- *dst = sipx->sipx_addr;
- } else {
- flush:
- if (ro->ro_rt)
- RTFREE(ro->ro_rt);
- ro->ro_rt = (struct rtentry *)0;
- ipxp->ipxp_laddr.ipx_net = ipx_zeronet;
- }
- }/* 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 == (struct rtentry *)0 ||
- ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
- /* 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->ipx_port = 0;
- rtalloc(ro);
- }
- if (ipx_neteqnn(ipxp->ipxp_laddr.ipx_net, ipx_zeronet)) {
- /*
- * If route is known or can be allocated now,
- * our src addr is taken from the i/f, else punt.
- */
-
- ia = (struct ipx_ifaddr *)0;
- /*
- * If we found a route, use the address
- * corresponding to the outgoing interface
- */
- if (ro->ro_rt && (ifp = ro->ro_rt->rt_ifp))
- TAILQ_FOREACH(ia, &ipx_ifaddr, ia_list)
- if (ia->ia_ifp == ifp)
- break;
- if (ia == NULL) {
- u_short fport = sipx->sipx_addr.ipx_port;
- sipx->sipx_addr.ipx_port = 0;
- ia = (struct ipx_ifaddr *)
- ifa_ifwithdstaddr((struct sockaddr *)sipx);
- sipx->sipx_addr.ipx_port = fport;
- if (ia == NULL)
- ia = ipx_iaonnetof(&sipx->sipx_addr);
- if (ia == NULL)
- ia = TAILQ_FIRST(&ipx_ifaddr);
- if (ia == 0)
- return (EADDRNOTAVAIL);
- }
- ipxp->ipxp_laddr.ipx_net = satoipx_addr(ia->ia_addr).ipx_net;
- }
- if (ipx_pcblookup(&sipx->sipx_addr, ipxp->ipxp_lport, 0))
- return (EADDRINUSE);
- if (ipxp->ipxp_lport == 0)
- (void) ipx_pcbbind(ipxp, (struct mbuf *)0);
-
- ipxp->ipxp_faddr = sipx->sipx_addr;
- /* Includes ipxp->ipxp_fport = sipx->sipx_port; */
- return (0);
-}
-
-void
-ipx_pcbdisconnect(ipxp)
- struct ipxpcb *ipxp;
-{
-
- ipxp->ipxp_faddr = zeroipx_addr;
- if (ipxp->ipxp_socket->so_state & SS_NOFDREF)
- ipx_pcbdetach(ipxp);
-}
-
-void
-ipx_pcbdetach(ipxp)
- struct ipxpcb *ipxp;
-{
- struct socket *so = ipxp->ipxp_socket;
- int s;
-
- so->so_pcb = 0;
- sofree(so);
- if (ipxp->ipxp_route.ro_rt)
- rtfree(ipxp->ipxp_route.ro_rt);
- s = splnet();
- LIST_REMOVE(ipxp, ipxp_hash);
- CIRCLEQ_REMOVE(&ipxp->ipxp_table->ipxpt_queue, ipxp, ipxp_queue);
- splx(s);
- FREE(ipxp, M_PCB);
-}
-
-void
-ipx_setsockaddr(ipxp, nam)
- struct ipxpcb *ipxp;
- struct mbuf *nam;
-{
- struct sockaddr_ipx *sipx = mtod(nam, struct sockaddr_ipx *);
-
- nam->m_len = sizeof(*sipx);
- sipx = mtod(nam, struct sockaddr_ipx *);
- bzero((caddr_t)sipx, sizeof(*sipx));
- sipx->sipx_len = sizeof(*sipx);
- sipx->sipx_family = AF_IPX;
- sipx->sipx_addr = ipxp->ipxp_laddr;
-}
-
-void
-ipx_setpeeraddr(ipxp, nam)
- struct ipxpcb *ipxp;
- struct mbuf *nam;
-{
- struct sockaddr_ipx *sipx = mtod(nam, struct sockaddr_ipx *);
-
- nam->m_len = sizeof(*sipx);
- sipx = mtod(nam, struct sockaddr_ipx *);
- bzero((caddr_t)sipx, sizeof(*sipx));
- sipx->sipx_len = sizeof(*sipx);
- sipx->sipx_family = AF_IPX;
- sipx->sipx_addr = ipxp->ipxp_faddr;
-}
-
-/*
- * Pass some notification to all connections of a protocol
- * associated with address dst. Call the
- * protocol specific routine to handle each connection.
- * Also pass an extra parameter via the ipxpcb. (which may in fact
- * be a parameter list!)
- */
-void
-ipx_pcbnotify(dst, errno, notify, param)
- struct ipx_addr *dst;
- int errno;
- void (*notify)(struct ipxpcb *);
- long param;
-{
- struct ipxpcb *ipxp, *oinp;
- int s = splnet();
-
- for (ipxp = CIRCLEQ_FIRST(&ipxcbtable.ipxpt_queue);
- ipxp != CIRCLEQ_END(&ipxcbtable.ipxpt_queue);) {
- if (!ipx_hosteq(*dst,ipxp->ipxp_faddr)) {
- next:
- ipxp = CIRCLEQ_NEXT(ipxp, ipxp_queue);
- continue;
- }
- if (ipxp->ipxp_socket == 0)
- goto next;
- if (errno)
- ipxp->ipxp_socket->so_error = errno;
- oinp = ipxp;
- ipxp = CIRCLEQ_NEXT(ipxp, ipxp_queue);
- oinp->ipxp_notify_param = param;
- (*notify)(oinp);
- }
- splx(s);
-}
-
-#ifdef notdef
-/*
- * After a routing change, flush old routing
- * and allocate a (hopefully) better one.
- */
-ipx_rtchange(ipxp)
- struct ipxpcb *ipxp;
-{
- if (ipxp->ipxp_route.ro_rt) {
- rtfree(ipxp->ipxp_route.ro_rt);
- ipxp->ipxp_route.ro_rt = 0;
- /*
- * A new route can be allocated the next time
- * output is attempted.
- */
- }
- /* SHOULD NOTIFY HIGHER-LEVEL PROTOCOLS */
-}
-#endif
-
-struct ipxpcb *
-ipx_pcblookup(faddr, lport, wildp)
- struct ipx_addr *faddr;
- u_short lport;
- int wildp;
-{
- struct ipxpcb *ipxp, *match = 0;
- int matchwild = 3, wildcard;
- u_short fport;
-
- fport = faddr->ipx_port;
- CIRCLEQ_FOREACH(ipxp, &ipxcbtable.ipxpt_queue, ipxp_queue) {
- 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);
-}
diff --git a/sys/netipx/ipx_pcb.h b/sys/netipx/ipx_pcb.h
deleted file mode 100644
index 46c9ce4984f..00000000000
--- a/sys/netipx/ipx_pcb.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* $OpenBSD: ipx_pcb.h,v 1.6 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_pcb.h
- *
- * from FreeBSD Id: ipx_pcb.h,v 1.5 1995/11/24 12:25:10 bde Exp
- */
-
-#ifndef _NETIPX_IPX_PCB_H_
-#define _NETIPX_IPX_PCB_H_
-
-/*
- * IPX protocol interface control block.
- */
-struct ipxpcb {
- LIST_ENTRY(ipxpcb) ipxp_hash;
- CIRCLEQ_ENTRY(ipxpcb) ipxp_queue;
- struct ipxpcbtable *ipxp_table; /* back pointer to the table */
- struct socket *ipxp_socket; /* back pointer to socket */
- struct ipx_addr ipxp_faddr; /* destination address */
- struct ipx_addr ipxp_laddr; /* socket's address */
-#define ipxp_lport ipxp_laddr.ipx_port
-#define ipxp_fport ipxp_faddr.ipx_port
- caddr_t ipxp_ppcb; /* protocol specific stuff */
- struct route ipxp_route; /* routing information */
- struct ipx_addr ipxp_lastdst; /* validate cached route for dg socks*/
- u_long ipxp_notify_param; /* extra info passed via ipx_pcbnotify*/
- u_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 ipxpcbtable {
- CIRCLEQ_HEAD(, ipxpcb) ipxpt_queue;
- LIST_HEAD(ipxppcbhead, ipxpcb) *ipxpt_hashtbl;
- u_long ipxpt_hash;
- u_int16_t ipxpt_lport;
-};
-
-/* possible 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 IPX_WILDCARD 1
-
-#define sotoipxpcb(so) ((struct ipxpcb *)((so)->so_pcb))
-
-/*
- * Nominal space allocated to a IPX socket.
- */
-#define IPXSNDQ 16384
-#define IPXRCVQ 40960
-
-#ifdef _KERNEL
-extern struct ipxpcbtable ipxcbtable, ipxrawcbtable; /* head of list */
-
-void ipx_pcbinit(struct ipxpcbtable *, int);
-int ipx_pcballoc(struct socket *so, struct ipxpcbtable *head);
-int ipx_pcbbind(struct ipxpcb *ipxp, struct mbuf *nam);
-int ipx_pcbconnect(struct ipxpcb *ipxp, struct mbuf *nam);
-void ipx_pcbdetach(struct ipxpcb *ipxp);
-void ipx_pcbdisconnect(struct ipxpcb *ipxp);
-struct ipxpcb *ipx_pcblookup(struct ipx_addr *faddr, int lport, int wildp);
-void ipx_pcbnotify(struct ipx_addr *dst, int errno,
- void (*notify)(struct ipxpcb *), long param);
-void ipx_setpeeraddr(struct ipxpcb *ipxp, struct mbuf *nam);
-void ipx_setsockaddr(struct ipxpcb *ipxp, struct mbuf *nam);
-#endif
-
-#endif /* !_NETIPX_IPX_PCB_H_ */
diff --git a/sys/netipx/ipx_proto.c b/sys/netipx/ipx_proto.c
deleted file mode 100644
index 97d2af16ff0..00000000000
--- a/sys/netipx/ipx_proto.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* $OpenBSD: ipx_proto.c,v 1.6 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_proto.c
- *
- * from FreeBSD Id: ipx_proto.c,v 1.4 1996/01/05 20:47:05 wollman Exp
- */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/protosw.h>
-#include <sys/domain.h>
-#include <sys/kernel.h>
-#include <sys/mbuf.h>
-
-#include <net/radix.h>
-
-#include <netipx/ipx.h>
-#include <netipx/spx.h>
-
-/*
- * IPX protocol family: IPX, ERR, PXP, SPX, ROUTE.
- */
-
-struct protosw ipxsw[] = {
-{ 0, &ipxdomain, 0, 0,
- 0, ipx_output, 0, 0,
- 0,
- ipx_init, 0, 0, 0, ipx_sysctl
-},
-{ SOCK_DGRAM, &ipxdomain, 0, PR_ATOMIC|PR_ADDR,
- 0, 0, ipx_ctlinput, ipx_ctloutput,
- ipx_usrreq,
- 0, 0, 0, 0, ipx_sysctl
-},
-{ SOCK_STREAM, &ipxdomain, IPXPROTO_SPX, PR_CONNREQUIRED|PR_WANTRCVD|PR_ABRTACPTDIS,
- spx_input, 0, spx_ctlinput, spx_ctloutput,
- spx_usrreq,
- spx_init, spx_fasttimo, spx_slowtimo, 0, spx_sysctl
-},
-{ SOCK_SEQPACKET,&ipxdomain, IPXPROTO_SPX, PR_CONNREQUIRED|PR_WANTRCVD|PR_ATOMIC|PR_ABRTACPTDIS,
- spx_input, 0, spx_ctlinput, spx_ctloutput,
- spx_usrreq_sp,
- 0, 0, 0, 0, spx_sysctl
-},
-{ SOCK_RAW, &ipxdomain, IPXPROTO_RAW, PR_ATOMIC|PR_ADDR,
- ipx_input, ipx_output, 0, ipx_ctloutput,
- ipx_raw_usrreq,
- 0, 0, 0, 0, ipx_sysctl
-},
-#ifdef IPTUNNEL
-{ SOCK_RAW, &ipxdomain, IPPROTO_IPX, PR_ATOMIC|PR_ADDR,
- iptun_input, rip_output, iptun_ctlinput, 0,
- rip_usrreq,
- 0, 0, 0, 0, ipx_sysctl,
-},
-#endif
-};
-
-struct domain ipxdomain =
- { AF_IPX, "Internetwork Packet Exchange", 0, 0, 0,
- ipxsw, &ipxsw[sizeof(ipxsw)/sizeof(ipxsw[0])], 0,
- rn_inithead, 16, sizeof(struct sockaddr_ipx)};
-
diff --git a/sys/netipx/ipx_tun.c b/sys/netipx/ipx_tun.c
deleted file mode 100644
index fac32574a4d..00000000000
--- a/sys/netipx/ipx_tun.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $OpenBSD: ipx_tun.c,v 1.3 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Modifications Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_tun.c
- *
- * from FreeBSD Id: ipx_tun.c,v 1.4 1996/03/11 15:13:55 davidg Exp
- */
-
-/*
- * Software interface driver for encapsulating IP in IPX.
- */
-
-#ifdef IPTUNNEL
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/errno.h>
-#include <sys/ioctl.h>
-#include <sys/protosw.h>
-
-#include <net/if.h>
-#include <net/netisr.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/in_var.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-
-#include <machine/mtpr.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-
-#endif
diff --git a/sys/netipx/ipx_usrreq.c b/sys/netipx/ipx_usrreq.c
deleted file mode 100644
index 1bfce2dc3d3..00000000000
--- a/sys/netipx/ipx_usrreq.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/* $OpenBSD: ipx_usrreq.c,v 1.15 2006/03/05 21:48:57 miod Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_usrreq.c
- *
- * from FreeBSD Id: ipx_usrreq.c,v 1.5 1996/03/11 15:13:57 davidg Exp
- */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/errno.h>
-#include <sys/stat.h>
-#include <sys/proc.h>
-#include <uvm/uvm_extern.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_pcb.h>
-#include <netipx/ipx_if.h>
-#include <netipx/ipx_var.h>
-#include <netipx/ipx_ip.h>
-
-#include <sys/stdarg.h>
-
-/*
- * IPX protocol implementation.
- */
-
-int noipxRoute;
-
-int ipx_sendspace = IPXSNDQ;
-int ipx_recvspace = IPXRCVQ;
-
-/*
- * 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;
- va_list ap;
-
- va_start(ap, m);
- ipxp = va_arg(ap, struct ipxpcb *);
- va_end(ap);
-
- if (ipxp == NULL)
- panic("No ipxpcb");
- /*
- * Construct sockaddr format source address.
- * Stuff source address and datagram in user buffer.
- */
- bzero(&ipx_ipx, sizeof(ipx_ipx));
- ipx_ipx.sipx_len = sizeof(ipx_ipx);
- ipx_ipx.sipx_family = AF_IPX;
- ipx_ipx.sipx_addr = ipx->ipx_sna;
- if (ipx_neteqnn(ipx->ipx_sna.ipx_net, ipx_zeronet) && ifp) {
- struct ifaddr *ifa;
-
- TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
- if (ifa->ifa_addr->sa_family == AF_IPX) {
- ipx_ipx.sipx_addr.ipx_net =
- IA_SIPX(ifa)->sipx_addr.ipx_net;
- break;
- }
- }
- }
- ipxp->ipxp_rpt = ipx->ipx_pt;
- if ( ! (ipxp->ipxp_flags & IPXP_RAWIN) ) {
- m->m_len -= sizeof(struct ipx);
- m->m_pkthdr.len -= sizeof(struct ipx);
- m->m_data += sizeof(struct ipx);
- }
- if (sbappendaddr(&ipxp->ipxp_socket->so_rcv, sipxtosa(&ipx_ipx), m,
- (struct mbuf *)0) == 0)
- goto bad;
- sorwakeup(ipxp->ipxp_socket);
- return;
-bad:
- m_freem(m);
-}
-
-void
-ipx_abort(ipxp)
- struct ipxpcb *ipxp;
-{
- struct socket *so = ipxp->ipxp_socket;
-
- ipx_pcbdisconnect(ipxp);
- soisdisconnected(so);
-}
-/*
- * Drop connection, reporting
- * the specified error.
- */
-/* struct ipxpcb * DELETE THIS */
-void
-ipx_drop(ipxp, errno)
- struct ipxpcb *ipxp;
- int errno;
-{
- struct socket *so = ipxp->ipxp_socket;
-
- /*
- * someday, in the xerox world
- * we will generate error protocol packets
- * announcing that the socket has gone away.
- */
- /*if (TCPS_HAVERCVDSYN(tp->t_state)) {
- tp->t_state = TCPS_CLOSED;
- (void) tcp_output(tp);
- }*/
- so->so_error = errno;
- ipx_pcbdisconnect(ipxp);
- soisdisconnected(so);
-}
-
-int
-ipx_output(struct mbuf *m0, ...)
-{
- struct mbuf *m;
- struct ipx *ipx;
- struct ipxpcb *ipxp;
- struct socket *so;
- int len = 0;
- struct route *ro;
- struct mbuf *mprev = NULL;
- va_list ap;
-
- va_start(ap, m0);
- ipxp = va_arg(ap, struct ipxpcb *);
- va_end(ap);
-
- /*
- * Calculate data length.
- */
- for (m = m0; m; 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])) {
- m->m_len++;
- } else {
- struct mbuf *m1 = m_get(M_DONTWAIT, MT_DATA);
-
- if (m1 == 0) {
- 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_DONTWAIT);
- if (m == 0)
- 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 (ipxcksum) {
- ipx->ipx_sum = 0;
- len = ((len - 1) | 1) + 1;
- 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 *)0,
- (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;
- if (noipxRoute)
- ro = 0;
- return (ipx_outputfl(m, ro, so->so_options & SO_BROADCAST));
-}
-
-/* ARGSUSED */
-int
-ipx_ctloutput(req, so, level, name, value)
- int req, level;
- struct socket *so;
- int name;
- struct mbuf **value;
-{
- struct mbuf *m;
- struct ipxpcb *ipxp = sotoipxpcb(so);
- int mask, error = 0;
- /*extern long ipx_pexseq;*/ /*XXX*//*JRE*/
-
- if (ipxp == NULL)
- return (EINVAL);
-
- switch (req) {
-
- case PRCO_GETOPT:
- if (value==NULL)
- return (EINVAL);
- m = m_get(M_DONTWAIT, MT_DATA);
- if (m==NULL)
- return (ENOBUFS);
- switch (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_HEADERS_ON_OUTPUT:
- mask = IPXP_RAWOUT;
- get_flags:
- m->m_len = sizeof(short);
- *mtod(m, short *) = ipxp->ipxp_flags & mask;
- break;
-
- case SO_DEFAULT_HEADERS:
- m->m_len = sizeof(struct ipx);
- {
- struct ipx *ipx = mtod(m, struct ipx *);
- ipx->ipx_len = 0;
- ipx->ipx_sum = 0;
- ipx->ipx_tc = 0;
- ipx->ipx_pt = ipxp->ipxp_dpt;
- ipx->ipx_dna = ipxp->ipxp_faddr;
- ipx->ipx_sna = ipxp->ipxp_laddr;
- }
- break;
-
- case SO_SEQNO:
- m->m_len = sizeof(long);
- *mtod(m, long *) = ipx_pexseq++;
- break;
-
- default:
- error = EINVAL;
- }
- *value = m;
- break;
-
- case PRCO_SETOPT:
- switch (name) {
- int *ok;
-
- case SO_ALL_PACKETS:
- mask = IPXP_ALL_PACKETS;
- goto set_head;
-
- case SO_HEADERS_ON_INPUT:
- mask = IPXP_RAWIN;
- goto set_head;
-
- case SO_HEADERS_ON_OUTPUT:
- mask = IPXP_RAWOUT;
- set_head:
- if (value && *value) {
- ok = mtod(*value, int *);
- if (*ok)
- ipxp->ipxp_flags |= mask;
- else
- ipxp->ipxp_flags &= ~mask;
- } else error = EINVAL;
- break;
-
- case SO_DEFAULT_HEADERS:
- {
- struct ipx *ipx
- = mtod(*value, struct ipx *);
- ipxp->ipxp_dpt = ipx->ipx_pt;
- }
- break;
-#ifdef IPXIP
- case SO_IPXIP_ROUTE:
- error = ipxip_route(*value);
- break;
-#endif /* IPXIP */
-#ifdef IPXTUNNEL
- case SO_IPXTUNNEL_ROUTE:
- error = ipxtun_route(*value);
- break;
-#endif
- default:
- error = EINVAL;
- }
- if (value && *value)
- m_freem(*value);
- break;
- }
- return (error);
-}
-
-/*ARGSUSED*/
-int
-ipx_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
-{
- struct ipxpcb *ipxp = sotoipxpcb(so);
- int error = 0;
-
- if (req == PRU_CONTROL)
- return (ipx_control(so, (long)m, (caddr_t)nam,
- (struct ifnet *)control));
- if (control && control->m_len) {
- error = EINVAL;
- goto release;
- }
- if (ipxp == NULL && req != PRU_ATTACH) {
- error = EINVAL;
- goto release;
- }
- switch (req) {
-
- case PRU_ATTACH:
- if (ipxp != NULL) {
- error = EINVAL;
- break;
- }
- error = ipx_pcballoc(so, &ipxcbtable);
- if (error)
- break;
- error = soreserve(so, ipx_sendspace, ipx_recvspace);
- if (error)
- break;
- break;
-
- case PRU_DETACH:
- if (ipxp == NULL) {
- error = ENOTCONN;
- break;
- }
- ipx_pcbdetach(ipxp);
- break;
-
- case PRU_BIND:
- error = ipx_pcbbind(ipxp, nam);
- break;
-
- case PRU_LISTEN:
- error = EOPNOTSUPP;
- break;
-
- case PRU_CONNECT:
- if (!ipx_nullhost(ipxp->ipxp_faddr)) {
- error = EISCONN;
- break;
- }
- error = ipx_pcbconnect(ipxp, nam);
- if (error == 0)
- soisconnected(so);
- break;
-
- case PRU_CONNECT2:
- error = EOPNOTSUPP;
- break;
-
- case PRU_ACCEPT:
- error = EOPNOTSUPP;
- break;
-
- case PRU_DISCONNECT:
- if (ipx_nullhost(ipxp->ipxp_faddr)) {
- error = ENOTCONN;
- break;
- }
- ipx_pcbdisconnect(ipxp);
- soisdisconnected(so);
- break;
-
- case PRU_SHUTDOWN:
- socantsendmore(so);
- break;
-
- case PRU_SEND:
- {
- struct ipx_addr laddr;
- int s = 0;
-
- if (nam) {
- laddr = ipxp->ipxp_laddr;
- if (!ipx_nullhost(ipxp->ipxp_faddr)) {
- error = EISCONN;
- break;
- }
- /*
- * Must block input while temporarily connected.
- */
- s = splnet();
- error = ipx_pcbconnect(ipxp, nam);
- if (error) {
- splx(s);
- break;
- }
- } else {
- if (ipx_nullhost(ipxp->ipxp_faddr)) {
- error = ENOTCONN;
- break;
- }
- }
- error = ipx_output(m, ipxp);
- m = NULL;
- if (nam) {
- ipx_pcbdisconnect(ipxp);
- splx(s);
- ipxp->ipxp_laddr.ipx_host = laddr.ipx_host;
- ipxp->ipxp_laddr.ipx_port = laddr.ipx_port;
- }
- }
- break;
-
- case PRU_ABORT:
- ipx_pcbdetach(ipxp);
- sofree(so);
- soisdisconnected(so);
- break;
-
- case PRU_SOCKADDR:
- ipx_setsockaddr(ipxp, nam);
- break;
-
- case PRU_PEERADDR:
- ipx_setpeeraddr(ipxp, nam);
- break;
-
- case PRU_SENSE:
- /*
- * stat: don't bother with a blocksize.
- */
- return (0);
-
- case PRU_SENDOOB:
- case PRU_FASTTIMO:
- case PRU_SLOWTIMO:
- case PRU_PROTORCV:
- case PRU_PROTOSEND:
- error = EOPNOTSUPP;
- break;
-
- case PRU_CONTROL:
- case PRU_RCVD:
- case PRU_RCVOOB:
- return (EOPNOTSUPP); /* do not free mbuf's */
-
- default:
- panic("ipx_usrreq");
- }
-release:
- if (control != NULL)
- m_freem(control);
- if (m != NULL)
- m_freem(m);
- return (error);
-}
-
-/*ARGSUSED*/
-int
-ipx_raw_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
-{
- int error = 0;
- struct ipxpcb *ipxp = sotoipxpcb(so);
- /*extern struct ipxpcb ipxrawpcb;*//*XXX*//*JRE*/
-
- switch (req) {
-
- case PRU_ATTACH:
-
- if (!(so->so_state & SS_PRIV) || (ipxp != NULL)) {
- error = EINVAL;
- break;
- }
- error = ipx_pcballoc(so, &ipxrawcbtable);
- if (error)
- break;
- error = soreserve(so, ipx_sendspace, ipx_recvspace);
- if (error)
- break;
- ipxp = sotoipxpcb(so);
- ipxp->ipxp_faddr.ipx_host = ipx_broadhost;
- ipxp->ipxp_flags = IPXP_RAWIN | IPXP_RAWOUT;
- break;
- default:
- error = ipx_usrreq(so, req, m, nam, control);
- }
- return (error);
-}
-
-int
-ipx_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
- int *name;
- u_int namelen;
- void *oldp;
- size_t *oldlenp;
- void *newp;
- size_t newlen;
-{
- /* All sysctl names at this level are terminal. */
- if (namelen != 1)
- return (ENOTDIR);
-
- switch (name[0]) {
- case IPXCTL_CHECKSUM:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ipxcksum));
- case IPXCTL_FORWARDING:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ipxforwarding));
- case IPXCTL_NETBIOS:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ipxnetbios));
- case IPXCTL_RECVSPACE:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ipx_recvspace));
- case IPXCTL_SENDSPACE:
- return (sysctl_int(oldp, oldlenp, newp, newlen,
- &ipx_sendspace));
- default:
- return (ENOPROTOOPT);
- }
- /* NOTREACHED */
-}
diff --git a/sys/netipx/ipx_var.h b/sys/netipx/ipx_var.h
deleted file mode 100644
index 50dea808076..00000000000
--- a/sys/netipx/ipx_var.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* $OpenBSD: ipx_var.h,v 1.6 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ipx_var.h
- *
- * from FreeBSD Id: ipx_var.h,v 1.3 1995/11/04 09:03:27 julian Exp
- */
-
-#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 */
-};
-
-/*
- * Names for IPX sysctl objects.
- */
-
-#define IPXCTL_CHECKSUM 1
-#define IPXCTL_FORWARDING 2
-#define IPXCTL_NETBIOS 3
-#define IPXCTL_RECVSPACE 4
-#define IPXCTL_SENDSPACE 5
-#define IPXCTL_MAXID 6
-
-#define IPXCTL_NAMES { \
- { 0, 0}, \
- { "checksum", CTLTYPE_INT }, \
- { "forwarding", CTLTYPE_INT }, \
- { "netbios", CTLTYPE_INT }, \
- { "recvspace", CTLTYPE_INT }, \
- { "sendspace", CTLTYPE_INT }, \
-}
-
-#ifdef _KERNEL
-extern struct ipxstat ipxstat;
-#endif
-
-#endif
diff --git a/sys/netipx/spx.h b/sys/netipx/spx.h
deleted file mode 100644
index 729920184a4..00000000000
--- a/sys/netipx/spx.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/* $OpenBSD: spx.h,v 1.8 2003/10/26 17:01:11 avsm Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)spx.h
- *
- * from FreeBSD Id: spx.h,v 1.7 1996/01/30 22:58:51 mpp Exp
- */
-
-#ifndef _NETIPX_SPX_H_
-#define _NETIPX_SPX_H_
-
-#include <sys/queue.h>
-
-/*
- * Definitions for IPX style Sequenced Packet Protocol
- */
-
-struct spxhdr {
- u_int8_t spx_cc __packed; /* connection control */
- u_int8_t spx_dt __packed; /* 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_int16_t spx_sid __packed; /* source connection identifier */
- u_int16_t spx_did __packed; /* destination connection identifier */
- u_int16_t spx_seq __packed; /* sequence number */
- u_int16_t spx_ack __packed; /* acknowledge number */
- u_int16_t spx_alo __packed; /* allocation number */
-};
-
-/*
- * Definitions for NS(tm) Internet Datagram Protocol
- * containing a Sequenced Packet Protocol packet.
- */
-struct spx {
- struct ipx si_i __packed;
- struct spxhdr si_s __packed;
-};
-
-#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.ipx_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
-
-struct spx_q {
- TAILQ_ENTRY(spx_q) list;
- struct mbuf *m;
-};
-
-/*
- * SPX control block, one per connection
- */
-struct spxpcb {
- TAILQ_HEAD(, spx_q) spxp_queue;
- struct ipxpcb *s_ipxpcb; /* backpointer to ipx 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.ipx_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_ppcb)
-#define sotospxpcb(so) (ipxtospxpcb(sotoipxpcb(so)))
-
-#ifdef _KERNEL
-
-void spx_abort(struct ipxpcb *ipxp);
-struct spxpcb *spx_close(struct spxpcb *cb);
-void *spx_ctlinput(int cmd, struct sockaddr *arg_as_sa, void *dummy);
-int spx_ctloutput(int req, struct socket *so, int level, int name,
- struct mbuf **value);
-struct spxpcb *spx_disconnect(struct spxpcb *cb);
-struct spxpcb *spx_drop(struct spxpcb *cb, int errno);
-void spx_fasttimo(void);
-void spx_init(void);
-void spx_input(struct mbuf *m, ...);
-int spx_output(struct spxpcb *cb, struct mbuf *m0);
-void spx_quench(struct ipxpcb *ipxp);
-int spx_reass(struct spxpcb *cb, struct mbuf *m0);
-void spx_setpersist(struct spxpcb *cb);
-void spx_slowtimo(void);
-void spx_template(struct spxpcb *cb);
-struct spxpcb *spx_timers(struct spxpcb *cb, int timer);
-struct spxpcb *spx_usrclosed(struct spxpcb *cb);
-int spx_usrreq(struct socket *so, int req, struct mbuf *m,
- struct mbuf *nam, struct mbuf *controlp);
-int spx_usrreq_sp(struct socket *so, int req, struct mbuf *m,
- struct mbuf *nam, struct mbuf *controlp);
-int spx_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-
-#endif /* _KERNEL */
-
-#endif /* !_NETIPX_SPX_H_ */
diff --git a/sys/netipx/spx_debug.c b/sys/netipx/spx_debug.c
deleted file mode 100644
index e8a7374fb9b..00000000000
--- a/sys/netipx/spx_debug.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* $OpenBSD: spx_debug.c,v 1.7 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)spx_debug.c
- *
- * from FreeBSD Id: spx_debug.c,v 1.5 1996/03/11 15:13:58 davidg Exp
- */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/systm.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#define PRUREQUESTS
-#include <sys/protosw.h>
-#include <sys/errno.h>
-
-#include <net/route.h>
-#include <net/if.h>
-#include <netinet/in_systm.h>
-#define TCPSTATES
-#include <netinet/tcp_fsm.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_pcb.h>
-#include <netipx/ipx.h>
-#include <netipx/ipx_var.h>
-#include <netipx/spx.h>
-#define SPXTIMERS
-#include <netipx/spx_timer.h>
-#include <netipx/spx_var.h>
-#define SANAMES
-#include <netipx/spx_debug.h>
-
-int spxconsdebug = 0;
-
-/*
- * spx debug routines
- */
-void
-spx_trace(act, ostate, sp, si, req)
- short act;
- u_char ostate;
- struct spxpcb *sp;
- struct spx *si;
- int req;
-{
-#ifdef SPXDEBUG
- 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)
- sd->sd_sp = *sp;
- else
- bzero((caddr_t)&sd->sd_sp, sizeof(*sp));
- if (si)
- 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)
- printf("%x %s:", 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 == 0)
- 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
-}
diff --git a/sys/netipx/spx_debug.h b/sys/netipx/spx_debug.h
deleted file mode 100644
index e038cd57c8e..00000000000
--- a/sys/netipx/spx_debug.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* $OpenBSD: spx_debug.h,v 1.5 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)spx_debug.h
- *
- * from FreeBSD Id: spx_debug.h,v 1.5 1995/11/24 12:25:13 bde Exp
- */
-
-#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
-char *spxnames[] =
- { "input", "output", "user", "respond", "drop" };
-#endif
-
-#define SPX_NDEBUG 100
-struct spx_debug spx_debug[SPX_NDEBUG];
-int spx_debx;
-
-#ifdef _KERNEL
-extern char *prurequests[];
-extern char *sanames[];
-
-void spx_trace(int act, int ostate, struct spxpcb *sp, struct spx *si,
- int req);
-#endif
-
-#endif /* !_NETIPX_SPX_DEBUG_H_ */
diff --git a/sys/netipx/spx_timer.h b/sys/netipx/spx_timer.h
deleted file mode 100644
index 8ade6513ef3..00000000000
--- a/sys/netipx/spx_timer.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $OpenBSD: spx_timer.h,v 1.3 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)spx_timer.h
- *
- * from FreeBSD Id: spx_timer.h,v 1.5 1996/01/30 22:58:53 mpp Exp
- */
-
-#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); \
-}
-
-#ifdef _KERNEL
-extern int spx_backoff[];
-#endif
-
-#endif
diff --git a/sys/netipx/spx_usrreq.c b/sys/netipx/spx_usrreq.c
deleted file mode 100644
index ecf413a73e6..00000000000
--- a/sys/netipx/spx_usrreq.c
+++ /dev/null
@@ -1,1815 +0,0 @@
-/* $OpenBSD: spx_usrreq.c,v 1.25 2006/03/05 21:48:57 miod Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)spx_usrreq.h
- *
- * from FreeBSD Id: spx_usrreq.c,v 1.7 1995/12/16 02:14:35 bde Exp
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.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_timer.h>
-#include <netipx/spx_var.h>
-#include <netipx/spx_debug.h>
-
-#include <sys/stdarg.h>
-
-/*
- * SPX protocol implementation.
- */
-
-struct spx spx_savesi;
-int traceallspxs = 0;
-extern int spxconsdebug;
-int spx_hardnosed;
-int spx_use_delack = 0;
-u_short spx_newchecks[50];
-
-struct spx_istat spx_istat;
-u_short spx_iss;
-
-#ifndef SPXCBHASHSIZE
-#define SPXCBHASHSIZE 32
-#endif
-struct ipxpcbtable ipxcbtable;
-int ipxcbhashsize = SPXCBHASHSIZE;
-
-void
-spx_init()
-{
- ipx_pcbinit(&ipxcbtable, ipxcbhashsize);
- spx_iss = 1; /* WRONG !! should fish it out of TODR */
-}
-
-/* ARGSUSED */
-void
-spx_input(struct mbuf *m, ...)
-{
- struct ipxpcb *ipxpcbp;
- struct spxpcb *cb;
- struct spx *si = mtod(m, struct spx *);
- struct socket *so;
- int dropsocket = 0;
- short ostate = 0;
- va_list ap;
-
- va_start(ap, m);
- ipxpcbp = va_arg(ap, struct ipxpcb *);
- va_end(ap);
-
- spxstat.spxs_rcvtotal++;
- if (ipxpcbp == NULL)
- panic("spx_input: no ipxpcb");
-
- cb = ipxtospxpcb(ipxpcbp);
- if (cb == 0) goto bad;
-
- if (m->m_len < sizeof(*si)) {
- if ((m = m_pullup(m, sizeof(*si))) == 0) {
- spxstat.spxs_rcvshort++;
- return;
- }
- si = mtod(m, struct spx *);
- }
- si->si_seq = ntohs(si->si_seq);
- si->si_ack = ntohs(si->si_ack);
- si->si_alo = ntohs(si->si_alo);
-
- so = ipxpcbp->ipxp_socket;
-
- if (so->so_options & SO_DEBUG || traceallspxs) {
- ostate = cb->s_state;
- spx_savesi = *si;
- }
- if (so->so_options & SO_ACCEPTCONN) {
- struct spxpcb *ocb = cb;
-
- so = sonewconn(so, 0);
- if (so == 0) {
- goto drop;
- }
- /*
- * This is ugly, but ....
- *
- * Mark socket as temporary until we're
- * committed to keeping it. The code at
- * ``drop'' and ``dropwithreset'' check the
- * flag dropsocket to see if the temporary
- * socket created here should be discarded.
- * We mark the socket as discardable until
- * we're committed to it below in TCPS_LISTEN.
- */
- dropsocket++;
- ipxpcbp = (struct ipxpcb *)so->so_pcb;
- ipxpcbp->ipxp_laddr = si->si_dna;
- cb = ipxtospxpcb(ipxpcbp);
- cb->s_mtu = ocb->s_mtu; /* preserve sockopts */
- cb->s_flags = ocb->s_flags; /* preserve sockopts */
- cb->s_flags2 = ocb->s_flags2; /* preserve sockopts */
- cb->s_state = TCPS_LISTEN;
- }
-
- /*
- * Packet received on connection.
- * reset idle time and keep-alive timer;
- */
- cb->s_idle = 0;
- cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
-
- switch (cb->s_state) {
-
- case TCPS_LISTEN:{
- struct mbuf *am;
- struct sockaddr_ipx *sipx;
- struct ipx_addr laddr;
-
- /*
- * If somebody here was carying on a conversation
- * and went away, and his pen pal thinks he can
- * still talk, we get the misdirected packet.
- */
- if (spx_hardnosed && (si->si_did != 0 || si->si_seq != 0)) {
- spx_istat.gonawy++;
- goto dropwithreset;
- }
- am = m_get(M_DONTWAIT, MT_SONAME);
- if (am == NULL)
- goto drop;
- am->m_len = sizeof(struct sockaddr_ipx);
- sipx = mtod(am, struct sockaddr_ipx *);
- sipx->sipx_len = sizeof(*sipx);
- sipx->sipx_family = AF_IPX;
- sipx->sipx_addr = si->si_sna;
- laddr = ipxpcbp->ipxp_laddr;
- if (ipx_nullhost(laddr))
- ipxpcbp->ipxp_laddr = si->si_dna;
- if (ipx_pcbconnect(ipxpcbp, am)) {
- ipxpcbp->ipxp_laddr = laddr;
- (void) m_free(am);
- spx_istat.noconn++;
- goto drop;
- }
- (void) m_free(am);
- spx_template(cb);
- dropsocket = 0; /* committed to socket */
- cb->s_did = si->si_sid;
- cb->s_rack = si->si_ack;
- cb->s_ralo = si->si_alo;
-#define THREEWAYSHAKE
-#ifdef THREEWAYSHAKE
- cb->s_state = TCPS_SYN_RECEIVED;
- cb->s_force = 1 + SPXT_KEEP;
- spxstat.spxs_accepts++;
- cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
- }
- break;
- /*
- * This state means that we have heard a response
- * to our acceptance of their connection
- * It is probably logically unnecessary in this
- * implementation.
- */
- case TCPS_SYN_RECEIVED: {
- if (si->si_did!=cb->s_sid) {
- spx_istat.wrncon++;
- goto drop;
- }
-#endif
- ipxpcbp->ipxp_fport = si->si_sport;
- cb->s_timer[SPXT_REXMT] = 0;
- cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
- soisconnected(so);
- cb->s_state = TCPS_ESTABLISHED;
- spxstat.spxs_accepts++;
- }
- break;
-
- /*
- * This state means that we have gotten a response
- * to our attempt to establish a connection.
- * We fill in the data from the other side,
- * telling us which port to respond to, instead of the well-
- * known one we might have sent to in the first place.
- * We also require that this is a response to our
- * connection id.
- */
- case TCPS_SYN_SENT:
- if (si->si_did!=cb->s_sid) {
- spx_istat.notme++;
- goto drop;
- }
- spxstat.spxs_connects++;
- cb->s_did = si->si_sid;
- cb->s_rack = si->si_ack;
- cb->s_ralo = si->si_alo;
- cb->s_dport = ipxpcbp->ipxp_fport = si->si_sport;
- cb->s_timer[SPXT_REXMT] = 0;
- cb->s_flags |= SF_ACKNOW;
- soisconnected(so);
- cb->s_state = TCPS_ESTABLISHED;
- /* Use roundtrip time of connection request for initial rtt */
- if (cb->s_rtt) {
- cb->s_srtt = cb->s_rtt << 3;
- cb->s_rttvar = cb->s_rtt << 1;
- SPXT_RANGESET(cb->s_rxtcur,
- ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1,
- SPXTV_MIN, SPXTV_REXMTMAX);
- cb->s_rtt = 0;
- }
- }
- if (so->so_options & SO_DEBUG || traceallspxs)
- spx_trace(SA_INPUT, (u_char)ostate, cb, &spx_savesi, 0);
-
- m->m_len -= sizeof(struct ipx);
- m->m_pkthdr.len -= sizeof(struct ipx);
- m->m_data += sizeof(struct ipx);
-
- if (spx_reass(cb, m))
- m_freem(m);
-
- if (cb->s_force || (cb->s_flags & (SF_ACKNOW|SF_WIN|SF_RXT)))
- (void) spx_output(cb, (struct mbuf *)0);
- cb->s_flags &= ~(SF_WIN|SF_RXT);
- return;
-
-dropwithreset:
- if (dropsocket)
- (void) soabort(so);
- si->si_seq = ntohs(si->si_seq);
- si->si_ack = ntohs(si->si_ack);
- si->si_alo = ntohs(si->si_alo);
- m_freem(m);
- if (cb->s_ipxpcb->ipxp_socket->so_options & SO_DEBUG || traceallspxs)
- spx_trace(SA_DROP, (u_char)ostate, cb, &spx_savesi, 0);
- return;
-
-drop:
-bad:
- if (cb == 0 || cb->s_ipxpcb->ipxp_socket->so_options & SO_DEBUG ||
- traceallspxs)
- spx_trace(SA_DROP, (u_char)ostate, cb, &spx_savesi, 0);
- m_freem(m);
-}
-
-int spxrexmtthresh = 3;
-
-/*
- * 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(cb, m0)
- struct spxpcb *cb;
- struct mbuf *m0;
-{
- struct spx_q *q;
- struct mbuf *m;
- struct spx *si = mtod(m0, struct spx *);
- struct socket *so = cb->s_ipxpcb->ipxp_socket;
- char packetp = cb->s_flags & SF_HI;
- int incr;
- char wakeup = 0;
-
- if (si == NULL)
- 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;
- (void) spx_output(cb, (struct mbuf *)0);
- 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.
- */
- while ((m = so->so_snd.sb_mb) != NULL) {
- if (SSEQ_LT((mtod(m, struct spx *))->si_seq, si->si_ack))
- sbdroprecord(&so->so_snd);
- else
- break;
- }
- sowwakeup(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)) {
- m_freem(m0);
- return (0);
- } /* else queue this packet; */
- } else {
- /*register struct socket *so = cb->s_ipxpcb->ipxp_socket;
- if (so->so_state & SS_NOFDREF) {
- m_freem(m0);
- (void)spx_close(cb);
- } else
- would crash system*/
- spx_istat.notyet++;
- m_freem(m0);
- return (0);
- }
- }
- /*
- * 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.
- */
- TAILQ_FOREACH(q, &cb->spxp_queue, list) {
- if (si->si_seq == SI(q)->si_seq) {
- spxstat.spxs_rcvduppack++;
- return (1);
- }
- if (SSEQ_LT(si->si_seq, SI(q)->si_seq)) {
- spxstat.spxs_rcvoopack++;
- break;
- }
- }
-
- /* XXX what if q == NULL ??? */
- {
- struct spx_q *p;
- if ((p = malloc(sizeof(*p),M_DEVBUF,M_NOWAIT)) != NULL)
- {
- p->m = m0;
- TAILQ_INSERT_AFTER(&cb->spxp_queue, q, p, list);
- } else
- return 1;
- }
-
- /*
- * 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)
- /*
- * 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.
- */
- TAILQ_FOREACH(q, &cb->spxp_queue, list) {
- if (SI(q)->si_seq == cb->s_ack) {
- cb->s_ack++;
- m = q->m;
- if (SI(q)->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_state |= SS_RCVATMARK;
- }
- TAILQ_REMOVE(&cb->spxp_queue, q, list);
- free(q, M_DEVBUF);
- wakeup = 1;
- spxstat.spxs_rcvpack++;
-#ifdef SF_NEWCALL
- if (cb->s_flags2 & SF_NEWCALL) {
- struct spxhdr *sp = mtod(m, struct spxhdr *);
- u_char dt = sp->spx_dt;
- spx_newchecks[4]++;
- if (dt != cb->s_rhdr.spx_dt) {
- struct mbuf *mm =
- m_getclr(M_DONTWAIT, 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(&so->so_rcv, mm);
- }
- }
- if (sp->spx_cc & SPX_OB) {
- MCHTYPE(m, MT_OOBDATA);
- spx_newchecks[1]++;
- so->so_oobmark = 0;
- so->so_state &= ~SS_RCVATMARK;
- }
- if (packetp == 0) {
- m->m_data += SPINC;
- m->m_len -= SPINC;
- m->m_pkthdr.len -= SPINC;
- }
- if ((sp->spx_cc & SPX_EM) || packetp) {
- sbappendrecord(&so->so_rcv, m);
- spx_newchecks[9]++;
- } else
- sbappend(&so->so_rcv, m);
- } else
-#endif
- if (packetp) {
- sbappendrecord(&so->so_rcv, m);
- } else {
- cb->s_rhdr = *mtod(m, struct spxhdr *);
- m->m_data += SPINC;
- m->m_len -= SPINC;
- m->m_pkthdr.len -= SPINC;
- sbappend(&so->so_rcv, m);
- }
- } else
- break;
- }
- if (wakeup) sorwakeup(so);
- return (0);
-}
-
-void *
-spx_ctlinput(cmd, arg_as_sa, dummy)
- int cmd;
- struct sockaddr *arg_as_sa; /* XXX should be swapped with dummy */
- void *dummy;
-{
- caddr_t arg = (/* XXX */ caddr_t)arg_as_sa;
- struct ipx_addr *na;
- struct sockaddr_ipx *sipx;
-
- if (cmd < 0 || cmd >= PRC_NCMDS)
- return NULL;
-
- switch (cmd) {
-
- case PRC_ROUTEDEAD:
- return NULL;
-
- case PRC_IFDOWN:
- case PRC_HOSTDEAD:
- case PRC_HOSTUNREACH:
- sipx = (struct sockaddr_ipx *)arg;
- if (sipx == NULL || sipx->sipx_family != AF_IPX)
- return NULL;
- na = &sipx->sipx_addr;
- break;
-
- default:
- break;
- }
- return NULL;
-}
-
-/*
- * When a source quench is received, close congestion window
- * to one packet. We will gradually open it again as we proceed.
- */
-void
-spx_quench(ipxp)
- struct ipxpcb *ipxp;
-{
- struct spxpcb *cb = ipxtospxpcb(ipxp);
-
- if (cb)
- cb->s_cwnd = CUNIT;
-}
-
-#ifdef notdef
-int
-spx_fixmtu(ipxp)
- struct ipxpcb *ipxp;
-{
- struct spxpcb *cb = (struct spxpcb *)(ipxp->ipxp_ppcb);
- struct mbuf *m;
- struct spx *si;
- struct ipx_errp *ep;
- struct sockbuf *sb;
- int badseq, len;
- struct mbuf *firstbad, *m0;
-
- if (cb) {
- /*
- * The notification that we have sent
- * too much is bad news -- we will
- * have to go through queued up so far
- * splitting ones which are too big and
- * reassigning sequence numbers and checksums.
- * we should then retransmit all packets from
- * one above the offending packet to the last one
- * we had sent (or our allocation)
- * then the offending one so that the any queued
- * data at our destination will be discarded.
- */
- ep = (struct ipx_errp *)ipxp->ipxp_notify_param;
- sb = &ipxp->ipxp_socket->so_snd;
- cb->s_mtu = ep->ipx_err_param;
- badseq = SI(&ep->ipx_err_ipx)->si_seq;
- for (m = sb->sb_mb; m; m = m->m_act) {
- si = mtod(m, struct spx *);
- if (si->si_seq == badseq)
- break;
- }
- if (m == 0) return;
- firstbad = m;
- /*for (;;) {*/
- /* calculate length */
- for (m0 = m, len = 0; m ; m = m->m_next)
- len += m->m_len;
- if (len > cb->s_mtu) {
- }
- /* FINISH THIS
- } */
- }
-}
-#endif
-
-int
-spx_output(cb, m0)
- struct spxpcb *cb;
- struct mbuf *m0;
-{
- struct socket *so = cb->s_ipxpcb->ipxp_socket;
- struct mbuf *m;
- struct spx *si = NULL;
- struct sockbuf *sb = &so->so_snd;
- int len = 0, win, rcv_win;
- short span, off, recordp = 0;
- u_short alo;
- int error = 0, sendalot;
-#ifdef notdef
- int idle;
-#endif
- struct mbuf *mprev;
-
- if (m0) {
- int mtu = cb->s_mtu;
- int datalen;
- /*
- * Make sure that packet isn't too big.
- */
- for (m = m0; m ; m = m->m_next) {
- mprev = m;
- len += m->m_len;
- if (m->m_flags & M_EOR)
- recordp = 1;
- }
- datalen = (cb->s_flags & SF_HO) ?
- len - sizeof(struct spxhdr) : len;
- if (datalen > mtu) {
- if (cb->s_flags & SF_PI) {
- m_freem(m0);
- return (EMSGSIZE);
- } else {
- int oldEM = cb->s_cc & SPX_EM;
-
- cb->s_cc &= ~SPX_EM;
- while (len > mtu) {
- /*
- * Here we are only being called
- * from usrreq(), so it is OK to
- * block.
- */
- m = m_copym(m0, 0, mtu, M_WAIT);
- if (cb->s_flags & SF_NEWCALL) {
- struct mbuf *mm = m;
- spx_newchecks[7]++;
- while (mm) {
- mm->m_flags &= ~M_EOR;
- mm = mm->m_next;
- }
- }
- error = spx_output(cb, m);
- if (error) {
- cb->s_cc |= oldEM;
- m_freem(m0);
- return(error);
- }
- m_adj(m0, mtu);
- len -= mtu;
- }
- cb->s_cc |= oldEM;
- }
- }
- /*
- * Force length even, by adding a "garbage byte" if
- * necessary.
- */
- if (len & 1) {
- m = mprev;
- if (M_TRAILINGSPACE(m) >= 1)
- m->m_len++;
- else {
- struct mbuf *m1 = m_get(M_DONTWAIT, MT_DATA);
-
- if (m1 == 0) {
- m_freem(m0);
- return (ENOBUFS);
- }
- m1->m_len = 1;
- *(mtod(m1, u_char *)) = 0;
- m->m_next = m1;
- }
- }
- m = m_gethdr(M_DONTWAIT, MT_HEADER);
- if (m == 0) {
- m_freem(m0);
- return (ENOBUFS);
- }
- /*
- * Fill in mbuf with extended SP header
- * and addresses and length put into network format.
- */
- M_MOVE_HDR(m, m0);
- MH_ALIGN(m, sizeof(struct spx));
- m->m_len = sizeof(struct spx);
- m->m_next = m0;
- si = mtod(m, struct spx *);
- si->si_i = *cb->s_ipx;
- si->si_s = cb->s_shdr;
- if ((cb->s_flags & SF_PI) && (cb->s_flags & SF_HO)) {
- struct spxhdr *sh;
- if (m0->m_len < sizeof(*sh)) {
- if((m0 = m_pullup(m0, sizeof(*sh))) == NULL) {
- (void) m_free(m);
- return (EINVAL);
- }
- m->m_next = m0;
- }
- sh = mtod(m0, struct spxhdr *);
- si->si_dt = sh->spx_dt;
- si->si_cc |= sh->spx_cc & SPX_EM;
- m0->m_len -= sizeof(*sh);
- m0->m_data += sizeof(*sh);
- len -= sizeof(*sh);
- }
- len += sizeof(*si);
- if ((cb->s_flags2 & SF_NEWCALL) && recordp) {
- si->si_cc |= SPX_EM;
- spx_newchecks[8]++;
- }
- if (cb->s_oobflags & SF_SOOB) {
- /*
- * Per jqj@cornell:
- * make sure OB packets convey exactly 1 byte.
- * If the packet is 1 byte or larger, we
- * have already guaranted there to be at least
- * one garbage byte for the checksum, and
- * extra bytes shouldn't hurt!
- */
- if (len > sizeof(*si)) {
- si->si_cc |= SPX_OB;
- len = (1 + sizeof(*si));
- }
- }
- si->si_len = htons((u_short)len);
- m->m_pkthdr.len = ((len - 1) | 1) + 1;
- /*
- * queue stuff up for output
- */
- sbappendrecord(sb, m);
- cb->s_seq++;
- }
-#ifdef notdef
- idle = (cb->s_smax == (cb->s_rack - 1));
-#endif
-again:
- sendalot = 0;
- off = cb->s_snxt - cb->s_rack;
- win = min(cb->s_swnd, (cb->s_cwnd/CUNIT));
-
- /*
- * If in persist timeout with window of 0, send a probe.
- * Otherwise, if window is small but nonzero
- * and timer expired, send what we can and go into
- * transmit state.
- */
- if (cb->s_force == 1 + SPXT_PERSIST) {
- if (win != 0) {
- cb->s_timer[SPXT_PERSIST] = 0;
- cb->s_rxtshift = 0;
- }
- }
- span = cb->s_seq - cb->s_rack;
- len = min(span, win) - off;
-
- if (len < 0) {
- /*
- * Window shrank after we went into it.
- * If window shrank to 0, cancel pending
- * restransmission and pull s_snxt back
- * to (closed) window. We will enter persist
- * state below. If the widndow didn't close completely,
- * just wait for an ACK.
- */
- len = 0;
- if (win == 0) {
- cb->s_timer[SPXT_REXMT] = 0;
- cb->s_snxt = cb->s_rack;
- }
- }
- if (len > 1)
- sendalot = 1;
- rcv_win = sbspace(&so->so_rcv);
-
- /*
- * Send if we owe peer an ACK.
- */
- if (cb->s_oobflags & SF_SOOB) {
- /*
- * must transmit this out of band packet
- */
- cb->s_oobflags &= ~ SF_SOOB;
- sendalot = 1;
- spxstat.spxs_sndurg++;
- goto found;
- }
- if (cb->s_flags & SF_ACKNOW)
- goto send;
- if (cb->s_state < TCPS_ESTABLISHED)
- goto send;
- /*
- * Silly window can't happen in spx.
- * Code from tcp deleted.
- */
- if (len)
- goto send;
- /*
- * Compare available window to amount of window
- * known to peer (as advertised window less
- * next expected input.) If the difference is at least two
- * packets or at least 35% of the mximum possible window,
- * then want to send a window update to peer.
- */
- if (rcv_win > 0) {
- u_short delta = 1 + cb->s_alo - cb->s_ack;
- int adv = rcv_win - (delta * cb->s_mtu);
-
- if ((so->so_rcv.sb_cc == 0 && adv >= (2 * cb->s_mtu)) ||
- (100 * adv / so->so_rcv.sb_hiwat >= 35)) {
- spxstat.spxs_sndwinup++;
- cb->s_flags |= SF_ACKNOW;
- goto send;
- }
-
- }
- /*
- * Many comments from tcp_output.c are appropriate here
- * including . . .
- * If send window is too small, there is data to transmit, and no
- * retransmit or persist is pending, then go to persist state.
- * If nothing happens soon, send when timer expires:
- * if window is nonzero, transmit what we can,
- * otherwise send a probe.
- */
- if (so->so_snd.sb_cc && cb->s_timer[SPXT_REXMT] == 0 &&
- cb->s_timer[SPXT_PERSIST] == 0) {
- cb->s_rxtshift = 0;
- spx_setpersist(cb);
- }
- /*
- * No reason to send a packet, just return.
- */
- cb->s_outx = 1;
- return (0);
-
-send:
- /*
- * Find requested packet.
- */
- si = NULL;
- if (len > 0) {
- cb->s_want = cb->s_snxt;
- for (m = sb->sb_mb; m; m = m->m_act) {
- si = mtod(m, struct spx *);
- if (SSEQ_LEQ(cb->s_snxt, si->si_seq))
- break;
- }
- found:
- if (si) {
- if (si->si_seq == cb->s_snxt)
- cb->s_snxt++;
- else
- spxstat.spxs_sndvoid++, si = NULL;
- }
- }
- /*
- * update window
- */
- if (rcv_win < 0)
- rcv_win = 0;
- alo = cb->s_ack - 1 + (rcv_win / ((short)cb->s_mtu));
- if (SSEQ_LT(alo, cb->s_alo))
- alo = cb->s_alo;
-
- if (si) {
- /*
- * must make a copy of this packet for
- * ipx_output to monkey with
- */
- m = m_copy(m, 0, M_COPYALL);
- if (m == NULL)
- return (ENOBUFS);
- si = mtod(m, struct spx *);
- if (SSEQ_LT(si->si_seq, cb->s_smax))
- spxstat.spxs_sndrexmitpack++;
- else
- spxstat.spxs_sndpack++;
- } else if (cb->s_force || cb->s_flags & SF_ACKNOW) {
- /*
- * Must send an acknowledgement or a probe
- */
- if (cb->s_force)
- spxstat.spxs_sndprobe++;
- if (cb->s_flags & SF_ACKNOW)
- spxstat.spxs_sndacks++;
- m = m_gethdr(M_DONTWAIT, MT_HEADER);
- if (m == 0)
- return (ENOBUFS);
- /*
- * Fill in mbuf with extended SP header
- * and addresses and length put into network format.
- */
- MH_ALIGN(m, sizeof(struct spx));
- m->m_len = sizeof(*si);
- m->m_pkthdr.len = sizeof(*si);
- si = mtod(m, struct spx *);
- si->si_i = *cb->s_ipx;
- si->si_s = cb->s_shdr;
- si->si_seq = cb->s_smax + 1;
- si->si_len = htons(sizeof(*si));
- si->si_cc |= SPX_SP;
- } else {
- cb->s_outx = 3;
- if (so->so_options & SO_DEBUG || traceallspxs)
- spx_trace(SA_OUTPUT, cb->s_state, cb, si, 0);
- return (0);
- }
- /*
- * Stuff checksum and output datagram.
- */
- if ((si->si_cc & SPX_SP) == 0) {
- if (cb->s_force != (1 + SPXT_PERSIST) ||
- cb->s_timer[SPXT_PERSIST] == 0) {
- /*
- * If this is a new packet and we are not currently
- * timing anything, time this one.
- */
- if (SSEQ_LT(cb->s_smax, si->si_seq)) {
- cb->s_smax = si->si_seq;
- if (cb->s_rtt == 0) {
- spxstat.spxs_segstimed++;
- cb->s_rtseq = si->si_seq;
- cb->s_rtt = 1;
- }
- }
- /*
- * Set rexmt timer if not currently set,
- * Initial value for retransmit timer is smoothed
- * round-trip time + 2 * round-trip time variance.
- * Initialize shift counter which is used for backoff
- * of retransmit time.
- */
- if (cb->s_timer[SPXT_REXMT] == 0 &&
- cb->s_snxt != cb->s_rack) {
- cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
- if (cb->s_timer[SPXT_PERSIST]) {
- cb->s_timer[SPXT_PERSIST] = 0;
- cb->s_rxtshift = 0;
- }
- }
- } else if (SSEQ_LT(cb->s_smax, si->si_seq)) {
- cb->s_smax = si->si_seq;
- }
- } else if (cb->s_state < TCPS_ESTABLISHED) {
- if (cb->s_rtt == 0)
- cb->s_rtt = 1; /* Time initial handshake */
- if (cb->s_timer[SPXT_REXMT] == 0)
- cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
- }
- {
- /*
- * Do not request acks when we ack their data packets or
- * when we do a gratuitous window update.
- */
- if (((si->si_cc & SPX_SP) == 0) || cb->s_force)
- si->si_cc |= SPX_SA;
- si->si_seq = htons(si->si_seq);
- si->si_alo = htons(alo);
- si->si_ack = htons(cb->s_ack);
-
- if (ipxcksum) {
- si->si_sum = 0;
- len = ntohs(si->si_len);
- if (len & 1)
- len++;
- si->si_sum = ipx_cksum(m, len);
- } else
- si->si_sum = 0xffff;
-
- cb->s_outx = 4;
- if (so->so_options & SO_DEBUG || traceallspxs)
- spx_trace(SA_OUTPUT, cb->s_state, cb, si, 0);
-
- if (so->so_options & SO_DONTROUTE)
- error = ipx_outputfl(m, (struct route *)0,
- IPX_ROUTETOIF);
- else
- error = ipx_outputfl(m, &cb->s_ipxpcb->ipxp_route, 0);
- }
- if (error) {
- return (error);
- }
- spxstat.spxs_sndtotal++;
- /*
- * Data sent (as far as we can tell).
- * If this advertises a larger window than any other segment,
- * then remember the size of the advertized window.
- * Any pending ACK has now been sent.
- */
- cb->s_force = 0;
- cb->s_flags &= ~(SF_ACKNOW|SF_DELACK);
- if (SSEQ_GT(alo, cb->s_alo))
- cb->s_alo = alo;
- if (sendalot)
- goto again;
- cb->s_outx = 5;
- return (0);
-}
-
-int spx_do_persist_panics = 0;
-
-void
-spx_setpersist(cb)
- struct spxpcb *cb;
-{
- int t = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1;
-
- if (cb->s_timer[SPXT_REXMT] && spx_do_persist_panics)
- panic("spx_output REXMT");
- /*
- * Start/restart persistance timer.
- */
- SPXT_RANGESET(cb->s_timer[SPXT_PERSIST],
- t*spx_backoff[cb->s_rxtshift],
- SPXTV_PERSMIN, SPXTV_PERSMAX);
- if (cb->s_rxtshift < SPX_MAXRXTSHIFT)
- cb->s_rxtshift++;
-}
-
-/* ARGSUSED */
-int
-spx_ctloutput(req, so, level, name, value)
- int req;
- struct socket *so;
- int level, name;
- struct mbuf **value;
-{
- struct mbuf *m;
- struct ipxpcb *ipxp = sotoipxpcb(so);
- struct spxpcb *cb;
- int mask, error = 0;
-
- if (level != IPXPROTO_SPX) {
- /* This will have to be changed when we do more general
- stacking of protocols */
- return (ipx_ctloutput(req, so, level, name, value));
- }
- if (ipxp == NULL) {
- error = EINVAL;
- goto release;
- } else
- cb = ipxtospxpcb(ipxp);
-
- switch (req) {
-
- case PRCO_GETOPT:
- if (value == NULL)
- return (EINVAL);
- m = m_get(M_DONTWAIT, MT_DATA);
- if (m == NULL)
- return (ENOBUFS);
- switch (name) {
-
- case SO_HEADERS_ON_INPUT:
- mask = SF_HI;
- goto get_flags;
-
- case SO_HEADERS_ON_OUTPUT:
- mask = SF_HO;
- get_flags:
- m->m_len = sizeof(short);
- *mtod(m, short *) = cb->s_flags & mask;
- break;
-
- case SO_MTU:
- m->m_len = sizeof(u_short);
- *mtod(m, short *) = cb->s_mtu;
- break;
-
- case SO_LAST_HEADER:
- m->m_len = sizeof(struct spxhdr);
- *mtod(m, struct spxhdr *) = cb->s_rhdr;
- break;
-
- case SO_DEFAULT_HEADERS:
- m->m_len = sizeof(struct spx);
- *mtod(m, struct spxhdr *) = cb->s_shdr;
- break;
-
- default:
- error = EINVAL;
- }
- *value = m;
- break;
-
- case PRCO_SETOPT:
- if (value == 0 || *value == 0) {
- error = EINVAL;
- break;
- }
- switch (name) {
- int *ok;
-
- case SO_HEADERS_ON_INPUT:
- mask = SF_HI;
- goto set_head;
-
- case SO_HEADERS_ON_OUTPUT:
- mask = SF_HO;
- set_head:
- if (cb->s_flags & SF_PI) {
- ok = mtod(*value, int *);
- if (*ok)
- cb->s_flags |= mask;
- else
- cb->s_flags &= ~mask;
- } else error = EINVAL;
- break;
-
- case SO_MTU:
- cb->s_mtu = *(mtod(*value, u_short *));
- break;
-
-#ifdef SF_NEWCALL
- case SO_NEWCALL:
- ok = mtod(*value, int *);
- if (*ok) {
- cb->s_flags2 |= SF_NEWCALL;
- spx_newchecks[5]++;
- } else {
- cb->s_flags2 &= ~SF_NEWCALL;
- spx_newchecks[6]++;
- }
- break;
-#endif
-
- case SO_DEFAULT_HEADERS:
- {
- struct spxhdr *sp =
- mtod(*value, struct spxhdr *);
- cb->s_dt = sp->spx_dt;
- cb->s_cc = sp->spx_cc & SPX_EM;
- }
- break;
-
- default:
- error = EINVAL;
- }
- m_freem(*value);
- break;
- }
- release:
- return (error);
-}
-
-/* ARGSUSED */
-int
-spx_usrreq(so, req, m, nam, controlp)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *controlp;
-{
- struct ipxpcb *ipxp = sotoipxpcb(so);
- struct spxpcb *cb = NULL;
- int s = splnet();
- int error = 0, ostate;
- struct sockbuf *sb;
-
- if (req == PRU_CONTROL)
- return (ipx_control(so, (long)m, (caddr_t)nam,
- (struct ifnet *)controlp));
- if (ipxp == NULL) {
- if (req != PRU_ATTACH) {
- error = EINVAL;
- goto release;
- }
- } else
- cb = ipxtospxpcb(ipxp);
-
- ostate = cb ? cb->s_state : 0;
-
- switch (req) {
-
- case PRU_ATTACH:
- if (ipxp != NULL) {
- error = EISCONN;
- break;
- }
- error = ipx_pcballoc(so, &ipxcbtable);
- if (error)
- break;
- if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
- error = soreserve(so, (u_long) 3072, (u_long) 3072);
- if (error)
- break;
- }
- ipxp = sotoipxpcb(so);
- sb = &so->so_snd;
-
- cb = malloc(sizeof(*cb), M_PCB, M_NOWAIT);
- if (cb == NULL) {
- error = ENOBUFS;
- break;
- }
- bzero((caddr_t)cb, sizeof(*cb));
- cb->s_ipx = malloc(sizeof(*cb->s_ipx), M_PCB, M_NOWAIT);
- if (cb->s_ipx == NULL) {
- (void) free(cb, M_PCB);
- error = ENOBUFS;
- break;
- }
- bzero((caddr_t)cb->s_ipx, sizeof(*cb->s_ipx));
- cb->s_state = TCPS_LISTEN;
- cb->s_smax = -1;
- cb->s_swl1 = -1;
- TAILQ_INIT(&cb->spxp_queue);
- cb->s_ipxpcb = ipxp;
- cb->s_mtu = 576 - sizeof(struct spx);
- cb->s_cwnd = sbspace(sb) * CUNIT / cb->s_mtu;
- cb->s_ssthresh = cb->s_cwnd;
- cb->s_cwmx = sbspace(sb) * CUNIT /
- (2 * sizeof(struct spx));
- /* Above is recomputed when connecting to account
- for changed buffering or mtu's */
- cb->s_rtt = SPXTV_SRTTBASE;
- cb->s_rttvar = SPXTV_SRTTDFLT << 2;
- SPXT_RANGESET(cb->s_rxtcur,
- ((SPXTV_SRTTBASE >> 2) + (SPXTV_SRTTDFLT << 2)) >> 1,
- SPXTV_MIN, SPXTV_REXMTMAX);
- ipxp->ipxp_ppcb = (caddr_t) cb;
- break;
-
- case PRU_DETACH:
- if (cb->s_state > TCPS_LISTEN)
- cb = spx_disconnect(cb);
- else
- cb = spx_close(cb);
- break;
-
- case PRU_BIND:
- error = ipx_pcbbind(ipxp, nam);
- break;
-
- case PRU_LISTEN:
- if (ipxp->ipxp_lport == 0)
- error = ipx_pcbbind(ipxp, (struct mbuf *)0);
- if (error == 0)
- cb->s_state = TCPS_LISTEN;
- break;
-
- /*
- * Initiate connection to peer.
- * Enter SYN_SENT state, and mark socket as connecting.
- * Start keep-alive timer, setup prototype header,
- * Send initial system packet requesting connection.
- */
- case PRU_CONNECT:
- if (ipxp->ipxp_lport == 0) {
- error = ipx_pcbbind(ipxp, (struct mbuf *)0);
- if (error)
- break;
- }
- error = ipx_pcbconnect(ipxp, nam);
- if (error)
- break;
- soisconnecting(so);
- spxstat.spxs_connattempt++;
- cb->s_state = TCPS_SYN_SENT;
- cb->s_did = 0;
- spx_template(cb);
- cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
- cb->s_force = 1 + SPXTV_KEEP;
- /*
- * Other party is required to respond to
- * the port I send from, but he is not
- * required to answer from where I am sending to,
- * so allow wildcarding.
- * original port I am sending to is still saved in
- * cb->s_dport.
- */
- ipxp->ipxp_fport = 0;
- error = spx_output(cb, (struct mbuf *) 0);
- break;
-
- case PRU_CONNECT2:
- error = EOPNOTSUPP;
- break;
-
- /*
- * We may decide later to implement connection closing
- * handshaking at the spx level optionally.
- * here is the hook to do it:
- */
- case PRU_DISCONNECT:
- cb = spx_disconnect(cb);
- break;
-
- case PRU_SHUTDOWN:
- socantsendmore(so);
- cb = spx_usrclosed(cb);
- if (cb)
- error = spx_output(cb, (struct mbuf *) 0);
- break;
-
- /*
- * After a receive, possibly send acknowledgment
- * updating allocation.
- */
- case PRU_RCVD:
- cb->s_flags |= SF_RVD;
- (void) spx_output(cb, (struct mbuf *) 0);
- cb->s_flags &= ~SF_RVD;
- break;
-
- case PRU_ABORT:
- (void) spx_drop(cb, ECONNABORTED);
- break;
-
- case PRU_SENSE:
- case PRU_CONTROL:
- m = NULL;
- error = EOPNOTSUPP;
- break;
-
- case PRU_RCVOOB:
- if ((cb->s_oobflags & SF_IOOB) || so->so_oobmark ||
- (so->so_state & SS_RCVATMARK)) {
- m->m_len = 1;
- *mtod(m, caddr_t) = cb->s_iobc;
- break;
- }
- error = EINVAL;
- break;
-
- case PRU_SENDOOB:
- if (sbspace(&so->so_snd) < -512) {
- error = ENOBUFS;
- break;
- }
- cb->s_oobflags |= SF_SOOB;
- /* FALLTHROUGH */
-
- case PRU_SEND:
- if (controlp) {
- u_short *p = mtod(controlp, u_short *);
- spx_newchecks[2]++;
- if ((p[0] == 5) && p[1] == 1) { /* XXXX, for testing */
- cb->s_shdr.spx_dt = *(u_char *)(&p[2]);
- spx_newchecks[3]++;
- }
- m_freem(controlp);
- }
- controlp = NULL;
- error = spx_output(cb, m);
- m = NULL;
- break;
-
- case PRU_SOCKADDR:
- ipx_setsockaddr(ipxp, nam);
- break;
-
- /*
- * Accept a connection. Essentially all the work is
- * done at higher levels; just return the address
- * of the peer, storing through addr.
- */
- case PRU_ACCEPT:
- /* FALLTHROUGH */
-
- case PRU_PEERADDR:
- ipx_setpeeraddr(ipxp, nam);
- break;
-
- case PRU_SLOWTIMO:
- cb = spx_timers(cb, (long)nam);
- req |= ((long)nam) << 8;
- break;
-
- case PRU_FASTTIMO:
- case PRU_PROTORCV:
- case PRU_PROTOSEND:
- error = EOPNOTSUPP;
- break;
-
- default:
- panic("spx_usrreq");
- }
- if (cb && (so->so_options & SO_DEBUG || traceallspxs))
- spx_trace(SA_USER, (u_char)ostate, cb, (struct spx *)0, req);
-release:
- if (controlp != NULL)
- m_freem(controlp);
- if (m != NULL)
- m_freem(m);
- splx(s);
- return (error);
-}
-
-int
-spx_usrreq_sp(so, req, m, nam, controlp)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *controlp;
-{
- int error = spx_usrreq(so, req, m, nam, controlp);
-
- if (req == PRU_ATTACH && error == 0) {
- struct ipxpcb *ipxp = sotoipxpcb(so);
- ((struct spxpcb *)ipxp->ipxp_ppcb)->s_flags |=
- (SF_HI | SF_HO | SF_PI);
- }
- return (error);
-}
-
-/*
- * Create template to be used to send spx packets on a connection.
- * Called after host entry created, fills
- * in a skeletal spx header (choosing connection id),
- * minimizing the amount of work necessary when the connection is used.
- */
-void
-spx_template(cb)
- struct spxpcb *cb;
-{
- struct ipxpcb *ipxp = cb->s_ipxpcb;
- struct ipx *ipx = cb->s_ipx;
- struct sockbuf *sb = &(ipxp->ipxp_socket->so_snd);
-
- ipx->ipx_pt = IPXPROTO_SPX;
- ipx->ipx_sna = ipxp->ipxp_laddr;
- ipx->ipx_dna = ipxp->ipxp_faddr;
- cb->s_sid = htons(spx_iss);
- spx_iss += SPX_ISSINCR/2;
- cb->s_alo = 1;
- cb->s_cwnd = (sbspace(sb) * CUNIT) / cb->s_mtu;
- cb->s_ssthresh = cb->s_cwnd; /* Try to expand fast to full complement
- of large packets */
- cb->s_cwmx = (sbspace(sb) * CUNIT) / (2 * sizeof(struct spx));
- cb->s_cwmx = max(cb->s_cwmx, cb->s_cwnd);
- /* But allow for lots of little packets as well */
-}
-
-/*
- * Close a SPIP control block:
- * discard spx control block itself
- * discard ipx protocol control block
- * wake up any sleepers
- */
-struct spxpcb *
-spx_close(cb)
- struct spxpcb *cb;
-{
- struct spx_q *s;
- struct ipxpcb *ipxp = cb->s_ipxpcb;
- struct socket *so = ipxp->ipxp_socket;
-
- for (s = TAILQ_FIRST(&cb->spxp_queue); s != NULL;
- s = TAILQ_FIRST(&cb->spxp_queue)) {
- TAILQ_REMOVE(&cb->spxp_queue, s, list);
- m_freem(s->m);
- free(s, M_DEVBUF);
- }
- free(cb->s_ipx, M_PCB);
- free(cb, M_PCB);
- ipxp->ipxp_ppcb = 0;
- soisdisconnected(so);
- ipx_pcbdetach(ipxp);
- spxstat.spxs_closed++;
- return (NULL);
-}
-/*
- * Someday we may do level 3 handshaking
- * to close a connection or send a xerox style error.
- * For now, just close.
- */
-struct spxpcb *
-spx_usrclosed(cb)
- struct spxpcb *cb;
-{
- return (spx_close(cb));
-}
-struct spxpcb *
-spx_disconnect(cb)
- struct spxpcb *cb;
-{
- return (spx_close(cb));
-}
-/*
- * Drop connection, reporting
- * the specified error.
- */
-struct spxpcb *
-spx_drop(cb, errno)
- struct spxpcb *cb;
- int errno;
-{
- struct socket *so = cb->s_ipxpcb->ipxp_socket;
-
- /*
- * someday, in the xerox world
- * we will generate error protocol packets
- * announcing that the socket has gone away.
- */
- if (TCPS_HAVERCVDSYN(cb->s_state)) {
- spxstat.spxs_drops++;
- cb->s_state = TCPS_CLOSED;
- /*(void) tcp_output(cb);*/
- } else
- spxstat.spxs_conndrops++;
- so->so_error = errno;
- return (spx_close(cb));
-}
-
-void
-spx_abort(ipxp)
- struct ipxpcb *ipxp;
-{
-
- (void) spx_close((struct spxpcb *)ipxp->ipxp_ppcb);
-}
-
-int spx_backoff[SPX_MAXRXTSHIFT+1] =
- { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
-/*
- * Fast timeout routine for processing delayed acks
- */
-void
-spx_fasttimo()
-{
- struct ipxpcb *ipxp;
- struct spxpcb *cb;
- int s = splnet();
-
- if (!CIRCLEQ_EMPTY(&ipxpcbtable.ipxpt_queue))
- CIRCLEQ_FOREACH(ipxp, &ipxpcbtable.ipxpt_queue, ipxp_queue)
- if ((cb = (struct spxpcb *)ipxp->ipxp_ppcb) &&
- (cb->s_flags & SF_DELACK)) {
- cb->s_flags &= ~SF_DELACK;
- cb->s_flags |= SF_ACKNOW;
- spxstat.spxs_delack++;
- (void) spx_output(cb, (struct mbuf *) 0);
- }
- splx(s);
-}
-
-/*
- * spx protocol timeout routine called every 500 ms.
- * Updates the timers in all active pcb's and
- * causes finite state machine actions if timers expire.
- */
-void
-spx_slowtimo()
-{
- struct ipxpcb *ipx, *ipxnxt;
- struct spxpcb *cb;
- int s = splnet();
- int i;
-
- /*
- * Search through tcb's and update active timers.
- */
- if (CIRCLEQ_EMPTY(&ipxpcbtable.ipxpt_queue)) {
- splx(s);
- return;
- }
- for (ipx = CIRCLEQ_FIRST(&ipxcbtable.ipxpt_queue);
- ipx != CIRCLEQ_END(&ipxcbtable.ipxpt_queue);) {
- cb = ipxtospxpcb(ipx);
- ipxnxt = CIRCLEQ_NEXT(ipx, ipxp_queue);
- if (cb == 0)
- goto tpgone;
- for (i = 0; i < SPXT_NTIMERS; i++) {
- if (cb->s_timer[i] && --cb->s_timer[i] == 0) {
- (void) spx_usrreq(cb->s_ipxpcb->ipxp_socket,
- PRU_SLOWTIMO, NULL,
- (struct mbuf *)(long)i, NULL);
- if (ipxnxt->ipxp_queue.cqe_prev != ipx)
- goto tpgone;
- }
- }
- cb->s_idle++;
- if (cb->s_rtt)
- cb->s_rtt++;
-tpgone:
- ipx = ipxnxt;
- }
- spx_iss += SPX_ISSINCR/PR_SLOWHZ; /* increment iss */
- splx(s);
-}
-/*
- * SPX timer processing.
- */
-struct spxpcb *
-spx_timers(cb, timer)
- struct spxpcb *cb;
- int timer;
-{
- long rexmt;
- int win;
-
- cb->s_force = 1 + timer;
- switch (timer) {
-
- /*
- * 2 MSL timeout in shutdown went off. TCP deletes connection
- * control block.
- */
- case SPXT_2MSL:
- printf("spx: SPXT_2MSL went off for no reason\n");
- cb->s_timer[timer] = 0;
- break;
-
- /*
- * Retransmission timer went off. Message has not
- * been acked within retransmit interval. Back off
- * to a longer retransmit interval and retransmit one packet.
- */
- case SPXT_REXMT:
- if (++cb->s_rxtshift > SPX_MAXRXTSHIFT) {
- cb->s_rxtshift = SPX_MAXRXTSHIFT;
- spxstat.spxs_timeoutdrop++;
- cb = spx_drop(cb, ETIMEDOUT);
- break;
- }
- spxstat.spxs_rexmttimeo++;
- rexmt = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1;
- rexmt *= spx_backoff[cb->s_rxtshift];
- SPXT_RANGESET(cb->s_rxtcur, rexmt, SPXTV_MIN, SPXTV_REXMTMAX);
- cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
- /*
- * If we have backed off fairly far, our srtt
- * estimate is probably bogus. Clobber it
- * so we'll take the next rtt measurement as our srtt;
- * move the current srtt into rttvar to keep the current
- * retransmit times until then.
- */
- if (cb->s_rxtshift > SPX_MAXRXTSHIFT / 4 ) {
- cb->s_rttvar += (cb->s_srtt >> 2);
- cb->s_srtt = 0;
- }
- cb->s_snxt = cb->s_rack;
- /*
- * If timing a packet, stop the timer.
- */
- cb->s_rtt = 0;
- /*
- * See very long discussion in tcp_timer.c about congestion
- * window and sstrhesh
- */
- win = min(cb->s_swnd, (cb->s_cwnd/CUNIT)) / 2;
- if (win < 2)
- win = 2;
- cb->s_cwnd = CUNIT;
- cb->s_ssthresh = win * CUNIT;
- (void) spx_output(cb, (struct mbuf *) 0);
- break;
-
- /*
- * Persistance timer into zero window.
- * Force a probe to be sent.
- */
- case SPXT_PERSIST:
- spxstat.spxs_persisttimeo++;
- spx_setpersist(cb);
- (void) spx_output(cb, (struct mbuf *) 0);
- break;
-
- /*
- * Keep-alive timer went off; send something
- * or drop connection if idle for too long.
- */
- case SPXT_KEEP:
- spxstat.spxs_keeptimeo++;
- if (cb->s_state < TCPS_ESTABLISHED)
- goto dropit;
- if (cb->s_ipxpcb->ipxp_socket->so_options & SO_KEEPALIVE) {
- if (cb->s_idle >= SPXTV_MAXIDLE)
- goto dropit;
- spxstat.spxs_keepprobe++;
- (void) spx_output(cb, (struct mbuf *) 0);
- } else
- cb->s_idle = 0;
- cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
- break;
- dropit:
- spxstat.spxs_keepdrops++;
- cb = spx_drop(cb, ETIMEDOUT);
- break;
- }
- return (cb);
-}
-
-int
-spx_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
- int *name;
- u_int namelen;
- void *oldp;
- size_t *oldlenp;
- void *newp;
- size_t newlen;
-{
- /* All sysctl names at this level are terminal. */
- if (namelen != 1)
- return (ENOTDIR);
-
- switch (name[0]) {
- default:
- return (ENOPROTOOPT);
- }
- /* NOT REACHED */
-}
diff --git a/sys/netipx/spx_var.h b/sys/netipx/spx_var.h
deleted file mode 100644
index a89671f39ed..00000000000
--- a/sys/netipx/spx_var.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/* $OpenBSD: spx_var.h,v 1.4 2003/06/02 23:28:16 millert Exp $ */
-
-/*-
- *
- * Copyright (c) 1996 Michael Shalayeff
- * Copyright (c) 1995, Mike Mitchell
- * 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)spx_var.h
- *
- * from FreeBSD Id: spx_var.h,v 1.4 1995/11/04 09:03:47 julian Exp
- */
-
-#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;
-};
-
-#ifdef _KERNEL
-extern struct spx_istat spx_istat;
-extern u_short spx_iss;
-
-/* Following was struct spxstat spxstat; */
-#ifndef spxstat
-#define spxstat spx_istat.newstats
-#endif
-
-#endif
-
-#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)
-
-/*
- * Names for SPX sysctl objects.
- */
-
-#define SPXCTL_MAXID 1
-
-#define SPXCTL_NAMES { \
- { 0, 0}, \
-}
-
-
-#endif