xref: /freebsd/contrib/ntp/include/ntp_rfc2553.h (revision 416ba5c74546f32a993436a99516d35008e9f384)
19c2daa00SOllivier Robert /*
29c2daa00SOllivier Robert  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
39c2daa00SOllivier Robert  * All rights reserved.
49c2daa00SOllivier Robert  *
59c2daa00SOllivier Robert  * Redistribution and use in source and binary forms, with or without
69c2daa00SOllivier Robert  * modification, are permitted provided that the following conditions
79c2daa00SOllivier Robert  * are met:
89c2daa00SOllivier Robert  * 1. Redistributions of source code must retain the above copyright
99c2daa00SOllivier Robert  *    notice, this list of conditions and the following disclaimer.
109c2daa00SOllivier Robert  * 2. Redistributions in binary form must reproduce the above copyright
119c2daa00SOllivier Robert  *    notice, this list of conditions and the following disclaimer in the
129c2daa00SOllivier Robert  *    documentation and/or other materials provided with the distribution.
139c2daa00SOllivier Robert  * 3. Neither the name of the project nor the names of its contributors
149c2daa00SOllivier Robert  *    may be used to endorse or promote products derived from this software
159c2daa00SOllivier Robert  *    without specific prior written permission.
169c2daa00SOllivier Robert  *
179c2daa00SOllivier Robert  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
189c2daa00SOllivier Robert  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199c2daa00SOllivier Robert  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
209c2daa00SOllivier Robert  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
219c2daa00SOllivier Robert  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
229c2daa00SOllivier Robert  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
239c2daa00SOllivier Robert  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249c2daa00SOllivier Robert  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
259c2daa00SOllivier Robert  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
269c2daa00SOllivier Robert  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
279c2daa00SOllivier Robert  * SUCH DAMAGE.
289c2daa00SOllivier Robert  */
299c2daa00SOllivier Robert 
309c2daa00SOllivier Robert /*
319c2daa00SOllivier Robert  * Copyright (c) 1982, 1986, 1990, 1993
329c2daa00SOllivier Robert  *	The Regents of the University of California.  All rights reserved.
339c2daa00SOllivier Robert  *
349c2daa00SOllivier Robert  * Redistribution and use in source and binary forms, with or without
359c2daa00SOllivier Robert  * modification, are permitted provided that the following conditions
369c2daa00SOllivier Robert  * are met:
379c2daa00SOllivier Robert  * 1. Redistributions of source code must retain the above copyright
389c2daa00SOllivier Robert  *    notice, this list of conditions and the following disclaimer.
399c2daa00SOllivier Robert  * 2. Redistributions in binary form must reproduce the above copyright
409c2daa00SOllivier Robert  *    notice, this list of conditions and the following disclaimer in the
419c2daa00SOllivier Robert  *    documentation and/or other materials provided with the distribution.
429c2daa00SOllivier Robert  * 3. All advertising materials mentioning features or use of this software
439c2daa00SOllivier Robert  *    must display the following acknowledgement:
449c2daa00SOllivier Robert  *	This product includes software developed by the University of
459c2daa00SOllivier Robert  *	California, Berkeley and its contributors.
469c2daa00SOllivier Robert  * 4. Neither the name of the University nor the names of its contributors
479c2daa00SOllivier Robert  *    may be used to endorse or promote products derived from this software
489c2daa00SOllivier Robert  *    without specific prior written permission.
499c2daa00SOllivier Robert  *
509c2daa00SOllivier Robert  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
519c2daa00SOllivier Robert  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
529c2daa00SOllivier Robert  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
539c2daa00SOllivier Robert  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
549c2daa00SOllivier Robert  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
559c2daa00SOllivier Robert  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
569c2daa00SOllivier Robert  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
579c2daa00SOllivier Robert  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
589c2daa00SOllivier Robert  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
599c2daa00SOllivier Robert  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
609c2daa00SOllivier Robert  * SUCH DAMAGE.
619c2daa00SOllivier Robert  *
629c2daa00SOllivier Robert  *	@(#)in.h	8.3 (Berkeley) 1/3/94
639c2daa00SOllivier Robert  */
649c2daa00SOllivier Robert 
659c2daa00SOllivier Robert /*
669c2daa00SOllivier Robert  * Compatability shims with the rfc2553 API to simplify ntp.
679c2daa00SOllivier Robert  */
68*2b15cb3dSCy Schubert #ifndef NTP_RFC2553_H
69*2b15cb3dSCy Schubert #define NTP_RFC2553_H
709c2daa00SOllivier Robert 
71ea906c41SOllivier Robert #include <netdb.h>
72*2b15cb3dSCy Schubert #include <isc/net.h>
73ea906c41SOllivier Robert 
749c2daa00SOllivier Robert #include "ntp_types.h"
75*2b15cb3dSCy Schubert #include "ntp_malloc.h"
769c2daa00SOllivier Robert 
77*2b15cb3dSCy Schubert struct addrinfo *copy_addrinfo_impl(const struct addrinfo *
78*2b15cb3dSCy Schubert #ifdef EREALLOC_CALLSITE	/* from ntp_malloc.h */
79*2b15cb3dSCy Schubert 							   ,
80*2b15cb3dSCy Schubert 				    const char *, int
81*2b15cb3dSCy Schubert #endif
82*2b15cb3dSCy Schubert 					 );
83*2b15cb3dSCy Schubert struct addrinfo *copy_addrinfo_list_impl(const struct addrinfo *
84*2b15cb3dSCy Schubert #ifdef EREALLOC_CALLSITE	/* from ntp_malloc.h */
85*2b15cb3dSCy Schubert 								,
86*2b15cb3dSCy Schubert 					 const char *, int
87*2b15cb3dSCy Schubert #endif
88*2b15cb3dSCy Schubert 					 );
89*2b15cb3dSCy Schubert #ifdef EREALLOC_CALLSITE
90*2b15cb3dSCy Schubert # define copy_addrinfo(l) \
91*2b15cb3dSCy Schubert 	 copy_addrinfo_impl((l), __FILE__, __LINE__)
92*2b15cb3dSCy Schubert # define copy_addrinfo_list(l) \
93*2b15cb3dSCy Schubert 	 copy_addrinfo_list_impl((l), __FILE__, __LINE__)
94*2b15cb3dSCy Schubert #else
95*2b15cb3dSCy Schubert # define copy_addrinfo(l)	copy_addrinfo_impl(l)
96*2b15cb3dSCy Schubert # define copy_addrinfo_list(l)	copy_addrinfo_list_impl(l)
97*2b15cb3dSCy Schubert #endif
989c2daa00SOllivier Robert 
99ea906c41SOllivier Robert /*
100ea906c41SOllivier Robert  * If various macros are not defined we need to define them
101ea906c41SOllivier Robert  */
1029c2daa00SOllivier Robert 
103ea906c41SOllivier Robert #ifndef AF_INET6
104ea906c41SOllivier Robert # define AF_INET6	AF_MAX
105ea906c41SOllivier Robert # define PF_INET6	AF_INET6
106ea906c41SOllivier Robert #endif
107ea906c41SOllivier Robert 
108ea906c41SOllivier Robert #if !defined(_SS_MAXSIZE) && !defined(_SS_ALIGNSIZE)
109ea906c41SOllivier Robert 
110ea906c41SOllivier Robert # define	_SS_MAXSIZE	128
111ea906c41SOllivier Robert # define	_SS_ALIGNSIZE	(sizeof(ntp_uint64_t))
112*2b15cb3dSCy Schubert # ifdef ISC_PLATFORM_HAVESALEN
113ea906c41SOllivier Robert #  define	_SS_PAD1SIZE	(_SS_ALIGNSIZE - sizeof(u_char) - sizeof(ntp_u_int8_t))
114ea906c41SOllivier Robert #  define	_SS_PAD2SIZE	(_SS_MAXSIZE - sizeof(u_char) - sizeof(ntp_u_int8_t) - \
115ea906c41SOllivier Robert 				_SS_PAD1SIZE - _SS_ALIGNSIZE)
116ea906c41SOllivier Robert # else
117ea906c41SOllivier Robert #  define	_SS_PAD1SIZE	(_SS_ALIGNSIZE - sizeof(short))
118ea906c41SOllivier Robert #  define	_SS_PAD2SIZE	(_SS_MAXSIZE - sizeof(short) - \
119ea906c41SOllivier Robert 				_SS_PAD1SIZE - _SS_ALIGNSIZE)
120*2b15cb3dSCy Schubert # endif /* ISC_PLATFORM_HAVESALEN */
121*2b15cb3dSCy Schubert #endif
122*2b15cb3dSCy Schubert 
123*2b15cb3dSCy Schubert #ifndef INET6_ADDRSTRLEN
124*2b15cb3dSCy Schubert # define	INET6_ADDRSTRLEN	46	/* max len of IPv6 addr in ascii */
1259c2daa00SOllivier Robert #endif
1269c2daa00SOllivier Robert 
1279c2daa00SOllivier Robert /*
128ea906c41SOllivier Robert  * If we don't have the sockaddr_storage structure
129ea906c41SOllivier Robert  * we need to define it
130ea906c41SOllivier Robert  */
131ea906c41SOllivier Robert 
132ea906c41SOllivier Robert #ifndef HAVE_STRUCT_SOCKADDR_STORAGE
133ea906c41SOllivier Robert struct sockaddr_storage {
134*2b15cb3dSCy Schubert #ifdef ISC_PLATFORM_HAVESALEN
135ea906c41SOllivier Robert 	ntp_u_int8_t	ss_len;		/* address length */
136ea906c41SOllivier Robert 	ntp_u_int8_t	ss_family;	/* address family */
137ea906c41SOllivier Robert #else
138ea906c41SOllivier Robert 	short		ss_family;	/* address family */
139ea906c41SOllivier Robert #endif
140ea906c41SOllivier Robert 	char		__ss_pad1[_SS_PAD1SIZE];
141ea906c41SOllivier Robert 	ntp_uint64_t	__ss_align;	/* force desired structure storage alignment */
142ea906c41SOllivier Robert 	char		__ss_pad2[_SS_PAD2SIZE];
143ea906c41SOllivier Robert };
144ea906c41SOllivier Robert #endif
145ea906c41SOllivier Robert 
146ea906c41SOllivier Robert /*
147ea906c41SOllivier Robert  * Finally if the platform doesn't support IPv6 we need some
148ea906c41SOllivier Robert  * additional definitions
149ea906c41SOllivier Robert  */
150ea906c41SOllivier Robert 
151ea906c41SOllivier Robert /*
152ea906c41SOllivier Robert  * Flag values for getaddrinfo()
153ea906c41SOllivier Robert  */
154*2b15cb3dSCy Schubert #ifndef AI_PASSIVE
155ea906c41SOllivier Robert #define	AI_PASSIVE	0x00000001 /* get address to use bind() */
156ea906c41SOllivier Robert #define	AI_CANONNAME	0x00000002 /* fill ai_canonname */
157ea906c41SOllivier Robert #define	AI_NUMERICHOST	0x00000004 /* prevent name resolution */
158ea906c41SOllivier Robert /* valid flags for addrinfo */
159ea906c41SOllivier Robert #define AI_MASK \
160ea906c41SOllivier Robert     (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_ADDRCONFIG)
161ea906c41SOllivier Robert 
162ea906c41SOllivier Robert #define	AI_ADDRCONFIG	0x00000400 /* only if any address is assigned */
163*2b15cb3dSCy Schubert #endif	/* !AI_PASSIVE */
164*2b15cb3dSCy Schubert 
165*2b15cb3dSCy Schubert #ifndef AI_NUMERICHOST		/* such as AIX 4.3 */
166*2b15cb3dSCy Schubert # define Z_AI_NUMERICHOST	0
167*2b15cb3dSCy Schubert #else
168*2b15cb3dSCy Schubert # define Z_AI_NUMERICHOST	AI_NUMERICHOST
169*2b15cb3dSCy Schubert #endif
170*2b15cb3dSCy Schubert 
171*2b15cb3dSCy Schubert #ifndef AI_NUMERICSERV		/* not in RFC 2553 */
172*2b15cb3dSCy Schubert # define Z_AI_NUMERICSERV	0
173*2b15cb3dSCy Schubert #else
174*2b15cb3dSCy Schubert # define Z_AI_NUMERICSERV	AI_NUMERICSERV
175ea906c41SOllivier Robert #endif
176ea906c41SOllivier Robert 
177ea906c41SOllivier Robert #ifndef ISC_PLATFORM_HAVEIPV6
1789c2daa00SOllivier Robert 
179ea906c41SOllivier Robert #ifdef SYS_WINNT
180ea906c41SOllivier Robert # define in6_addr in_addr6
181ea906c41SOllivier Robert #endif
1829c2daa00SOllivier Robert 
1839c2daa00SOllivier Robert struct addrinfo {
1849c2daa00SOllivier Robert 	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
1859c2daa00SOllivier Robert 	int	ai_family;	/* PF_xxx */
1869c2daa00SOllivier Robert 	int	ai_socktype;	/* SOCK_xxx */
1879c2daa00SOllivier Robert 	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */
1889c2daa00SOllivier Robert 	size_t	ai_addrlen;	/* length of ai_addr */
1899c2daa00SOllivier Robert 	char	*ai_canonname;	/* canonical name for hostname */
1909c2daa00SOllivier Robert 	struct	sockaddr *ai_addr;	/* binary address */
1919c2daa00SOllivier Robert 	struct	addrinfo *ai_next;	/* next structure in linked list */
1929c2daa00SOllivier Robert };
1939c2daa00SOllivier Robert 
1949c2daa00SOllivier Robert /*
1959c2daa00SOllivier Robert  * Error return codes from getaddrinfo()
1969c2daa00SOllivier Robert  */
1979c2daa00SOllivier Robert #define	EAI_ADDRFAMILY	 1	/* address family for hostname not supported */
1989c2daa00SOllivier Robert #define	EAI_AGAIN	 2	/* temporary failure in name resolution */
1999c2daa00SOllivier Robert #define	EAI_BADFLAGS	 3	/* invalid value for ai_flags */
2009c2daa00SOllivier Robert #define	EAI_FAIL	 4	/* non-recoverable failure in name resolution */
2019c2daa00SOllivier Robert #define	EAI_FAMILY	 5	/* ai_family not supported */
2029c2daa00SOllivier Robert #define	EAI_MEMORY	 6	/* memory allocation failure */
2039c2daa00SOllivier Robert #define	EAI_NODATA	 7	/* no address associated with hostname */
2049c2daa00SOllivier Robert #define	EAI_NONAME	 8	/* hostname nor servname provided, or not known */
2059c2daa00SOllivier Robert #define	EAI_SERVICE	 9	/* servname not supported for ai_socktype */
2069c2daa00SOllivier Robert #define	EAI_SOCKTYPE	10	/* ai_socktype not supported */
2079c2daa00SOllivier Robert #define	EAI_SYSTEM	11	/* system error returned in errno */
2089c2daa00SOllivier Robert #define	EAI_BADHINTS	12
2099c2daa00SOllivier Robert #define	EAI_PROTOCOL	13
2109c2daa00SOllivier Robert #define	EAI_MAX		14
2119c2daa00SOllivier Robert 
2129c2daa00SOllivier Robert 
213*2b15cb3dSCy Schubert int	getaddrinfo (const char *, const char *,
214*2b15cb3dSCy Schubert 			 const struct addrinfo *, struct addrinfo **);
215*2b15cb3dSCy Schubert int	getnameinfo (const struct sockaddr *, u_int, char *,
216*2b15cb3dSCy Schubert 			 size_t, char *, size_t, int);
217*2b15cb3dSCy Schubert void	freeaddrinfo (struct addrinfo *);
218*2b15cb3dSCy Schubert char	*gai_strerror (int);
2199c2daa00SOllivier Robert 
220ea906c41SOllivier Robert /*
221ea906c41SOllivier Robert  * Constants for getnameinfo()
222ea906c41SOllivier Robert  */
223ea906c41SOllivier Robert #ifndef NI_MAXHOST
224ea906c41SOllivier Robert #define	NI_MAXHOST	1025
225ea906c41SOllivier Robert #define	NI_MAXSERV	32
226ea906c41SOllivier Robert #endif
227ea906c41SOllivier Robert 
228ea906c41SOllivier Robert /*
229ea906c41SOllivier Robert  * Flag values for getnameinfo()
230ea906c41SOllivier Robert  */
231ea906c41SOllivier Robert #ifndef NI_NUMERICHOST
232ea906c41SOllivier Robert #define	NI_NOFQDN	0x00000001
233ea906c41SOllivier Robert #define	NI_NUMERICHOST	0x00000002
234ea906c41SOllivier Robert #define	NI_NAMEREQD	0x00000004
235ea906c41SOllivier Robert #define	NI_NUMERICSERV	0x00000008
236ea906c41SOllivier Robert #define	NI_DGRAM	0x00000010
237ea906c41SOllivier Robert #define NI_WITHSCOPEID	0x00000020
238ea906c41SOllivier Robert #endif
239ea906c41SOllivier Robert 
240*2b15cb3dSCy Schubert #endif /* !ISC_PLATFORM_HAVEIPV6 */
241ea906c41SOllivier Robert 
242*2b15cb3dSCy Schubert /*
243*2b15cb3dSCy Schubert  * Set up some macros to look for IPv6 and IPv6 multicast
244*2b15cb3dSCy Schubert  */
245*2b15cb3dSCy Schubert 
246*2b15cb3dSCy Schubert #if defined(ISC_PLATFORM_HAVEIPV6) && defined(WANT_IPV6)
247*2b15cb3dSCy Schubert # define INCLUDE_IPV6_SUPPORT
248*2b15cb3dSCy Schubert # if defined(IPV6_JOIN_GROUP) && defined(IPV6_LEAVE_GROUP)
249*2b15cb3dSCy Schubert #  define INCLUDE_IPV6_MULTICAST_SUPPORT
250*2b15cb3dSCy Schubert # endif	/* IPV6 Multicast Support */
251*2b15cb3dSCy Schubert #endif  /* IPv6 Support */
252*2b15cb3dSCy Schubert 
253*2b15cb3dSCy Schubert #endif /* !NTP_RFC2553_H */
254