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