xref: /csrg-svn/sbin/routed/af.c (revision 7133)
16916Ssam #ifndef lint
2*7133Swnj static char sccsid[] = "@(#)af.c	4.3 06/09/82";
36916Ssam #endif
46916Ssam 
56916Ssam #include <sys/types.h>
66916Ssam #include <sys/socket.h>
76916Ssam #include <net/in.h>
86916Ssam 
96916Ssam #include "router.h"
106916Ssam #include "rip.h"
116916Ssam 
126916Ssam /*
136916Ssam  * Address family support routines
146916Ssam  */
156916Ssam int	null_hash(), null_netmatch(), null_output(),
167026Ssam 	null_portmatch(), null_portcheck(),
177026Ssam 	null_checkhost(), null_canon();
186916Ssam int	inet_hash(), inet_netmatch(), inet_output(),
197026Ssam 	inet_portmatch(), inet_portcheck(),
207026Ssam 	inet_checkhost(), inet_canon();
216916Ssam #define NIL \
226916Ssam 	{ null_hash,		null_netmatch,		null_output, \
237026Ssam 	  null_portmatch,	null_portcheck,		null_checkhost, \
247026Ssam 	  null_canon }
256916Ssam #define	INET \
266916Ssam 	{ inet_hash,		inet_netmatch,		inet_output, \
277026Ssam 	  inet_portmatch,	inet_portcheck,		inet_checkhost, \
287026Ssam 	  inet_canon }
296916Ssam 
306916Ssam struct afswitch afswitch[AF_MAX] =
316916Ssam 	{ NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
326916Ssam 
336916Ssam inet_hash(sin, hp)
346916Ssam 	register struct sockaddr_in *sin;
356916Ssam 	struct afhash *hp;
366916Ssam {
376916Ssam 
386916Ssam 	hp->afh_nethash = sin->sin_addr.s_net;
39*7133Swnj 	hp->afh_hosthash = sin->sin_addr.s_addr;
40*7133Swnj #if vax || pdp11
41*7133Swnj 	hp->afh_hosthash = ntohl(hp->afh_hosthash);
42*7133Swnj #endif
43*7133Swnj 	hp->afh_hosthash &= 0x7fffffff;
446916Ssam }
456916Ssam 
466916Ssam inet_netmatch(sin1, sin2)
476916Ssam 	struct sockaddr_in *sin1, *sin2;
486916Ssam {
496916Ssam 
506916Ssam 	return (sin1->sin_addr.s_net == sin2->sin_addr.s_net);
516916Ssam }
526916Ssam 
536916Ssam /*
546916Ssam  * Verify the message is from the right port.
556916Ssam  */
566916Ssam inet_portmatch(sin)
576916Ssam 	struct sockaddr_in *sin;
586916Ssam {
59*7133Swnj 	int port = sin->sin_port;
60*7133Swnj 
61*7133Swnj #if vax || pdp11
62*7133Swnj 	port = ntohs(port);
63*7133Swnj #endif
646916Ssam 	return (port == IPPORT_ROUTESERVER);
656916Ssam }
666916Ssam 
676916Ssam /*
687026Ssam  * Verify the message is from a "trusted" port.
697026Ssam  */
707026Ssam inet_portcheck(sin)
717026Ssam 	struct sockaddr_in *sin;
727026Ssam {
73*7133Swnj 	int port = sin->sin_port;
747026Ssam 
75*7133Swnj #if vax || pdp11
76*7133Swnj 	port = ntohs(port);
77*7133Swnj #endif
787026Ssam 	return (port <= IPPORT_RESERVED);
797026Ssam }
807026Ssam 
817026Ssam /*
826916Ssam  * Internet output routine.
836916Ssam  */
84*7133Swnj inet_output(s, sin, size)
85*7133Swnj 	int s;
866916Ssam 	struct sockaddr_in *sin;
876916Ssam 	int size;
886916Ssam {
896916Ssam 	extern char packet[MAXPACKETSIZE];
906916Ssam 	struct sockaddr_in dst;
916916Ssam 
926916Ssam 	dst = *sin;
936916Ssam 	sin = &dst;
94*7133Swnj 	if (sin->sin_port == 0) {
95*7133Swnj 		sin->sin_port = IPPORT_ROUTESERVER;
96*7133Swnj #if vax || pdp11
97*7133Swnj 		sin->sin_port = htons(sin->sin_port);
98*7133Swnj #endif
99*7133Swnj 	}
1006916Ssam 	if (send(s, sin, packet, size) < 0)
1016916Ssam 		perror("send");
1026916Ssam }
1036916Ssam 
1046916Ssam /*
1056916Ssam  * Return 1 if the address is for an Internet host,
1066916Ssam  * otherwise assume it's a network address (broadcast).
1076916Ssam  */
1086916Ssam inet_checkhost(sin)
1096916Ssam 	struct sockaddr_in *sin;
1106916Ssam {
1116916Ssam 	extern struct in_addr if_makeaddr();
1126916Ssam 	struct in_addr netaddr;
1136916Ssam 
1146916Ssam 	netaddr = if_makeaddr((int)sin->sin_addr.s_net, INADDR_ANY);
1156916Ssam 	return (netaddr.s_addr != sin->sin_addr.s_addr);
1166916Ssam }
1176916Ssam 
1186916Ssam inet_canon(sin)
1196916Ssam 	struct sockaddr_in *sin;
1206916Ssam {
1216916Ssam 	sin->sin_port = 0;
1226916Ssam }
1236916Ssam 
1246916Ssam /*ARGSUSED*/
1256916Ssam null_hash(addr, hp)
1266916Ssam 	struct sockaddr *addr;
1276916Ssam 	struct afhash *hp;
1286916Ssam {
1296916Ssam 
1306916Ssam 	hp->afh_nethash = hp->afh_hosthash = 0;
1316916Ssam }
1326916Ssam 
1336916Ssam /*ARGSUSED*/
1346916Ssam null_netmatch(a1, a2)
1356916Ssam 	struct sockaddr *a1, *a2;
1366916Ssam {
1376916Ssam 
1386916Ssam 	return (0);
1396916Ssam }
1406916Ssam 
1416916Ssam /*ARGSUSED*/
142*7133Swnj null_output(s, a1, n)
143*7133Swnj 	int s;
1446916Ssam 	struct sockaddr *a1;
1456916Ssam 	int n;
1466916Ssam {
147*7133Swnj 
1486916Ssam 	;
1496916Ssam }
1506916Ssam 
1516916Ssam /*ARGSUSED*/
1526916Ssam null_portmatch(a1)
1536916Ssam 	struct sockaddr *a1;
1546916Ssam {
155*7133Swnj 
1566916Ssam 	return (0);
1576916Ssam }
1586916Ssam 
1596916Ssam /*ARGSUSED*/
1607026Ssam null_portcheck(a1)
1617026Ssam 	struct sockaddr *a1;
1627026Ssam {
163*7133Swnj 
1647026Ssam 	return (0);
1657026Ssam }
1667026Ssam 
1677026Ssam /*ARGSUSED*/
1686916Ssam null_checkhost(a1)
1696916Ssam 	struct sockaddr *a1;
1706916Ssam {
171*7133Swnj 
1726916Ssam 	return (0);
1736916Ssam }
1746916Ssam 
1756916Ssam /*ARGSUSED*/
1766916Ssam null_canon(a1)
1776916Ssam 	struct sockaddr *a1;
1786916Ssam {
179*7133Swnj 
1806916Ssam 	;
1816916Ssam }
182