xref: /csrg-svn/sbin/routed/af.c (revision 16435)
16916Ssam #ifndef lint
2*16435Skarels static char sccsid[] = "@(#)af.c	4.14 (Berkeley) 05/03/84";
36916Ssam #endif
46916Ssam 
510243Ssam #include "defs.h"
66916Ssam 
76916Ssam /*
86916Ssam  * Address family support routines
96916Ssam  */
106916Ssam int	null_hash(), null_netmatch(), null_output(),
117026Ssam 	null_portmatch(), null_portcheck(),
1216128Skarels 	null_checkhost(), null_ishost(), null_canon();
136916Ssam int	inet_hash(), inet_netmatch(), inet_output(),
147026Ssam 	inet_portmatch(), inet_portcheck(),
1516128Skarels 	inet_checkhost(), inet_ishost(), inet_canon();
166916Ssam #define NIL \
176916Ssam 	{ null_hash,		null_netmatch,		null_output, \
187026Ssam 	  null_portmatch,	null_portcheck,		null_checkhost, \
1916128Skarels 	  null_ishost,		null_canon }
206916Ssam #define	INET \
216916Ssam 	{ inet_hash,		inet_netmatch,		inet_output, \
227026Ssam 	  inet_portmatch,	inet_portcheck,		inet_checkhost, \
2316128Skarels 	  inet_ishost,		inet_canon }
246916Ssam 
256916Ssam struct afswitch afswitch[AF_MAX] =
266916Ssam 	{ NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
276916Ssam 
2816325Skarels struct sockaddr_in inet_default = { AF_INET, INADDR_ANY };
2916325Skarels 
306916Ssam inet_hash(sin, hp)
316916Ssam 	register struct sockaddr_in *sin;
326916Ssam 	struct afhash *hp;
336916Ssam {
346916Ssam 
358365Ssam 	hp->afh_nethash = inet_netof(sin->sin_addr);
3610243Ssam 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
377133Swnj 	hp->afh_hosthash &= 0x7fffffff;
386916Ssam }
396916Ssam 
406916Ssam inet_netmatch(sin1, sin2)
416916Ssam 	struct sockaddr_in *sin1, *sin2;
426916Ssam {
436916Ssam 
448365Ssam 	return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr));
456916Ssam }
466916Ssam 
476916Ssam /*
486916Ssam  * Verify the message is from the right port.
496916Ssam  */
506916Ssam inet_portmatch(sin)
519023Ssam 	register struct sockaddr_in *sin;
526916Ssam {
537133Swnj 
5410243Ssam #ifdef COMPAT
5510243Ssam 	if (ntohs(sin->sin_port) == ntohs(sp->s_port) + 1)
5610243Ssam 		return (1);
577133Swnj #endif
5810243Ssam 	return (sin->sin_port == sp->s_port);
596916Ssam }
606916Ssam 
616916Ssam /*
627026Ssam  * Verify the message is from a "trusted" port.
637026Ssam  */
647026Ssam inet_portcheck(sin)
6510243Ssam 	struct sockaddr_in *sin;
667026Ssam {
677026Ssam 
6810243Ssam 	return (ntohs(sin->sin_port) <= IPPORT_RESERVED);
697026Ssam }
707026Ssam 
717026Ssam /*
726916Ssam  * Internet output routine.
736916Ssam  */
7410243Ssam inet_output(s, flags, sin, size)
7510243Ssam 	int s, flags;
766916Ssam 	struct sockaddr_in *sin;
776916Ssam 	int size;
786916Ssam {
796916Ssam 	struct sockaddr_in dst;
806916Ssam 
816916Ssam 	dst = *sin;
826916Ssam 	sin = &dst;
839023Ssam 	if (sin->sin_port == 0)
8410243Ssam 		sin->sin_port = sp->s_port;
8510243Ssam 	if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
8610243Ssam 		perror("sendto");
876916Ssam }
886916Ssam 
896916Ssam /*
907793Ssam  * Return 1 if the address is believed
917793Ssam  * for an Internet host -- THIS IS A KLUDGE.
926916Ssam  */
936916Ssam inet_checkhost(sin)
946916Ssam 	struct sockaddr_in *sin;
956916Ssam {
96*16435Skarels 	u_long i = ntohl(sin->sin_addr);
97*16435Skarels 
9816128Skarels #define	IN_BADCLASS(i)	(((long) (i) & 0xe0000000) == 0xe0000000)
9910243Ssam 
100*16435Skarels 	if (IN_BADCLASS(i))
10116325Skarels 		return (0);
102*16435Skarels 	if (i != 0 && (i & 0xff000000) == 0)
10316325Skarels 		return (0);
10416325Skarels 	return (1);
10516128Skarels }
10616128Skarels 
10716128Skarels /*
10816128Skarels  * Return 1 if the address is
10916128Skarels  * for an Internet host, 0 for a network.
11016128Skarels  */
11116128Skarels inet_ishost(sin)
11216128Skarels 	struct sockaddr_in *sin;
11316128Skarels {
11416128Skarels 
1158365Ssam 	return (inet_lnaof(sin->sin_addr) != 0);
1166916Ssam }
1176916Ssam 
1186916Ssam inet_canon(sin)
1196916Ssam 	struct sockaddr_in *sin;
1206916Ssam {
12110243Ssam 
1226916Ssam 	sin->sin_port = 0;
1236916Ssam }
1246916Ssam 
1256916Ssam /*ARGSUSED*/
1266916Ssam null_hash(addr, hp)
1276916Ssam 	struct sockaddr *addr;
1286916Ssam 	struct afhash *hp;
1296916Ssam {
1306916Ssam 
1316916Ssam 	hp->afh_nethash = hp->afh_hosthash = 0;
1326916Ssam }
1336916Ssam 
1346916Ssam /*ARGSUSED*/
1356916Ssam null_netmatch(a1, a2)
1366916Ssam 	struct sockaddr *a1, *a2;
1376916Ssam {
1386916Ssam 
1396916Ssam 	return (0);
1406916Ssam }
1416916Ssam 
1426916Ssam /*ARGSUSED*/
14310243Ssam null_output(s, f, a1, n)
14410243Ssam 	int s, f;
1456916Ssam 	struct sockaddr *a1;
1466916Ssam 	int n;
1476916Ssam {
1487133Swnj 
1496916Ssam 	;
1506916Ssam }
1516916Ssam 
1526916Ssam /*ARGSUSED*/
1536916Ssam null_portmatch(a1)
1546916Ssam 	struct sockaddr *a1;
1556916Ssam {
1567133Swnj 
1576916Ssam 	return (0);
1586916Ssam }
1596916Ssam 
1606916Ssam /*ARGSUSED*/
1617026Ssam null_portcheck(a1)
1627026Ssam 	struct sockaddr *a1;
1637026Ssam {
1647133Swnj 
1657026Ssam 	return (0);
1667026Ssam }
1677026Ssam 
1687026Ssam /*ARGSUSED*/
16916128Skarels null_ishost(a1)
17016128Skarels 	struct sockaddr *a1;
17116128Skarels {
17216128Skarels 
17316128Skarels 	return (0);
17416128Skarels }
17516128Skarels 
17616128Skarels /*ARGSUSED*/
1776916Ssam null_checkhost(a1)
1786916Ssam 	struct sockaddr *a1;
1796916Ssam {
1807133Swnj 
1816916Ssam 	return (0);
1826916Ssam }
1836916Ssam 
1846916Ssam /*ARGSUSED*/
1856916Ssam null_canon(a1)
1866916Ssam 	struct sockaddr *a1;
1876916Ssam {
1887133Swnj 
1896916Ssam 	;
1906916Ssam }
191