Admin Panel

/*
 * $Id$
 *
 * :ts=8
 *
 * 'Roadshow' -- Amiga TCP/IP stack
 * Copyright � 2001-2016 by Olaf Barthel.
 * All Rights Reserved.
 *
 * Amiga specific TCP/IP 'C' header files;
 * Freely Distributable
 */

/****************************************************************************/

#ifndef _LIBRARIES_BSDSOCKET_H
#define _LIBRARIES_BSDSOCKET_H

/****************************************************************************/

#ifndef EXEC_PORTS_H
#include <exec/ports.h>
#endif /* EXEC_PORTS_H */

#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif /* UTILITY_TAGITEM_H */

#ifndef DOS_H
#include <dos/dos.h>
#endif /* DOS_H */

/****************************************************************************/

#ifndef _SYS_SOCKET_H_
#include <sys/socket.h>
#endif /* _SYS_SOCKET_H_ */

#ifndef _NETINET_IN_H_
#include <netinet/in.h>
#endif /* _NETINET_IN_H_ */

#ifndef _NET_IF_H_
#include <net/if.h>
#endif /* _NET_IF_H_ */

#ifndef _SYS_MBUF_H_
#include <sys/mbuf.h>
#endif /* _SYS_MBUF_H_ */

/****************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/****************************************************************************/

#ifdef __GNUC__
 #ifdef __PPC__
  #pragma pack(2)
 #endif
#elif defined(__VBCC__)
 #pragma amiga-align
#endif

/****************************************************************************/

/*
 * Parameter passing macros for use with SocketBaseTagList()
 */

/* Argument passing: either by value or by reference. */
#define SBTF_VAL 0x0000	/* Tag->ti_Data contains the value */
#define SBTF_REF 0x8000	/* Tag->ti_Data contains a pointer to the value */

/* Code value: this is one of the SBTC_.. values from the table below */
#define SBTB_CODE 1
#define SBTS_CODE 0x3FFF

#define SBTM_CODE(td) (((td) >> SBTB_CODE) & SBTS_CODE)

/* Read or write access control. */
#define SBTF_GET 0	/* Modify either Tag->ti_Data (SBTF_VAL) or the value
			   pointed to by Tag->ti_Data (SBTF_REF) */
#define SBTF_SET 1	/* Use either Tag->ti_Data (SBTF_VAL) or the value
			   pointed to by Tag->ti_Data (SBTF_REF) */

/* Macros for passing the individual tag item parameters. */
#define SBTM_GETREF(code) \
	(TAG_USER | SBTF_REF | (((code) & SBTS_CODE) << SBTB_CODE) | SBTF_GET)
#define SBTM_GETVAL(code) \
	(TAG_USER | SBTF_VAL | (((code) & SBTS_CODE) << SBTB_CODE) | SBTF_GET)
#define SBTM_SETREF(code) \
	(TAG_USER | SBTF_REF | (((code) & SBTS_CODE) << SBTB_CODE) | SBTF_SET)
#define SBTM_SETVAL(code) \
	(TAG_USER | SBTF_VAL | (((code) & SBTS_CODE) << SBTB_CODE) | SBTF_SET)

/****************************************************************************/

/*
 * Parameters for SocketBaseTagList(); these must be wrapped into the
 * SBTM_GETREF/SBTM_GETVAL/SBTM_SETREF/SBTM_SETVAL macros defined
 * above.
 */

/* Masks defining the signals for Task notification */
#define SBTC_BREAKMASK		1
#define SBTC_SIGIOMASK		2
#define SBTC_SIGURGMASK		3
#define SBTC_SIGEVENTMASK	4

/* Current value of the errno and h_errno variables */
#define SBTC_ERRNO		6
#define SBTC_HERRNO		7

/* Current size of the socket descriptor table */
#define SBTC_DTABLESIZE		8

/* Link library fd allocation callback; don't use this in
   new code! */
#define SBTC_FDCALLBACK		9

/* Callback actions; don't use these in new code! */
#define FDCB_FREE  0
#define FDCB_ALLOC 1
#define FDCB_CHECK 2

/* syslog variables */
#define SBTC_LOGSTAT		10
#define SBTC_LOGTAGPTR		11
#define SBTC_LOGFACILITY	12
#define SBTC_LOGMASK		13

/* Error strings */
#define SBTC_ERRNOSTRPTR	14
#define SBTC_HERRNOSTRPTR	15
#define SBTC_IOERRNOSTRPTR	16
#define SBTC_S2ERRNOSTRPTR	17
#define SBTC_S2WERRNOSTRPTR	18

/* 'errno' pointer & size */
#define SBTC_ERRNOBYTEPTR	21
#define SBTC_ERRNOWORDPTR	22
#define SBTC_ERRNOLONGPTR	24
#define SBTC_ERRNOPTR(size) \
	((size == sizeof(long))		? SBTC_ERRNOLONGPTR :	\
	((size == sizeof(short))	? SBTC_ERRNOWORDPTR :	\
	((size == sizeof(char))		? SBTC_ERRNOBYTEPTR :	\
	0)))

/* 'h_errno' pointer (with sizeof(h_errno) == sizeof(long)) */
#define SBTC_HERRNOLONGPTR	25

/* Release string pointer */
#define SBTC_RELEASESTRPTR	29

/*
 * Extensions to the original AmiTCP API
 */

/* Number of Berkeley packet filter channels available. */
#define SBTC_NUM_PACKET_FILTER_CHANNELS 40

/* Whether or not the routing API is supported. */
#define SBTC_HAVE_ROUTING_API 41

/* Enable/Disable UDP checksums? */
#define SBTC_UDP_CHECKSUM 42

/* Enable/Disable IP packet forwarding? */
#define SBTC_IP_FORWARDING 43

/* Get/set the default IP packet TTL value. */
#define SBTC_IP_DEFAULT_TTL 44

/* Respond to ICMP mask requests? */
#define SBTC_ICMP_MASK_REPLY 45

/* Enable/Disable sending of redirection messages? */
#define SBTC_ICMP_SEND_REDIRECTS 46

/* Whether or not the interface API is supported. */
#define SBTC_HAVE_INTERFACE_API 47

/* How ICMP echo messages should be processed. */
#define SBTC_ICMP_PROCESS_ECHO 48

/* How ICMP time stamp messages should be processed. */
#define SBTC_ICMP_PROCESS_TSTAMP 49

/* Whether or not the monitoring API is supported. */
#define SBTC_HAVE_MONITORING_API 50

/* Whether or not library bases can be shared by different
   callers. */
#define SBTC_CAN_SHARE_LIBRARY_BASES 51

/* Set the name of the log output file or get a pointer
   to the current file name. */
#define SBTC_LOG_FILE_NAME 52

/* Whether or not the status API is supported. */
#define SBTC_HAVE_STATUS_API 53

/* Whether or not the DNS API is supported. */
#define SBTC_HAVE_DNS_API 54

/* Set or get a pointer to the currently installed log hook. */
#define SBTC_LOG_HOOK 55

/* Get the system status, with regard to whether the TCP/IP stack
   has access to network interfaces and name resolution servers. */
#define SBTC_SYSTEM_STATUS 56

/* Get or set the signal mask used to send a notification when
   the address of an interface has changed. */
#define SBTC_SIG_ADDRESS_CHANGE_MASK 57

/* If the IP filter API is supported, which version of that API
   would it be? */
#define SBTC_IPF_API_VERSION 58

/* Whether or not the local database access API is supported. */
#define SBTC_HAVE_LOCAL_DATABASE_API 59

/* Whether or not the address conversion API is supported. */
#define SBTC_HAVE_ADDRESS_CONVERSION_API 60

/* Whether or not the kernel memory API is supported. */
#define SBTC_HAVE_KERNEL_MEMORY_API 61

/* Get or set the IP filter hook which is invoked whenever a
   datagram has arrived or is about to be sent. */
#define SBTC_IP_FILTER_HOOK 62

/* Whether or not the server API is supported. */
#define SBTC_HAVE_SERVER_API 63

/* Query the number of bytes received so far. */
#define SBTC_GET_BYTES_RECEIVED 64

/* Query the number of bytes sent so far. */
#define SBTC_GET_BYTES_SENT 65

/* International Domain Name support: which character set should be assumed
   when performing translations between the name provided to the resolver
   and the encoded form sent to the Domain Name System server? See below
   for a list of choices. */
#define SBTC_IDN_DEFAULT_CHARACTER_SET 66

/* Whether or not the RoadshowData API is supported. */
#define SBTC_HAVE_ROADSHOWDATA_API 67

/* Install or remove the error code hook. */
#define SBTC_ERROR_HOOK 68

/* Whether or not the gethostbyname_r() and gethostbyaddr_r() functions
   are supported. */
#define SBTC_HAVE_GETHOSTADDR_R_API 69

/****************************************************************************/

/*
 * International Domain Name support: character sets that can be used
 * with SocketBaseTagList() and the SBTC_IDN_DEFAULT_CHARACTER_SET
 * feature.
 */

#define IDNCS_ASCII		0	/* Plain ASCII encoding; this will
					   disable the transparent domain
					   name translation feature. */
#define IDNCS_ISO_8859_LATIN_1	1	/* The native Amiga character set. */

/****************************************************************************/

/*
 * Flags returned by a SocketBaseTagList() 'SBTC_SYSTEM_STATUS' query.
 */

#define SBSYSSTAT_Interfaces		(1L<<0)	/* Interfaces are available,
						   configured and
						   operational. */
#define SBSYSSTAT_PTP_Interfaces	(1L<<1)	/* Point-to-point interfaces
						   are available, configured
						   and operational. */
#define SBSYSSTAT_BCast_Interfaces	(1L<<2)	/* Broadcast interfaces are
						   available, configured and
						   operational. */
#define SBSYSSTAT_Resolver		(1L<<3)	/* Domain name servers are
						   known and available */
#define SBSYSSTAT_Routes		(1L<<4)	/* Routing information is
						   configured */
#define SBSYSSTAT_DefaultRoute		(1L<<5)	/* A default route is
						   configured */

/****************************************************************************/

/*
 * Data structures for use with the log hook.
 */

struct LogHookMessage
{
	LONG	lhm_Size;	/* Size of this data structure in bytes. */
	LONG	lhm_Priority;	/* Log entry priority (LOG_EMERG..LOG_DEBUG) */
	struct DateStamp
		lhm_Date;	/* Time and date when this log entry was
				   added. */
	STRPTR	lhm_Tag;	/* Name of the facility which added this entry;
				   this can be NULL. */
	ULONG	lhm_ID;		/* ID of the facility which added this entry;
				   this can be zero. */
	STRPTR	lhm_Message;	/* NUL-terminated string which contains the
				   log message to be displayed. */
};

/****************************************************************************/

/*
 * Options for configuring how ICMP echo and time stamp
 * requests should be processed.
 */
#define IR_Process	0	/* Process the request and respond to it */
#define IR_Ignore	1	/* Ignore the request, but feed it into the
				   raw IP packet processing framework */
#define IR_Drop		2	/* Ignore the request and treat it as if
				   it had a checksum error */

/****************************************************************************/

/*
 * For use with ReleaseSocket() and ReleaseCopyOfSocket().
 */

#define UNIQUE_ID (-1)

/****************************************************************************/

/*
 * Event masks returned by GetSocketEvents().
 */

#define FD_ACCEPT	0x01	/* there is a connection to accept() */
#define FD_CONNECT	0x02	/* connect() completed */
#define FD_OOB		0x04	/* socket has out-of-band data */
#define FD_READ		0x08	/* socket is readable */
#define FD_WRITE	0x10	/* socket is writeable */
#define FD_ERROR	0x20	/* asynchronous error on socket */
#define FD_CLOSE	0x40	/* connection closed (graceful or not) */

/****************************************************************************/

/*
 * Tags for use with the routing API.
 */

#define RTA_BASE (TAG_USER+1600)

#define RTA_Destination		(RTA_BASE+1)	/* Route destination
						   address */
#define RTA_Gateway		(RTA_BASE+2)	/* Gateway address */
#define RTA_DefaultGateway	(RTA_BASE+3)	/* Default gateway address */
#define RTA_DestinationHost	(RTA_BASE+4)	/* Route destination
						   address; destination is
						   assumed to be a host and
						   not a network */
#define RTA_DestinationNet	(RTA_BASE+5)	/* Route destination
						   address; destination is
						   assumed to be a network
						   and not a host */

/****************************************************************************/

/*
 * Tags for use with the interface management API,
 * specifically the AddInterfaceTagList() call.
 */
#define IFA_BASE (TAG_USER+1700)

#define IFA_IPType		(IFA_BASE+1)	/* IP packet type */
#define IFA_ARPType		(IFA_BASE+2)	/* ARP packet type */
#define IFA_NumReadRequests	(IFA_BASE+3)	/* Number of read requests
						   to queue */
#define IFA_NumWriteRequests	(IFA_BASE+4)	/* Number of write requests
						   to queue */
#define IFA_NumARPRequests	(IFA_BASE+5)	/* Number of ARP requests
						   to queue */
#define IFA_PacketFilterMode	(IFA_BASE+6)	/* Operating mode of the
						   Berkeley packet filter */
#define IFA_PointToPoint	(IFA_BASE+7)	/* Whether or not this
						   interface is of the
						   point-to-point type */
#define IFA_Reserved0		(IFA_BASE+8)	/* This tag is reserved for
						   future use */
#define IFA_Multicast		(IFA_BASE+9)	/* Whether or not this
						   interface is allowed to
						   send multicast packets */
#define IFA_DownGoesOffline	(IFA_BASE+10)	/* Whether or not this
						   interface will go offline
						   when it is taken down */
#define IFA_ReportOffline	(IFA_BASE+11)	/* Whether or not this
						   interface will cause a
						   notification message to
						   be logged when it goes
						   offline */
#define IFA_RequiresInitDelay	(IFA_BASE+12)	/* Whether or not this
						   interface requires a short
						   delay to precede the
						   device initialization */
#define IFA_CopyMode		(IFA_BASE+13)	/* Special data copy options
						   for this interface */
#define IFA_HardwareAddress	(IFA_BASE+14)	/* Set the interface hardware
						   address to a certain
						   value. */
#define IFA_SetDebugMode	(IFA_BASE+15)	/* Enable or disable debugging
						   mode for this interface. */
#define IFA_LimitMTU		(IFA_BASE+16)	/* Set the maximum hardware
						   transmission unit. */

/****************************************************************************/

/* This is used with the 'IFA_HardwareAddress' tag above. */
struct InterfaceHardwareAddress
{
	LONG	iha_Length;	/* Number of bits in address */
	UBYTE *	iha_Address;	/* Points to first address byte */
};

/****************************************************************************/

/*
 * Options available for use with the IFA_PacketFilterMode tag.
 */
#define PFM_Nothing	0	/* Filter is disabled for this interface. */
#define PFM_Local	1	/* Filter is enabled; only packets intended
				   for this interface are filtered */
#define PFM_IPandARP	2	/* Filter is enabled; all IP and ARP packets
				   are filtered, even if they are not intended
				   for this interface */
#define PFM_Everything	3	/* Filter is enabled; all packets are filtered
				   that pass by, regardless of their type and
				   contents */

/****************************************************************************/

/*
 * Options available for use with the IFA_CopyMode tag.
 */
#define CM_SlowWordCopy	0	/* Disables the S2_CopyFromBuff16 SANA-II
				   buffer management option (default). */
#define CM_FastWordCopy	1	/* Enables the S2_CopyFromBuff16 SANA-II
				   buffer management option. */

/****************************************************************************/

/*
 * Tags for use with the interface management API,
 * specifically the ConfigureInterfaceTagList() call.
 */
#define IFC_BASE (TAG_USER+1800)

#define IFC_Address		(IFC_BASE+1)	/* The address to assign to
						   the interface itself */
#define IFC_NetMask		(IFC_BASE+2)	/* The interface's address
						   net mask */
#define IFC_DestinationAddress	(IFC_BASE+3)	/* The address of the other
						   end of a point-to-point
						   link */
#define IFC_BroadcastAddress	(IFC_BASE+4)	/* The broadcast address to
						   be used by the interface */
#define IFC_Metric		(IFC_BASE+5)	/* The routing metric value */

#define IFC_AddAliasAddress	(IFC_BASE+6)	/* Add another alias address
						   for this interface */
#define IFC_DeleteAliasAddress	(IFC_BASE+7)	/* Remove an alias address
						   for this interface */
#define IFC_State		(IFC_BASE+8)	/* Mark an interface up, down,
						   online or offline */
#define IFC_GetPeerAddress	(IFC_BASE+9)	/* If available, obtain the
						   interface's local address
						   and the address of its
						   point to point partner */
#define IFC_GetDNS		(IFC_BASE+10)	/* If available, obtain the
						   domain name servers known
						   to this interface */
#define IFC_AssociatedRoute	(IFC_BASE+12)	/* That interface is associated
						   with a route. */
#define IFC_AssociatedDNS	(IFC_BASE+13)	/* That interface is associated
						   with a DNS. */
#define IFC_ReleaseAddress	(IFC_BASE+14)	/* Release the address allocated
						   for this interface (via the
						   DHCP protocol). */
#define IFC_SetDebugMode	(IFC_BASE+15)	/* Enable or disable debugging
						   mode for this interface. */
#define IFC_Complete		(IFC_BASE+16)	/* Indicate that the configuration
						   for this interface is complete */
#define IFC_LimitMTU		(IFC_BASE+17)	/* Set the maximum hardware
						   transmission unit */

/****************************************************************************/

/*
 * Tags for use with the interface management API,
 * specifically the QueryInterfaceTagList() call.
 */
#define IFQ_BASE (TAG_USER+1900)

#define IFQ_DeviceName		(IFQ_BASE+1)	/* Query the associated
						   SANA-II device name */
#define IFQ_DeviceUnit		(IFQ_BASE+2)	/* Query the associated
						   SANA-II unit number */
#define IFQ_HardwareAddressSize	(IFQ_BASE+3)	/* Query the hardware address
						   size (in bytes) */
#define IFQ_HardwareAddress	(IFQ_BASE+4)	/* Query the hardware
						   address */
#define IFQ_MTU			(IFQ_BASE+5)	/* Query the maximum
						   transmission unit currently
						   in use */
#define IFQ_BPS			(IFQ_BASE+6)	/* Query the transmission
						   speed */
#define IFQ_HardwareType	(IFQ_BASE+7)	/* Query the SANA-II hardware
						   type */
#define IFQ_PacketsReceived	(IFQ_BASE+8)	/* Query the number of
						   packets received by this
						   interface */
#define IFQ_PacketsSent		(IFQ_BASE+9)	/* Query the number of
						   packets sent by this
						   interface */
#define IFQ_BadData		(IFQ_BASE+10)	/* Query the number of bad
						   packets dropped by this
						   interface */
#define IFQ_Overruns		(IFQ_BASE+11)	/* Query the number of buffer
						   overruns */
#define IFQ_UnknownTypes	(IFQ_BASE+12)	/* Query the number of unknown
						   packet types dropped by this
						   interface */
#define IFQ_LastStart		(IFQ_BASE+13)	/* Query the last time the
						   interface went online */
#define IFQ_Address		(IFQ_BASE+14)	/* Query the IP address
						   associated with this
						   interface */
#define IFQ_DestinationAddress	(IFQ_BASE+15)	/* Query the interface's
						   destination address */
#define IFQ_BroadcastAddress	(IFQ_BASE+16)	/* Query the interface's
						   broadcast address */
#define IFQ_NetMask		(IFQ_BASE+17)	/* Query the interface's
						   subnet mask */
#define IFQ_Metric		(IFQ_BASE+18)	/* Query the interface's
						   metric value */
#define IFQ_State		(IFQ_BASE+19)	/* Query the interface's
						   status */
#define IFQ_AddressBindType	(IFQ_BASE+20)	/* Query whether the address
						   bound to this interface
						   is statically, manually
						   or dynamically bound. */
#define IFQ_AddressLeaseExpires	(IFQ_BASE+21)	/* Find out whether and when
						   the address bound to this
						   interface expires. */
#define IFQ_PrimaryDNSAddress	(IFQ_BASE+22)	/* Query the primary domain
						   name server address known
						   to this interface */
#define IFQ_SecondaryDNSAddress	(IFQ_BASE+23)	/* Query the secondary domain
						   name server address known
						   to this interface */
#define IFQ_NumReadRequests	(IFQ_BASE+24)	/* Number of read I/O requests
						   allocated for this
						   interface */
#define IFQ_MaxReadRequests	(IFQ_BASE+25)	/* Maximum number of read I/O
						   requests in use at a time
						   on this interface */
#define IFQ_NumWriteRequests	(IFQ_BASE+26)	/* Number of write I/O requests
						   allocated for this
						   interface */
#define IFQ_MaxWriteRequests	(IFQ_BASE+27)	/* Maximum number of write I/O
						   requests in use at a time
						   on this interface */
#define IFQ_GetBytesIn		(IFQ_BASE+28)	/* Query the number of bytes
						   received */
#define IFQ_GetBytesOut		(IFQ_BASE+29)	/* Query the number of bytes
						   sent */
#define IFQ_GetDebugMode	(IFQ_BASE+30)	/* Check if this interface has
						   the debug mode enabled */
#define IFQ_GetSANA2CopyStats	(IFQ_BASE+31)	/* Obtain the SANA-II data
						   copy statistics */
#define IFQ_NumReadRequestsPending (IFQ_BASE+32)
						/* Number of read I/O requests
						   still pending to be
						   satisfied on this
						   interface */
#define IFQ_NumWriteRequestsPending (IFQ_BASE+33)
						/* Number of write I/O requests
						   still pending to be
						   satisfied on this
						   interface */
#define IFQ_HardwareMTU		(IFQ_BASE+34)	/* Query the maximum hardware
						   transmission unit */

#define IFQ_OutputDrops		(IFQ_BASE+35)	/* Query the number of packets
						   dropped during transmission */

#define IFQ_InputDrops		(IFQ_BASE+36)	/* Query the number of packets
						   dropped during reception */

#define IFQ_OutputErrors	(IFQ_BASE+37)	/* Query the number errors
						   encountered during data
						   transmission */

#define IFQ_InputErrors		(IFQ_BASE+38)	/* Query the number errors
						   encountered during data
						   reception */

#define IFQ_OutputMulticasts	(IFQ_BASE+39)	/* Query the number of
						   multicast packets sent */

#define IFQ_InputMulticasts	(IFQ_BASE+40)	/* Query the number of
						   multicast packets
						   received */

#define IFQ_IPDrops		(IFQ_BASE+41)	/* Query the total number
						   of all IP packets dropped */

#define IFQ_ARPDrops		(IFQ_BASE+42)	/* Query the total number
						   of all ARP packets dropped */

/****************************************************************************/

/* This is used with the 'IFQ_GetSANA2CopyStats' tag above. */
struct SANA2CopyStats
{
	ULONG	s2cs_DMAIn;	/* How many times data was received via the
				   DMA transfer function */
	ULONG	s2cs_DMAOut;	/* How many times data was sent via the
				   DMA transfer function */

	ULONG	s2cs_ByteIn;	/* How many times data was received via the
				   byte wide copy function */
	ULONG	s2cs_ByteOut;	/* How many times data was sent via the
				   byte wide copy function */

	ULONG	s2cs_WordOut;	/* How many times data was sent via the
				   word wide copy function */
};

/****************************************************************************/

/* The different types of interface address binding. */
#define IFABT_Unknown	0	/* The interface address has not been bound
				   or is in transitional state; check later
				   for more information. */
#define IFABT_Static	1	/* The address was assigned manually, or
				   by an automated configuration process
				   and is not expected to change. */
#define IFABT_Dynamic	2	/* The address was assigned by an automated
				   configuration process and may change in the
				   future. */

/****************************************************************************/

/*
 * The 64 bit integer value used by the IFQ_GetBytesIn..IFQ_GetResetBytesOut
 * query tags.
 */
typedef struct
{
	ULONG sbq_High;
	ULONG sbq_Low;
} SBQUAD_T;

/****************************************************************************/

/*
 * Options available for use with the IFC_State and IFQ_State tags.
 */
#define SM_Offline	0	/* Interface is offline and not ready to
				   receive and transmit data */
#define SM_Online	1	/* Interface is online and ready to receive
				   and transmit data */
#define SM_Down		2	/* Interface is not ready to receive and
				   transmit data, but might still be
				   online. */
#define SM_Up		3	/* Interface is ready to receive and transmit
				   data, but not necessarily online. */

/****************************************************************************/

/*
 * Types of monitoring hooks that can be installed.
 */
#define MHT_ICMP	0	/* ICMP message monitoring */
#define MHT_UDP		1	/* UDP datagram monitoring */
#define MHT_TCP_Connect	2	/* TCP connection monitoring */
#define MHT_Connect	3	/* connect() call monitoring */
#define MHT_Send	4	/* sendto() and sendmsg() monitoring */
#define MHT_Packet	5	/* Low level packet monitoring */
#define MHT_Bind	6	/* bind() call monitoring */

/****************************************************************************/

/*
 * Parameters passed to the different monitoring hooks.
 */

/* This type of message parameter is passed to 'MHT_Connect'
   type monitoring hooks. */
struct ConnectMonitorMsg
{
	LONG		cmm_Size;	/* Size of this data
					   structure */
	STRPTR		cmm_Caller;	/* The name of the calling
					   program, if it chose to be
					   identified */
	LONG		cmm_Socket;	/* The socket to connect to
					   the address */
	struct sockaddr *
			cmm_Name;	/* The address to connect
					   to */
	LONG		cmm_NameLen;	/* The size of the address */
};

/* This type of message parameter is passed to 'MHT_Bind'
   type monitoring hooks. */
struct BindMonitorMsg
{
	LONG		bmm_Size;	/* Size of this data
					   structure */
	STRPTR		bmm_Caller;	/* The name of the calling
					   program, if it chose to be
					   identified */
	LONG		bmm_Socket;	/* The socket to bind to the
					   address */
	struct sockaddr *
			bmm_Name;	/* The address to bind */
	LONG		bmm_NameLen;	/* The size of the address */
};

/* This type of message is passed to 'MHT_Send' type monitoring hooks. */
struct SendMonitorMessage
{
	LONG		smm_Size;	/* Size of this data structure */
	STRPTR		smm_Caller;	/* The name of the calling
					   program, if it chose to be
					   identified */
	LONG		smm_Socket;	/* The socket to connect to the
					   address */
	APTR		smm_Buffer;	/* Data to be sent */
	LONG		smm_Len;	/* Amount of data to be sent */
	LONG		smm_Flags;	/* Control flags, including
					   MSG_OOB or MSG_DONTROUTE */
	struct sockaddr *
			smm_To;		/* The address to send the
					   data to; this may be NULL */
	LONG		smm_ToLen;	/* The size of the address to send
					   this data to; this may be
					   NULL */
	struct msghdr *	smm_Msg;	/* The message to send; this may
					   be NULL. */
};

/* This type of message is passed to 'MHT_TCP_Connect' type
   monitoring hooks. */
struct TCPConnectMonitorMessage
{
	LONG		tcmm_Size;	/* Size of this data structure */
	struct in_addr *
			tcmm_Src;	/* Source internet address */
	struct in_addr *
			tcmm_Dst;	/* Destination internet address */
	struct tcphdr *	tcmm_TCP;	/* TCP header */
};

/* This type of message is passed to 'MHT_UDP' type monitoring hooks. */
struct UDPMonitorMessage
{
	LONG		umm_Size;	/* Size of this data structure */
	struct in_addr *
			umm_Src;	/* Source internet address */
	struct in_addr *
			umm_Dst;	/* Destination internet address */
	struct udphdr *	umm_UDP;	/* UDP header */
};

/* This type of message is passed to 'MHT_ICMP' type monitoring hooks. */
struct ICMPMonitorMessage
{
	LONG		imm_Size;	/* Size of this data structure */
	struct in_addr *
			imm_Src;	/* Source internet address */
	struct in_addr *
			imm_Dst;	/* Destination internet address */
	struct icmp *	imm_ICMP;	/* ICMP header */
};

/* This type of message is passed to 'MHT_Packet' type monitoring hooks. */
struct PacketMonitorMessage
{
	LONG		pmm_Size;	/* Size of this data structure */
	LONG		pmm_Direction;	/* Whether the packet was received
					   or is about to be sent */
	APTR		pmm_LinkLayerData;
					/* Points to the link layer part
					   of the packet, typically an
					   Ethernet header per RFC 894.
					   This may be NULL. */
	LONG		pmm_LinkLayerSize;
					/* Size of the link layer data part
					   of the packet; this may be 0. */
	APTR		pmm_PacketData;	/* Points to the packet 'payload'. */
	LONG		pmm_PacketSize;	/* Size of the packet 'payload'. */
};

/* Possible values for 'pmm_Direction'. */
#define PMMD_Receive	0	/* Packet was received and is waiting to be
				   processed */
#define PMMD_Send	1	/* Packet is about to be sent */

/****************************************************************************/

/*
 * Possible actions to be taken after a monitoring hook has
 * examined the data it was passed. Any positive return value
 * will cause the data to be dropped and the corresponding
 * errno value to be set to the result.
 */
#define MA_Continue		0	/* Proceed as if no filtering had
					   taken place */
#define MA_Ignore		-1	/* Ignore the data and skip the
					   normal route processing would
					   take */
#define MA_Drop			-2	/* Drop the data */
#define MA_DropWithReset	-3	/* Drop the data and also reset the
					   connection */

/****************************************************************************/

/*
 * Parameters for use with the GetNetworkStatus() function.
 */

/* What version of the statistics data should be returned; so far
   there is only version #1. */
#define NETWORKSTATUS_VERSION 1

/* What statistics should be provided */

#define NETSTATUS_icmp		0	/* Internet control message
					   protocol statistics */
#define NETSTATUS_igmp		1	/* Internet group management
					   protocol statistics */
#define NETSTATUS_ip		2	/* Internet protocol statistics */
#define NETSTATUS_mb		3	/* Memory buffer statistics */
#define NETSTATUS_mrt		4	/* Multicast routing statistics */
#define NETSTATUS_rt		5	/* Routing statistics */
#define NETSTATUS_tcp		6	/* Transmission control protocol
					   statistics */
#define NETSTATUS_udp		7	/* User datagram protocol
					   statistics */
#define NETSTATUS_tcp_sockets	9	/* TCP socket statistics */
#define NETSTATUS_udp_sockets	10	/* UDP socket statistics */

/* Protocol connection data returned for each TCP/UDP socket. */
struct protocol_connection_data
{
	struct in_addr
		pcd_foreign_address;	/* Foreign host address */
	UWORD	pcd_foreign_port;	/* Foreign port number */
	struct in_addr
		pcd_local_address;	/* Local host address */
	UWORD	pcd_local_port;		/* Local port number */
	ULONG	pcd_receive_queue_size;	/* Socket receive queue size */
	ULONG	pcd_send_queue_size;	/* Socket send queue size */
	LONG	pcd_tcp_state;		/* Socket TCP state */
};

/****************************************************************************/

/*
 * Interface address allocation (BOOTP and DHCP).
 */

/* The message to send to the interface configuration process
   to start looking for an IP address. */
struct AddressAllocationMessage
{
	struct Message
		aam_Message;
	LONG	aam_Reserved;
	LONG	aam_Result;		/* What kind of result this
					   request produced. */
	LONG	aam_Version;		/* Version number associated with
					   this data structure. */
	LONG	aam_Protocol;		/* What kind of configuration
					   protocol should be used. */
	char	aam_InterfaceName[16];	/* Name of interface an
					   address is to be
					   assigned to. */
	LONG	aam_Timeout;		/* Number of seconds to
					   wait before a result
					   materializes. */
	ULONG	aam_LeaseTime;		/* Requested lease time in
					   seconds; 0 to accept the
					   default. */
	ULONG	aam_RequestedAddress;	/* Interface address that should
					   be assigned, if possible; 0
					   to accept the server's choice. */
	STRPTR	aam_ClientIdentifier;	/* Unique identifier for this
					   host */
	ULONG	aam_Address;		/* Interface address
					   returned upon
					   success. */
	ULONG	aam_ServerAddress;	/* Address of BOOTP server. */
	ULONG	aam_SubnetMask;		/* Interface subnet
					   mask; ignore if zero. */

	STRPTR	aam_NAKMessage;		/* In case of failure,
					   put the explanation
					   text here. */
	LONG	aam_NAKMessageSize;	/* Maximum length of the
					   negative ack message. */

	ULONG *	aam_RouterTable;	/* A list of router addresses
					   will be put here. */
	LONG	aam_RouterTableSize;	/* Maximum number of valid
					   router addresses. */
	
	ULONG *	aam_DNSTable;		/* A list of domain name servers
					   will be put here. */
	LONG	aam_DNSTableSize;	/* Maximum number of valid
					   domain name server
					   addresses. */

	ULONG *	aam_StaticRouteTable;	/* A list of static routes
					   will be put here. */
	LONG	aam_StaticRouteTableSize;
					/* Maximum number of valid
					   static routes. */

	STRPTR	aam_HostName;		/* If available, the name
					   assigned to this host will
					   be put here. */
	LONG	aam_HostNameSize;	/* Maximum size of the host
					   name. */

	STRPTR	aam_DomainName;		/* If available, the name
					   of the domain assigned to
					   this host will be put here. */
	LONG	aam_DomainNameSize;	/* Maximum size of the domain
					   name. */
	UBYTE *	aam_BOOTPMessage;	/* Points to buffer to place
					   the BOOTP message in. */
	LONG	aam_BOOTPMessageSize;	/* Size of the buffer to place
					   the BOOTP message in. */
	struct DateStamp *
		aam_LeaseExpires;	/* Points to buffer to place the
					   lease expire date and time in.
					   in. This will be 0 if no data
					   is provided or if the lease
					   never expires. */
	BOOL	aam_Unicast;		/* Request that the DHCP server
					   sends messages using unicast,
					   rather than using broadcast.
					   This requires aam_Version 2
					   or higher. */
};

/* This data structure version. */
#define AAM_VERSION 2

/* Minimum supported data structure version. */
#define AAM_VERSION_MINIMUM 1

/* Available result codes. */
#define AAMR_Success		0	/* Allocation has succeeded */
#define AAMR_Aborted		1	/* The allocation was aborted */
#define AAMR_InterfaceNotKnown	2	/* The interface name is not
					   known */
#define AAMR_InterfaceWrongType	3	/* The interface must support
					   broadcast access. */
#define AAMR_AddressKnown	4	/* The interface address is already
					   known. */
#define AAMR_VersionUnknown	5	/* The data structure version is
					   not supported. */
#define AAMR_NoMemory		6	/* Not enough memory to process
					   the request. */
#define AAMR_Timeout		7	/* The allocation request did not
					   succeed in the requested time
					   span. */
#define AAMR_AddressInUse	8	/* The address to be allocated is
					   already in use. */
#define AAMR_AddrChangeFailed	9	/* The interface address could
					   not be changed. */
#define AAMR_MaskChangeFailed	10	/* The interface subnet mask could
					   not be changed. */
#define AAMR_Busy		11	/* Address allocation is already in
					   progress for this interface. */
#define AAMR_Ignored		-1	/* The message type was not
					   understood */

/* The minimum timeout value supported for an allocation to succeed. */
#define AAM_TIMEOUT_MIN 10

/* The special DHCP lease times. */
#define DHCP_DEFAULT_LEASE_TIME		0
#define DHCP_INFINITE_LEASE_TIME	0xFFFFFFFF

/* The configuration protocols to use. */
#define AAMP_BOOTP	0	/* Bootstrap Protocol (RFC 951) */
#define AAMP_DHCP	1	/* Dynamic Host Configuration Protocol
				   (RFC 2131) */
#define AAMP_SLOWAUTO	2	/* Automatic address allocation; slower
				   version for Ethernet networks with
				   switches which use the IEEE Spanning
				   Tree Protocol (802.1d) */
#define AAMP_FASTAUTO	3	/* Automatic address allocation; faster
				   version for wireless devices */

/* Tags for use with CreateAddressAllocationMessage(). */
#define CAAMTA_BASE (TAG_USER+2000)

/* This corresponds to the 'aam_Timeout' member of the
   AddressAllocationMessage. */
#define CAAMTA_Timeout			(CAAMTA_BASE+1)

/* This corresponds to the 'aam_LeaseTime' member of the
   AddressAllocationMessage. */
#define CAAMTA_LeaseTime		(CAAMTA_BASE+2)

/* This corresponds to the 'aam_RequestedAddress' member of the
   AddressAllocationMessage. */
#define CAAMTA_RequestedAddress		(CAAMTA_BASE+3)

/* Pointer to the client identifier string to be used; this
   string must be at least 2 characters long. The string will
   be duplicated and stored in the 'aam_ClientIdentifier' member
   of the AddressAllocationMessage. */
#define CAAMTA_ClientIdentifier		(CAAMTA_BASE+4)

/* Size of the buffer to allocate for the NAK message, as
   stored in the 'aam_NAKMessage' member of the AddressAllocationMessage. */
#define CAAMTA_NAKMessageSize		(CAAMTA_BASE+5)

/* Size of the buffer to allocate for the router address table, as
   stored in the 'aam_RouterTable' member of the AddressAllocationMessage. */
#define CAAMTA_RouterTableSize		(CAAMTA_BASE+6)

/* Size of the buffer to allocate for the DNS address table, as
   stored in the 'aam_DNSTable' member of the AddressAllocationMessage. */
#define CAAMTA_DNSTableSize		(CAAMTA_BASE+7)

/* Size of the buffer to allocate for the static route address table, as
   stored in the 'aam_StaticRouteTable' member of the
   AddressAllocationMessage. */
#define CAAMTA_StaticRouteTableSize	(CAAMTA_BASE+8)

/* Size of the buffer to allocate for the host name, as stored in
   the 'aam_HostName' member of the AddressAllocationMessage. */
#define CAAMTA_HostNameSize		(CAAMTA_BASE+9)

/* Size of the buffer to allocate for the domain name, as stored in
   the 'aam_DomainName' member of the AddressAllocationMessage. */
#define CAAMTA_DomainNameSize		(CAAMTA_BASE+10)

/* Size of the buffer to allocate for the BOOTP message, as stored in
   the 'aam_BOOTPMessage' member of the AddressAllocationMessage. */
#define CAAMTA_BOOTPMessageSize		(CAAMTA_BASE+11)

/* Either FALSE or TRUE; if TRUE, will allocate a buffer for a
   DateStamp and put its address into the 'aam_LeaseExpires'
   member of the AddressAllocationMessage. */
#define CAAMTA_RecordLeaseExpiration	(CAAMTA_BASE+12)

/* The MsgPort to send the AddressAllocationMessage to after
   the configuration has finished. */
#define CAAMTA_ReplyPort		(CAAMTA_BASE+13)

/* Either FALSE or TRUE; if TRUE, ask the DHCP server
   responding to send replies using unicast instead of
   broadcast (the default). Note that the DHCP server
   is free to ignore this request and may send replies
   using broadcast even if requested to use unicast. */
#define CAAMTA_RequestUnicast		(CAAMTA_BASE+14)

/* Codes returned by CreateAddressAllocationMessage(). */
#define CAAME_Success			0	/* It worked */
#define CAAME_Invalid_result_ptr	1	/* No proper result pointer
						   provided */
#define CAAME_Not_enough_memory		2	/* No enough memory available */
#define CAAME_Invalid_version		3	/* The version number is not
						   in order */
#define CAAME_Invalid_protocol		4	/* The protocol is neither BOOTP
						   nor DHCP */
#define CAAME_Invalid_interface_name	5	/* The interface name is
						   not OK */
#define CAAME_Interface_not_found	6	/* The name of the interface
						   is not known */
#define CAAME_Invalid_client_identifier	7	/* The client identifier is not
						   OK */
#define CAAME_Client_identifier_too_short 8	/* The client identifier is too
						   short */
#define CAAME_Client_identifier_too_long 9	/* The client identifier is too
						   long */

/****************************************************************************/

/*
 * The DNS management data structures.
 */

/* These nodes are returned by the DNS API. */
struct DomainNameServerNode
{
	struct MinNode
		dnsn_MinNode;
	LONG	dnsn_Size;	/* Size of this data structure */
	STRPTR	dnsn_Address;	/* Points to NUL-terminated string
				   which holds the IP address in
				   dotted-decimal notation */
	LONG	dnsn_UseCount;	/* Usage count of this address;
				   negative values indicate
				   statically-configured servers. */
};

/****************************************************************************/

/*
 * Filtering for incoming and outgoing IP packets.
 */

/* This identifies whether a packet was received or is about
   to be sent. Check the IPFilterMsg->ifm_Direction field to
   find out. */
#define IFMD_Incoming 0	/* Packet was received */
#define IFMD_Outgoing 1	/* Packet is about to be sent */

/* The packet filter hook is invoked with a message of
   this type: */
struct IPFilterMsg
{
	LONG		ifm_Size;	/* Size of this data structure */
	struct ip *	ifm_IP;		/* Points to IP packet header */
	LONG		ifm_IPLength;	/* Size of the IP packet header */
	struct ifnet *	ifm_Interface;	/* Interface this packet either
					   came in from or is to be
					   sent to */
	LONG		ifm_Direction;	/* Whether this packet came in
					   or is about to go out */
	struct mbuf *	ifm_Packet;	/* The entire packet, as stored
					   in a memory buffer */
};

/****************************************************************************/

/*
 * Network shutdown
 */

/* To shut down the network, send a message of the following form to the
   network controller message port. */
struct NetShutdownMessage
{
	struct Message	nsm_Message;	/* Standard Message header */

	ULONG		nsm_Command;	/* The action to be performed */

	APTR		nsm_Data;	/* Payload */
	ULONG		nsm_Length;	/* Payload size */

	LONG		nsm_Error;	/* Whether or not the command
					   suceeded */
	ULONG		nsm_Actual;	/* How much data was transferred */
};

/* The command to be sent to the network controller message port must
   be one of the following: */

#define NSMC_Shutdown	1	/* Shut down the network; a pointer to an
				   ULONG may be placed in nsm_Data (if the
				   shutdown does not succeed, this is where
				   the number of active clients will be
				   placed). */

#define NSMC_Cancel	2	/* Cancel a shutdown request; this recalls
				   a shutdown message, to which a pointer must
				   be placed in nsm_Data. */

/* Error codes that may be set when a message returns: */

#define NSME_Success	0	/* Command was processed successfully */

#define NSME_Aborted	1	/* Command was aborted */

#define NSME_InUse	2	/* Network is still running, since clients are
				   still using it */

#define NSME_Ignored	3	/* Command was ignored (network may be shutting
				   down right now) */

#define NSME_NotFound	4	/* Shutdown command to be cancelled could not
				   be recalled */

/* The name of the public network controller message port: */
#define NETWORK_CONTROLLER_PORT_NAME "TCP/IP Control"

/* The network controller message port data structure; you must check the
   magic cookie before you post a message to it. If the cookie value is
   missing, don't send your message: the controller may not be listening
   to it. To be on the safe side, look for the port under Forbid(),
   check the cookie, then post the message. */
struct NetControlPort
{
	struct MsgPort	ncp_Port;
	ULONG		ncp_Magic;
};

/* The magic cookie stored in ncp_Magic: */
#define NCPM_Cookie	0x20040306

/****************************************************************************/

/*
 * System data access
 */

/* ObtainRoadshowData() returns a pointer to a list of data items which
   may be viewed or modified. Here is how the list items look like. */
struct RoadshowDataNode
{
	struct MinNode	rdn_MinNode;

	STRPTR		rdn_Name;	/* Name assigned to this item */
	UWORD		rdn_Flags;	/* Properties of this data (see
					   below) */
	WORD		rdn_Type;	/* What kind of data this
					   is (see below) */
	ULONG		rdn_Length;	/* Size of this data */
	APTR		rdn_Data;	/* Points to the data */
};

/* What kind of data is represented by a RoadshowDataNode. */
#define RDNT_Integer	0	/* Signed 32 bit integer */

/* What properties the data associated with a RoadshowDataNode has */
#define RDNF_ReadOnly	(1<<0)	/* This option cannot be modified */

/* Parameter to pass to ObtainRoadshowData(); you can either request read
   or write access. */
#define ORD_ReadAccess	0
#define ORD_WriteAccess	1

/****************************************************************************/

/*
 * Call-back hook for use with SBTC_ERROR_HOOK
 */
struct ErrorHookMsg
{
	ULONG	ehm_Size;	/* Size of this data structure; this
				   must be >= 12 */
	ULONG	ehm_Action;	/* See below for a list of definitions */

	LONG	ehm_Code;	/* The error code to use */
};

/* Which action the hook is to perform */
#define EHMA_Set_errno		1	/* Set the local 'errno' to what is
					   found in ehm_Code */
#define EHMA_Set_h_errno	2	/* Set the local 'h_errno' to what is
					   found in ehm_Code */

/****************************************************************************/

/*
 * A pointer to the following data structure can be found in a Process
 * pr_ExitData field if the associated program was launched as a server
 * by the Internet super-server (inetd). You should check it only if your
 * program is known to act as a server because otherwise the contents of
 * the pr_ExitData field are unreliable.
 *
 * The purpose of this data structure is to let your application access the
 * socket allocated for it by the Internet super-server, which can be
 * accomplished as follows:
 * 
 *     extern struct Library * DOSBase;
 *
 *     struct Process * this_process = (struct Process *)FindTask(NULL);
 *     LONG have_server_api = FALSE;
 *     struct DaemonMessage * dm;
 *     LONG socket = -1;
 *
 *     if(SocketBaseTags(
 *         SBTM_GETREF(SBTC_HAVE_SERVER_API),&have_server_api,
 *     TAG_END) == 0)
 *     {
 *         if(have_server_api && ProcessIsServer(this_process))
 *         {
 *             if(DOSBase->lib_Version < 50)
 *                 dm = (struct DaemonMessage *)this_process->pr_ExitData;
 *             else
 *                 dm = (struct DaemonMessage *)GetExitData();
 *
 *             socket = ObtainSocket(dm->dm_ID,dm->dm_Family,dm->dm_Type,0);
 *         }
 *     }
 */

struct DaemonMessage
{
	struct Message	dm_Message;	/* Used by super-server; don't touch! */
	ULONG		dm_Pad1;	/* Used by super-server; don't touch! */
	ULONG		dm_Pad2;	/* Used by super-server; don't touch! */
	LONG		dm_ID;		/* Public socket identifier; this must
					   be passed to ObtainSocket() to
					   access the socket allocated for you */
	ULONG		dm_Pad3;	/* Used by super-server; don't touch! */
	UBYTE		dm_Family;	/* Socket family type */
	UBYTE		dm_Type;	/* Socket type */
};

/****************************************************************************/

#ifdef __GNUC__
 #ifdef __PPC__
  #pragma pack()
 #endif
#elif defined(__VBCC__)
 #pragma default-align
#endif

/****************************************************************************/

#ifdef __cplusplus
}
#endif /* __cplusplus */

/****************************************************************************/

#endif /* _LIBRARIES_BSDSOCKET_H */