116395Skarels #ifndef lint 2*21846Skarels static char *sccsid[] = "@(#)inet.c 4.3 (Berkeley) 06/03/85"; 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 10*21846Skarels extern struct interface *ifnet; 11*21846Skarels 1216395Skarels /* 13*21846Skarels * Formulate an Internet address from network + host. 1416395Skarels */ 1516395Skarels struct in_addr 16*21846Skarels inet_makeaddr(net, host) 17*21846Skarels u_long net, host; 1816395Skarels { 19*21846Skarels register struct interface *ifp; 20*21846Skarels register u_long mask; 2116395Skarels u_long addr; 2216395Skarels 23*21846Skarels if (IN_CLASSA(net)) 24*21846Skarels mask = IN_CLASSA_HOST; 25*21846Skarels else if (IN_CLASSB(net)) 26*21846Skarels mask = IN_CLASSB_HOST; 2716395Skarels else 28*21846Skarels mask = IN_CLASSC_HOST; 29*21846Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) 30*21846Skarels if ((ifp->int_netmask & net) == ifp->int_net) { 31*21846Skarels mask = ~ifp->int_subnetmask; 32*21846Skarels break; 33*21846Skarels } 34*21846Skarels addr = net | (host & mask); 3516395Skarels addr = htonl(addr); 3616395Skarels return (*(struct in_addr *)&addr); 3716395Skarels } 3816395Skarels 3916395Skarels /* 4016395Skarels * Return the network number from an internet address. 4116395Skarels */ 4216395Skarels inet_netof(in) 4316395Skarels struct in_addr in; 4416395Skarels { 4516395Skarels register u_long i = ntohl(in.s_addr); 46*21846Skarels register u_long net; 4716429Skarels register struct interface *ifp; 4816395Skarels 49*21846Skarels if (IN_CLASSA(i)) 50*21846Skarels net = i & IN_CLASSA_NET; 51*21846Skarels else if (IN_CLASSB(i)) 52*21846Skarels net = i & IN_CLASSB_NET; 53*21846Skarels else 54*21846Skarels net = i & IN_CLASSC_NET; 5516429Skarels 5616429Skarels /* 57*21846Skarels * Check whether network is a subnet; 5816429Skarels * if so, return subnet number. 5916429Skarels */ 60*21846Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) 61*21846Skarels if ((ifp->int_netmask & net) == ifp->int_net) 62*21846Skarels return (i & ifp->int_subnetmask); 6316429Skarels return (net); 6416395Skarels } 6516395Skarels 6616395Skarels /* 6716395Skarels * Return the host portion of an internet address. 6816395Skarels */ 6916395Skarels inet_lnaof(in) 7016395Skarels struct in_addr in; 7116395Skarels { 7216395Skarels register u_long i = ntohl(in.s_addr); 73*21846Skarels register u_long net, host; 7416429Skarels register struct interface *ifp; 7516395Skarels 7616395Skarels if (IN_CLASSA(i)) { 77*21846Skarels net = i & IN_CLASSA_NET; 78*21846Skarels host = i & IN_CLASSA_HOST; 7916395Skarels } else if (IN_CLASSB(i)) { 80*21846Skarels net = i & IN_CLASSB_NET; 81*21846Skarels host = i & IN_CLASSB_HOST; 8216395Skarels } else { 83*21846Skarels net = i & IN_CLASSC_NET; 84*21846Skarels host = i & IN_CLASSC_HOST; 8516395Skarels } 8616395Skarels 8716429Skarels /* 88*21846Skarels * Check whether network is a subnet; 8916429Skarels * if so, use the modified interpretation of `host'. 9016429Skarels */ 91*21846Skarels for (ifp = ifnet; ifp; ifp = ifp->int_next) 92*21846Skarels if ((ifp->int_netmask & net) == ifp->int_net) 93*21846Skarels return (host &~ ifp->int_subnetmask); 9416429Skarels return (host); 9516395Skarels } 96