1 /* in.c 4.5 82/10/17 */ 2 3 #include "../h/param.h" 4 #include "../h/mbuf.h" 5 #include "../h/protosw.h" 6 #include "../h/socket.h" 7 #include "../h/socketvar.h" 8 #include "../netinet/in.h" 9 #include "../netinet/in_systm.h" 10 #include "../net/if.h" 11 #include "../net/route.h" 12 #include "../net/af.h" 13 14 #ifdef INET 15 inet_hash(sin, hp) 16 register struct sockaddr_in *sin; 17 struct afhash *hp; 18 { 19 20 hp->afh_nethash = in_netof(sin->sin_addr); 21 hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); 22 } 23 24 inet_netmatch(sin1, sin2) 25 struct sockaddr_in *sin1, *sin2; 26 { 27 28 return (sin1->sin_addr.s_net == sin2->sin_addr.s_net); 29 } 30 31 /* 32 * Formulate an Internet address from network + host. Used in 33 * building addresses stored in the ifnet structure. 34 */ 35 struct in_addr 36 if_makeaddr(net, host) 37 int net, host; 38 { 39 u_long addr; 40 41 if (net < 128) 42 addr = (net << IN_CLASSANSHIFT) | host; 43 else if (net < 65536) 44 addr = (net << IN_CLASSBNSHIFT) | host; 45 else 46 addr = (net << IN_CLASSCNSHIFT) | host; 47 #ifdef vax || pdp11 || ns16032 48 addr = htonl(addr); 49 #endif 50 return (*(struct in_addr *)&addr); 51 } 52 53 /* 54 * Return the network number from an internet address. 55 */ 56 in_netof(in) 57 struct in_addr in; 58 { 59 register u_int i = in.s_addr; 60 61 #ifdef vax || pdp11 || ns16032 62 i = ntohl(i); 63 #endif 64 if (IN_CLASSA(i)) 65 return (((i)&IN_CLASSANET) >> IN_CLASSANSHIFT); 66 else if (IN_CLASSB(i)) 67 return (((i)&IN_CLASSBNET) >> IN_CLASSBNSHIFT); 68 else 69 return (((i)&IN_CLASSCNET) >> IN_CLASSCNSHIFT); 70 } 71 72 /* 73 * Return the host portion of an internet address. 74 */ 75 in_lnaof(in) 76 struct in_addr in; 77 { 78 register u_int i = in.s_addr; 79 80 #ifdef vax || pdp11 || ns16032 81 i = ntohl(i); 82 #endif 83 if (IN_CLASSA(i)) 84 return ((i)&IN_CLASSAHOST); 85 else if (IN_CLASSB(i)) 86 return ((i)&IN_CLASSBHOST); 87 else 88 return ((i)&IN_CLASSCHOST); 89 } 90 91 /* 92 * Initialize an interface's routing 93 * table entry according to the network. 94 * INTERNET SPECIFIC. 95 */ 96 if_rtinit(ifp, flags) 97 register struct ifnet *ifp; 98 int flags; 99 { 100 struct sockaddr_in sin; 101 102 if (ifp->if_flags & IFF_ROUTE) 103 return; 104 bzero((caddr_t)&sin, sizeof (sin)); 105 sin.sin_family = AF_INET; 106 sin.sin_addr = if_makeaddr(ifp->if_net, 0); 107 rtinit(&sin, &ifp->if_addr, flags); 108 } 109 #endif 110