1*8775Sroot /* in.c 4.9 82/10/21 */ 27159Ssam 37159Ssam #include "../h/param.h" 47159Ssam #include "../h/mbuf.h" 57159Ssam #include "../h/protosw.h" 67159Ssam #include "../h/socket.h" 77159Ssam #include "../h/socketvar.h" 88397Swnj #include "../netinet/in.h" 98397Swnj #include "../netinet/in_systm.h" 107166Ssam #include "../net/if.h" 117166Ssam #include "../net/route.h" 127159Ssam #include "../net/af.h" 137159Ssam 147159Ssam #ifdef INET 157159Ssam inet_hash(sin, hp) 167159Ssam register struct sockaddr_in *sin; 177159Ssam struct afhash *hp; 187159Ssam { 198595Sroot 207159Ssam hp->afh_nethash = in_netof(sin->sin_addr); 218694Sroot hp->afh_hosthash = sin->sin_addr.s_addr; 228694Sroot #if vax || pdp11 || ns16032 238694Sroot hp->afh_hosthash = ntohl((u_long)hp->afh_hosthash); 24*8775Sroot #endif 257159Ssam } 267159Ssam 277159Ssam inet_netmatch(sin1, sin2) 287159Ssam struct sockaddr_in *sin1, *sin2; 297159Ssam { 308595Sroot 317159Ssam return (sin1->sin_addr.s_net == sin2->sin_addr.s_net); 327159Ssam } 337159Ssam 347159Ssam /* 357159Ssam * Formulate an Internet address from network + host. Used in 367159Ssam * building addresses stored in the ifnet structure. 377159Ssam */ 387159Ssam struct in_addr 397159Ssam if_makeaddr(net, host) 407159Ssam int net, host; 417159Ssam { 427159Ssam u_long addr; 437159Ssam 447159Ssam if (net < 128) 458694Sroot addr = (net << IN_CLASSA_NSHIFT) | host; 467159Ssam else if (net < 65536) 478694Sroot addr = (net << IN_CLASSB_NSHIFT) | host; 487159Ssam else 498694Sroot addr = (net << IN_CLASSC_NSHIFT) | host; 508595Sroot #ifdef vax || pdp11 || ns16032 517159Ssam addr = htonl(addr); 527159Ssam #endif 537159Ssam return (*(struct in_addr *)&addr); 547159Ssam } 557159Ssam 567159Ssam /* 578595Sroot * Return the network number from an internet address. 587159Ssam */ 597159Ssam in_netof(in) 607159Ssam struct in_addr in; 617159Ssam { 628694Sroot register u_long i = in.s_addr; 637159Ssam 648595Sroot #ifdef vax || pdp11 || ns16032 658595Sroot i = ntohl(i); 668595Sroot #endif 678595Sroot if (IN_CLASSA(i)) 688694Sroot return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); 698595Sroot else if (IN_CLASSB(i)) 708694Sroot return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); 718595Sroot else 728694Sroot return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); 737159Ssam } 747159Ssam 75*8775Sroot #ifdef notdef 767159Ssam /* 778595Sroot * Return the host portion of an internet address. 787159Ssam */ 797159Ssam in_lnaof(in) 807159Ssam struct in_addr in; 817159Ssam { 828694Sroot register u_long i = in.s_addr; 837159Ssam 848595Sroot #ifdef vax || pdp11 || ns16032 858595Sroot i = ntohl(i); 868595Sroot #endif 878595Sroot if (IN_CLASSA(i)) 888694Sroot return ((i)&IN_CLASSA_HOST); 898595Sroot else if (IN_CLASSB(i)) 908694Sroot return ((i)&IN_CLASSB_HOST); 918595Sroot else 928694Sroot return ((i)&IN_CLASSC_HOST); 937159Ssam } 948724Sroot #endif 957159Ssam 967159Ssam /* 977159Ssam * Initialize an interface's routing 987159Ssam * table entry according to the network. 997159Ssam * INTERNET SPECIFIC. 1007159Ssam */ 1017159Ssam if_rtinit(ifp, flags) 1027159Ssam register struct ifnet *ifp; 1037159Ssam int flags; 1047159Ssam { 1057159Ssam struct sockaddr_in sin; 1067159Ssam 1077159Ssam if (ifp->if_flags & IFF_ROUTE) 1087159Ssam return; 1097159Ssam bzero((caddr_t)&sin, sizeof (sin)); 1107159Ssam sin.sin_family = AF_INET; 1117159Ssam sin.sin_addr = if_makeaddr(ifp->if_net, 0); 1128637Sroot rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags); 1137159Ssam } 1147159Ssam #endif 115