1*6916Ssam #ifndef lint 2*6916Ssam static char sccsid[] = "@(#)af.c 4.1 05/22/82"; 3*6916Ssam #endif 4*6916Ssam 5*6916Ssam #include <sys/types.h> 6*6916Ssam #include <sys/socket.h> 7*6916Ssam #include <net/in.h> 8*6916Ssam 9*6916Ssam #include "router.h" 10*6916Ssam #include "rip.h" 11*6916Ssam 12*6916Ssam /* 13*6916Ssam * Address family support routines 14*6916Ssam */ 15*6916Ssam int null_hash(), null_netmatch(), null_output(), 16*6916Ssam null_portmatch(), null_checkhost(), null_canon(); 17*6916Ssam int inet_hash(), inet_netmatch(), inet_output(), 18*6916Ssam inet_portmatch(), inet_checkhost(), inet_canon(); 19*6916Ssam #define NIL \ 20*6916Ssam { null_hash, null_netmatch, null_output, \ 21*6916Ssam null_portmatch, null_checkhost, null_canon } 22*6916Ssam #define INET \ 23*6916Ssam { inet_hash, inet_netmatch, inet_output, \ 24*6916Ssam inet_portmatch, inet_checkhost, inet_canon } 25*6916Ssam 26*6916Ssam struct afswitch afswitch[AF_MAX] = 27*6916Ssam { NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL }; 28*6916Ssam 29*6916Ssam inet_hash(sin, hp) 30*6916Ssam register struct sockaddr_in *sin; 31*6916Ssam struct afhash *hp; 32*6916Ssam { 33*6916Ssam 34*6916Ssam hp->afh_nethash = sin->sin_addr.s_net; 35*6916Ssam hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); 36*6916Ssam } 37*6916Ssam 38*6916Ssam inet_netmatch(sin1, sin2) 39*6916Ssam struct sockaddr_in *sin1, *sin2; 40*6916Ssam { 41*6916Ssam 42*6916Ssam return (sin1->sin_addr.s_net == sin2->sin_addr.s_net); 43*6916Ssam } 44*6916Ssam 45*6916Ssam /* 46*6916Ssam * Verify the message is from the right port. 47*6916Ssam */ 48*6916Ssam inet_portmatch(sin) 49*6916Ssam struct sockaddr_in *sin; 50*6916Ssam { 51*6916Ssam int port = ntohs(sin->sin_port); 52*6916Ssam 53*6916Ssam return (port == IPPORT_ROUTESERVER); 54*6916Ssam } 55*6916Ssam 56*6916Ssam /* 57*6916Ssam * Internet output routine. 58*6916Ssam */ 59*6916Ssam inet_output(sin, size) 60*6916Ssam struct sockaddr_in *sin; 61*6916Ssam int size; 62*6916Ssam { 63*6916Ssam extern int s; 64*6916Ssam extern char packet[MAXPACKETSIZE]; 65*6916Ssam struct sockaddr_in dst; 66*6916Ssam 67*6916Ssam dst = *sin; 68*6916Ssam sin = &dst; 69*6916Ssam if (sin->sin_port == 0) 70*6916Ssam sin->sin_port = htons(IPPORT_ROUTESERVER); 71*6916Ssam if (send(s, sin, packet, size) < 0) 72*6916Ssam perror("send"); 73*6916Ssam } 74*6916Ssam 75*6916Ssam /* 76*6916Ssam * Return 1 if the address is for an Internet host, 77*6916Ssam * otherwise assume it's a network address (broadcast). 78*6916Ssam */ 79*6916Ssam inet_checkhost(sin) 80*6916Ssam struct sockaddr_in *sin; 81*6916Ssam { 82*6916Ssam extern struct in_addr if_makeaddr(); 83*6916Ssam struct in_addr netaddr; 84*6916Ssam 85*6916Ssam netaddr = if_makeaddr((int)sin->sin_addr.s_net, INADDR_ANY); 86*6916Ssam return (netaddr.s_addr != sin->sin_addr.s_addr); 87*6916Ssam } 88*6916Ssam 89*6916Ssam inet_canon(sin) 90*6916Ssam struct sockaddr_in *sin; 91*6916Ssam { 92*6916Ssam sin->sin_port = 0; 93*6916Ssam } 94*6916Ssam 95*6916Ssam /*ARGSUSED*/ 96*6916Ssam null_hash(addr, hp) 97*6916Ssam struct sockaddr *addr; 98*6916Ssam struct afhash *hp; 99*6916Ssam { 100*6916Ssam 101*6916Ssam hp->afh_nethash = hp->afh_hosthash = 0; 102*6916Ssam } 103*6916Ssam 104*6916Ssam /*ARGSUSED*/ 105*6916Ssam null_netmatch(a1, a2) 106*6916Ssam struct sockaddr *a1, *a2; 107*6916Ssam { 108*6916Ssam 109*6916Ssam return (0); 110*6916Ssam } 111*6916Ssam 112*6916Ssam /*ARGSUSED*/ 113*6916Ssam null_output(a1, n) 114*6916Ssam struct sockaddr *a1; 115*6916Ssam int n; 116*6916Ssam { 117*6916Ssam ; 118*6916Ssam } 119*6916Ssam 120*6916Ssam /*ARGSUSED*/ 121*6916Ssam null_portmatch(a1) 122*6916Ssam struct sockaddr *a1; 123*6916Ssam { 124*6916Ssam return (0); 125*6916Ssam } 126*6916Ssam 127*6916Ssam /*ARGSUSED*/ 128*6916Ssam null_checkhost(a1) 129*6916Ssam struct sockaddr *a1; 130*6916Ssam { 131*6916Ssam return (0); 132*6916Ssam } 133*6916Ssam 134*6916Ssam /*ARGSUSED*/ 135*6916Ssam null_canon(a1) 136*6916Ssam struct sockaddr *a1; 137*6916Ssam { 138*6916Ssam ; 139*6916Ssam } 140