1258945Sroberto/* 2258945Sroberto * ntp_net.h - definitions for NTP network stuff 3258945Sroberto */ 4258945Sroberto 5258945Sroberto#ifndef NTP_NET_H 6258945Sroberto#define NTP_NET_H 7258945Sroberto 8258945Sroberto#include <sys/types.h> 9258945Sroberto#ifdef HAVE_SYS_SOCKET_H 10258945Sroberto#include <sys/socket.h> 11258945Sroberto#endif 12258945Sroberto#ifdef HAVE_NET_IF_H 13258945Sroberto#include <net/if.h> 14258945Sroberto#endif 15258945Sroberto#ifdef HAVE_NETINET_IN_H 16258945Sroberto#include <netinet/in.h> 17258945Sroberto#endif 18258945Sroberto#ifdef HAVE_NET_IF_VAR_H 19258945Sroberto#include <net/if_var.h> 20258945Sroberto#endif 21258945Sroberto#ifdef HAVE_NETINET_IN_VAR_H 22258945Sroberto#include <netinet/in_var.h> 23258945Sroberto#endif 24258945Sroberto 25258945Sroberto#include "ntp_rfc2553.h" 26280849Scy#include "ntp_malloc.h" 27258945Sroberto 28258945Srobertotypedef union { 29258945Sroberto struct sockaddr sa; 30258945Sroberto struct sockaddr_in sa4; 31258945Sroberto struct sockaddr_in6 sa6; 32258945Sroberto} sockaddr_u; 33258945Sroberto 34258945Sroberto/* 35258945Sroberto * Utilities for manipulating sockaddr_u v4/v6 unions 36258945Sroberto */ 37258945Sroberto#define SOCK_ADDR4(psau) ((psau)->sa4.sin_addr) 38258945Sroberto#define SOCK_ADDR6(psau) ((psau)->sa6.sin6_addr) 39258945Sroberto 40258945Sroberto#define PSOCK_ADDR4(psau) (&SOCK_ADDR4(psau)) 41258945Sroberto#define PSOCK_ADDR6(psau) (&SOCK_ADDR6(psau)) 42258945Sroberto 43258945Sroberto#define AF(psau) ((psau)->sa.sa_family) 44258945Sroberto 45258945Sroberto#define IS_IPV4(psau) (AF_INET == AF(psau)) 46258945Sroberto#define IS_IPV6(psau) (AF_INET6 == AF(psau)) 47258945Sroberto 48258945Sroberto/* sockaddr_u v4 address in network byte order */ 49258945Sroberto#define NSRCADR(psau) (SOCK_ADDR4(psau).s_addr) 50258945Sroberto 51258945Sroberto/* sockaddr_u v4 address in host byte order */ 52258945Sroberto#define SRCADR(psau) (ntohl(NSRCADR(psau))) 53258945Sroberto 54258945Sroberto/* sockaddr_u v6 address in network byte order */ 55258945Sroberto#define NSRCADR6(psau) (SOCK_ADDR6(psau).s6_addr) 56258945Sroberto 57258945Sroberto/* assign sockaddr_u v4 address from host byte order */ 58258945Sroberto#define SET_ADDR4(psau, addr4) (NSRCADR(psau) = htonl(addr4)) 59258945Sroberto 60258945Sroberto/* assign sockaddr_u v4 address from network byte order */ 61258945Sroberto#define SET_ADDR4N(psau, addr4n) (NSRCADR(psau) = (addr4n)); 62258945Sroberto 63258945Sroberto/* assign sockaddr_u v6 address from network byte order */ 64258945Sroberto#define SET_ADDR6N(psau, s6_addr) \ 65258945Sroberto (SOCK_ADDR6(psau) = (s6_addr)) 66258945Sroberto 67258945Sroberto/* sockaddr_u v4/v6 port in network byte order */ 68258945Sroberto#define NSRCPORT(psau) ((psau)->sa4.sin_port) 69258945Sroberto 70258945Sroberto/* sockaddr_u v4/v6 port in host byte order */ 71258945Sroberto#define SRCPORT(psau) (ntohs(NSRCPORT(psau))) 72258945Sroberto 73258945Sroberto/* assign sockaddr_u v4/v6 port from host byte order */ 74258945Sroberto#define SET_PORT(psau, port) (NSRCPORT(psau) = htons(port)) 75258945Sroberto 76258945Sroberto/* sockaddr_u v6 scope */ 77258945Sroberto#define SCOPE_VAR(psau) ((psau)->sa6.sin6_scope_id) 78258945Sroberto 79258945Sroberto#ifdef ISC_PLATFORM_HAVESCOPEID 80258945Sroberto/* v4/v6 scope (always zero for v4) */ 81258945Sroberto# define SCOPE(psau) (IS_IPV4(psau) \ 82258945Sroberto ? 0 \ 83258945Sroberto : SCOPE_VAR(psau)) 84258945Sroberto 85258945Sroberto/* are two v6 sockaddr_u scopes equal? */ 86258945Sroberto# define SCOPE_EQ(psau1, psau2) \ 87258945Sroberto (SCOPE_VAR(psau1) == SCOPE_VAR(psau2)) 88258945Sroberto 89258945Sroberto/* assign scope if supported */ 90258945Sroberto# define SET_SCOPE(psau, s) \ 91258945Sroberto do \ 92258945Sroberto if (IS_IPV6(psau)) \ 93258945Sroberto SCOPE_VAR(psau) = (s); \ 94258945Sroberto while (0) 95258945Sroberto#else /* ISC_PLATFORM_HAVESCOPEID not defined */ 96258945Sroberto# define SCOPE(psau) (0) 97258945Sroberto# define SCOPE_EQ(psau1, psau2) (1) 98258945Sroberto# define SET_SCOPE(psau, s) do { } while (0) 99258945Sroberto#endif /* ISC_PLATFORM_HAVESCOPEID */ 100258945Sroberto 101258945Sroberto/* v4/v6 is multicast address */ 102258945Sroberto#define IS_MCAST(psau) \ 103258945Sroberto (IS_IPV4(psau) \ 104258945Sroberto ? IN_CLASSD(SRCADR(psau)) \ 105258945Sroberto : IN6_IS_ADDR_MULTICAST(PSOCK_ADDR6(psau))) 106258945Sroberto 107258945Sroberto/* v6 is interface ID scope universal, as with MAC-derived addresses */ 108258945Sroberto#define IS_IID_UNIV(psau) \ 109258945Sroberto (!!(0x02 & NSRCADR6(psau)[8])) 110258945Sroberto 111258945Sroberto#define SIZEOF_INADDR(fam) \ 112258945Sroberto ((AF_INET == (fam)) \ 113258945Sroberto ? sizeof(struct in_addr) \ 114258945Sroberto : sizeof(struct in6_addr)) 115258945Sroberto 116258945Sroberto#define SIZEOF_SOCKADDR(fam) \ 117258945Sroberto ((AF_INET == (fam)) \ 118258945Sroberto ? sizeof(struct sockaddr_in) \ 119258945Sroberto : sizeof(struct sockaddr_in6)) 120258945Sroberto 121258945Sroberto#define SOCKLEN(psau) \ 122258945Sroberto (IS_IPV4(psau) \ 123258945Sroberto ? sizeof((psau)->sa4) \ 124258945Sroberto : sizeof((psau)->sa6)) 125258945Sroberto 126258945Sroberto#define ZERO_SOCK(psau) \ 127280849Scy ZERO(*(psau)) 128258945Sroberto 129258945Sroberto/* blast a byte value across sockaddr_u v6 address */ 130258945Sroberto#define MEMSET_ADDR6(psau, v) \ 131258945Sroberto memset((psau)->sa6.sin6_addr.s6_addr, (v), \ 132258945Sroberto sizeof((psau)->sa6.sin6_addr.s6_addr)) 133258945Sroberto 134258945Sroberto#define SET_ONESMASK(psau) \ 135258945Sroberto do { \ 136258945Sroberto if (IS_IPV6(psau)) \ 137258945Sroberto MEMSET_ADDR6((psau), 0xff); \ 138258945Sroberto else \ 139258945Sroberto NSRCADR(psau) = 0xffffffff; \ 140258945Sroberto } while(0) 141258945Sroberto 142258945Sroberto/* zero sockaddr_u, fill in family and all-ones (host) mask */ 143258945Sroberto#define SET_HOSTMASK(psau, family) \ 144258945Sroberto do { \ 145258945Sroberto ZERO_SOCK(psau); \ 146258945Sroberto AF(psau) = (family); \ 147258945Sroberto SET_ONESMASK(psau); \ 148258945Sroberto } while (0) 149258945Sroberto 150258945Sroberto/* 151258945Sroberto * compare two in6_addr returning negative, 0, or positive. 152258945Sroberto * ADDR6_CMP is negative if *pin6A is lower than *pin6B, zero if they 153258945Sroberto * are equal, positive if *pin6A is higher than *pin6B. IN6ADDR_ANY 154258945Sroberto * is the lowest address (128 zero bits). 155258945Sroberto */ 156258945Sroberto#define ADDR6_CMP(pin6A, pin6B) \ 157258945Sroberto memcmp((pin6A)->s6_addr, (pin6B)->s6_addr, \ 158258945Sroberto sizeof(pin6A)->s6_addr) 159258945Sroberto 160258945Sroberto/* compare two in6_addr for equality only */ 161258945Sroberto#if !defined(SYS_WINNT) || !defined(in_addr6) 162258945Sroberto#define ADDR6_EQ(pin6A, pin6B) \ 163258945Sroberto (!ADDR6_CMP(pin6A, pin6B)) 164258945Sroberto#else 165258945Sroberto#define ADDR6_EQ(pin6A, pin6B) \ 166258945Sroberto IN6_ADDR_EQUAL(pin6A, pin6B) 167258945Sroberto#endif 168258945Sroberto 169258945Sroberto/* compare a in6_addr with socket address */ 170258945Sroberto#define S_ADDR6_EQ(psau, pin6) \ 171258945Sroberto ADDR6_EQ(&(psau)->sa6.sin6_addr, pin6) 172258945Sroberto 173258945Sroberto/* are two sockaddr_u's addresses equal? (port excluded) */ 174258945Sroberto#define SOCK_EQ(psau1, psau2) \ 175258945Sroberto ((AF(psau1) != AF(psau2)) \ 176258945Sroberto ? 0 \ 177258945Sroberto : IS_IPV4(psau1) \ 178258945Sroberto ? (NSRCADR(psau1) == NSRCADR(psau2)) \ 179258945Sroberto : (S_ADDR6_EQ((psau1), PSOCK_ADDR6(psau2)) \ 180258945Sroberto && SCOPE_EQ((psau1), (psau2)))) 181258945Sroberto 182258945Sroberto/* are two sockaddr_u's addresses and ports equal? */ 183258945Sroberto#define ADDR_PORT_EQ(psau1, psau2) \ 184258945Sroberto ((NSRCPORT(psau1) != NSRCPORT(psau2) \ 185258945Sroberto ? 0 \ 186258945Sroberto : SOCK_EQ((psau1), (psau2)))) 187258945Sroberto 188258945Sroberto/* is sockaddr_u address unspecified? */ 189258945Sroberto#define SOCK_UNSPEC(psau) \ 190258945Sroberto (IS_IPV4(psau) \ 191258945Sroberto ? !NSRCADR(psau) \ 192258945Sroberto : IN6_IS_ADDR_UNSPECIFIED(PSOCK_ADDR6(psau))) 193258945Sroberto 194258945Sroberto/* just how unspecified do you mean? (scope 0/unspec too) */ 195258945Sroberto#define SOCK_UNSPEC_S(psau) \ 196258945Sroberto (SOCK_UNSPEC(psau) && !SCOPE(psau)) 197258945Sroberto 198258945Sroberto/* choose a default net interface (struct interface) for v4 or v6 */ 199258945Sroberto#define ANY_INTERFACE_BYFAM(family) \ 200258945Sroberto ((AF_INET == family) \ 201258945Sroberto ? any_interface \ 202258945Sroberto : any6_interface) 203258945Sroberto 204258945Sroberto/* choose a default interface for addresses' protocol (addr family) */ 205258945Sroberto#define ANY_INTERFACE_CHOOSE(psau) \ 206258945Sroberto ANY_INTERFACE_BYFAM(AF(psau)) 207258945Sroberto 208258945Sroberto 209258945Sroberto/* 210258945Sroberto * We tell reference clocks from real peers by giving the reference 211258945Sroberto * clocks an address of the form 127.127.t.u, where t is the type and 212258945Sroberto * u is the unit number. We define some of this here since we will need 213258945Sroberto * some sanity checks to make sure this address isn't interpretted as 214258945Sroberto * that of a normal peer. 215258945Sroberto */ 216258945Sroberto#define REFCLOCK_ADDR 0x7f7f0000 /* 127.127.0.0 */ 217258945Sroberto#define REFCLOCK_MASK 0xffff0000 /* 255.255.0.0 */ 218258945Sroberto 219258945Sroberto#define ISREFCLOCKADR(srcadr) \ 220258945Sroberto (IS_IPV4(srcadr) && \ 221258945Sroberto (SRCADR(srcadr) & REFCLOCK_MASK) == REFCLOCK_ADDR) 222258945Sroberto 223258945Sroberto/* 224258945Sroberto * Macro for checking for invalid addresses. This is really, really 225258945Sroberto * gross, but is needed so no one configures a host on net 127 now that 226258945Sroberto * we're encouraging it the the configuration file. 227258945Sroberto */ 228258945Sroberto#define LOOPBACKADR 0x7f000001 229258945Sroberto#define LOOPNETMASK 0xff000000 230258945Sroberto 231258945Sroberto#define ISBADADR(srcadr) \ 232258945Sroberto (IS_IPV4(srcadr) \ 233258945Sroberto && ((SRCADR(srcadr) & LOOPNETMASK) \ 234258945Sroberto == (LOOPBACKADR & LOOPNETMASK)) \ 235258945Sroberto && SRCADR(srcadr) != LOOPBACKADR) 236258945Sroberto 237258945Sroberto 238258945Sroberto#endif /* NTP_NET_H */ 239