1*8637Sroot /* in.c 4.6 82/10/17 */ 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); 217159Ssam hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); 227159Ssam } 237159Ssam 247159Ssam inet_netmatch(sin1, sin2) 257159Ssam struct sockaddr_in *sin1, *sin2; 267159Ssam { 278595Sroot 287159Ssam return (sin1->sin_addr.s_net == sin2->sin_addr.s_net); 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) 428595Sroot addr = (net << IN_CLASSANSHIFT) | host; 437159Ssam else if (net < 65536) 448595Sroot addr = (net << IN_CLASSBNSHIFT) | host; 457159Ssam else 468595Sroot addr = (net << IN_CLASSCNSHIFT) | host; 478595Sroot #ifdef vax || pdp11 || ns16032 487159Ssam addr = htonl(addr); 497159Ssam #endif 507159Ssam return (*(struct in_addr *)&addr); 517159Ssam } 527159Ssam 537159Ssam /* 548595Sroot * Return the network number from an internet address. 557159Ssam */ 567159Ssam in_netof(in) 577159Ssam struct in_addr in; 587159Ssam { 598595Sroot register u_int i = in.s_addr; 607159Ssam 618595Sroot #ifdef vax || pdp11 || ns16032 628595Sroot i = ntohl(i); 638595Sroot #endif 648595Sroot if (IN_CLASSA(i)) 658595Sroot return (((i)&IN_CLASSANET) >> IN_CLASSANSHIFT); 668595Sroot else if (IN_CLASSB(i)) 678595Sroot return (((i)&IN_CLASSBNET) >> IN_CLASSBNSHIFT); 688595Sroot else 698595Sroot return (((i)&IN_CLASSCNET) >> IN_CLASSCNSHIFT); 707159Ssam } 717159Ssam 727159Ssam /* 738595Sroot * Return the host portion of an internet address. 747159Ssam */ 757159Ssam in_lnaof(in) 767159Ssam struct in_addr in; 777159Ssam { 788595Sroot register u_int i = in.s_addr; 797159Ssam 808595Sroot #ifdef vax || pdp11 || ns16032 818595Sroot i = ntohl(i); 828595Sroot #endif 838595Sroot if (IN_CLASSA(i)) 848595Sroot return ((i)&IN_CLASSAHOST); 858595Sroot else if (IN_CLASSB(i)) 868595Sroot return ((i)&IN_CLASSBHOST); 878595Sroot else 888595Sroot return ((i)&IN_CLASSCHOST); 897159Ssam } 907159Ssam 917159Ssam /* 927159Ssam * Initialize an interface's routing 937159Ssam * table entry according to the network. 947159Ssam * INTERNET SPECIFIC. 957159Ssam */ 967159Ssam if_rtinit(ifp, flags) 977159Ssam register struct ifnet *ifp; 987159Ssam int flags; 997159Ssam { 1007159Ssam struct sockaddr_in sin; 1017159Ssam 1027159Ssam if (ifp->if_flags & IFF_ROUTE) 1037159Ssam return; 1047159Ssam bzero((caddr_t)&sin, sizeof (sin)); 1057159Ssam sin.sin_family = AF_INET; 1067159Ssam sin.sin_addr = if_makeaddr(ifp->if_net, 0); 107*8637Sroot rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags); 1087159Ssam } 1097159Ssam #endif 110