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