SCCS-vsn: sbin/routed/inet.c 4.2
-static char *sccsid[] = "@(#)inet.c 4.1 (Berkeley) %G%";
+static char *sccsid[] = "@(#)inet.c 4.2 (Berkeley) %G%";
#endif
/*
* Temporarily, copy these routines from the kernel,
#endif
/*
* Temporarily, copy these routines from the kernel,
struct in_addr in;
{
register u_long i = ntohl(in.s_addr);
struct in_addr in;
{
register u_long i = ntohl(in.s_addr);
+ register u_long net, subnet;
+ register struct interface *ifp;
+ extern struct interface *ifnet;
- net = ((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
- if (IN_SUBNETA(i) && inet_localnet(net))
- return (((i)&IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT);
- else
+ net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+ if (IN_SUBNETA(i)) {
+ subnet = (i & IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT;
+ /* Fall through and check whether a subnet */
+ } else
return (net);
} else if (IN_CLASSB(i)) {
return (net);
} else if (IN_CLASSB(i)) {
- net = ((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
- if (IN_SUBNETB(i) && inet_localnet(net))
- return (((i)&IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT);
- else
+ net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+ if (IN_SUBNETB(i)) {
+ subnet = (i & IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT;
+ /* Fall through and check whether a subnet */
+ } else
- return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+ return ((i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+ }
+
+ /*
+ * Check whether network is a subnet of a `local' network;
+ * if so, return subnet number.
+ */
+ for (ifp = ifnet; ifp; ifp = ifp->int_next) {
+ if (ifp->int_flags & IFF_LOCAL) {
+ if (ifp->int_net == net)
+ return (subnet);
+ if ((ifp->int_net >> SUBNETSHIFT) == net)
+ return (subnet);
+ }
struct in_addr in;
{
register u_long i = ntohl(in.s_addr);
struct in_addr in;
{
register u_long i = ntohl(in.s_addr);
+ register u_long net, host, subhost;
+ register struct interface *ifp;
- if (IN_SUBNETA(i) &&
- inet_localnet(((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT))
- return ((i)&IN_CLASSA_SUBHOST);
- else
- return ((i)&IN_CLASSA_HOST);
+ if (IN_SUBNETA(i)) {
+ net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+ host = i & IN_CLASSA_HOST;
+ subhost = i & IN_CLASSA_SUBHOST;
+ /* Fall through and check whether a subnet */
+ } else
+ return (i & IN_CLASSA_HOST);
} else if (IN_CLASSB(i)) {
} else if (IN_CLASSB(i)) {
- if (IN_SUBNETB(i) &&
- inet_localnet(((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT))
- return ((i)&IN_CLASSB_SUBHOST);
- else
- return ((i)&IN_CLASSB_HOST);
+ if (IN_SUBNETB(i)) {
+ net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+ host = i & IN_CLASSB_HOST;
+ subhost = i & IN_CLASSB_SUBHOST;
+ /* Fall through and check whether a subnet */
+ } else
+ return (i & IN_CLASSB_HOST);
- return ((i)&IN_CLASSC_HOST);
+ return (i & IN_CLASSC_HOST);
-}
-
-/*
- * Return true if the network is a ``local'' net
- * (one for which we can interpret the host part).
- */
-inet_localnet(net)
- register int net;
-{
- register struct interface *ifp;
- extern struct interface *ifnet;
+ /*
+ * Check whether network is a subnet of a `local' network;
+ * if so, use the modified interpretation of `host'.
+ */
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
if (ifp->int_flags & IFF_LOCAL) {
if (ifp->int_net == net)
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
if (ifp->int_flags & IFF_LOCAL) {
if (ifp->int_net == net)
if ((ifp->int_net >> SUBNETSHIFT) == net)
if ((ifp->int_net >> SUBNETSHIFT) == net)