/* * $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 #endif /* EXEC_PORTS_H */ #ifndef UTILITY_TAGITEM_H #include #endif /* UTILITY_TAGITEM_H */ #ifndef DOS_H #include #endif /* DOS_H */ /****************************************************************************/ #ifndef _SYS_SOCKET_H_ #include #endif /* _SYS_SOCKET_H_ */ #ifndef _NETINET_IN_H_ #include #endif /* _NETINET_IN_H_ */ #ifndef _NET_IF_H_ #include #endif /* _NET_IF_H_ */ #ifndef _SYS_MBUF_H_ #include #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 */