xref: /csrg-svn/sys/deprecated/bbnnet/in.c (revision 25563)
125202Skarels #ifdef	RCSIDENT
225202Skarels static char rcsident[] = "$Header: in.c,v 1.28 85/04/08 15:06:03 walsh Exp $";
325202Skarels #endif
425202Skarels 
525202Skarels #include "../h/param.h"
625202Skarels #include "../h/mbuf.h"
725202Skarels #include "../h/protosw.h"
825202Skarels #include "../h/socket.h"
925202Skarels #include "../h/socketvar.h"
1025202Skarels #include "../h/errno.h"
1125202Skarels #include "../h/ioctl.h"
1225202Skarels #include "../h/dir.h"
1325202Skarels #include "../h/user.h"
1425202Skarels 
1525202Skarels #include "../net/if.h"
1625202Skarels #include "../net/route.h"
1725202Skarels #include "../net/af.h"
1825202Skarels #include "../net/netisr.h"
1925202Skarels #include "../vax/mtpr.h"
2025202Skarels 
2125202Skarels #include "../bbnnet/in.h"
2225202Skarels #include "../bbnnet/net.h"
2325202Skarels #include "../bbnnet/in_pcb.h"
2425202Skarels #include "../bbnnet/in_var.h"
2525202Skarels #include "../bbnnet/fsm.h"
2625202Skarels #include "../bbnnet/tcp.h"
2725202Skarels #include "../bbnnet/udp.h"
2825202Skarels #include "../bbnnet/ip.h"
2925202Skarels #include "../bbnnet/icmp.h"
3025202Skarels 
3125202Skarels #ifdef BBNNET
3225202Skarels 
3325202Skarels struct in_ifaddr *in_ifaddr;	/* list of Internet addresses for interfaces */
3425202Skarels 
3525202Skarels #define	IN_CLASSA(i)		((((long)(i))&0x80000000)==0)
3625202Skarels #define	IN_CLASSA_NET		0xff000000
3725202Skarels #define	IN_CLASSA_NSHIFT	24
3825202Skarels #define	IN_CLASSA_HOST		0x00ffffff
3925202Skarels 
4025202Skarels #define	IN_CLASSB(i)		((((long)(i))&0xc0000000)==0x80000000)
4125202Skarels #define	IN_CLASSB_NET		0xffff0000
4225202Skarels #define	IN_CLASSB_NSHIFT	16
4325202Skarels #define	IN_CLASSB_HOST		0x0000ffff
4425202Skarels 
4525202Skarels #define	IN_CLASSC(i)		((((long)(i))&0xc0000000)==0xc0000000)
4625202Skarels #define	IN_CLASSC_NET		0xffffff00
4725202Skarels #define	IN_CLASSC_NSHIFT	8
4825202Skarels #define	IN_CLASSC_HOST		0x000000ff
4925202Skarels /*
5025202Skarels  * little utility routines
5125202Skarels  * cannot be macros because called from non-IP segments of the code.
5225202Skarels  */
5325202Skarels 
5425202Skarels in_lnaof(ip_addr)
5525202Skarels struct in_addr ip_addr;
5625202Skarels {
5725202Skarels     /*
5825202Skarels      * 1/27/84 Berkeley interface of programs to kernel uses net ordering
5925202Skarels      * This subr used for SIOCSIFADDR ioctl
6025202Skarels      */
6125202Skarels     register u_long i = ntohl(ip_addr.s_addr);
6225202Skarels 
6325202Skarels     if (IN_CLASSA(i))
6425202Skarels 	return ((i)&IN_CLASSA_HOST);
6525202Skarels     else if (IN_CLASSB(i))
6625202Skarels 	return ((i)&IN_CLASSB_HOST);
6725202Skarels     else
6825202Skarels 	return ((i)&IN_CLASSC_HOST);
6925202Skarels }
7025202Skarels 
71*25563Slam /*
7225202Skarels #ifdef unused
73*25563Slam */
7425202Skarels in_netof(ip_addr)
7525202Skarels struct in_addr ip_addr;
7625202Skarels {
7725202Skarels     register u_long i = ntohl(ip_addr.s_addr);
7825202Skarels 
7925202Skarels     if (IN_CLASSA(i))
8025202Skarels 	return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
8125202Skarels     else if (IN_CLASSB(i))
8225202Skarels 	return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
8325202Skarels     else
8425202Skarels 	return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
8525202Skarels }
86*25563Slam /*
8725202Skarels #endif
88*25563Slam */
8925202Skarels 
9025202Skarels /*
9125202Skarels  * hash an internet address for routing lookups
9225202Skarels  * host part of the address is byte-swapped to put host-specific
9325202Skarels  * bits in the low byte (only the low LOG2(RTHASHSIZ) bits are used by rtalloc)
9425202Skarels  */
9525202Skarels 
inet_hash(sin,hp)9625202Skarels inet_hash(sin, hp)
9725202Skarels register struct sockaddr_in *sin;
9825202Skarels struct afhash *hp;
9925202Skarels {
10025202Skarels     hp->afh_nethash = NETHASH(sin->sin_addr);
10125202Skarels     hp->afh_hosthash = HOSTHASH(sin->sin_addr.s_addr);
10225202Skarels }
10325202Skarels 
10425202Skarels inet_netmatch(sin1, sin2)
10525202Skarels struct sockaddr_in *sin1, *sin2;
10625202Skarels {
10725202Skarels 
10825202Skarels     return (iptonet(sin1->sin_addr) == iptonet(sin2->sin_addr));
10925202Skarels }
11025202Skarels 
11125202Skarels /*
11225202Skarels  * Formulate an Internet address from network + host.
11325202Skarels  */
in_makeaddr(net,host)11425202Skarels struct in_addr in_makeaddr(net, host)
11525202Skarels u_long net, host;
11625202Skarels {
11725202Skarels     register struct in_ifaddr *ia;
11825202Skarels     register u_long mask;
11925202Skarels     u_long addr;
12025202Skarels 
12125202Skarels     if (IN_CLASSA(net))
12225202Skarels 	mask = IN_CLASSA_HOST;
12325202Skarels     else if (IN_CLASSB(net))
12425202Skarels 	mask = IN_CLASSB_HOST;
12525202Skarels     else
12625202Skarels 	mask = IN_CLASSC_HOST;
12725202Skarels 
12825202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
12925202Skarels 	if ((ia->ia_netmask & net) == ia->ia_net)
13025202Skarels 	{
13125202Skarels 	    mask = ~ia->ia_subnetmask;
13225202Skarels 	    break;
13325202Skarels 	}
13425202Skarels 
13525202Skarels     addr = htonl(net | (host & mask));
13625202Skarels     return (*(struct in_addr *)&addr);
13725202Skarels }
13825202Skarels 
13925202Skarels /*
14025202Skarels  * Return 1 if the address is a local broadcast address.
14125202Skarels  */
14225202Skarels in_broadcast(in)
14325202Skarels struct in_addr in;
14425202Skarels {
14525202Skarels     register struct in_ifaddr *ia;
14625202Skarels 
14725202Skarels     /*
14825202Skarels      * Look through the list of addresses for a match
14925202Skarels      * with a broadcast address.
15025202Skarels      */
15125202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
15225202Skarels 	if (((struct sockaddr_in *)&ia->ia_broadaddr)->sin_addr.s_addr ==
15325202Skarels 	in.s_addr && (ia->ia_ifp->if_flags & IFF_BROADCAST))
15425202Skarels 	return (TRUE);
15525202Skarels     return (FALSE);
15625202Skarels }
15725202Skarels 
15825202Skarels /*
15925202Skarels  * Return the network number from an internet address.
16025202Skarels  */
16125202Skarels iptonet (in)
16225202Skarels struct in_addr in;
16325202Skarels {
16425202Skarels     register u_long i = ntohl(in.s_addr);
16525202Skarels     register u_long net;
16625202Skarels     register struct in_ifaddr *ia;
16725202Skarels 
16825202Skarels     if (IN_CLASSA(i))
16925202Skarels 	net = i & IN_CLASSA_NET;
17025202Skarels     else if (IN_CLASSB(i))
17125202Skarels 	net = i & IN_CLASSB_NET;
17225202Skarels     else
17325202Skarels 	net = i & IN_CLASSC_NET;
17425202Skarels 
17525202Skarels     /*
17625202Skarels      * Check whether network is a subnet;
17725202Skarels      * if so, return subnet number.
17825202Skarels      */
17925202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
18025202Skarels 	if (net == ia->ia_net)
18125202Skarels 	    return (i & ia->ia_subnetmask);
18225202Skarels 
18325202Skarels     return (net);
18425202Skarels }
18525202Skarels 
18625202Skarels #ifdef unused
18725202Skarels /*
18825202Skarels  * Return the host portion of an internet address.
18925202Skarels  */
19025202Skarels iptohost (in)
19125202Skarels struct in_addr in;
19225202Skarels {
19325202Skarels     register u_long i = ntohl(in.s_addr);
19425202Skarels     register u_long net, host;
19525202Skarels     register struct in_ifaddr *ia;
19625202Skarels 
19725202Skarels     if (IN_CLASSA(i))
19825202Skarels     {
19925202Skarels 	net = i & IN_CLASSA_NET;
20025202Skarels 	host = i & IN_CLASSA_HOST;
20125202Skarels     }
20225202Skarels     else if (IN_CLASSB(i))
20325202Skarels     {
20425202Skarels 	net = i & IN_CLASSB_NET;
20525202Skarels 	host = i & IN_CLASSB_HOST;
20625202Skarels     }
20725202Skarels     else
20825202Skarels     {
20925202Skarels 	net = i & IN_CLASSC_NET;
21025202Skarels 	host = i & IN_CLASSC_HOST;
21125202Skarels     }
21225202Skarels 
21325202Skarels     /*
21425202Skarels      * Check whether network is a subnet;
21525202Skarels      * if so, use the modified interpretation of `host'.
21625202Skarels      */
21725202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
21825202Skarels 	if (net == ia->ia_net)
21925202Skarels 	    return (host & ~ia->ia_subnetmask);
22025202Skarels 
22125202Skarels     return (host);
22225202Skarels }
22325202Skarels #endif
22425202Skarels 
22525202Skarels #ifdef unused
22625202Skarels /*
22725202Skarels  * Return TRUE if an internet address is for a ``local'' host
22825202Skarels  * (one to which we have a connection through a local logical net).
22925202Skarels  */
23025202Skarels in_localaddr(in)
23125202Skarels struct in_addr in;
23225202Skarels {
23325202Skarels     register u_long i = ntohl(in.s_addr);
23425202Skarels     register u_long net;
23525202Skarels     register struct in_ifaddr *ia;
23625202Skarels 
23725202Skarels     if (IN_CLASSA(i))
23825202Skarels 	net = i & IN_CLASSA_NET;
23925202Skarels     else if (IN_CLASSB(i))
24025202Skarels 	net = i & IN_CLASSB_NET;
24125202Skarels     else
24225202Skarels 	net = i & IN_CLASSC_NET;
24325202Skarels 
24425202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
24525202Skarels 	if (net == ia->ia_net)
24625202Skarels 	    return (TRUE);
24725202Skarels 
24825202Skarels     return (FALSE);
24925202Skarels }
25025202Skarels #endif
25125202Skarels 
25225202Skarels /*
25325202Skarels  * because defaults are a bit messy here, the ARP and interface layers
25425202Skarels  * are both handled here....
25525202Skarels  */
25625202Skarels 
25725202Skarels /* ARGSUSED */
in_ioctl(optname,optval)25825202Skarels in_ioctl(optname, optval)
25925202Skarels int optname;
26025202Skarels struct mbuf **optval;
26125202Skarels {
26225202Skarels     extern struct ifnet *ifunit();
26325202Skarels     register struct ifreq *ifr = (struct ifreq *)optval;
26425202Skarels     register struct ifnet *ifp = ifunit(ifr->ifr_name);
26525202Skarels     register struct in_ifaddr *ia = NULL;
26625202Skarels     struct ifaddr *ifa;
26725202Skarels     struct mbuf *m;
26825202Skarels     int error = 0;
26925202Skarels 
27025202Skarels     /*
27125202Skarels      *  ARP
27225202Skarels      */
27325202Skarels     switch (optname)
27425202Skarels     {
27525202Skarels       case SIOCSARP:
27625202Skarels       case SIOCDARP:
27725202Skarels 	if (!suser())
27825202Skarels 	    return(u.u_error);
27925202Skarels 
28025202Skarels 	/* fall thru */
28125202Skarels 
28225202Skarels       case SIOCGARP:
28325202Skarels 	return(arpioctl(optname,(caddr_t)optval));
28425202Skarels     }
28525202Skarels 
28625202Skarels     /*
28725202Skarels      * Find address for this interface, if it exists.
28825202Skarels      */
28925202Skarels     if (ifp)
29025202Skarels 	for (ia = in_ifaddr; ia; ia = ia->ia_next)
29125202Skarels 	    if (ia->ia_ifp == ifp)
29225202Skarels 		break;
29325202Skarels 
29425202Skarels     /*
29525202Skarels      * Interface stuff
29625202Skarels      */
29725202Skarels 
29825202Skarels     switch (optname)
29925202Skarels     {
30025202Skarels 
30125202Skarels       case SIOCGIFADDR:
30225202Skarels       case SIOCGIFBRDADDR:
30325202Skarels       case SIOCGIFDSTADDR:
30425202Skarels       case SIOCGIFNETMASK:
30525202Skarels 	if (ia == (struct in_ifaddr *) NULL)
30625202Skarels 	    return(EADDRNOTAVAIL);
30725202Skarels 	break;
30825202Skarels 
30925202Skarels       case SIOCSIFADDR:
31025202Skarels       case SIOCSIFDSTADDR:
31125202Skarels       case SIOCSIFBRDADDR:
31225202Skarels       case SIOCSIFNETMASK:
31325202Skarels 	if (!suser())
31425202Skarels 	    return(u.u_error);
31525202Skarels 
31625202Skarels 	if (ifp == NULL)
31725202Skarels 	    panic("in_control");
31825202Skarels 	if (ia == (struct in_ifaddr *) NULL)
31925202Skarels 	{
32025202Skarels 	    m = m_getclr(M_WAIT, MT_IFADDR);
32125202Skarels 	    if (m == (struct mbuf *)NULL)
32225202Skarels 		return(ENOBUFS);
32325202Skarels 	    if (ia = in_ifaddr)
32425202Skarels 	    {
32525202Skarels 		for ( ; ia->ia_next; ia = ia->ia_next)
32625202Skarels 		    ;
32725202Skarels 		ia->ia_next = mtod(m, struct in_ifaddr *);
32825202Skarels 	    }
32925202Skarels 	    else
33025202Skarels 	        in_ifaddr = mtod(m, struct in_ifaddr *);
33125202Skarels 	    ia = mtod(m, struct in_ifaddr *);
33225202Skarels 	    if (ifa = ifp->if_addrlist)
33325202Skarels 	    {
33425202Skarels 		for ( ; ifa->ifa_next; ifa = ifa->ifa_next)
33525202Skarels 		    ;
33625202Skarels 		ifa->ifa_next = (struct ifaddr *) ia;
33725202Skarels 	    }
33825202Skarels 	    else
33925202Skarels 	        ifp->if_addrlist = (struct ifaddr *) ia;
34025202Skarels 	    ia->ia_ifp = ifp;
34125202Skarels 	    IA_SIN(ia)->sin_family = AF_INET;
34225202Skarels 	}
34325202Skarels 	break;
34425202Skarels     }
34525202Skarels 
34625202Skarels     switch (optname)
34725202Skarels     {
34825202Skarels 
34925202Skarels       case SIOCGIFADDR:
35025202Skarels 	ifr->ifr_addr = ia->ia_addr;
35125202Skarels 	break;
35225202Skarels 
35325202Skarels       case SIOCGIFBRDADDR:
35425202Skarels 	if ((ifp->if_flags & IFF_BROADCAST) == 0)
35525202Skarels 	    return(EINVAL);
35625202Skarels 	ifr->ifr_dstaddr = ia->ia_broadaddr;
35725202Skarels 	break;
35825202Skarels 
35925202Skarels       case SIOCGIFDSTADDR:
36025202Skarels 	if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
36125202Skarels 	    return(EINVAL);
36225202Skarels 	ifr->ifr_dstaddr = ia->ia_dstaddr;
36325202Skarels 	break;
36425202Skarels 
36525202Skarels       case SIOCGIFNETMASK:
36625202Skarels #define	satosin(sa)	((struct sockaddr_in *)(sa))
36725202Skarels 	satosin(&ifr->ifr_addr)->sin_family = AF_INET;
36825202Skarels 	satosin(&ifr->ifr_addr)->sin_addr.s_addr = htonl(ia->ia_subnetmask);
36925202Skarels 	break;
37025202Skarels 
37125202Skarels       case SIOCSIFDSTADDR:
37225202Skarels 	if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
37325202Skarels 	    return(EINVAL);
37425202Skarels 
37525202Skarels 	if (ifp->if_ioctl &&
37625202Skarels 	    (error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia)))
37725202Skarels 	    return(error);
37825202Skarels 
37925202Skarels 	ia->ia_dstaddr = ifr->ifr_dstaddr;
38025202Skarels 	break;
38125202Skarels 
38225202Skarels       case SIOCSIFBRDADDR:
38325202Skarels 	if ((ifp->if_flags & IFF_BROADCAST) == 0)
38425202Skarels 	    return(EINVAL);
38525202Skarels 
38625202Skarels 	ia->ia_broadaddr = ifr->ifr_broadaddr;
38725202Skarels 	break;
38825202Skarels 
38925202Skarels       case SIOCSIFADDR:
39025202Skarels 	return(in_ifinit(ifp, ia, (struct sockaddr_in *)&ifr->ifr_addr));
39125202Skarels 
39225202Skarels       case SIOCSIFNETMASK:
39325202Skarels 	ia->ia_subnetmask =
39425202Skarels 	    ntohl(satosin(&ifr->ifr_addr)->sin_addr.s_addr);
39525202Skarels 	break;
39625202Skarels 
39725202Skarels       default:
39825202Skarels 	if (ifp == NULL || ifp->if_ioctl == 0)
39925202Skarels 	    return(EOPNOTSUPP);
40025202Skarels 
40125202Skarels 	return(((*ifp->if_ioctl)(ifp, optname, (caddr_t)optval)));
40225202Skarels     }
40325202Skarels 
40425202Skarels     return (0);
40525202Skarels }
40625202Skarels 
40725202Skarels /*
40825202Skarels  * Initialize an interface's internet address
40925202Skarels  * and routing table entry.
41025202Skarels  */
in_ifinit(ifp,ia,sin)41125202Skarels in_ifinit(ifp, ia, sin)
41225202Skarels register struct ifnet *ifp;
41325202Skarels register struct in_ifaddr *ia;
41425202Skarels struct sockaddr_in *sin;
41525202Skarels {
41625202Skarels     register u_long i = ntohl(sin->sin_addr.s_addr);
41725202Skarels     struct sockaddr_in netaddr;
41825202Skarels     int s = splimp(), error;
41925202Skarels 
42025202Skarels     bzero((caddr_t)&netaddr, sizeof (netaddr));
42125202Skarels     netaddr.sin_family = AF_INET;
42225202Skarels     /*
42325202Skarels      * Delete any previous route for an old address.
42425202Skarels      */
42525202Skarels     if (ia->ia_flags & IFA_ROUTE)
42625202Skarels     {
42725202Skarels 	if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
42825202Skarels 	{
42925202Skarels 	    netaddr.sin_addr = in_makeaddr(ia->ia_subnet, INADDR_ANY);
43025202Skarels 	    rtinit((struct sockaddr *)&netaddr, &ia->ia_addr, -1);
43125202Skarels 	}
43225202Skarels 	else
43325202Skarels 	    rtinit((struct sockaddr *)&ia->ia_dstaddr, &ia->ia_addr, -1);
43425202Skarels 	ia->ia_flags &= ~IFA_ROUTE;
43525202Skarels     }
43625202Skarels     ia->ia_addr = *(struct sockaddr *)sin;
43725202Skarels     if (IN_CLASSA(i))
43825202Skarels 	ia->ia_netmask = IN_CLASSA_NET;
43925202Skarels     else if (IN_CLASSB(i))
44025202Skarels 	ia->ia_netmask = IN_CLASSB_NET;
44125202Skarels     else
44225202Skarels 	ia->ia_netmask = IN_CLASSC_NET;
44325202Skarels     ia->ia_net = i & ia->ia_netmask;
44425202Skarels     /*
44525202Skarels      * The subnet mask includes at least the standard network part,
44625202Skarels      * but may already have been set to a larger value.
44725202Skarels      */
44825202Skarels     ia->ia_subnetmask |= ia->ia_netmask;
44925202Skarels     ia->ia_subnet = i & ia->ia_subnetmask;
45025202Skarels     if (ifp->if_flags & IFF_BROADCAST)
45125202Skarels     {
45225202Skarels 	ia->ia_broadaddr.sa_family = AF_INET;
45325202Skarels 	satoipa(&ia->ia_broadaddr) = in_makeaddr(ia->ia_subnet, INADDR_BROADCAST);
45425202Skarels     }
45525202Skarels 
45625202Skarels     /*
45725202Skarels      * Give the interface a chance to initialize
45825202Skarels      * if this is its first address,
45925202Skarels      * and to validate the address if necessary.
46025202Skarels      */
46125202Skarels     if (ifp->if_ioctl && (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia)))
46225202Skarels     {
46325202Skarels 	splx(s);
46425202Skarels 	bzero((caddr_t)&ia->ia_addr, sizeof(ia->ia_addr));
46525202Skarels 	return (error);
46625202Skarels     }
46725202Skarels     splx(s);
46825202Skarels     /*
46925202Skarels      * Add route for the network.
47025202Skarels      */
47125202Skarels     if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
47225202Skarels     {
47325202Skarels 	netaddr.sin_addr = in_makeaddr(ia->ia_subnet, INADDR_ANY);
47425202Skarels 	rtinit((struct sockaddr *)&netaddr, &ia->ia_addr, RTF_UP);
47525202Skarels     }
47625202Skarels     else
47725202Skarels 	rtinit((struct sockaddr *)&ia->ia_dstaddr, &ia->ia_addr, RTF_HOST|RTF_UP);
47825202Skarels     ia->ia_flags |= IFA_ROUTE;
47925202Skarels     return (0);
48025202Skarels }
48125202Skarels 
48225202Skarels /*
48325202Skarels  * return address info for specified address
48425202Skarels  */
48525202Skarels 
in_iawithaddr(addr,bcast)48625202Skarels struct in_ifaddr *in_iawithaddr(addr,bcast)
48725202Skarels struct in_addr addr;
48825202Skarels int bcast;	/* look for broadcast addrs */
48925202Skarels {
49025202Skarels     register struct in_ifaddr *ia;
49125202Skarels 
49225202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
49325202Skarels     {
49425202Skarels 	if (IA_INADDR(ia).s_addr == addr.s_addr)
49525202Skarels 	    return(ia);
49625202Skarels 
49725202Skarels 	if (bcast)
49825202Skarels 	    if (IA_B_INADDR(ia).s_addr == addr.s_addr)
49925202Skarels 	        return(ia);
50025202Skarels     }
50125202Skarels 
50225202Skarels     return(ia);
50325202Skarels }
50425202Skarels 
in_iawithnet(addr)50525202Skarels struct in_ifaddr *in_iawithnet(addr)
50625202Skarels struct in_addr addr;
50725202Skarels {
50825202Skarels     register struct in_ifaddr *ia;
50925202Skarels     register u_long net;
51025202Skarels 
51125202Skarels     net = iptonet(addr);
51225202Skarels 
51325202Skarels     for(ia = in_ifaddr; ia; ia = ia->ia_next)
51425202Skarels     {
51525202Skarels 	if (iptonet(IA_INADDR(ia)) == net)
51625202Skarels 	    return(ia);
51725202Skarels     }
51825202Skarels 
51925202Skarels     return(ia);
52025202Skarels }
52125202Skarels 
in_iafromif(ifp)52225202Skarels struct in_ifaddr *in_iafromif(ifp)
52325202Skarels struct ifnet *ifp;
52425202Skarels {
52525202Skarels     register struct ifaddr *ifa;
52625202Skarels 
52725202Skarels     for(ifa = ifp->if_addrlist; ifa != NULL; ifa = ifa->ifa_next)
52825202Skarels 	if (ifa->ifa_addr.sa_family == AF_INET)
52925202Skarels 	    break;
53025202Skarels 
53125202Skarels     return((struct in_ifaddr *)ifa);
53225202Skarels }
53325202Skarels 
534*25563Slam /*
53525202Skarels #ifdef unused
536*25563Slam */
53725202Skarels /*
53825202Skarels  * Return address info for specified internet network.
53925202Skarels  */
in_iaonnetof(net)54025202Skarels struct in_ifaddr *in_iaonnetof(net)
54125202Skarels u_long net;
54225202Skarels {
54325202Skarels     register struct in_ifaddr *ia;
54425202Skarels 
54525202Skarels     for (ia = in_ifaddr; ia; ia = ia->ia_next)
54625202Skarels 	if (ia->ia_subnet == net)
54725202Skarels 	    return (ia);
54825202Skarels 
54925202Skarels     return ((struct in_ifaddr *) NULL);
55025202Skarels }
551*25563Slam /*
55225202Skarels #endif
553*25563Slam */
55425202Skarels #endif
555