121992Sdist /* 221992Sdist * Copyright (c) 1983 Regents of the University of California. 321992Sdist * All rights reserved. The Berkeley software License Agreement 421992Sdist * specifies the terms and conditions for redistribution. 521992Sdist */ 621992Sdist 76916Ssam #ifndef lint 8*25352Skarels static char sccsid[] = "@(#)af.c 5.2 (Berkeley) 10/31/85"; 921992Sdist #endif not lint 106916Ssam 1110243Ssam #include "defs.h" 126916Ssam 136916Ssam /* 146916Ssam * Address family support routines 156916Ssam */ 166916Ssam int null_hash(), null_netmatch(), null_output(), 177026Ssam null_portmatch(), null_portcheck(), 1816128Skarels null_checkhost(), null_ishost(), null_canon(); 196916Ssam int inet_hash(), inet_netmatch(), inet_output(), 207026Ssam inet_portmatch(), inet_portcheck(), 2116128Skarels inet_checkhost(), inet_ishost(), inet_canon(); 226916Ssam #define NIL \ 236916Ssam { null_hash, null_netmatch, null_output, \ 247026Ssam null_portmatch, null_portcheck, null_checkhost, \ 2516128Skarels null_ishost, null_canon } 266916Ssam #define INET \ 276916Ssam { inet_hash, inet_netmatch, inet_output, \ 287026Ssam inet_portmatch, inet_portcheck, inet_checkhost, \ 2916128Skarels inet_ishost, inet_canon } 306916Ssam 316916Ssam struct afswitch afswitch[AF_MAX] = 326916Ssam { NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL }; 336916Ssam 3416325Skarels struct sockaddr_in inet_default = { AF_INET, INADDR_ANY }; 3516325Skarels 366916Ssam inet_hash(sin, hp) 376916Ssam register struct sockaddr_in *sin; 386916Ssam struct afhash *hp; 396916Ssam { 4021838Skarels register u_long n; 416916Ssam 4221838Skarels n = inet_netof(sin->sin_addr); 4321838Skarels if (n) 4421838Skarels while ((n & 0xff) == 0) 4521838Skarels n >>= 8; 4621838Skarels hp->afh_nethash = n; 4710243Ssam hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); 487133Swnj hp->afh_hosthash &= 0x7fffffff; 496916Ssam } 506916Ssam 516916Ssam inet_netmatch(sin1, sin2) 526916Ssam struct sockaddr_in *sin1, *sin2; 536916Ssam { 546916Ssam 558365Ssam return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr)); 566916Ssam } 576916Ssam 586916Ssam /* 596916Ssam * Verify the message is from the right port. 606916Ssam */ 616916Ssam inet_portmatch(sin) 629023Ssam register struct sockaddr_in *sin; 636916Ssam { 647133Swnj 6510243Ssam return (sin->sin_port == sp->s_port); 666916Ssam } 676916Ssam 686916Ssam /* 697026Ssam * Verify the message is from a "trusted" port. 707026Ssam */ 717026Ssam inet_portcheck(sin) 7210243Ssam struct sockaddr_in *sin; 737026Ssam { 747026Ssam 7510243Ssam return (ntohs(sin->sin_port) <= IPPORT_RESERVED); 767026Ssam } 777026Ssam 787026Ssam /* 796916Ssam * Internet output routine. 806916Ssam */ 8110243Ssam inet_output(s, flags, sin, size) 8210243Ssam int s, flags; 836916Ssam struct sockaddr_in *sin; 846916Ssam int size; 856916Ssam { 866916Ssam struct sockaddr_in dst; 876916Ssam 886916Ssam dst = *sin; 896916Ssam sin = &dst; 909023Ssam if (sin->sin_port == 0) 9110243Ssam sin->sin_port = sp->s_port; 9210243Ssam if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0) 9310243Ssam perror("sendto"); 946916Ssam } 956916Ssam 966916Ssam /* 977793Ssam * Return 1 if the address is believed 987793Ssam * for an Internet host -- THIS IS A KLUDGE. 996916Ssam */ 1006916Ssam inet_checkhost(sin) 1016916Ssam struct sockaddr_in *sin; 1026916Ssam { 10316741Skarels u_long i = ntohl(sin->sin_addr.s_addr); 10416435Skarels 10516128Skarels #define IN_BADCLASS(i) (((long) (i) & 0xe0000000) == 0xe0000000) 10610243Ssam 10721838Skarels if (IN_BADCLASS(i) || sin->sin_port != 0) 10816325Skarels return (0); 10916435Skarels if (i != 0 && (i & 0xff000000) == 0) 11016325Skarels return (0); 111*25352Skarels for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++) 112*25352Skarels if (sin->sin_zero[i]) 113*25352Skarels return (0); 11416325Skarels return (1); 11516128Skarels } 11616128Skarels 11716128Skarels /* 11816128Skarels * Return 1 if the address is 11916128Skarels * for an Internet host, 0 for a network. 12016128Skarels */ 12116128Skarels inet_ishost(sin) 12216128Skarels struct sockaddr_in *sin; 12316128Skarels { 12416128Skarels 1258365Ssam return (inet_lnaof(sin->sin_addr) != 0); 1266916Ssam } 1276916Ssam 1286916Ssam inet_canon(sin) 1296916Ssam struct sockaddr_in *sin; 1306916Ssam { 13110243Ssam 1326916Ssam sin->sin_port = 0; 1336916Ssam } 1346916Ssam 1356916Ssam /*ARGSUSED*/ 1366916Ssam null_hash(addr, hp) 1376916Ssam struct sockaddr *addr; 1386916Ssam struct afhash *hp; 1396916Ssam { 1406916Ssam 1416916Ssam hp->afh_nethash = hp->afh_hosthash = 0; 1426916Ssam } 1436916Ssam 1446916Ssam /*ARGSUSED*/ 1456916Ssam null_netmatch(a1, a2) 1466916Ssam struct sockaddr *a1, *a2; 1476916Ssam { 1486916Ssam 1496916Ssam return (0); 1506916Ssam } 1516916Ssam 1526916Ssam /*ARGSUSED*/ 15310243Ssam null_output(s, f, a1, n) 15410243Ssam int s, f; 1556916Ssam struct sockaddr *a1; 1566916Ssam int n; 1576916Ssam { 1587133Swnj 1596916Ssam ; 1606916Ssam } 1616916Ssam 1626916Ssam /*ARGSUSED*/ 1636916Ssam null_portmatch(a1) 1646916Ssam struct sockaddr *a1; 1656916Ssam { 1667133Swnj 1676916Ssam return (0); 1686916Ssam } 1696916Ssam 1706916Ssam /*ARGSUSED*/ 1717026Ssam null_portcheck(a1) 1727026Ssam struct sockaddr *a1; 1737026Ssam { 1747133Swnj 1757026Ssam return (0); 1767026Ssam } 1777026Ssam 1787026Ssam /*ARGSUSED*/ 17916128Skarels null_ishost(a1) 18016128Skarels struct sockaddr *a1; 18116128Skarels { 18216128Skarels 18316128Skarels return (0); 18416128Skarels } 18516128Skarels 18616128Skarels /*ARGSUSED*/ 1876916Ssam null_checkhost(a1) 1886916Ssam struct sockaddr *a1; 1896916Ssam { 1907133Swnj 1916916Ssam return (0); 1926916Ssam } 1936916Ssam 1946916Ssam /*ARGSUSED*/ 1956916Ssam null_canon(a1) 1966916Ssam struct sockaddr *a1; 1976916Ssam { 1987133Swnj 1996916Ssam ; 2006916Ssam } 201