1*8694Sroot /* in.c 4.7 82/10/20 */ 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); 21*8694Sroot hp->afh_hosthash = sin->sin_addr.s_addr; 22*8694Sroot #if vax || pdp11 || ns16032 23*8694Sroot hp->afh_hosthash = ntohl((u_long)hp->afh_hosthash); 24*8694Sroot #else 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) 45*8694Sroot addr = (net << IN_CLASSA_NSHIFT) | host; 467159Ssam else if (net < 65536) 47*8694Sroot addr = (net << IN_CLASSB_NSHIFT) | host; 487159Ssam else 49*8694Sroot 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 { 62*8694Sroot register u_long i = in.s_addr; 637159Ssam 648595Sroot #ifdef vax || pdp11 || ns16032 658595Sroot i = ntohl(i); 668595Sroot #endif 678595Sroot if (IN_CLASSA(i)) 68*8694Sroot return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); 698595Sroot else if (IN_CLASSB(i)) 70*8694Sroot return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); 718595Sroot else 72*8694Sroot return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); 737159Ssam } 747159Ssam 757159Ssam /* 768595Sroot * Return the host portion of an internet address. 777159Ssam */ 787159Ssam in_lnaof(in) 797159Ssam struct in_addr in; 807159Ssam { 81*8694Sroot register u_long i = in.s_addr; 827159Ssam 838595Sroot #ifdef vax || pdp11 || ns16032 848595Sroot i = ntohl(i); 858595Sroot #endif 868595Sroot if (IN_CLASSA(i)) 87*8694Sroot return ((i)&IN_CLASSA_HOST); 888595Sroot else if (IN_CLASSB(i)) 89*8694Sroot return ((i)&IN_CLASSB_HOST); 908595Sroot else 91*8694Sroot return ((i)&IN_CLASSC_HOST); 927159Ssam } 937159Ssam 947159Ssam /* 957159Ssam * Initialize an interface's routing 967159Ssam * table entry according to the network. 977159Ssam * INTERNET SPECIFIC. 987159Ssam */ 997159Ssam if_rtinit(ifp, flags) 1007159Ssam register struct ifnet *ifp; 1017159Ssam int flags; 1027159Ssam { 1037159Ssam struct sockaddr_in sin; 1047159Ssam 1057159Ssam if (ifp->if_flags & IFF_ROUTE) 1067159Ssam return; 1077159Ssam bzero((caddr_t)&sin, sizeof (sin)); 1087159Ssam sin.sin_family = AF_INET; 1097159Ssam sin.sin_addr = if_makeaddr(ifp->if_net, 0); 1108637Sroot rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags); 1117159Ssam } 1127159Ssam #endif 113