1*16395Skarels #ifndef lint 2*16395Skarels static char *sccsid[] = "@(#)inet.c 4.1 (Berkeley) 04/16/84"; 3*16395Skarels #endif 4*16395Skarels /* 5*16395Skarels * Temporarily, copy these routines from the kernel, 6*16395Skarels * as we need to know about subnets. 7*16395Skarels */ 8*16395Skarels #include "defs.h" 9*16395Skarels 10*16395Skarels /* 11*16395Skarels * Formulate an Internet address from network + host. Used in 12*16395Skarels * building addresses stored in the ifnet structure. 13*16395Skarels */ 14*16395Skarels struct in_addr 15*16395Skarels if_makeaddr(net, host) 16*16395Skarels int net, host; 17*16395Skarels { 18*16395Skarels u_long addr; 19*16395Skarels 20*16395Skarels if (net < IN_CLASSA_MAX) 21*16395Skarels addr = (net << IN_CLASSA_NSHIFT) | host; 22*16395Skarels else if (net < IN_CLASSB_MAX) 23*16395Skarels addr = (net << IN_CLASSB_NSHIFT) | host; 24*16395Skarels else 25*16395Skarels addr = (net << IN_CLASSC_NSHIFT) | host; 26*16395Skarels addr = htonl(addr); 27*16395Skarels return (*(struct in_addr *)&addr); 28*16395Skarels } 29*16395Skarels 30*16395Skarels /* 31*16395Skarels * Return the network number from an internet address. 32*16395Skarels */ 33*16395Skarels inet_netof(in) 34*16395Skarels struct in_addr in; 35*16395Skarels { 36*16395Skarels register u_long i = ntohl(in.s_addr); 37*16395Skarels register net; 38*16395Skarels 39*16395Skarels if (IN_CLASSA(i)) { 40*16395Skarels net = ((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT; 41*16395Skarels if (IN_SUBNETA(i) && inet_localnet(net)) 42*16395Skarels return (((i)&IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT); 43*16395Skarels else 44*16395Skarels return (net); 45*16395Skarels } else if (IN_CLASSB(i)) { 46*16395Skarels net = ((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT; 47*16395Skarels if (IN_SUBNETB(i) && inet_localnet(net)) 48*16395Skarels return (((i)&IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT); 49*16395Skarels else 50*16395Skarels return (net); 51*16395Skarels } else { 52*16395Skarels return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); 53*16395Skarels } 54*16395Skarels } 55*16395Skarels 56*16395Skarels /* 57*16395Skarels * Return the host portion of an internet address. 58*16395Skarels */ 59*16395Skarels inet_lnaof(in) 60*16395Skarels struct in_addr in; 61*16395Skarels { 62*16395Skarels register u_long i = ntohl(in.s_addr); 63*16395Skarels 64*16395Skarels if (IN_CLASSA(i)) { 65*16395Skarels if (IN_SUBNETA(i) && 66*16395Skarels inet_localnet(((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT)) 67*16395Skarels return ((i)&IN_CLASSA_SUBHOST); 68*16395Skarels else 69*16395Skarels return ((i)&IN_CLASSA_HOST); 70*16395Skarels } else if (IN_CLASSB(i)) { 71*16395Skarels if (IN_SUBNETB(i) && 72*16395Skarels inet_localnet(((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT)) 73*16395Skarels return ((i)&IN_CLASSB_SUBHOST); 74*16395Skarels else 75*16395Skarels return ((i)&IN_CLASSB_HOST); 76*16395Skarels } else { 77*16395Skarels return ((i)&IN_CLASSC_HOST); 78*16395Skarels } 79*16395Skarels } 80*16395Skarels 81*16395Skarels /* 82*16395Skarels * Return true if the network is a ``local'' net 83*16395Skarels * (one for which we can interpret the host part). 84*16395Skarels */ 85*16395Skarels inet_localnet(net) 86*16395Skarels register int net; 87*16395Skarels { 88*16395Skarels register struct interface *ifp; 89*16395Skarels extern struct interface *ifnet; 90*16395Skarels 91*16395Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) { 92*16395Skarels if (ifp->int_flags & IFF_LOCAL) { 93*16395Skarels if (ifp->int_net == net) 94*16395Skarels return (1); 95*16395Skarels if ((ifp->int_net >> SUBNETSHIFT) == net) 96*16395Skarels return (1); 97*16395Skarels } 98*16395Skarels } 99*16395Skarels return (0); 100*16395Skarels } 101