12b15cb3dSCy Schubert /* 22b15cb3dSCy Schubert * ntp_net.h - definitions for NTP network stuff 32b15cb3dSCy Schubert */ 42b15cb3dSCy Schubert 52b15cb3dSCy Schubert #ifndef NTP_NET_H 62b15cb3dSCy Schubert #define NTP_NET_H 72b15cb3dSCy Schubert 82b15cb3dSCy Schubert #include <sys/types.h> 92b15cb3dSCy Schubert #ifdef HAVE_SYS_SOCKET_H 102b15cb3dSCy Schubert #include <sys/socket.h> 112b15cb3dSCy Schubert #endif 122b15cb3dSCy Schubert #ifdef HAVE_NET_IF_H 132b15cb3dSCy Schubert #include <net/if.h> 142b15cb3dSCy Schubert #endif 152b15cb3dSCy Schubert #ifdef HAVE_NETINET_IN_H 162b15cb3dSCy Schubert #include <netinet/in.h> 172b15cb3dSCy Schubert #endif 182b15cb3dSCy Schubert #ifdef HAVE_NET_IF_VAR_H 192b15cb3dSCy Schubert #include <net/if_var.h> 202b15cb3dSCy Schubert #endif 212b15cb3dSCy Schubert #ifdef HAVE_NETINET_IN_VAR_H 222b15cb3dSCy Schubert #include <netinet/in_var.h> 232b15cb3dSCy Schubert #endif 242b15cb3dSCy Schubert 252b15cb3dSCy Schubert #include "ntp_rfc2553.h" 262b15cb3dSCy Schubert #include "ntp_malloc.h" 272b15cb3dSCy Schubert 282b15cb3dSCy Schubert typedef union { 292b15cb3dSCy Schubert struct sockaddr sa; 302b15cb3dSCy Schubert struct sockaddr_in sa4; 312b15cb3dSCy Schubert struct sockaddr_in6 sa6; 322b15cb3dSCy Schubert } sockaddr_u; 332b15cb3dSCy Schubert 342b15cb3dSCy Schubert /* 352b15cb3dSCy Schubert * Utilities for manipulating sockaddr_u v4/v6 unions 362b15cb3dSCy Schubert */ 372b15cb3dSCy Schubert #define SOCK_ADDR4(psau) ((psau)->sa4.sin_addr) 382b15cb3dSCy Schubert #define SOCK_ADDR6(psau) ((psau)->sa6.sin6_addr) 392b15cb3dSCy Schubert 402b15cb3dSCy Schubert #define PSOCK_ADDR4(psau) (&SOCK_ADDR4(psau)) 412b15cb3dSCy Schubert #define PSOCK_ADDR6(psau) (&SOCK_ADDR6(psau)) 422b15cb3dSCy Schubert 432b15cb3dSCy Schubert #define AF(psau) ((psau)->sa.sa_family) 442b15cb3dSCy Schubert 452b15cb3dSCy Schubert #define IS_IPV4(psau) (AF_INET == AF(psau)) 462b15cb3dSCy Schubert #define IS_IPV6(psau) (AF_INET6 == AF(psau)) 472b15cb3dSCy Schubert 482b15cb3dSCy Schubert /* sockaddr_u v4 address in network byte order */ 492b15cb3dSCy Schubert #define NSRCADR(psau) (SOCK_ADDR4(psau).s_addr) 502b15cb3dSCy Schubert 512b15cb3dSCy Schubert /* sockaddr_u v4 address in host byte order */ 522b15cb3dSCy Schubert #define SRCADR(psau) (ntohl(NSRCADR(psau))) 532b15cb3dSCy Schubert 542b15cb3dSCy Schubert /* sockaddr_u v6 address in network byte order */ 552b15cb3dSCy Schubert #define NSRCADR6(psau) (SOCK_ADDR6(psau).s6_addr) 562b15cb3dSCy Schubert 572b15cb3dSCy Schubert /* assign sockaddr_u v4 address from host byte order */ 582b15cb3dSCy Schubert #define SET_ADDR4(psau, addr4) (NSRCADR(psau) = htonl(addr4)) 592b15cb3dSCy Schubert 602b15cb3dSCy Schubert /* assign sockaddr_u v4 address from network byte order */ 612b15cb3dSCy Schubert #define SET_ADDR4N(psau, addr4n) (NSRCADR(psau) = (addr4n)); 622b15cb3dSCy Schubert 632b15cb3dSCy Schubert /* assign sockaddr_u v6 address from network byte order */ 642b15cb3dSCy Schubert #define SET_ADDR6N(psau, s6_addr) \ 652b15cb3dSCy Schubert (SOCK_ADDR6(psau) = (s6_addr)) 662b15cb3dSCy Schubert 672b15cb3dSCy Schubert /* sockaddr_u v4/v6 port in network byte order */ 682b15cb3dSCy Schubert #define NSRCPORT(psau) ((psau)->sa4.sin_port) 692b15cb3dSCy Schubert 702b15cb3dSCy Schubert /* sockaddr_u v4/v6 port in host byte order */ 712b15cb3dSCy Schubert #define SRCPORT(psau) (ntohs(NSRCPORT(psau))) 722b15cb3dSCy Schubert 732b15cb3dSCy Schubert /* assign sockaddr_u v4/v6 port from host byte order */ 742b15cb3dSCy Schubert #define SET_PORT(psau, port) (NSRCPORT(psau) = htons(port)) 752b15cb3dSCy Schubert 762b15cb3dSCy Schubert /* sockaddr_u v6 scope */ 772b15cb3dSCy Schubert #define SCOPE_VAR(psau) ((psau)->sa6.sin6_scope_id) 782b15cb3dSCy Schubert 792b15cb3dSCy Schubert #ifdef ISC_PLATFORM_HAVESCOPEID 802b15cb3dSCy Schubert /* v4/v6 scope (always zero for v4) */ 812b15cb3dSCy Schubert # define SCOPE(psau) (IS_IPV4(psau) \ 822b15cb3dSCy Schubert ? 0 \ 832b15cb3dSCy Schubert : SCOPE_VAR(psau)) 842b15cb3dSCy Schubert 852b15cb3dSCy Schubert /* are two v6 sockaddr_u scopes equal? */ 862b15cb3dSCy Schubert # define SCOPE_EQ(psau1, psau2) \ 872b15cb3dSCy Schubert (SCOPE_VAR(psau1) == SCOPE_VAR(psau2)) 882b15cb3dSCy Schubert 892b15cb3dSCy Schubert /* assign scope if supported */ 902b15cb3dSCy Schubert # define SET_SCOPE(psau, s) \ 912b15cb3dSCy Schubert do \ 922b15cb3dSCy Schubert if (IS_IPV6(psau)) \ 932b15cb3dSCy Schubert SCOPE_VAR(psau) = (s); \ 942b15cb3dSCy Schubert while (0) 952b15cb3dSCy Schubert #else /* ISC_PLATFORM_HAVESCOPEID not defined */ 962b15cb3dSCy Schubert # define SCOPE(psau) (0) 972b15cb3dSCy Schubert # define SCOPE_EQ(psau1, psau2) (1) 982b15cb3dSCy Schubert # define SET_SCOPE(psau, s) do { } while (0) 992b15cb3dSCy Schubert #endif /* ISC_PLATFORM_HAVESCOPEID */ 1002b15cb3dSCy Schubert 1012b15cb3dSCy Schubert /* v4/v6 is multicast address */ 1022b15cb3dSCy Schubert #define IS_MCAST(psau) \ 1032b15cb3dSCy Schubert (IS_IPV4(psau) \ 1042b15cb3dSCy Schubert ? IN_CLASSD(SRCADR(psau)) \ 1052b15cb3dSCy Schubert : IN6_IS_ADDR_MULTICAST(PSOCK_ADDR6(psau))) 1062b15cb3dSCy Schubert 1072b15cb3dSCy Schubert /* v6 is interface ID scope universal, as with MAC-derived addresses */ 1082b15cb3dSCy Schubert #define IS_IID_UNIV(psau) \ 1092b15cb3dSCy Schubert (!!(0x02 & NSRCADR6(psau)[8])) 1102b15cb3dSCy Schubert 1112b15cb3dSCy Schubert #define SIZEOF_INADDR(fam) \ 1122b15cb3dSCy Schubert ((AF_INET == (fam)) \ 1132b15cb3dSCy Schubert ? sizeof(struct in_addr) \ 1142b15cb3dSCy Schubert : sizeof(struct in6_addr)) 1152b15cb3dSCy Schubert 1162b15cb3dSCy Schubert #define SIZEOF_SOCKADDR(fam) \ 1172b15cb3dSCy Schubert ((AF_INET == (fam)) \ 1182b15cb3dSCy Schubert ? sizeof(struct sockaddr_in) \ 1192b15cb3dSCy Schubert : sizeof(struct sockaddr_in6)) 1202b15cb3dSCy Schubert 1212b15cb3dSCy Schubert #define SOCKLEN(psau) \ 1222b15cb3dSCy Schubert (IS_IPV4(psau) \ 1232b15cb3dSCy Schubert ? sizeof((psau)->sa4) \ 1242b15cb3dSCy Schubert : sizeof((psau)->sa6)) 1252b15cb3dSCy Schubert 1262b15cb3dSCy Schubert #define ZERO_SOCK(psau) \ 1272b15cb3dSCy Schubert ZERO(*(psau)) 1282b15cb3dSCy Schubert 1292b15cb3dSCy Schubert /* blast a byte value across sockaddr_u v6 address */ 1302b15cb3dSCy Schubert #define MEMSET_ADDR6(psau, v) \ 1312b15cb3dSCy Schubert memset((psau)->sa6.sin6_addr.s6_addr, (v), \ 1322b15cb3dSCy Schubert sizeof((psau)->sa6.sin6_addr.s6_addr)) 1332b15cb3dSCy Schubert 1342b15cb3dSCy Schubert #define SET_ONESMASK(psau) \ 1352b15cb3dSCy Schubert do { \ 1362b15cb3dSCy Schubert if (IS_IPV6(psau)) \ 1372b15cb3dSCy Schubert MEMSET_ADDR6((psau), 0xff); \ 1382b15cb3dSCy Schubert else \ 1392b15cb3dSCy Schubert NSRCADR(psau) = 0xffffffff; \ 1402b15cb3dSCy Schubert } while(0) 1412b15cb3dSCy Schubert 1422b15cb3dSCy Schubert /* zero sockaddr_u, fill in family and all-ones (host) mask */ 1432b15cb3dSCy Schubert #define SET_HOSTMASK(psau, family) \ 1442b15cb3dSCy Schubert do { \ 1452b15cb3dSCy Schubert ZERO_SOCK(psau); \ 1462b15cb3dSCy Schubert AF(psau) = (family); \ 1472b15cb3dSCy Schubert SET_ONESMASK(psau); \ 1482b15cb3dSCy Schubert } while (0) 1492b15cb3dSCy Schubert 1502b15cb3dSCy Schubert /* 1512b15cb3dSCy Schubert * compare two in6_addr returning negative, 0, or positive. 1522b15cb3dSCy Schubert * ADDR6_CMP is negative if *pin6A is lower than *pin6B, zero if they 1532b15cb3dSCy Schubert * are equal, positive if *pin6A is higher than *pin6B. IN6ADDR_ANY 1542b15cb3dSCy Schubert * is the lowest address (128 zero bits). 1552b15cb3dSCy Schubert */ 1562b15cb3dSCy Schubert #define ADDR6_CMP(pin6A, pin6B) \ 1572b15cb3dSCy Schubert memcmp((pin6A)->s6_addr, (pin6B)->s6_addr, \ 1582b15cb3dSCy Schubert sizeof(pin6A)->s6_addr) 1592b15cb3dSCy Schubert 1602b15cb3dSCy Schubert /* compare two in6_addr for equality only */ 1612b15cb3dSCy Schubert #if !defined(SYS_WINNT) || !defined(in_addr6) 1622b15cb3dSCy Schubert #define ADDR6_EQ(pin6A, pin6B) \ 1632b15cb3dSCy Schubert (!ADDR6_CMP(pin6A, pin6B)) 1642b15cb3dSCy Schubert #else 1652b15cb3dSCy Schubert #define ADDR6_EQ(pin6A, pin6B) \ 1662b15cb3dSCy Schubert IN6_ADDR_EQUAL(pin6A, pin6B) 1672b15cb3dSCy Schubert #endif 1682b15cb3dSCy Schubert 1692b15cb3dSCy Schubert /* compare a in6_addr with socket address */ 1702b15cb3dSCy Schubert #define S_ADDR6_EQ(psau, pin6) \ 1712b15cb3dSCy Schubert ADDR6_EQ(&(psau)->sa6.sin6_addr, pin6) 1722b15cb3dSCy Schubert 1732b15cb3dSCy Schubert /* are two sockaddr_u's addresses equal? (port excluded) */ 1742b15cb3dSCy Schubert #define SOCK_EQ(psau1, psau2) \ 1752b15cb3dSCy Schubert ((AF(psau1) != AF(psau2)) \ 1762b15cb3dSCy Schubert ? 0 \ 1772b15cb3dSCy Schubert : IS_IPV4(psau1) \ 1782b15cb3dSCy Schubert ? (NSRCADR(psau1) == NSRCADR(psau2)) \ 1792b15cb3dSCy Schubert : (S_ADDR6_EQ((psau1), PSOCK_ADDR6(psau2)) \ 1802b15cb3dSCy Schubert && SCOPE_EQ((psau1), (psau2)))) 1812b15cb3dSCy Schubert 1822b15cb3dSCy Schubert /* are two sockaddr_u's addresses and ports equal? */ 1832b15cb3dSCy Schubert #define ADDR_PORT_EQ(psau1, psau2) \ 1842b15cb3dSCy Schubert ((NSRCPORT(psau1) != NSRCPORT(psau2) \ 1852b15cb3dSCy Schubert ? 0 \ 1862b15cb3dSCy Schubert : SOCK_EQ((psau1), (psau2)))) 1872b15cb3dSCy Schubert 1882b15cb3dSCy Schubert /* is sockaddr_u address unspecified? */ 1892b15cb3dSCy Schubert #define SOCK_UNSPEC(psau) \ 1902b15cb3dSCy Schubert (IS_IPV4(psau) \ 1912b15cb3dSCy Schubert ? !NSRCADR(psau) \ 1922b15cb3dSCy Schubert : IN6_IS_ADDR_UNSPECIFIED(PSOCK_ADDR6(psau))) 1932b15cb3dSCy Schubert 1942b15cb3dSCy Schubert /* just how unspecified do you mean? (scope 0/unspec too) */ 1952b15cb3dSCy Schubert #define SOCK_UNSPEC_S(psau) \ 1962b15cb3dSCy Schubert (SOCK_UNSPEC(psau) && !SCOPE(psau)) 1972b15cb3dSCy Schubert 198*f5f40dd6SCy Schubert /* choose a default net interface (endpt) for v4 or v6 */ 1992b15cb3dSCy Schubert #define ANY_INTERFACE_BYFAM(family) \ 2002b15cb3dSCy Schubert ((AF_INET == family) \ 2012b15cb3dSCy Schubert ? any_interface \ 2022b15cb3dSCy Schubert : any6_interface) 2032b15cb3dSCy Schubert 2042b15cb3dSCy Schubert /* choose a default interface for addresses' protocol (addr family) */ 2052b15cb3dSCy Schubert #define ANY_INTERFACE_CHOOSE(psau) \ 2062b15cb3dSCy Schubert ANY_INTERFACE_BYFAM(AF(psau)) 2072b15cb3dSCy Schubert 2082b15cb3dSCy Schubert 2092b15cb3dSCy Schubert /* 2102b15cb3dSCy Schubert * We tell reference clocks from real peers by giving the reference 2112b15cb3dSCy Schubert * clocks an address of the form 127.127.t.u, where t is the type and 2122b15cb3dSCy Schubert * u is the unit number. We define some of this here since we will need 2132b15cb3dSCy Schubert * some sanity checks to make sure this address isn't interpretted as 2142b15cb3dSCy Schubert * that of a normal peer. 2152b15cb3dSCy Schubert */ 2162b15cb3dSCy Schubert #define REFCLOCK_ADDR 0x7f7f0000 /* 127.127.0.0 */ 2172b15cb3dSCy Schubert #define REFCLOCK_MASK 0xffff0000 /* 255.255.0.0 */ 2182b15cb3dSCy Schubert 2192b15cb3dSCy Schubert #define ISREFCLOCKADR(srcadr) \ 2202b15cb3dSCy Schubert (IS_IPV4(srcadr) && \ 2212b15cb3dSCy Schubert (SRCADR(srcadr) & REFCLOCK_MASK) == REFCLOCK_ADDR) 2222b15cb3dSCy Schubert 2232b15cb3dSCy Schubert /* 2242b15cb3dSCy Schubert * Macro for checking for invalid addresses. This is really, really 2252b15cb3dSCy Schubert * gross, but is needed so no one configures a host on net 127 now that 2262b15cb3dSCy Schubert * we're encouraging it the the configuration file. 2272b15cb3dSCy Schubert */ 2282b15cb3dSCy Schubert #define LOOPBACKADR 0x7f000001 2292b15cb3dSCy Schubert #define LOOPNETMASK 0xff000000 230*f5f40dd6SCy Schubert #ifdef WORDS_BIGENDIAN 231*f5f40dd6SCy Schubert # define LOOPBACKADR_N LOOPBACKADR 232*f5f40dd6SCy Schubert #else 233*f5f40dd6SCy Schubert # define LOOPBACKADR_N 0x0100007f 234*f5f40dd6SCy Schubert #endif 235*f5f40dd6SCy Schubert 2362b15cb3dSCy Schubert 2372b15cb3dSCy Schubert #define ISBADADR(srcadr) \ 2382b15cb3dSCy Schubert (IS_IPV4(srcadr) \ 2392b15cb3dSCy Schubert && ((SRCADR(srcadr) & LOOPNETMASK) \ 2402b15cb3dSCy Schubert == (LOOPBACKADR & LOOPNETMASK)) \ 2412b15cb3dSCy Schubert && SRCADR(srcadr) != LOOPBACKADR) 2422b15cb3dSCy Schubert 243*f5f40dd6SCy Schubert #define IS_LOOPBACK_ADDR(psau) \ 244*f5f40dd6SCy Schubert (IS_IPV4(psau) \ 245*f5f40dd6SCy Schubert ? LOOPBACKADR == SRCADR(psau) \ 246*f5f40dd6SCy Schubert : IN6_IS_ADDR_LOOPBACK(PSOCK_ADDR6(psau)) \ 247*f5f40dd6SCy Schubert ) 2482b15cb3dSCy Schubert 2492b15cb3dSCy Schubert #endif /* NTP_NET_H */ 250