X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/4fad5a6eeb6297fea5e2a7c10ee0fe5db9cd1192..f5bd3952d99406fd9279c21216b6694d630150ed:/usr/src/sbin/routed/inet.c diff --git a/usr/src/sbin/routed/inet.c b/usr/src/sbin/routed/inet.c index 3e688cbbf4..ab32ac8bc8 100644 --- a/usr/src/sbin/routed/inet.c +++ b/usr/src/sbin/routed/inet.c @@ -1,12 +1,23 @@ /* * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. The Berkeley software License Agreement - * specifies the terms and conditions for redistribution. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint -static char sccsid[] = "@(#)inet.c 5.2 (Berkeley) %G%"; -#endif not lint +static char sccsid[] = "@(#)inet.c 5.7 (Berkeley) %G%"; +#endif /* not lint */ /* * Temporarily, copy these routines from the kernel, @@ -124,44 +135,64 @@ inet_rtflags(sin) host = i & IN_CLASSC_HOST; } - if (host == 0) - return (0); /* network */ /* * Check whether this network is subnetted; * if so, check whether this is a subnet or a host. */ for (ifp = ifnet; ifp; ifp = ifp->int_next) if (net == ifp->int_net) { - if ((host &~ ifp->int_subnetmask) == 0) + if (host &~ ifp->int_subnetmask) + return (RTF_HOST); + else if (ifp->int_subnetmask != ifp->int_netmask) return (RTF_SUBNET); else - return (RTF_HOST); + return (0); /* network */ } - return (RTF_HOST); + if (host == 0) + return (0); /* network */ + else + return (RTF_HOST); } /* - * Return true if a route to subnet rtsin should be sent to dst. - * Send it only if dst is on the same logical network, - * or the route turns out to be for the net (aka subnet 0). + * Return true if a route to subnet/host of route rt should be sent to dst. + * Send it only if dst is on the same logical network if not "internal", + * otherwise only if the route is the "internal" route for the logical net. */ -inet_sendsubnet(rtsin, dst) - struct sockaddr_in *rtsin, *dst; +inet_sendroute(rt, dst) + struct rt_entry *rt; + struct sockaddr_in *dst; { - register u_long rt = ntohl(rtsin->sin_addr.s_addr); + register u_long r = + ntohl(((struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr); register u_long d = ntohl(dst->sin_addr.s_addr); - if (IN_CLASSA(rt)) { - if ((rt & IN_CLASSA_HOST) == 0) + if (IN_CLASSA(r)) { + if ((r & IN_CLASSA_NET) == (d & IN_CLASSA_NET)) { + if ((r & IN_CLASSA_HOST) == 0) + return ((rt->rt_state & RTS_INTERNAL) == 0); return (1); - return ((rt & IN_CLASSA_NET) == (d & IN_CLASSA_NET)); - } else if (IN_CLASSB(rt)) { - if ((rt & IN_CLASSB_HOST) == 0) + } + if (r & IN_CLASSA_HOST) + return (0); + return ((rt->rt_state & RTS_INTERNAL) != 0); + } else if (IN_CLASSB(r)) { + if ((r & IN_CLASSB_NET) == (d & IN_CLASSB_NET)) { + if ((r & IN_CLASSB_HOST) == 0) + return ((rt->rt_state & RTS_INTERNAL) == 0); return (1); - return ((rt & IN_CLASSB_NET) == (d & IN_CLASSB_NET)); + } + if (r & IN_CLASSB_HOST) + return (0); + return ((rt->rt_state & RTS_INTERNAL) != 0); } else { - if ((rt & IN_CLASSC_HOST) == 0) + if ((r & IN_CLASSC_NET) == (d & IN_CLASSC_NET)) { + if ((r & IN_CLASSC_HOST) == 0) + return ((rt->rt_state & RTS_INTERNAL) == 0); return (1); - return ((rt & IN_CLASSC_NET) == (d & IN_CLASSC_NET)); + } + if (r & IN_CLASSC_HOST) + return (0); + return ((rt->rt_state & RTS_INTERNAL) != 0); } }