xref: /csrg-svn/sbin/routed/af.c (revision 16128)
16916Ssam #ifndef lint
2*16128Skarels static char sccsid[] = "@(#)af.c	4.12 (Berkeley) 03/07/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(),
12*16128Skarels 	null_checkhost(), null_ishost(), null_canon();
136916Ssam int	inet_hash(), inet_netmatch(), inet_output(),
147026Ssam 	inet_portmatch(), inet_portcheck(),
15*16128Skarels 	inet_checkhost(), inet_ishost(), inet_canon();
166916Ssam #define NIL \
176916Ssam 	{ null_hash,		null_netmatch,		null_output, \
187026Ssam 	  null_portmatch,	null_portcheck,		null_checkhost, \
19*16128Skarels 	  null_ishost,		null_canon }
206916Ssam #define	INET \
216916Ssam 	{ inet_hash,		inet_netmatch,		inet_output, \
227026Ssam 	  inet_portmatch,	inet_portcheck,		inet_checkhost, \
23*16128Skarels 	  inet_ishost,		inet_canon }
246916Ssam 
256916Ssam struct afswitch afswitch[AF_MAX] =
266916Ssam 	{ NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
276916Ssam 
286916Ssam inet_hash(sin, hp)
296916Ssam 	register struct sockaddr_in *sin;
306916Ssam 	struct afhash *hp;
316916Ssam {
326916Ssam 
338365Ssam 	hp->afh_nethash = inet_netof(sin->sin_addr);
3410243Ssam 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
357133Swnj 	hp->afh_hosthash &= 0x7fffffff;
366916Ssam }
376916Ssam 
386916Ssam inet_netmatch(sin1, sin2)
396916Ssam 	struct sockaddr_in *sin1, *sin2;
406916Ssam {
416916Ssam 
428365Ssam 	return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr));
436916Ssam }
446916Ssam 
456916Ssam /*
466916Ssam  * Verify the message is from the right port.
476916Ssam  */
486916Ssam inet_portmatch(sin)
499023Ssam 	register struct sockaddr_in *sin;
506916Ssam {
517133Swnj 
5210243Ssam #ifdef COMPAT
5310243Ssam 	if (ntohs(sin->sin_port) == ntohs(sp->s_port) + 1)
5410243Ssam 		return (1);
557133Swnj #endif
5610243Ssam 	return (sin->sin_port == sp->s_port);
576916Ssam }
586916Ssam 
596916Ssam /*
607026Ssam  * Verify the message is from a "trusted" port.
617026Ssam  */
627026Ssam inet_portcheck(sin)
6310243Ssam 	struct sockaddr_in *sin;
647026Ssam {
657026Ssam 
6610243Ssam 	return (ntohs(sin->sin_port) <= IPPORT_RESERVED);
677026Ssam }
687026Ssam 
697026Ssam /*
706916Ssam  * Internet output routine.
716916Ssam  */
7210243Ssam inet_output(s, flags, sin, size)
7310243Ssam 	int s, flags;
746916Ssam 	struct sockaddr_in *sin;
756916Ssam 	int size;
766916Ssam {
776916Ssam 	struct sockaddr_in dst;
786916Ssam 
796916Ssam 	dst = *sin;
806916Ssam 	sin = &dst;
819023Ssam 	if (sin->sin_port == 0)
8210243Ssam 		sin->sin_port = sp->s_port;
8310243Ssam 	if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
8410243Ssam 		perror("sendto");
856916Ssam }
866916Ssam 
876916Ssam /*
887793Ssam  * Return 1 if the address is believed
897793Ssam  * for an Internet host -- THIS IS A KLUDGE.
906916Ssam  */
916916Ssam inet_checkhost(sin)
926916Ssam 	struct sockaddr_in *sin;
936916Ssam {
94*16128Skarels #define	IN_BADCLASS(i)	(((long) (i) & 0xe0000000) == 0xe0000000)
9510243Ssam 
96*16128Skarels 	if (IN_BADCLASS(ntohl(sin->sin_addr)))
97*16128Skarels 		return(0);
98*16128Skarels 	return (inet_netof(sin->sin_addr) != 0);
99*16128Skarels }
100*16128Skarels 
101*16128Skarels /*
102*16128Skarels  * Return 1 if the address is
103*16128Skarels  * for an Internet host, 0 for a network.
104*16128Skarels  */
105*16128Skarels inet_ishost(sin)
106*16128Skarels 	struct sockaddr_in *sin;
107*16128Skarels {
108*16128Skarels 
1098365Ssam 	return (inet_lnaof(sin->sin_addr) != 0);
1106916Ssam }
1116916Ssam 
1126916Ssam inet_canon(sin)
1136916Ssam 	struct sockaddr_in *sin;
1146916Ssam {
11510243Ssam 
1166916Ssam 	sin->sin_port = 0;
1176916Ssam }
1186916Ssam 
1196916Ssam /*ARGSUSED*/
1206916Ssam null_hash(addr, hp)
1216916Ssam 	struct sockaddr *addr;
1226916Ssam 	struct afhash *hp;
1236916Ssam {
1246916Ssam 
1256916Ssam 	hp->afh_nethash = hp->afh_hosthash = 0;
1266916Ssam }
1276916Ssam 
1286916Ssam /*ARGSUSED*/
1296916Ssam null_netmatch(a1, a2)
1306916Ssam 	struct sockaddr *a1, *a2;
1316916Ssam {
1326916Ssam 
1336916Ssam 	return (0);
1346916Ssam }
1356916Ssam 
1366916Ssam /*ARGSUSED*/
13710243Ssam null_output(s, f, a1, n)
13810243Ssam 	int s, f;
1396916Ssam 	struct sockaddr *a1;
1406916Ssam 	int n;
1416916Ssam {
1427133Swnj 
1436916Ssam 	;
1446916Ssam }
1456916Ssam 
1466916Ssam /*ARGSUSED*/
1476916Ssam null_portmatch(a1)
1486916Ssam 	struct sockaddr *a1;
1496916Ssam {
1507133Swnj 
1516916Ssam 	return (0);
1526916Ssam }
1536916Ssam 
1546916Ssam /*ARGSUSED*/
1557026Ssam null_portcheck(a1)
1567026Ssam 	struct sockaddr *a1;
1577026Ssam {
1587133Swnj 
1597026Ssam 	return (0);
1607026Ssam }
1617026Ssam 
1627026Ssam /*ARGSUSED*/
163*16128Skarels null_ishost(a1)
164*16128Skarels 	struct sockaddr *a1;
165*16128Skarels {
166*16128Skarels 
167*16128Skarels 	return (0);
168*16128Skarels }
169*16128Skarels 
170*16128Skarels /*ARGSUSED*/
1716916Ssam null_checkhost(a1)
1726916Ssam 	struct sockaddr *a1;
1736916Ssam {
1747133Swnj 
1756916Ssam 	return (0);
1766916Ssam }
1776916Ssam 
1786916Ssam /*ARGSUSED*/
1796916Ssam null_canon(a1)
1806916Ssam 	struct sockaddr *a1;
1816916Ssam {
1827133Swnj 
1836916Ssam 	;
1846916Ssam }
185