diff options
author | glebius <glebius@FreeBSD.org> | 2014-03-14 02:58:48 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2014-03-14 02:58:48 +0000 |
commit | d494babace1c51efd0d2c4582515a1e1ae5fa9d2 (patch) | |
tree | 289644ca4a3bc9d349466888b297c5a34d00e321 /sys/netipx/ipx.c | |
parent | a4fb4957a59109b80df9cabe72982fd067c6f5d1 (diff) | |
download | FreeBSD-src-d494babace1c51efd0d2c4582515a1e1ae5fa9d2.zip FreeBSD-src-d494babace1c51efd0d2c4582515a1e1ae5fa9d2.tar.gz |
Remove IPX support.
IPX was a network transport protocol in Novell's NetWare network operating
system from late 80s and then 90s. The NetWare itself switched to TCP/IP
as default transport in 1998. Later, in this century the Novell Open
Enterprise Server became successor of Novell NetWare. The last release
that claimed to still support IPX was OES 2 in 2007. Routing equipment
vendors (e.g. Cisco) discontinued support for IPX in 2011.
Thus, IPX won't be supported in FreeBSD 11.0-RELEASE.
Diffstat (limited to 'sys/netipx/ipx.c')
-rw-r--r-- | sys/netipx/ipx.c | 457 |
1 files changed, 0 insertions, 457 deletions
diff --git a/sys/netipx/ipx.c b/sys/netipx/ipx.c deleted file mode 100644 index 987a267..0000000 --- a/sys/netipx/ipx.c +++ /dev/null @@ -1,457 +0,0 @@ -/*- - * Copyright (c) 1984, 1985, 1986, 1987, 1993 - * The Regents of the University of California. - * Copyright (c) 2009 Robert N. M. Watson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Copyright (c) 1995, Mike Mitchell - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ipx.c - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/lock.h> -#include <sys/malloc.h> -#include <sys/priv.h> -#include <sys/rwlock.h> -#include <sys/sockio.h> -#include <sys/socket.h> - -#include <net/if.h> -#include <net/if_var.h> -#include <net/route.h> - -#include <netipx/ipx.h> -#include <netipx/ipx_if.h> -#include <netipx/ipx_var.h> - -/* - * The IPX-layer address list is protected by ipx_ifaddr_rw. - */ -struct rwlock ipx_ifaddr_rw; -struct ipx_ifaddrhead ipx_ifaddrhead; - -static void ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia); -static int ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia, - struct sockaddr_ipx *sipx, int scrub); - -/* - * Generic internet control operations (ioctl's). - */ -int -ipx_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, - struct thread *td) -{ - struct ifreq *ifr = (struct ifreq *)data; - struct ipx_aliasreq *ifra = (struct ipx_aliasreq *)data; - struct ipx_ifaddr *ia; - struct ifaddr *ifa; - int dstIsNew, hostIsNew; - int error, priv; - - /* - * Find address for this interface, if it exists. - */ - if (ifp == NULL) - return (EADDRNOTAVAIL); - - IPX_IFADDR_RLOCK(); - TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) { - if (ia->ia_ifp == ifp) - break; - } - if (ia != NULL) - ifa_ref(&ia->ia_ifa); - IPX_IFADDR_RUNLOCK(); - - error = 0; - switch (cmd) { - case SIOCGIFADDR: - if (ia == NULL) { - error = EADDRNOTAVAIL; - goto out; - } - *(struct sockaddr_ipx *)&ifr->ifr_addr = ia->ia_addr; - goto out; - - case SIOCGIFBRDADDR: - if (ia == NULL) { - error = EADDRNOTAVAIL; - goto out; - } - if ((ifp->if_flags & IFF_BROADCAST) == 0) { - error = EINVAL; - goto out; - } - *(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_broadaddr; - goto out; - - case SIOCGIFDSTADDR: - if (ia == NULL) { - error = EADDRNOTAVAIL; - goto out; - } - if ((ifp->if_flags & IFF_POINTOPOINT) == 0) { - error = EINVAL; - goto out; - } - *(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_dstaddr; - goto out; - } - - switch (cmd) { - case SIOCAIFADDR: - case SIOCDIFADDR: - priv = (cmd == SIOCAIFADDR) ? PRIV_NET_ADDIFADDR : - PRIV_NET_DELIFADDR; - if (td && (error = priv_check(td, priv)) != 0) - goto out; - - IPX_IFADDR_RLOCK(); - if (ifra->ifra_addr.sipx_family == AF_IPX) { - struct ipx_ifaddr *oia; - - for (oia = ia; ia; ia = TAILQ_NEXT(ia, ia_link)) { - if (ia->ia_ifp == ifp && - ipx_neteq(ia->ia_addr.sipx_addr, - ifra->ifra_addr.sipx_addr)) - break; - } - if (oia != NULL && oia != ia) - ifa_free(&oia->ia_ifa); - if (ia != NULL && oia != ia) - ifa_ref(&ia->ia_ifa); - } - IPX_IFADDR_RUNLOCK(); - if (cmd == SIOCDIFADDR && ia == NULL) { - error = EADDRNOTAVAIL; - goto out; - } - /* FALLTHROUGH */ - - case SIOCSIFADDR: - case SIOCSIFDSTADDR: - if (td && (error = priv_check(td, PRIV_NET_SETLLADDR)) != 0) - goto out; - if (ia == NULL) { - ifa = ifa_alloc(sizeof(struct ipx_ifaddr), M_WAITOK); - ia = (struct ipx_ifaddr *)ifa; - ia->ia_ifp = ifp; - ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr; - ifa->ifa_netmask = (struct sockaddr *)&ipx_netmask; - ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr; - if (ifp->if_flags & IFF_BROADCAST) { - ia->ia_broadaddr.sipx_family = AF_IPX; - ia->ia_broadaddr.sipx_len = - sizeof(ia->ia_addr); - ia->ia_broadaddr.sipx_addr.x_host = - ipx_broadhost; - } - ifa_ref(&ia->ia_ifa); /* ipx_ifaddrhead */ - IPX_IFADDR_WLOCK(); - TAILQ_INSERT_TAIL(&ipx_ifaddrhead, ia, ia_link); - IPX_IFADDR_WUNLOCK(); - - ifa_ref(&ia->ia_ifa); /* if_addrhead */ - IF_ADDR_WLOCK(ifp); - TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link); - IF_ADDR_WUNLOCK(ifp); - } - break; - - default: - if (td && (error = priv_check(td, PRIV_NET_HWIOCTL)) != 0) - goto out; - } - - switch (cmd) { - case SIOCSIFDSTADDR: - if ((ifp->if_flags & IFF_POINTOPOINT) == 0) { - error = EINVAL; - goto out; - } - if (ia->ia_flags & IFA_ROUTE) { - rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST); - ia->ia_flags &= ~IFA_ROUTE; - } - if (ifp->if_ioctl) { - error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, - (void *)ia); - if (error) - goto out; - } - *(struct sockaddr *)&ia->ia_dstaddr = ifr->ifr_dstaddr; - goto out; - - case SIOCSIFADDR: - error = ipx_ifinit(ifp, ia, - (struct sockaddr_ipx *)&ifr->ifr_addr, 1); - goto out; - - case SIOCDIFADDR: - ipx_ifscrub(ifp, ia); - ifa = (struct ifaddr *)ia; - - IF_ADDR_WLOCK(ifp); - TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); - IF_ADDR_WUNLOCK(ifp); - ifa_free(ifa); /* if_addrhead */ - - IPX_IFADDR_WLOCK(); - TAILQ_REMOVE(&ipx_ifaddrhead, ia, ia_link); - IPX_IFADDR_WUNLOCK(); - ifa_free(&ia->ia_ifa); /* ipx_ifaddrhead */ - goto out; - - case SIOCAIFADDR: - dstIsNew = 0; - hostIsNew = 1; - if (ia->ia_addr.sipx_family == AF_IPX) { - if (ifra->ifra_addr.sipx_len == 0) { - ifra->ifra_addr = ia->ia_addr; - hostIsNew = 0; - } else if (ipx_neteq(ifra->ifra_addr.sipx_addr, - ia->ia_addr.sipx_addr)) - hostIsNew = 0; - } - if ((ifp->if_flags & IFF_POINTOPOINT) && - (ifra->ifra_dstaddr.sipx_family == AF_IPX)) { - if (hostIsNew == 0) - ipx_ifscrub(ifp, ia); - ia->ia_dstaddr = ifra->ifra_dstaddr; - dstIsNew = 1; - } - if (ifra->ifra_addr.sipx_family == AF_IPX && - (hostIsNew || dstIsNew)) - error = ipx_ifinit(ifp, ia, &ifra->ifra_addr, 0); - goto out; - - default: - if (ifp->if_ioctl == NULL) { - error = EOPNOTSUPP; - goto out; - } - error = ((*ifp->if_ioctl)(ifp, cmd, data)); - } - -out: - if (ia != NULL) - ifa_free(&ia->ia_ifa); - return (error); -} - -/* - * Delete any previous route for an old address. - */ -static void -ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia) -{ - - if (ia->ia_flags & IFA_ROUTE) { - if (ifp->if_flags & IFF_POINTOPOINT) { - rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST); - } else - rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0); - ia->ia_flags &= ~IFA_ROUTE; - } -} - -/* - * Initialize an interface's internet address and routing table entry. - */ -static int -ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia, - struct sockaddr_ipx *sipx, int scrub) -{ - struct sockaddr_ipx oldaddr; - int s = splimp(), error; - - /* - * Set up new addresses. - */ - oldaddr = ia->ia_addr; - ia->ia_addr = *sipx; - - /* - * The convention we shall adopt for naming is that a supplied - * address of zero means that "we don't care". Use the MAC address - * of the interface. If it is an interface without a MAC address, - * like a serial line, the address must be supplied. - * - * Give the interface a chance to initialize if this is its first - * address, and to validate the address if necessary. - */ - if (ifp->if_ioctl != NULL && - (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (void *)ia))) { - ia->ia_addr = oldaddr; - splx(s); - return (error); - } - splx(s); - ia->ia_ifa.ifa_metric = ifp->if_metric; - - /* - * Add route for the network. - */ - if (scrub) { - ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr; - ipx_ifscrub(ifp, ia); - ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr; - } - if (ifp->if_flags & IFF_POINTOPOINT) - rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP); - else { - ia->ia_broadaddr.sipx_addr.x_net = ia->ia_addr.sipx_addr.x_net; - rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP); - } - ia->ia_flags |= IFA_ROUTE; - return (0); -} - -/* - * Return address info for specified internet network. - */ -struct ipx_ifaddr * -ipx_iaonnetof(struct ipx_addr *dst) -{ - struct ipx_ifaddr *ia; - struct ipx_addr *compare; - struct ifnet *ifp; - struct ipx_ifaddr *ia_maybe = NULL; - union ipx_net net = dst->x_net; - - IPX_IFADDR_LOCK_ASSERT(); - - TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) { - if ((ifp = ia->ia_ifp) != NULL) { - if (ifp->if_flags & IFF_POINTOPOINT) { - compare = &satoipx_addr(ia->ia_dstaddr); - if (ipx_hosteq(*dst, *compare)) - return (ia); - if (ipx_neteqnn(net, - ia->ia_addr.sipx_addr.x_net)) - ia_maybe = ia; - } else { - if (ipx_neteqnn(net, - ia->ia_addr.sipx_addr.x_net)) - return (ia); - } - } - } - return (ia_maybe); -} - -void -ipx_printhost(struct ipx_addr *addr) -{ - u_short port; - struct ipx_addr work = *addr; - char *p; u_char *q; - char *net = "", *host = ""; - char cport[10], chost[15], cnet[15]; - - port = ntohs(work.x_port); - - if (ipx_nullnet(work) && ipx_nullhost(work)) { - if (port) - printf("*.%x", port); - else - printf("*.*"); - - return; - } - - if (ipx_wildnet(work)) - net = "any"; - else if (ipx_nullnet(work)) - net = "*"; - else { - q = work.x_net.c_net; - snprintf(cnet, sizeof(cnet), "%x%x%x%x", - q[0], q[1], q[2], q[3]); - for (p = cnet; *p == '0' && p < cnet + 8; p++) - continue; - net = p; - } - - if (ipx_wildhost(work)) - host = "any"; - else if (ipx_nullhost(work)) - host = "*"; - else { - q = work.x_host.c_host; - snprintf(chost, sizeof(chost), "%x%x%x%x%x%x", - q[0], q[1], q[2], q[3], q[4], q[5]); - for (p = chost; *p == '0' && p < chost + 12; p++) - continue; - host = p; - } - - if (port) { - if (strcmp(host, "*") == 0) { - host = ""; - snprintf(cport, sizeof(cport), "%x", port); - } else - snprintf(cport, sizeof(cport), ".%x", port); - } else - *cport = 0; - - printf("%s.%s%s", net, host, cport); -} |