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