1995-11-29 07:40:04 +00:00
|
|
|
/* osdep.h
|
|
|
|
|
|
|
|
Operating system dependencies... */
|
|
|
|
|
|
|
|
/*
|
2017-07-12 09:23:23 -04:00
|
|
|
* Copyright (c) 2004-2017 by Internet Systems Consortium,Inc. ("ISC")
|
2005-03-17 20:15:29 +00:00
|
|
|
* Copyright (c) 1996-2003 by Internet Software Consortium
|
1995-11-29 07:40:04 +00:00
|
|
|
*
|
2017-07-12 09:23:23 -04:00
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
1995-11-29 07:40:04 +00:00
|
|
|
*
|
2005-03-17 20:15:29 +00:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
|
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
|
|
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
1995-11-29 07:40:04 +00:00
|
|
|
*
|
2005-03-17 20:15:29 +00:00
|
|
|
* Internet Systems Consortium, Inc.
|
|
|
|
* 950 Charter Street
|
|
|
|
* Redwood City, CA 94063
|
|
|
|
* <info@isc.org>
|
2009-07-23 18:52:21 +00:00
|
|
|
* https://www.isc.org/
|
2000-03-17 04:00:32 +00:00
|
|
|
*
|
1995-11-29 07:40:04 +00:00
|
|
|
*/
|
|
|
|
|
1999-10-05 01:31:42 +00:00
|
|
|
#if !defined (__ISC_DHCP_OSDEP_H__)
|
|
|
|
#define __ISC_DHCP_OSDEP_H__
|
|
|
|
|
1996-05-13 00:05:01 +00:00
|
|
|
#include "site.h"
|
|
|
|
|
2007-05-19 18:47:15 +00:00
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
|
|
|
#ifndef LITTLE_ENDIAN
|
|
|
|
#define LITTLE_ENDIAN 1234
|
|
|
|
#endif /* LITTLE_ENDIAN */
|
|
|
|
|
|
|
|
#ifndef BIG_ENDIAN
|
|
|
|
#define BIG_ENDIAN 4321
|
|
|
|
#endif /* BIG_ENDIAN */
|
|
|
|
|
|
|
|
#ifndef BYTE_ORDER
|
|
|
|
#define BYTE_ORDER DHCP_BYTE_ORDER
|
|
|
|
#endif /* BYTE_ORDER */
|
|
|
|
|
1996-05-20 00:20:37 +00:00
|
|
|
/* Porting::
|
|
|
|
|
|
|
|
If you add a new network API, you must add a check for it below: */
|
|
|
|
|
1996-05-13 00:05:01 +00:00
|
|
|
#if !defined (USE_SOCKETS) && \
|
|
|
|
!defined (USE_SOCKET_SEND) && \
|
|
|
|
!defined (USE_SOCKET_RECEIVE) && \
|
|
|
|
!defined (USE_RAW_SOCKETS) && \
|
|
|
|
!defined (USE_RAW_SEND) && \
|
|
|
|
!defined (USE_SOCKET_RECEIVE) && \
|
|
|
|
!defined (USE_BPF) && \
|
|
|
|
!defined (USE_BPF_SEND) && \
|
|
|
|
!defined (USE_BPF_RECEIVE) && \
|
1999-02-14 19:04:05 +00:00
|
|
|
!defined (USE_LPF) && \
|
|
|
|
!defined (USE_LPF_SEND) && \
|
|
|
|
!defined (USE_LPF_RECEIVE) && \
|
1996-05-13 00:05:01 +00:00
|
|
|
!defined (USE_NIT) && \
|
|
|
|
!defined (USE_NIT_SEND) && \
|
1998-01-12 01:07:21 +00:00
|
|
|
!defined (USE_NIT_RECEIVE) && \
|
2007-05-19 18:47:15 +00:00
|
|
|
!defined (USE_DLPI_SEND) && \
|
1998-01-12 01:07:21 +00:00
|
|
|
!defined (USE_DLPI_RECEIVE)
|
2009-04-30 18:42:52 +00:00
|
|
|
/* Determine default socket API to USE. */
|
|
|
|
# if defined(HAVE_BPF)
|
|
|
|
# define USE_BPF 1
|
|
|
|
# elif defined(HAVE_LPF)
|
|
|
|
# define USE_LPF 1
|
|
|
|
# elif defined(HAVE_DLPI)
|
|
|
|
# define USE_DLPI 1
|
|
|
|
# endif
|
1996-05-13 00:05:01 +00:00
|
|
|
#endif
|
|
|
|
|
1999-02-14 19:04:05 +00:00
|
|
|
#if !defined (TIME_MAX)
|
|
|
|
# define TIME_MAX 2147483647
|
|
|
|
#endif
|
1996-05-13 00:05:01 +00:00
|
|
|
|
2005-03-17 20:15:29 +00:00
|
|
|
/* snprintf/vsnprintf hacks. for systems with no libc versions only. */
|
|
|
|
#ifdef NO_SNPRINTF
|
|
|
|
extern int isc_print_snprintf(char *, size_t, const char *, ...);
|
|
|
|
extern int isc_print_vsnprintf(char *, size_t, const char *, va_list ap);
|
|
|
|
# define snprintf isc_print_snprintf
|
|
|
|
# define vsnprintf isc_print_vsnprintf
|
|
|
|
#endif
|
|
|
|
|
1996-05-20 00:20:37 +00:00
|
|
|
/* Porting::
|
|
|
|
|
|
|
|
If you add a new network API, and have it set up so that it can be
|
|
|
|
used for sending or receiving, but doesn't have to be used for both,
|
|
|
|
then set up an ifdef like the ones below: */
|
|
|
|
|
1996-04-11 06:50:03 +00:00
|
|
|
#ifdef USE_SOCKETS
|
1996-05-13 00:05:01 +00:00
|
|
|
# define USE_SOCKET_SEND
|
|
|
|
# define USE_SOCKET_RECEIVE
|
2016-03-07 09:07:43 -05:00
|
|
|
# if defined(HAVE_DLPI) && !defined(sun) && !defined(USE_V4_PKTINFO)
|
2009-04-30 18:42:52 +00:00
|
|
|
# define USE_DLPI_HWADDR
|
2012-06-08 23:28:11 +00:00
|
|
|
# elif defined(HAVE_LPF)
|
|
|
|
# define USE_LPF_HWADDR
|
|
|
|
# elif defined(HAVE_BPF)
|
|
|
|
# define USE_BPF_HWADDR
|
2009-04-30 18:42:52 +00:00
|
|
|
# endif
|
1996-04-11 06:50:03 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_RAW_SOCKETS
|
1996-05-13 00:05:01 +00:00
|
|
|
# define USE_RAW_SEND
|
|
|
|
# define USE_SOCKET_RECEIVE
|
1996-04-11 06:50:03 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_BPF
|
1996-05-13 00:05:01 +00:00
|
|
|
# define USE_BPF_SEND
|
|
|
|
# define USE_BPF_RECEIVE
|
1996-04-11 06:50:03 +00:00
|
|
|
#endif
|
|
|
|
|
1999-02-14 19:04:05 +00:00
|
|
|
#ifdef USE_LPF
|
|
|
|
# define USE_LPF_SEND
|
|
|
|
# define USE_LPF_RECEIVE
|
|
|
|
#endif
|
|
|
|
|
1996-04-11 06:50:03 +00:00
|
|
|
#ifdef USE_NIT
|
1996-05-13 00:05:01 +00:00
|
|
|
# define USE_NIT_SEND
|
|
|
|
# define USE_NIT_RECEIVE
|
1996-04-11 06:50:03 +00:00
|
|
|
#endif
|
1996-05-22 07:27:28 +00:00
|
|
|
|
1998-01-12 01:07:21 +00:00
|
|
|
#ifdef USE_DLPI
|
|
|
|
# define USE_DLPI_SEND
|
|
|
|
# define USE_DLPI_RECEIVE
|
|
|
|
#endif
|
|
|
|
|
1997-03-05 06:16:07 +00:00
|
|
|
#ifdef USE_UPF
|
|
|
|
# define USE_UPF_SEND
|
|
|
|
# define USE_UPF_RECEIVE
|
|
|
|
#endif
|
|
|
|
|
1996-05-22 07:27:28 +00:00
|
|
|
/* Porting::
|
|
|
|
|
|
|
|
If you add support for sending packets directly out an interface,
|
|
|
|
and your support does not do ARP or routing, you must use a fallback
|
|
|
|
mechanism to deal with packets that need to be sent to routers.
|
|
|
|
Currently, all low-level packet interfaces use BSD sockets as a
|
|
|
|
fallback. */
|
|
|
|
|
1998-01-12 01:07:21 +00:00
|
|
|
#if defined (USE_BPF_SEND) || defined (USE_NIT_SEND) || \
|
1999-10-24 23:25:33 +00:00
|
|
|
defined (USE_DLPI_SEND) || defined (USE_UPF_SEND) || \
|
|
|
|
defined (USE_LPF_SEND) || \
|
2001-06-27 00:31:20 +00:00
|
|
|
(defined (USE_SOCKET_SEND) && defined (HAVE_SO_BINDTODEVICE))
|
1996-05-22 07:27:28 +00:00
|
|
|
# define USE_SOCKET_FALLBACK
|
|
|
|
# define USE_FALLBACK
|
|
|
|
#endif
|
1996-05-16 07:23:04 +00:00
|
|
|
|
1996-05-20 00:20:37 +00:00
|
|
|
/* Porting::
|
|
|
|
|
|
|
|
If you add support for sending packets directly out an interface
|
|
|
|
and need to be able to assemble packets, add the USE_XXX_SEND
|
|
|
|
definition for your interface to the list tested below. */
|
|
|
|
|
1997-03-05 06:16:07 +00:00
|
|
|
#if defined (USE_RAW_SEND) || defined (USE_BPF_SEND) || \
|
1998-01-12 01:07:21 +00:00
|
|
|
defined (USE_NIT_SEND) || defined (USE_UPF_SEND) || \
|
1999-02-14 19:04:05 +00:00
|
|
|
defined (USE_DLPI_SEND) || defined (USE_LPF_SEND)
|
1996-05-20 00:20:37 +00:00
|
|
|
# define PACKET_ASSEMBLY
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Porting::
|
|
|
|
|
|
|
|
If you add support for receiving packets directly from an interface
|
|
|
|
and need to be able to decode raw packets, add the USE_XXX_RECEIVE
|
|
|
|
definition for your interface to the list tested below. */
|
|
|
|
|
1997-03-05 06:16:07 +00:00
|
|
|
#if defined (USE_RAW_RECEIVE) || defined (USE_BPF_SEND) || \
|
1998-01-12 01:07:21 +00:00
|
|
|
defined (USE_NIT_RECEIVE) || defined (USE_UPF_RECEIVE) || \
|
1999-10-24 23:25:33 +00:00
|
|
|
defined (USE_DLPI_RECEIVE) || defined (USE_LPF_RECEIVE)
|
1996-05-20 00:20:37 +00:00
|
|
|
# define PACKET_DECODING
|
|
|
|
#endif
|
|
|
|
|
1998-03-15 20:59:47 +00:00
|
|
|
/* If we don't have a DLPI packet filter, we have to filter in userland.
|
|
|
|
Probably not worth doing, actually. */
|
|
|
|
#if defined (USE_DLPI_RECEIVE) && !defined (USE_DLPI_PFMOD)
|
|
|
|
# define USERLAND_FILTER
|
|
|
|
#endif
|
|
|
|
|
1996-05-16 07:23:04 +00:00
|
|
|
/* jmp_buf is assumed to be a struct unless otherwise defined in the
|
|
|
|
system header. */
|
|
|
|
#ifndef jbp_decl
|
|
|
|
# define jbp_decl(x) jmp_buf *x
|
|
|
|
#endif
|
|
|
|
#ifndef jref
|
|
|
|
# define jref(x) (&(x))
|
|
|
|
#endif
|
|
|
|
#ifndef jdref
|
|
|
|
# define jdref(x) (*(x))
|
|
|
|
#endif
|
1996-05-16 23:12:28 +00:00
|
|
|
#ifndef jrefproto
|
|
|
|
# define jrefproto jmp_buf *
|
|
|
|
#endif
|
1996-05-16 07:23:04 +00:00
|
|
|
|
1996-05-16 23:55:42 +00:00
|
|
|
#ifndef BPF_FORMAT
|
|
|
|
# define BPF_FORMAT "/dev/bpf%d"
|
|
|
|
#endif
|
1999-02-25 23:30:43 +00:00
|
|
|
|
1999-12-19 23:41:04 +00:00
|
|
|
#if defined (F_SETFD) && !defined (HAVE_SETFD)
|
|
|
|
# define HAVE_SETFD
|
|
|
|
#endif
|
|
|
|
|
1999-02-25 23:30:43 +00:00
|
|
|
#if defined (IFF_POINTOPOINT) && !defined (HAVE_IFF_POINTOPOINT)
|
|
|
|
# define HAVE_IFF_POINTOPOINT
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (AF_LINK) && !defined (HAVE_AF_LINK)
|
|
|
|
# define HAVE_AF_LINK
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (ARPHRD_TUNNEL) && !defined (HAVE_ARPHRD_TUNNEL)
|
|
|
|
# define HAVE_ARPHRD_TUNNEL
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (ARPHRD_LOOPBACK) && !defined (HAVE_ARPHRD_LOOPBACK)
|
|
|
|
# define HAVE_ARPHRD_LOOPBACK
|
|
|
|
#endif
|
|
|
|
|
1999-03-26 19:19:46 +00:00
|
|
|
#if defined (ARPHRD_ROSE) && !defined (HAVE_ARPHRD_ROSE)
|
|
|
|
# define HAVE_ARPHRD_ROSE
|
|
|
|
#endif
|
|
|
|
|
2006-02-24 23:16:32 +00:00
|
|
|
#if defined (ARPHRD_IRDA) && !defined (HAVE_ARPHRD_IRDA)
|
|
|
|
# define HAVE_ARPHRD_IRDA
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (ARPHRD_SIT) && !defined (HAVE_ARPHRD_SIT)
|
|
|
|
# define HAVE_ARPHRD_SIT
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (ARPHRD_IEEE1394) & !defined (HAVE_ARPHRD_IEEE1394)
|
|
|
|
# define HAVE_ARPHRD_IEEE1394
|
|
|
|
#endif
|
|
|
|
|
1999-03-26 19:19:46 +00:00
|
|
|
#if defined (ARPHRD_IEEE802) && !defined (HAVE_ARPHRD_IEEE802)
|
|
|
|
# define HAVE_ARPHRD_IEEE802
|
|
|
|
#endif
|
|
|
|
|
2005-03-17 20:15:29 +00:00
|
|
|
#if defined (ARPHRD_IEEE802_TR) && !defined (HAVE_ARPHRD_IEEE802_TR)
|
|
|
|
# define HAVE_ARPHRD_IEEE802_TR
|
|
|
|
#endif
|
|
|
|
|
1999-03-26 19:19:46 +00:00
|
|
|
#if defined (ARPHRD_FDDI) && !defined (HAVE_ARPHRD_FDDI)
|
|
|
|
# define HAVE_ARPHRD_FDDI
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (ARPHRD_AX25) && !defined (HAVE_ARPHRD_AX25)
|
|
|
|
# define HAVE_ARPHRD_AX25
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (ARPHRD_NETROM) && !defined (HAVE_ARPHRD_NETROM)
|
|
|
|
# define HAVE_ARPHRD_NETROM
|
|
|
|
#endif
|
|
|
|
|
1999-02-25 23:30:43 +00:00
|
|
|
#if defined (ARPHRD_METRICOM) && !defined (HAVE_ARPHRD_METRICOM)
|
|
|
|
# define HAVE_ARPHRD_METRICOM
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (SO_BINDTODEVICE) && !defined (HAVE_SO_BINDTODEVICE)
|
|
|
|
# define HAVE_SO_BINDTODEVICE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined (AF_LINK) && !defined (HAVE_AF_LINK)
|
|
|
|
# define HAVE_AF_LINK
|
|
|
|
#endif
|
|
|
|
|
1999-12-19 23:41:04 +00:00
|
|
|
/* Linux needs to define SHUT_* in /usr/include/sys/socket.h someday... */
|
|
|
|
#if !defined (SHUT_RD)
|
|
|
|
# define SHUT_RD 0
|
|
|
|
#endif
|
|
|
|
|
2000-02-03 03:50:34 +00:00
|
|
|
#if !defined (SOCKLEN_T)
|
2005-03-17 20:15:29 +00:00
|
|
|
# define SOCKLEN_T socklen_t
|
2008-01-23 22:49:54 +00:00
|
|
|
#elif defined(_AIX)
|
|
|
|
#undef SOCKLEN_T
|
|
|
|
#define SOCKLEN_T socklen_t
|
2005-03-17 20:15:29 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined (STDERR_FILENO)
|
|
|
|
# define STDERR_FILENO 2
|
2000-02-03 03:50:34 +00:00
|
|
|
#endif
|
|
|
|
|
1999-10-05 01:31:42 +00:00
|
|
|
#endif /* __ISC_DHCP_OSDEP_H__ */
|