116395Skarels #ifndef lint 2*16429Skarels static char *sccsid[] = "@(#)inet.c 4.2 (Berkeley) 05/01/84"; 316395Skarels #endif 416395Skarels /* 516395Skarels * Temporarily, copy these routines from the kernel, 616395Skarels * as we need to know about subnets. 716395Skarels */ 816395Skarels #include "defs.h" 916395Skarels 1016395Skarels /* 1116395Skarels * Formulate an Internet address from network + host. Used in 1216395Skarels * building addresses stored in the ifnet structure. 1316395Skarels */ 1416395Skarels struct in_addr 1516395Skarels if_makeaddr(net, host) 1616395Skarels int net, host; 1716395Skarels { 1816395Skarels u_long addr; 1916395Skarels 2016395Skarels if (net < IN_CLASSA_MAX) 2116395Skarels addr = (net << IN_CLASSA_NSHIFT) | host; 2216395Skarels else if (net < IN_CLASSB_MAX) 2316395Skarels addr = (net << IN_CLASSB_NSHIFT) | host; 2416395Skarels else 2516395Skarels addr = (net << IN_CLASSC_NSHIFT) | host; 2616395Skarels addr = htonl(addr); 2716395Skarels return (*(struct in_addr *)&addr); 2816395Skarels } 2916395Skarels 3016395Skarels /* 3116395Skarels * Return the network number from an internet address. 3216395Skarels */ 3316395Skarels inet_netof(in) 3416395Skarels struct in_addr in; 3516395Skarels { 3616395Skarels register u_long i = ntohl(in.s_addr); 37*16429Skarels register u_long net, subnet; 38*16429Skarels register struct interface *ifp; 39*16429Skarels extern struct interface *ifnet; 4016395Skarels 4116395Skarels if (IN_CLASSA(i)) { 42*16429Skarels net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT; 43*16429Skarels if (IN_SUBNETA(i)) { 44*16429Skarels subnet = (i & IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT; 45*16429Skarels /* Fall through and check whether a subnet */ 46*16429Skarels } else 4716395Skarels return (net); 4816395Skarels } else if (IN_CLASSB(i)) { 49*16429Skarels net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT; 50*16429Skarels if (IN_SUBNETB(i)) { 51*16429Skarels subnet = (i & IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT; 52*16429Skarels /* Fall through and check whether a subnet */ 53*16429Skarels } else 5416395Skarels return (net); 5516395Skarels } else { 56*16429Skarels return ((i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); 5716395Skarels } 58*16429Skarels 59*16429Skarels /* 60*16429Skarels * Check whether network is a subnet of a `local' network; 61*16429Skarels * if so, return subnet number. 62*16429Skarels */ 63*16429Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) { 64*16429Skarels if (ifp->int_flags & IFF_LOCAL) { 65*16429Skarels if (ifp->int_net == net) 66*16429Skarels return (subnet); 67*16429Skarels if ((ifp->int_net >> SUBNETSHIFT) == net) 68*16429Skarels return (subnet); 69*16429Skarels } 70*16429Skarels } 71*16429Skarels return (net); 7216395Skarels } 7316395Skarels 7416395Skarels /* 7516395Skarels * Return the host portion of an internet address. 7616395Skarels */ 7716395Skarels inet_lnaof(in) 7816395Skarels struct in_addr in; 7916395Skarels { 8016395Skarels register u_long i = ntohl(in.s_addr); 81*16429Skarels register u_long net, host, subhost; 82*16429Skarels register struct interface *ifp; 8316395Skarels 8416395Skarels if (IN_CLASSA(i)) { 85*16429Skarels if (IN_SUBNETA(i)) { 86*16429Skarels net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT; 87*16429Skarels host = i & IN_CLASSA_HOST; 88*16429Skarels subhost = i & IN_CLASSA_SUBHOST; 89*16429Skarels /* Fall through and check whether a subnet */ 90*16429Skarels } else 91*16429Skarels return (i & IN_CLASSA_HOST); 9216395Skarels } else if (IN_CLASSB(i)) { 93*16429Skarels if (IN_SUBNETB(i)) { 94*16429Skarels net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT; 95*16429Skarels host = i & IN_CLASSB_HOST; 96*16429Skarels subhost = i & IN_CLASSB_SUBHOST; 97*16429Skarels /* Fall through and check whether a subnet */ 98*16429Skarels } else 99*16429Skarels return (i & IN_CLASSB_HOST); 10016395Skarels } else { 101*16429Skarels return (i & IN_CLASSC_HOST); 10216395Skarels } 10316395Skarels 104*16429Skarels /* 105*16429Skarels * Check whether network is a subnet of a `local' network; 106*16429Skarels * if so, use the modified interpretation of `host'. 107*16429Skarels */ 10816395Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) { 10916395Skarels if (ifp->int_flags & IFF_LOCAL) { 11016395Skarels if (ifp->int_net == net) 111*16429Skarels return (subhost); 11216395Skarels if ((ifp->int_net >> SUBNETSHIFT) == net) 113*16429Skarels return (subhost); 11416395Skarels } 11516395Skarels } 116*16429Skarels return (host); 11716395Skarels } 118