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*26340Skarels static char sccsid[] = "@(#)af.c 5.3 (Berkeley) 02/23/86"; 921992Sdist #endif not lint 106916Ssam 1110243Ssam #include "defs.h" 126916Ssam 136916Ssam /* 146916Ssam * Address family support routines 156916Ssam */ 166916Ssam int inet_hash(), inet_netmatch(), inet_output(), 177026Ssam inet_portmatch(), inet_portcheck(), 1816128Skarels inet_checkhost(), inet_ishost(), inet_canon(); 19*26340Skarels char *inet_format(); 20*26340Skarels #define NIL { 0 } 216916Ssam #define INET \ 226916Ssam { inet_hash, inet_netmatch, inet_output, \ 237026Ssam inet_portmatch, inet_portcheck, inet_checkhost, \ 24*26340Skarels inet_ishost, inet_canon, inet_format } 256916Ssam 266916Ssam struct afswitch afswitch[AF_MAX] = 27*26340Skarels { NIL, NIL, INET, }; 286916Ssam 29*26340Skarels int af_max = sizeof(afswitch) / sizeof(afswitch[0]); 30*26340Skarels 3116325Skarels struct sockaddr_in inet_default = { AF_INET, INADDR_ANY }; 3216325Skarels 336916Ssam inet_hash(sin, hp) 346916Ssam register struct sockaddr_in *sin; 356916Ssam struct afhash *hp; 366916Ssam { 3721838Skarels register u_long n; 386916Ssam 3921838Skarels n = inet_netof(sin->sin_addr); 4021838Skarels if (n) 4121838Skarels while ((n & 0xff) == 0) 4221838Skarels n >>= 8; 4321838Skarels hp->afh_nethash = n; 4410243Ssam hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); 457133Swnj hp->afh_hosthash &= 0x7fffffff; 466916Ssam } 476916Ssam 486916Ssam inet_netmatch(sin1, sin2) 496916Ssam struct sockaddr_in *sin1, *sin2; 506916Ssam { 516916Ssam 528365Ssam return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr)); 536916Ssam } 546916Ssam 556916Ssam /* 566916Ssam * Verify the message is from the right port. 576916Ssam */ 586916Ssam inet_portmatch(sin) 599023Ssam register struct sockaddr_in *sin; 606916Ssam { 617133Swnj 6210243Ssam return (sin->sin_port == sp->s_port); 636916Ssam } 646916Ssam 656916Ssam /* 667026Ssam * Verify the message is from a "trusted" port. 677026Ssam */ 687026Ssam inet_portcheck(sin) 6910243Ssam struct sockaddr_in *sin; 707026Ssam { 717026Ssam 7210243Ssam return (ntohs(sin->sin_port) <= IPPORT_RESERVED); 737026Ssam } 747026Ssam 757026Ssam /* 766916Ssam * Internet output routine. 776916Ssam */ 7810243Ssam inet_output(s, flags, sin, size) 7910243Ssam int s, flags; 806916Ssam struct sockaddr_in *sin; 816916Ssam int size; 826916Ssam { 836916Ssam struct sockaddr_in dst; 846916Ssam 856916Ssam dst = *sin; 866916Ssam sin = &dst; 879023Ssam if (sin->sin_port == 0) 8810243Ssam sin->sin_port = sp->s_port; 8910243Ssam if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0) 9010243Ssam perror("sendto"); 916916Ssam } 926916Ssam 936916Ssam /* 947793Ssam * Return 1 if the address is believed 957793Ssam * for an Internet host -- THIS IS A KLUDGE. 966916Ssam */ 976916Ssam inet_checkhost(sin) 986916Ssam struct sockaddr_in *sin; 996916Ssam { 10016741Skarels u_long i = ntohl(sin->sin_addr.s_addr); 10116435Skarels 10216128Skarels #define IN_BADCLASS(i) (((long) (i) & 0xe0000000) == 0xe0000000) 10310243Ssam 10421838Skarels if (IN_BADCLASS(i) || sin->sin_port != 0) 10516325Skarels return (0); 10616435Skarels if (i != 0 && (i & 0xff000000) == 0) 10716325Skarels return (0); 10825352Skarels for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++) 10925352Skarels if (sin->sin_zero[i]) 11025352Skarels return (0); 11116325Skarels return (1); 11216128Skarels } 11316128Skarels 11416128Skarels /* 11516128Skarels * Return 1 if the address is 11616128Skarels * for an Internet host, 0 for a network. 11716128Skarels */ 11816128Skarels inet_ishost(sin) 11916128Skarels struct sockaddr_in *sin; 12016128Skarels { 12116128Skarels 1228365Ssam return (inet_lnaof(sin->sin_addr) != 0); 1236916Ssam } 1246916Ssam 1256916Ssam inet_canon(sin) 1266916Ssam struct sockaddr_in *sin; 1276916Ssam { 12810243Ssam 1296916Ssam sin->sin_port = 0; 1306916Ssam } 1316916Ssam 132*26340Skarels char * 133*26340Skarels inet_format(sin) 134*26340Skarels struct sockaddr_in *sin; 1356916Ssam { 136*26340Skarels char *inet_ntoa(); 1376916Ssam 138*26340Skarels return (inet_ntoa(sin->sin_addr)); 1396916Ssam } 140