1 /* in.c 4.7 82/10/20 */ 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 = sin->sin_addr.s_addr; 22 #if vax || pdp11 || ns16032 23 hp->afh_hosthash = ntohl((u_long)hp->afh_hosthash); 24 #else 25 } 26 27 inet_netmatch(sin1, sin2) 28 struct sockaddr_in *sin1, *sin2; 29 { 30 31 return (sin1->sin_addr.s_net == sin2->sin_addr.s_net); 32 } 33 34 /* 35 * Formulate an Internet address from network + host. Used in 36 * building addresses stored in the ifnet structure. 37 */ 38 struct in_addr 39 if_makeaddr(net, host) 40 int net, host; 41 { 42 u_long addr; 43 44 if (net < 128) 45 addr = (net << IN_CLASSA_NSHIFT) | host; 46 else if (net < 65536) 47 addr = (net << IN_CLASSB_NSHIFT) | host; 48 else 49 addr = (net << IN_CLASSC_NSHIFT) | host; 50 #ifdef vax || pdp11 || ns16032 51 addr = htonl(addr); 52 #endif 53 return (*(struct in_addr *)&addr); 54 } 55 56 /* 57 * Return the network number from an internet address. 58 */ 59 in_netof(in) 60 struct in_addr in; 61 { 62 register u_long i = in.s_addr; 63 64 #ifdef vax || pdp11 || ns16032 65 i = ntohl(i); 66 #endif 67 if (IN_CLASSA(i)) 68 return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); 69 else if (IN_CLASSB(i)) 70 return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); 71 else 72 return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); 73 } 74 75 /* 76 * Return the host portion of an internet address. 77 */ 78 in_lnaof(in) 79 struct in_addr in; 80 { 81 register u_long i = in.s_addr; 82 83 #ifdef vax || pdp11 || ns16032 84 i = ntohl(i); 85 #endif 86 if (IN_CLASSA(i)) 87 return ((i)&IN_CLASSA_HOST); 88 else if (IN_CLASSB(i)) 89 return ((i)&IN_CLASSB_HOST); 90 else 91 return ((i)&IN_CLASSC_HOST); 92 } 93 94 /* 95 * Initialize an interface's routing 96 * table entry according to the network. 97 * INTERNET SPECIFIC. 98 */ 99 if_rtinit(ifp, flags) 100 register struct ifnet *ifp; 101 int flags; 102 { 103 struct sockaddr_in sin; 104 105 if (ifp->if_flags & IFF_ROUTE) 106 return; 107 bzero((caddr_t)&sin, sizeof (sin)); 108 sin.sin_family = AF_INET; 109 sin.sin_addr = if_makeaddr(ifp->if_net, 0); 110 rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags); 111 } 112 #endif 113