xref: /csrg-svn/sbin/routed/af.c (revision 26340)
121992Sdist /*
221992Sdist  * Copyright (c) 1983 Regents of the University of California.
321992Sdist  * All rights reserved.  The Berkeley software License Agreement
421992Sdist  * specifies the terms and conditions for redistribution.
521992Sdist  */
621992Sdist 
76916Ssam #ifndef lint
8*26340Skarels static char sccsid[] = "@(#)af.c	5.3 (Berkeley) 02/23/86";
921992Sdist #endif not lint
106916Ssam 
1110243Ssam #include "defs.h"
126916Ssam 
136916Ssam /*
146916Ssam  * Address family support routines
156916Ssam  */
166916Ssam int	inet_hash(), inet_netmatch(), inet_output(),
177026Ssam 	inet_portmatch(), inet_portcheck(),
1816128Skarels 	inet_checkhost(), inet_ishost(), inet_canon();
19*26340Skarels char	*inet_format();
20*26340Skarels #define NIL	{ 0 }
216916Ssam #define	INET \
226916Ssam 	{ inet_hash,		inet_netmatch,		inet_output, \
237026Ssam 	  inet_portmatch,	inet_portcheck,		inet_checkhost, \
24*26340Skarels 	  inet_ishost,		inet_canon, 		inet_format }
256916Ssam 
266916Ssam struct afswitch afswitch[AF_MAX] =
27*26340Skarels 	{ NIL, NIL, INET, };
286916Ssam 
29*26340Skarels int af_max = sizeof(afswitch) / sizeof(afswitch[0]);
30*26340Skarels 
3116325Skarels struct sockaddr_in inet_default = { AF_INET, INADDR_ANY };
3216325Skarels 
336916Ssam inet_hash(sin, hp)
346916Ssam 	register struct sockaddr_in *sin;
356916Ssam 	struct afhash *hp;
366916Ssam {
3721838Skarels 	register u_long n;
386916Ssam 
3921838Skarels 	n = inet_netof(sin->sin_addr);
4021838Skarels 	if (n)
4121838Skarels 	    while ((n & 0xff) == 0)
4221838Skarels 		n >>= 8;
4321838Skarels 	hp->afh_nethash = n;
4410243Ssam 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
457133Swnj 	hp->afh_hosthash &= 0x7fffffff;
466916Ssam }
476916Ssam 
486916Ssam inet_netmatch(sin1, sin2)
496916Ssam 	struct sockaddr_in *sin1, *sin2;
506916Ssam {
516916Ssam 
528365Ssam 	return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr));
536916Ssam }
546916Ssam 
556916Ssam /*
566916Ssam  * Verify the message is from the right port.
576916Ssam  */
586916Ssam inet_portmatch(sin)
599023Ssam 	register struct sockaddr_in *sin;
606916Ssam {
617133Swnj 
6210243Ssam 	return (sin->sin_port == sp->s_port);
636916Ssam }
646916Ssam 
656916Ssam /*
667026Ssam  * Verify the message is from a "trusted" port.
677026Ssam  */
687026Ssam inet_portcheck(sin)
6910243Ssam 	struct sockaddr_in *sin;
707026Ssam {
717026Ssam 
7210243Ssam 	return (ntohs(sin->sin_port) <= IPPORT_RESERVED);
737026Ssam }
747026Ssam 
757026Ssam /*
766916Ssam  * Internet output routine.
776916Ssam  */
7810243Ssam inet_output(s, flags, sin, size)
7910243Ssam 	int s, flags;
806916Ssam 	struct sockaddr_in *sin;
816916Ssam 	int size;
826916Ssam {
836916Ssam 	struct sockaddr_in dst;
846916Ssam 
856916Ssam 	dst = *sin;
866916Ssam 	sin = &dst;
879023Ssam 	if (sin->sin_port == 0)
8810243Ssam 		sin->sin_port = sp->s_port;
8910243Ssam 	if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
9010243Ssam 		perror("sendto");
916916Ssam }
926916Ssam 
936916Ssam /*
947793Ssam  * Return 1 if the address is believed
957793Ssam  * for an Internet host -- THIS IS A KLUDGE.
966916Ssam  */
976916Ssam inet_checkhost(sin)
986916Ssam 	struct sockaddr_in *sin;
996916Ssam {
10016741Skarels 	u_long i = ntohl(sin->sin_addr.s_addr);
10116435Skarels 
10216128Skarels #define	IN_BADCLASS(i)	(((long) (i) & 0xe0000000) == 0xe0000000)
10310243Ssam 
10421838Skarels 	if (IN_BADCLASS(i) || sin->sin_port != 0)
10516325Skarels 		return (0);
10616435Skarels 	if (i != 0 && (i & 0xff000000) == 0)
10716325Skarels 		return (0);
10825352Skarels 	for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++)
10925352Skarels 		if (sin->sin_zero[i])
11025352Skarels 			return (0);
11116325Skarels 	return (1);
11216128Skarels }
11316128Skarels 
11416128Skarels /*
11516128Skarels  * Return 1 if the address is
11616128Skarels  * for an Internet host, 0 for a network.
11716128Skarels  */
11816128Skarels inet_ishost(sin)
11916128Skarels 	struct sockaddr_in *sin;
12016128Skarels {
12116128Skarels 
1228365Ssam 	return (inet_lnaof(sin->sin_addr) != 0);
1236916Ssam }
1246916Ssam 
1256916Ssam inet_canon(sin)
1266916Ssam 	struct sockaddr_in *sin;
1276916Ssam {
12810243Ssam 
1296916Ssam 	sin->sin_port = 0;
1306916Ssam }
1316916Ssam 
132*26340Skarels char *
133*26340Skarels inet_format(sin)
134*26340Skarels 	struct sockaddr_in *sin;
1356916Ssam {
136*26340Skarels 	char *inet_ntoa();
1376916Ssam 
138*26340Skarels 	return (inet_ntoa(sin->sin_addr));
1396916Ssam }
140