diff options
author | julian <julian@FreeBSD.org> | 1995-10-26 21:28:30 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1995-10-26 21:28:30 +0000 |
commit | 08d0610487a6192a11d0803de49d2ed6e9dd16f7 (patch) | |
tree | b6b74427d5d1f5b58e8bf31836a53d1e4cf3c2c2 /usr.sbin/IPXrouted/af.c | |
parent | 90ae06d6ac1d2da3758389a70a20c91f3e9fd1dc (diff) | |
download | FreeBSD-src-08d0610487a6192a11d0803de49d2ed6e9dd16f7.zip FreeBSD-src-08d0610487a6192a11d0803de49d2ed6e9dd16f7.tar.gz |
Reviewed by: julian and Mike Mitchel
Submitted by: john Hay (John.Hay@csir.co.za)
John's IPXrouted..
this has not yet been seen to run correctly with Mike's IPX/SPX
code (he has his own)
bringing them both in is the first step in merging the two packages
for 2.2
Diffstat (limited to 'usr.sbin/IPXrouted/af.c')
-rw-r--r-- | usr.sbin/IPXrouted/af.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/usr.sbin/IPXrouted/af.c b/usr.sbin/IPXrouted/af.c new file mode 100644 index 0000000..28c231c --- /dev/null +++ b/usr.sbin/IPXrouted/af.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 1985, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 1995 John Hay. All rights reserved. + * + * This file includes significant work done at Cornell University by + * Bill Nesheim. That work included by permission. + * + * 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. + * + * $Id: af.c,v 1.4 1995/10/11 18:57:05 jhay Exp $ + */ + +#ifndef lint +static char sccsid[] = "@(#)af.c 8.1 (Berkeley) 6/5/93"; +#endif /* not lint */ + +#include "defs.h" + +/* + * Address family support routines + */ +af_hash_t null_hash; +af_netmatch_t null_netmatch; +af_output_t null_output; +af_portmatch_t null_portmatch; +af_portcheck_t null_portcheck; +af_checkhost_t null_checkhost; +af_ishost_t null_ishost; +af_canon_t null_canon; + +void ipxnet_hash(struct sockaddr_ipx *, struct afhash *); +int ipxnet_netmatch(struct sockaddr_ipx *, struct sockaddr_ipx *); +void ipxnet_output(int, int, struct sockaddr_ipx *, int); +int ipxnet_portmatch(struct sockaddr_ipx *); +int ipxnet_checkhost(struct sockaddr_ipx *); +int ipxnet_ishost(struct sockaddr_ipx *); +void ipxnet_canon(struct sockaddr_ipx *); + +#define NIL \ + { null_hash, null_netmatch, null_output, \ + null_portmatch, null_portcheck, null_checkhost, \ + null_ishost, null_canon } +#define IPXNET \ + { (af_hash_t *)ipxnet_hash, \ + (af_netmatch_t *)ipxnet_netmatch, \ + (af_output_t *)ipxnet_output, \ + (af_portmatch_t *)ipxnet_portmatch, \ + (af_portcheck_t *)ipxnet_portmatch, \ + (af_checkhost_t *)ipxnet_checkhost, \ + (af_ishost_t *)ipxnet_ishost, \ + (af_canon_t *)ipxnet_canon } + +struct afswitch afswitch[AF_MAX] = + { NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, + NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, + NIL, NIL, NIL, IPXNET, NIL, NIL }; + +struct sockaddr_ipx ipxnet_default = { sizeof(struct sockaddr_ipx), AF_IPX }; + +union ipx_net ipx_anynet; +union ipx_net ipx_zeronet; + +void +ipxnet_hash(sipx, hp) + register struct sockaddr_ipx *sipx; + struct afhash *hp; +{ + register long hash = 0; + register u_short *s = sipx->sipx_addr.x_host.s_host; + union ipx_net_u net; + + net.net_e = sipx->sipx_addr.x_net; + hp->afh_nethash = net.long_e; + hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s; + hp->afh_hosthash = hash; +} + +int +ipxnet_netmatch(sxn1, sxn2) + struct sockaddr_ipx *sxn1, *sxn2; +{ + return (ipx_neteq(sxn1->sipx_addr, sxn2->sipx_addr)); +} + +/* + * Verify the message is from the right port. + */ +int +ipxnet_portmatch(sipx) + register struct sockaddr_ipx *sipx; +{ + + return (ntohs(sipx->sipx_addr.x_port) == IPXPORT_RIP ); +} + + +/* + * ipx output routine. + */ +#ifdef DEBUG +int do_output = 0; +#endif +void +ipxnet_output(s, flags, sipx, size) + int s; + int flags; + struct sockaddr_ipx *sipx; + int size; +{ + struct sockaddr_ipx dst; + + dst = *sipx; + sipx = &dst; + if (sipx->sipx_addr.x_port == 0) + sipx->sipx_addr.x_port = htons(IPXPORT_RIP); +#ifdef DEBUG + if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST) +#endif + /* + * Kludge to allow us to get routes out to machines that + * don't know their addresses yet; send to that address on + * ALL connected nets + */ + if (ipx_neteqnn(sipx->sipx_addr.x_net, ipx_zeronet)) { + extern struct interface *ifnet; + register struct interface *ifp; + + for (ifp = ifnet; ifp; ifp = ifp->int_next) { + sipx->sipx_addr.x_net = + satoipx_addr(ifp->int_addr).x_net; + (void) sendto(s, msg, size, flags, + (struct sockaddr *)sipx, sizeof (*sipx)); + } + return; + } + + (void) sendto(s, msg, size, flags, + (struct sockaddr *)sipx, sizeof (*sipx)); +} + +/* + * Return 1 if we want this route. + * We use this to disallow route net G entries for one for multiple + * point to point links. + */ +int +ipxnet_checkhost(sipx) + struct sockaddr_ipx *sipx; +{ + register struct interface *ifp = if_ifwithnet((struct sockaddr *)sipx); + /* + * We want this route if there is no more than one + * point to point interface with this network. + */ + if (ifp == 0 || (ifp->int_flags & IFF_POINTOPOINT)==0) return (1); + return (ifp->int_sq.n == ifp->int_sq.p); +} + +/* + * Return 1 if the address is + * for a host, 0 for a network. + */ +int +ipxnet_ishost(sipx) +struct sockaddr_ipx *sipx; +{ + register u_short *s = sipx->sipx_addr.x_host.s_host; + + if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff)) + return (0); + else + return (1); +} + +void +ipxnet_canon(sipx) + struct sockaddr_ipx *sipx; +{ + + sipx->sipx_addr.x_port = 0; +} + +void +null_hash(addr, hp) + struct sockaddr *addr; + struct afhash *hp; +{ + + hp->afh_nethash = hp->afh_hosthash = 0; +} + +int +null_netmatch(a1, a2) + struct sockaddr *a1, *a2; +{ + + return (0); +} + +void +null_output(s, f, a1, n) + int s; + int f; + struct sockaddr *a1; + int n; +{ + + ; +} + +int +null_portmatch(a1) + struct sockaddr *a1; +{ + + return (0); +} + +int +null_portcheck(a1) + struct sockaddr *a1; +{ + + return (0); +} + +int +null_ishost(a1) + struct sockaddr *a1; +{ + + return (0); +} + +int +null_checkhost(a1) + struct sockaddr *a1; +{ + + return (0); +} + +void +null_canon(a1) + struct sockaddr *a1; +{ + + ; +} + |