xref: /csrg-svn/sbin/routed/af.c (revision 25352)
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*25352Skarels static char sccsid[] = "@(#)af.c	5.2 (Berkeley) 10/31/85";
921992Sdist #endif not lint
106916Ssam 
1110243Ssam #include "defs.h"
126916Ssam 
136916Ssam /*
146916Ssam  * Address family support routines
156916Ssam  */
166916Ssam int	null_hash(), null_netmatch(), null_output(),
177026Ssam 	null_portmatch(), null_portcheck(),
1816128Skarels 	null_checkhost(), null_ishost(), null_canon();
196916Ssam int	inet_hash(), inet_netmatch(), inet_output(),
207026Ssam 	inet_portmatch(), inet_portcheck(),
2116128Skarels 	inet_checkhost(), inet_ishost(), inet_canon();
226916Ssam #define NIL \
236916Ssam 	{ null_hash,		null_netmatch,		null_output, \
247026Ssam 	  null_portmatch,	null_portcheck,		null_checkhost, \
2516128Skarels 	  null_ishost,		null_canon }
266916Ssam #define	INET \
276916Ssam 	{ inet_hash,		inet_netmatch,		inet_output, \
287026Ssam 	  inet_portmatch,	inet_portcheck,		inet_checkhost, \
2916128Skarels 	  inet_ishost,		inet_canon }
306916Ssam 
316916Ssam struct afswitch afswitch[AF_MAX] =
326916Ssam 	{ NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
336916Ssam 
3416325Skarels struct sockaddr_in inet_default = { AF_INET, INADDR_ANY };
3516325Skarels 
366916Ssam inet_hash(sin, hp)
376916Ssam 	register struct sockaddr_in *sin;
386916Ssam 	struct afhash *hp;
396916Ssam {
4021838Skarels 	register u_long n;
416916Ssam 
4221838Skarels 	n = inet_netof(sin->sin_addr);
4321838Skarels 	if (n)
4421838Skarels 	    while ((n & 0xff) == 0)
4521838Skarels 		n >>= 8;
4621838Skarels 	hp->afh_nethash = n;
4710243Ssam 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
487133Swnj 	hp->afh_hosthash &= 0x7fffffff;
496916Ssam }
506916Ssam 
516916Ssam inet_netmatch(sin1, sin2)
526916Ssam 	struct sockaddr_in *sin1, *sin2;
536916Ssam {
546916Ssam 
558365Ssam 	return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr));
566916Ssam }
576916Ssam 
586916Ssam /*
596916Ssam  * Verify the message is from the right port.
606916Ssam  */
616916Ssam inet_portmatch(sin)
629023Ssam 	register struct sockaddr_in *sin;
636916Ssam {
647133Swnj 
6510243Ssam 	return (sin->sin_port == sp->s_port);
666916Ssam }
676916Ssam 
686916Ssam /*
697026Ssam  * Verify the message is from a "trusted" port.
707026Ssam  */
717026Ssam inet_portcheck(sin)
7210243Ssam 	struct sockaddr_in *sin;
737026Ssam {
747026Ssam 
7510243Ssam 	return (ntohs(sin->sin_port) <= IPPORT_RESERVED);
767026Ssam }
777026Ssam 
787026Ssam /*
796916Ssam  * Internet output routine.
806916Ssam  */
8110243Ssam inet_output(s, flags, sin, size)
8210243Ssam 	int s, flags;
836916Ssam 	struct sockaddr_in *sin;
846916Ssam 	int size;
856916Ssam {
866916Ssam 	struct sockaddr_in dst;
876916Ssam 
886916Ssam 	dst = *sin;
896916Ssam 	sin = &dst;
909023Ssam 	if (sin->sin_port == 0)
9110243Ssam 		sin->sin_port = sp->s_port;
9210243Ssam 	if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
9310243Ssam 		perror("sendto");
946916Ssam }
956916Ssam 
966916Ssam /*
977793Ssam  * Return 1 if the address is believed
987793Ssam  * for an Internet host -- THIS IS A KLUDGE.
996916Ssam  */
1006916Ssam inet_checkhost(sin)
1016916Ssam 	struct sockaddr_in *sin;
1026916Ssam {
10316741Skarels 	u_long i = ntohl(sin->sin_addr.s_addr);
10416435Skarels 
10516128Skarels #define	IN_BADCLASS(i)	(((long) (i) & 0xe0000000) == 0xe0000000)
10610243Ssam 
10721838Skarels 	if (IN_BADCLASS(i) || sin->sin_port != 0)
10816325Skarels 		return (0);
10916435Skarels 	if (i != 0 && (i & 0xff000000) == 0)
11016325Skarels 		return (0);
111*25352Skarels 	for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++)
112*25352Skarels 		if (sin->sin_zero[i])
113*25352Skarels 			return (0);
11416325Skarels 	return (1);
11516128Skarels }
11616128Skarels 
11716128Skarels /*
11816128Skarels  * Return 1 if the address is
11916128Skarels  * for an Internet host, 0 for a network.
12016128Skarels  */
12116128Skarels inet_ishost(sin)
12216128Skarels 	struct sockaddr_in *sin;
12316128Skarels {
12416128Skarels 
1258365Ssam 	return (inet_lnaof(sin->sin_addr) != 0);
1266916Ssam }
1276916Ssam 
1286916Ssam inet_canon(sin)
1296916Ssam 	struct sockaddr_in *sin;
1306916Ssam {
13110243Ssam 
1326916Ssam 	sin->sin_port = 0;
1336916Ssam }
1346916Ssam 
1356916Ssam /*ARGSUSED*/
1366916Ssam null_hash(addr, hp)
1376916Ssam 	struct sockaddr *addr;
1386916Ssam 	struct afhash *hp;
1396916Ssam {
1406916Ssam 
1416916Ssam 	hp->afh_nethash = hp->afh_hosthash = 0;
1426916Ssam }
1436916Ssam 
1446916Ssam /*ARGSUSED*/
1456916Ssam null_netmatch(a1, a2)
1466916Ssam 	struct sockaddr *a1, *a2;
1476916Ssam {
1486916Ssam 
1496916Ssam 	return (0);
1506916Ssam }
1516916Ssam 
1526916Ssam /*ARGSUSED*/
15310243Ssam null_output(s, f, a1, n)
15410243Ssam 	int s, f;
1556916Ssam 	struct sockaddr *a1;
1566916Ssam 	int n;
1576916Ssam {
1587133Swnj 
1596916Ssam 	;
1606916Ssam }
1616916Ssam 
1626916Ssam /*ARGSUSED*/
1636916Ssam null_portmatch(a1)
1646916Ssam 	struct sockaddr *a1;
1656916Ssam {
1667133Swnj 
1676916Ssam 	return (0);
1686916Ssam }
1696916Ssam 
1706916Ssam /*ARGSUSED*/
1717026Ssam null_portcheck(a1)
1727026Ssam 	struct sockaddr *a1;
1737026Ssam {
1747133Swnj 
1757026Ssam 	return (0);
1767026Ssam }
1777026Ssam 
1787026Ssam /*ARGSUSED*/
17916128Skarels null_ishost(a1)
18016128Skarels 	struct sockaddr *a1;
18116128Skarels {
18216128Skarels 
18316128Skarels 	return (0);
18416128Skarels }
18516128Skarels 
18616128Skarels /*ARGSUSED*/
1876916Ssam null_checkhost(a1)
1886916Ssam 	struct sockaddr *a1;
1896916Ssam {
1907133Swnj 
1916916Ssam 	return (0);
1926916Ssam }
1936916Ssam 
1946916Ssam /*ARGSUSED*/
1956916Ssam null_canon(a1)
1966916Ssam 	struct sockaddr *a1;
1976916Ssam {
1987133Swnj 
1996916Ssam 	;
2006916Ssam }
201