1*11566Ssam /* in.c 4.12 83/03/14 */ 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); 218937Sroot hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); 227159Ssam } 237159Ssam 247159Ssam inet_netmatch(sin1, sin2) 257159Ssam struct sockaddr_in *sin1, *sin2; 267159Ssam { 278595Sroot 28*11566Ssam return (in_netof(sin1->sin_addr) == in_netof(sin2->sin_addr)); 297159Ssam } 307159Ssam 317159Ssam /* 327159Ssam * Formulate an Internet address from network + host. Used in 337159Ssam * building addresses stored in the ifnet structure. 347159Ssam */ 357159Ssam struct in_addr 367159Ssam if_makeaddr(net, host) 377159Ssam int net, host; 387159Ssam { 397159Ssam u_long addr; 407159Ssam 417159Ssam if (net < 128) 428694Sroot addr = (net << IN_CLASSA_NSHIFT) | host; 437159Ssam else if (net < 65536) 448694Sroot addr = (net << IN_CLASSB_NSHIFT) | host; 457159Ssam else 468694Sroot addr = (net << IN_CLASSC_NSHIFT) | host; 477159Ssam addr = htonl(addr); 487159Ssam return (*(struct in_addr *)&addr); 497159Ssam } 507159Ssam 517159Ssam /* 528595Sroot * Return the network number from an internet address. 537159Ssam */ 547159Ssam in_netof(in) 557159Ssam struct in_addr in; 567159Ssam { 578937Sroot register u_long i = ntohl(in.s_addr); 587159Ssam 598595Sroot if (IN_CLASSA(i)) 608694Sroot return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); 618595Sroot else if (IN_CLASSB(i)) 628694Sroot return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); 638595Sroot else 648694Sroot return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); 657159Ssam } 667159Ssam 677159Ssam /* 688595Sroot * Return the host portion of an internet address. 697159Ssam */ 707159Ssam in_lnaof(in) 717159Ssam struct in_addr in; 727159Ssam { 738937Sroot register u_long i = ntohl(in.s_addr); 747159Ssam 758595Sroot if (IN_CLASSA(i)) 768694Sroot return ((i)&IN_CLASSA_HOST); 778595Sroot else if (IN_CLASSB(i)) 788694Sroot return ((i)&IN_CLASSB_HOST); 798595Sroot else 808694Sroot return ((i)&IN_CLASSC_HOST); 817159Ssam } 827159Ssam 837159Ssam /* 847159Ssam * Initialize an interface's routing 857159Ssam * table entry according to the network. 867159Ssam * INTERNET SPECIFIC. 877159Ssam */ 887159Ssam if_rtinit(ifp, flags) 897159Ssam register struct ifnet *ifp; 907159Ssam int flags; 917159Ssam { 927159Ssam struct sockaddr_in sin; 937159Ssam 947159Ssam if (ifp->if_flags & IFF_ROUTE) 957159Ssam return; 967159Ssam bzero((caddr_t)&sin, sizeof (sin)); 977159Ssam sin.sin_family = AF_INET; 98*11566Ssam sin.sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY); 998637Sroot rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags); 1007159Ssam } 1017159Ssam #endif 102