netx/addons/BSD/nx_bsd.h

830 lines
38 KiB
C
Raw Normal View History

2020-05-11 08:51:44 -06:00
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** NetX Component */
/** */
/** BSD 4.3 Socket API Compatible Interface to NetX */
/** */
/** */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/* */
/* BSD DEFINITIONS RELEASE */
/* */
/* nx_bsd.h PORTABLE C */
2021-02-28 04:52:45 +00:00
/* 6.1.5 */
2020-05-11 08:51:44 -06:00
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This file defines the constants, structures, etc... needed to */
/* implement the BSD 4.3 Socket API Compatible Interface to NetX. */
/* */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
2020-10-09 12:30:51 -07:00
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
/* resulting in version 6.1 */
2021-02-28 04:52:45 +00:00
/* 03-02-2021 Yuxin Zhou Modified comment(s), and */
/* fixed compiler warnings, */
/* resulting in version 6.1.5 */
2020-05-11 08:51:44 -06:00
/* */
/**************************************************************************/
#ifndef NX_BSD_H
#define NX_BSD_H
/* Determine if a C++ compiler is being used. If so, ensure that standard
C is used to process the API information. */
#ifdef __cplusplus
/* Yes, C++ compiler is present. Use standard C. */
extern "C" {
#endif
2021-06-02 06:45:21 +00:00
#ifndef __CCRX__
2020-05-11 08:51:44 -06:00
#include "time.h"
2021-06-02 06:45:21 +00:00
#endif /* __CCRX__ */
2020-05-11 08:51:44 -06:00
/* Bring in the necessary NetX include file. */
#include "nx_api.h"
/* Define the print error macro for reporting source line number.
#define NX_BSD_PRINT_ERRORS
*/
/* Defined, raw feature is enabled. */
/*
#define NX_BSD_RAW_SUPPORT
*/
/* Defined, raw packet is not duplicated. Then NetX will not handle packets such as ARP. */
/*
#define NX_DISABLE_BSD_RAW_PACKET_DUPLICATE
*/
/* Defined, getaddrinfo is able to get address by name/cname. getnameinfo is able to get name by address. */
/*
#define NX_BSD_ENABLE_DNS
*/
/*
Define the BSD socket timeout process to execute in the timer context.
If this option is not defined, application needs to create stack space for the BSD timeout process
thread, and passes the stack to the BSD layer through the bsd_initialize() call. In this configuration,
the BSD timeout process is all done in the BSD timeout process thread context.
User may choose to define NX_BSD_TIMEOUT_PROCESS_IN_TIMER, so the BSD timeout process is executed in the
ThreadX timer object context. This configuration could eliminate an extra thread (and associated stack
space.) The following parameters passed into bsd_initialize are ignored:
* bsd_thread_stack_area
* bsd_thread_stack_size
* bsd_thread_priority
However system designer needs to be aware of the following if the BSD timeout process is
executed in ThreadX timer context:
* The amount of BSD socket processing may slow down the ThreadX timer;
* If the timer is executed in ISR context (ThreadX library is built with TX_TIMER_PROCESS_IN_ISR),
the BSD timeout process is now executing in the ISR context;
By default NX_BSD_TIMEOUT_PROCESS_IN_TIMER is NOT defined.
*/
/* #define NX_BSD_TIMEOUT_PROCESS_IN_TIMER */
/* Define configuration constants for the BSD compatibility layer. Note that these can be overridden via -D or a #define somewhere else. */
#ifndef NX_BSD_TCP_WINDOW
#define NX_BSD_TCP_WINDOW 65535 /* 64k is typical window size for 100Mb ethernet. */
#endif
#ifndef NX_BSD_SOCKFD_START
#define NX_BSD_SOCKFD_START 32 /* Logical FD starting value. */
#endif
#ifndef NX_BSD_MAX_SOCKETS
#define NX_BSD_MAX_SOCKETS 32 /* Maximum number of total sockets available in the BSD layer. Note */
#endif /* NOTE: Must be multiple of 32! */
#ifndef NX_BSD_MAX_LISTEN_BACKLOG
#define NX_BSD_MAX_LISTEN_BACKLOG 5 /* Maximum listen backlog. */
#endif
#ifndef NX_MICROSECOND_PER_CPU_TICK
#define NX_MICROSECOND_PER_CPU_TICK (1000000/NX_IP_PERIODIC_RATE) /* Number of microseconds per timer interrupt, default 10ms. */
#endif
#ifndef NX_BSD_TIMEOUT
#define NX_BSD_TIMEOUT (20*NX_IP_PERIODIC_RATE)
/* By default all internal NetX calls wait and block for 20 seconds. */
#endif
#ifndef NX_BSD_TCP_SOCKET_DISCONNECT_TIMEOUT
#define NX_BSD_TCP_SOCKET_DISCONNECT_TIMEOUT 1 /* Timeout in timer ticks for internal NetX to disconnect the socket.
The default value of 1 tick is so NetX BSD emulates native BSD
socket and performs an immediate socket close without sending an RST
packet. */
#endif
/* Define configurable options for BSD extended options. */
#ifndef NX_BSD_TIMER_RATE
#define NX_BSD_TIMER_RATE (1 * NX_IP_PERIODIC_RATE) /* Rate at which BSD timer runs. */
#endif
/* Define BSD events */
#define NX_BSD_RECEIVE_EVENT ((ULONG) 0x00000001) /* Event flag to signal a receive packet event */
#define NX_BSD_SELECT_EVENT ((ULONG) 0x00008000) /* Event flag to signal a thread is waiting in select */
#define NX_BSD_ALL_EVENTS ((ULONG) 0xFFFFFFFF) /* All event flag */
#define NX_BSD_CONNECT_EVENT ((ULONG) 0x00000002)
#define NX_BSD_LINGER_EVENT ((ULONG) 0x00000004) /* Event flag to signal a timed linger state has expired on a socket */
#define NX_BSD_TIMED_WAIT_EVENT ((ULONG) 0x00000008) /* Event flag to signal a timed wait state has expired on a socket */
#define NX_BSD_TIMER_EVENT ((ULONG) 0x00000010) /* Event flag to singal a BSD 1 sec timer */
/* For compatibility undefine the fd_set. Then define the FD set size. */
#ifdef fd_set
#undef fd_set
#endif
#ifdef FD_SETSIZE
#undef FD_SETSIZE /* May be different in other header files e.g 64 in GNU types.h file */
#define FD_SETSIZE (NX_BSD_MAX_SOCKETS + NX_BSD_SOCKFD_START) /* Number of sockets to select on - same is max sockets! */
#else
#define FD_SETSIZE (NX_BSD_MAX_SOCKETS + NX_BSD_SOCKFD_START) /* Number of sockets to select on - same is max sockets! */
#endif
/* Define some BSD protocol constants. */
#define SOCK_STREAM 1 /* TCP Socket */
#define SOCK_DGRAM 2 /* UDP Socket */
#if defined(__PRODUCT_NETXDUO__) || defined(NX_BSD_RAW_SUPPORT) || defined(NX_ENABLE_IP_RAW_PACKET_FILTER) || defined(NX_BSD_RAW_PPPOE_SUPPORT)
#define SOCK_RAW 3 /* Raw socket */
#endif
#define IPPROTO_TCP 6 /* TCP Socket */
#define IPPROTO_UDP 17 /* TCP Socket */
/* Define supported flags for 'send' and 'recv'. */
#define MSG_PEEK 0x02 /* Peek incoming message */
#define MSG_DONTWAIT 0x40 /* Nonblocking IO */
/* Address families. */
#define AF_UNSPEC 0 /* Unspecified. */
#define AF_NS 1 /* Local to host (pipes, portals). */
#define AF_INET 2 /* IPv4 socket (UDP, TCP, etc) */
#define AF_PACKET 4 /* Raw Packet type (Link Layer packets) */
/* Protocol families, same as address families. */
#define PF_INET AF_INET
#if defined(__PRODUCT_NETXDUO__) || defined(NX_BSD_RAW_SUPPORT)
#define PF_PACKET AF_PACKET
#endif
#define ETH_P_ALL 3
#define INADDR_ANY 0
#define NX_BSD_LOCAL_IF_INADDR_ANY 0xFFFFFFFF
/* Define API error codes. */
#define NX_SOC_ERROR -1 /* Failure. */
#ifndef ERROR
#define ERROR NX_SOC_ERROR
#endif
#define NX_SOC_OK 0 /* Success. */
#ifndef OK
#define OK NX_SOC_OK
#endif
#define NX_BSD_BLOCK_POOL_ERROR 1
#define NX_BSD_MUTEX_ERROR 2
#define NX_BSD_THREAD_ERROR 4
#define NX_BSD_EVENT_ERROR 7
#define NX_BSD_ENVIRONMENT_ERROR 8
#ifndef NX_PACKET_OFFSET_ERROR
#define NX_PACKET_OFFSET_ERROR 0x53
#endif
/* The Netx API does not require Host to Network conversion or vice versa. The following macro's are provided for source compatibility reasons only. */
#ifndef htons
#define htons(a) a
#endif
#ifndef htonl
#define htonl(a) a
#endif
#ifndef ntohs
#define ntohs(a) a
#endif
#ifndef ntohl
#define ntohl(a) a
#endif
/* Define error handling macro. */
#ifdef NX_BSD_PRINT_ERRORS
#define NX_BSD_ERROR(status, line) printf(" NX BSD debug error message:, NX status: %x source line: %i \n", status, line)
#else
#define NX_BSD_ERROR(status, line)
#endif
/* Define file descriptor operation flags. */
/* Note: FIONREAD is hardware dependant. The default is for i386 processor. */
#ifndef FIONREAD
#define FIONREAD 0x541B /* Read bytes available for the ioctl() command */
#endif
#define F_GETFL 3 /* Get file descriptors */
#define F_SETFL 4 /* Set a subset of file descriptors (e.g. O_NONBlOCK */
#define O_NONBLOCK 0x4000 /* Option to enable non blocking on a file (e.g. socket) */
#ifndef FIONBIO
#define FIONBIO 0x5421 /* Enables socket non blocking option for the ioctl() command */
#endif
/* Define the minimal TCP socket listen backlog value. */
#ifndef NX_BSD_TCP_LISTEN_MIN_BACKLOG
#define NX_BSD_TCP_LISTEN_MIN_BACKLOG 1
#endif
/* Define the maximum number of packets that can be queued on a UDP socket socket. */
#ifndef NX_BSD_SOCKET_QUEUE_MAX
#define NX_BSD_SOCKET_QUEUE_MAX 5
#endif
/* Define additional BSD socket errors. */
/* From errno-base.h in /usr/include/asm-generic; */
#define EPERM 1 /* Operation not permitted */
#define E_MIN 1 /* Minimum Socket/IO error */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Not a typewriter */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read-only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */
/* From errno.h in /usr/include/asm-generic; */
#define EDEADLK 35 /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
#define ENOLCK 37 /* No record locks available */
#define ENOSYS 38 /* Function not implemented */
#define ENOTEMPTY 39 /* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN /* Operation would block */
#define ENOMSG 42 /* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define ECHRNG 44 /* Channel number out of range */
#define EL2NSYNC 45 /* Level 2 not synchronized */
#define EL3HLT 46 /* Level 3 halted */
#define EL3RST 47 /* Level 3 reset */
#define ELNRNG 48 /* Link number out of range */
#define EUNATCH 49 /* Protocol driver not attached */
#define ENOCSI 50 /* No CSI structure available */
#define EL2HLT 51 /* Level 2 halted */
#define EBADE 52 /* Invalid exchange */
#define EBADR 53 /* Invalid request descriptor */
#define EXFULL 54 /* Exchange full */
#define ENOANO 55 /* No anode */
#define EBADRQC 56 /* Invalid request code */
#define EBADSLT 57 /* Invalid slot */
#define EDEADLOCK EDEADLK
#define EBFONT 59 /* Bad font file format */
#define ENOSTR 60 /* Device not a stream */
#define ENODATA 61 /* No data available */
#define ETIME 62 /* Timer expired */
#define ENOSR 63 /* Out of streams resources */
#define ENONET 64 /* Machine is not on the network */
#define ENOPKG 65 /* Package not installed */
#define EREMOTE 66 /* Object is remote */
#define ENOLINK 67 /* Link has been severed */
#define EADV 68 /* Advertise error */
#define ESRMNT 69 /* Srmount error */
#define ECOMM 70 /* Communication error on send */
#define EPROTO 71 /* Protocol error */
#define EMULTIHOP 72 /* Multihop attempted */
#define EDOTDOT 73 /* RFS specific error */
#define EBADMSG 74 /* Not a data message */
#define EOVERFLOW 75 /* Value too large for defined data type */
#define ENOTUNIQ 76 /* Name not unique on network */
#define EBADFD 77 /* File descriptor in bad state */
#define EREMCHG 78 /* Remote address changed */
#define ELIBACC 79 /* Can not access a needed shared library */
#define ELIBBAD 80 /* Accessing a corrupted shared library */
#define ELIBSCN 81 /* .lib section in a.out corrupted */
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
#define EILSEQ 84 /* Illegal byte sequence */
#define ERESTART 85 /* Interrupted system call should be restarted */
#define ESTRPIPE 86 /* Streams pipe error */
#define EUSERS 87 /* Too many users */
#define ENOTSOCK 88 /* Socket operation on non-socket */
#define EDESTADDRREQ 89 /* Destination address required */
#define EMSGSIZE 90 /* Message too long */
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
#define ENOPROTOOPT 92 /* Protocol not available */
#define EPROTONOSUPPORT 93 /* Protocol not supported */
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT 96 /* Protocol family not supported */
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
#define EADDRINUSE 98 /* Address already in use */
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
#define ENETDOWN 100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET 102 /* Network dropped connection because of reset */
#define ECONNABORTED 103 /* Software caused connection abort */
#define ECONNRESET 104 /* Connection reset by peer */
#define ENOBUFS 105 /* No buffer space available */
#define EISCONN 106 /* Transport endpoint is already connected */
#define ENOTCONN 107 /* Transport endpoint is not connected */
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
#define ETIMEDOUT 110 /* Connection timed out */
#define ECONNREFUSED 111 /* Connection refused */
#define EHOSTDOWN 112 /* Host is down */
#define EHOSTUNREACH 113 /* No route to host */
#define EALREADY 114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE 116 /* Stale NFS file handle */
#define EUCLEAN 117 /* Structure needs cleaning */
#define ENOTNAM 118 /* Not a XENIX named type file */
#define ENAVAIL 119 /* No XENIX semaphores available */
#define EISNAM 120 /* Is a named type file */
#define EREMOTEIO 121 /* Remote I/O error */
#define EDQUOT 122 /* Quota exceeded */
#define ENOMEDIUM 123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
#define ECANCELED 125 /* Operation Canceled */
#define ENOKEY 126 /* Required key not available */
#define EKEYEXPIRED 127 /* Key has expired */
#define EKEYREVOKED 128 /* Key has been revoked */
#define EKEYREJECTED 129 /* Key was rejected by service */
#define EOWNERDEAD 130 /* Owner died - for robust mutexes*/
#define ENOTRECOVERABLE 131 /* State not recoverable */
#define ERFKILL 132 /* Operation not possible due to RF-kill */
/* List of BSD sock options from socket.h in /usr/include/asm/socket.h and asm-generic/socket.h.
Note: not all of these are implemented in NetX Extended socket options.
The first set of socket options take the socket level (category) SOL_SOCKET. */
#define SOL_SOCKET 1 /* Define the socket option category. */
#define IPPROTO_IP 2 /* Define the IP option category. */
#define SO_MIN 1 /* Minimum Socket option ID */
#define SO_DEBUG 1 /* Debugging information is being recorded.*/
#define SO_REUSEADDR 2 /* Enable reuse of local addresses in the time wait state */
#define SO_TYPE 3 /* Socket type */
#define SO_ERROR 4 /* Socket error status */
#define SO_DONTROUTE 5 /* Bypass normal routing */
#define SO_BROADCAST 6 /* Transmission of broadcast messages is supported.*/
#define SO_SNDBUF 7 /* Enable setting trasnmit buffer size */
#define SO_RCVBUF 8 /* Enable setting receive buffer size */
#define SO_KEEPALIVE 9 /* Connections are kept alive with periodic messages */
#define SO_OOBINLINE 10 /* Out-of-band data is transmitted in line */
#define SO_NO_CHECK 11 /* Disable UDP checksum */
#define SO_PRIORITY 12 /* Set the protocol-defined priority for all packets to be sent on this socket */
#define SO_LINGER 13 /* Socket lingers on close pending remaining send/receive packets. */
#define SO_BSDCOMPAT 14 /* Enable BSD bug-to-bug compatibility */
#define SO_REUSEPORT 15 /* Rebind a port already in use */
#ifndef SO_PASSCRED /* Used for passing credentials. Not currently in use. */
#define SO_PASSCRED 16 /* Enable passing local user credentials */
#define SO_PEERCRED 17 /* Obtain the process, user and group ids of the other end of the socket connection */
#define SO_RCVLOWAT 18 /* Enable receive "low water mark" */
#define SO_SNDLOWAT 19 /* Enable send "low water mark" */
#define SO_RCVTIMEO 20 /* Enable receive timeout */
#define SO_SNDTIMEO 21 /* Enable send timeout */
#endif /* SO_PASSCRED */
#define SO_SNDBUFFORCE 22 /* Enable setting trasnmit buffer size overriding user limit (admin privelege) */
#define SO_RCVBUFFORCE 23 /* Enable setting trasnmit buffer size overriding user limit (admin privelege) */
#define SO_MAX SO_RCVBUFFORCE /* Maximum Socket option ID */
/* This second set of socket options take the socket level (category) IPPROTO_IP. */
#define IP_MULTICAST_IF 27 /* Specify outgoing multicast interface */
#define IP_MULTICAST_TTL 28 /* Specify the TTL value to use for outgoing multicast packet. */
#define IP_MULTICAST_LOOP 29 /* Whether or not receive the outgoing multicast packet, loopbacloopbackk mode. */
#define IP_BLOCK_SOURCE 30 /* Block multicast from certain source. */
#define IP_UNBLOCK_SOURCE 31 /* Unblock multicast from certain source. */
#define IP_ADD_MEMBERSHIP 32 /* Join IPv4 multicast membership */
#define IP_DROP_MEMBERSHIP 33 /* Leave IPv4 multicast membership */
#define IP_OPTION_MAX IP_DROP_MEMBERSHIP
/*
* User-settable options (used with setsockopt).
*/
#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
#define TCP_MAXSEG 0x02 /* set maximum segment size */
#define TCP_NOPUSH 0x04 /* don't push last block of write */
#define TCP_NOOPT 0x08 /* don't use TCP options */
/* Define protocol types. */
#define NX_PROTOCOL_TCP 6
#define NX_PROTOCOL_UDP 17
/* Define data types used in structure timeval. */
2021-06-02 06:45:21 +00:00
#ifdef __CCRX__
typedef LONG time_t;
#endif /* __CCRX__ */
typedef LONG suseconds_t;
2020-05-11 08:51:44 -06:00
2021-02-28 04:52:45 +00:00
#ifndef __SES_ARM
2020-05-11 08:51:44 -06:00
struct timeval
{
time_t tv_sec; /* Seconds */
suseconds_t tv_usec; /* Microseconds */
};
2021-02-28 04:52:45 +00:00
#endif /* __SES_ARM */
2020-05-11 08:51:44 -06:00
struct sockaddr_storage
{
USHORT ss_len;
USHORT ss_family;
};
struct sockaddr
{
USHORT sa_family; /* Address family (e.g. , AF_INET). */
UCHAR sa_data[14]; /* Protocol- specific address information. */
};
/* Internet address (a structure for historical reasons). */
struct in_addr
{
ULONG s_addr; /* Internet address (32 bits). */
};
typedef ULONG in_addr_t;
typedef ULONG socklen_t;
/* Socket address, Internet style. */
struct sockaddr_in
{
USHORT sin_family; /* Internet Protocol (AF_INET). */
USHORT sin_port; /* Address port (16 bits). */
struct in_addr sin_addr; /* Internet address (32 bits). */
CHAR sin_zero[8]; /* Not used. */
};
typedef struct FD_SET_STRUCT /* The select socket array manager. */
{
INT fd_count; /* How many are SET? */
ULONG fd_array[(NX_BSD_MAX_SOCKETS + 31)/32]; /* Bit map of SOCKET Descriptors. */
} fd_set;
typedef struct NX_BSD_SOCKET_SUSPEND_STRUCT
{
ULONG nx_bsd_socket_suspend_actual_flags;
fd_set nx_bsd_socket_suspend_read_fd_set;
fd_set nx_bsd_socket_suspend_write_fd_set;
fd_set nx_bsd_socket_suspend_exception_fd_set;
} NX_BSD_SOCKET_SUSPEND;
struct ip_mreq
{
struct in_addr imr_multiaddr; /* The IPv4 multicast address to join. */
struct in_addr imr_interface; /* The interface to use for this group. */
};
/* Define additional BSD data structures for supporting socket options. */
struct sock_errno
{
INT error; /* default = 0; */
};
struct linger
{
INT l_onoff; /* 0 = disabled; 1 = enabled; default = 0;*/
INT l_linger; /* linger time in seconds; default = 0;*/
};
struct sock_keepalive
{
INT keepalive_enabled; /* 0 = disabled; 1 = enabled; default = 0;*/
};
struct sock_reuseaddr
{
INT reuseaddr_enabled; /* 0 = disabled; 1 = enabled; default = 1; */
};
struct sock_winsize
{
INT winsize; /* receive window size for TCP sockets ; */
};
/* Define an union struct for master ID and secondary ID used in NX_BSD_SOCKET_STRUCT. */
union UNION_ID
{
INT nx_bsd_socket_master_socket_id;
INT nx_bsd_socket_secondary_socket_id;
};
struct addrinfo
{
INT ai_flags;
INT ai_family;
INT ai_socktype;
INT ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
CHAR *ai_canonname;
struct addrinfo *ai_next;
};
struct NX_BSD_SERVICE_LIST
{
CHAR *service_name;
USHORT service_port;
INT service_socktype;
INT service_protocol;
};
/* Define the Errors return by getaddrinfo. */
/* The specified host doesn't have addresses in the specified address family. */
#define EAI_ADDRFAMILY 40
/* Name server temporary failure. */
#define EAI_AGAIN 41
/* hints.si_flags contains invalid flag. */
#define EAI_BADFLAGS 42
/* DNS fail. */
#define EAI_FAIL 43
/* Invalid address family. */
#define EAI_FAMILY 44
/* memory failure. */
#define EAI_MEMORY 45
/* host exsits, but doesn't have address in specified family. */
#define EAI_NODATA 46
#define EAI_NONAME 47
/* service not available for the specified socket type. */
#define EAI_SERVICE 48
#define EAI_OVERFLOW 49
/* invalid socktype. */
#define EAI_SOCKTYPE 50
#define EAI_SYSTEM 51
/* Define ai_flags value. */
#define AI_PASSIVE 0x0001
/* request CNAME. */
#define AI_CANONNAME 0x0002
/* host must be a address string. */
#define AI_NUMERICHOST 0x0004
/* service must be a port string. */
#define AI_NUMERICSERV 0x0008
#define AI_V4MAPPED 0x0010
#define AI_ALL 0x0020
#define AI_ADDRCONFIG 0x0040
/* Return numeric string for hostname. */
#define NI_NUMERICHOST 0x0001
/* Return numeric string for service name. */
#define NI_NUMERICSERV 0x0002
/* Return only hostname portion of FQDN. */
#define NI_NOFQDN 0x0004
/* Return error if name can't be resolved from address. */
#define NI_NAMEREQD 0x0008
/* Datagram service. */
#define NI_DGRAM 0x0010
/* Defines maximum IPv4 addresses for getaddrinfo. */
#ifndef NX_BSD_IPV4_ADDR_MAX_NUM
#define NX_BSD_IPV4_ADDR_MAX_NUM 5
#endif /* NX_BSD_IPV4_ADDR_MAX_NUM */
/* Defines maximum IPv4 addresses stored from DNS. */
#ifndef NX_BSD_IPV4_ADDR_PER_HOST
#define NX_BSD_IPV4_ADDR_PER_HOST 5
#endif /* NX_BSD_IPV4_ADDR_PER_HOST */
/* Define the BSD socket status bits. */
#define NX_BSD_SOCKET_CONNECTION_INPROGRESS 1
#define NX_BSD_SOCKET_ERROR (1 << 1)
#define NX_BSD_SOCKET_CONNECTED (1 << 2)
/* Disconnected from the stack. */
#define NX_BSD_SOCKET_DISCONNECT_FROM_STACK (1 << 3)
#define NX_BSD_SOCKET_SERVER_MASTER_SOCKET (1 << 4)
#define NX_BSD_SOCKET_SERVER_SECONDARY_SOCKET (1 << 5)
#define NX_BSD_SOCKET_TX_HDR_INCLUDE (1 << 6)
#define NX_BSD_SOCKET_RX_NO_HDR (1 << 7)
#define NX_BSD_SOCKET_IN_USE (1 << 8)
#define NX_BSD_SOCKET_CLIENT (1 << 9)
#define NX_BSD_SOCKET_ENABLE_LISTEN (1 << 10)
#define NX_BSD_SOCKET_BOUND (1 << 11)
#define NX_BSD_SOCKET_ACCEPTING (1 << 12)
#define NX_BSD_SOCKET_CONNECTION_REQUEST (1 << 13)
#define NX_BSD_SOCKET_DISCONNECTION_REQUEST (1 << 14)
/* Define the BSD socket options bits. */
#define NX_BSD_SOCKET_ENABLE_OPTION_LINGER (1 << 1)
#define NX_BSD_SOCKET_ENABLE_OPTION_REUSEADDR (1 << 2)
#define NX_BSD_SOCKET_ENABLE_OPTION_NON_BLOCKING (1 << 3)
/* Define the internal management structure for the BSD layer. */
typedef struct NX_BSD_SOCKET_STRUCT
{
NX_TCP_SOCKET *nx_bsd_socket_tcp_socket;
NX_UDP_SOCKET *nx_bsd_socket_udp_socket;
ULONG nx_bsd_socket_family;
/* Store the protocol number. For example TCP is 6, UDP is 17. */
USHORT nx_bsd_socket_protocol;
TX_THREAD *nx_bsd_socket_busy;
union UNION_ID nx_bsd_socket_union_id;
NX_PACKET* nx_bsd_socket_received_packet;
NX_PACKET* nx_bsd_socket_received_packet_tail;
UINT nx_bsd_socket_received_byte_count;
UINT nx_bsd_socket_received_byte_count_max;
UINT nx_bsd_socket_received_packet_count;
UINT nx_bsd_socket_received_packet_count_max;
ULONG nx_bsd_socket_received_packet_offset;
INT nx_bsd_socket_source_port;
ULONG nx_bsd_socket_local_bind_interface;
UINT nx_bsd_socket_local_bind_interface_index;
ULONG nx_bsd_socket_source_ip_address;
ULONG nx_bsd_socket_peer_ip;
/* For TCP/UDP, the local port is the port number this socket receives on. */
USHORT nx_bsd_socket_local_port;
USHORT nx_bsd_socket_peer_port;
INT nx_bsd_option_linger_time;
UINT nx_bsd_option_linger_time_closed;
UINT nx_bsd_option_linger_start_close;
UINT nx_bsd_socket_time_wait_remaining;
ULONG nx_bsd_option_receive_timeout;
ULONG nx_bsd_option_send_timeout;
INT nx_bsd_file_descriptor_flags;
ULONG nx_bsd_socket_status_flags;
ULONG nx_bsd_socket_option_flags;
int nx_bsd_socket_error_code;
struct NX_BSD_SOCKET_STRUCT
*nx_bsd_socket_next;
struct NX_BSD_SOCKET_STRUCT
*nx_bsd_socket_previous;
INT nx_bsd_socket_id;
#if defined(NX_BSD_RAW_SUPPORT) || defined(NX_BSD_RAW_PPPOE_SUPPORT)
UCHAR nx_bsd_socket_sll_addr[6];
USHORT nx_bsd_socket_sll_protocol;
INT nx_bsd_socket_sll_ifindex;
#endif /* defined(NX_BSD_RAW_SUPPORT) || defined(NX_BSD_RAW_PPPOE_SUPPORT) */
} NX_BSD_SOCKET;
/* Define the BSD function prototypes for use by the application. */
INT accept(INT sockID, struct sockaddr *ClientAddress, INT *addressLength);
INT bsd_initialize(NX_IP *default_ip, NX_PACKET_POOL *default_pool, CHAR *bsd_thread_stack_area, ULONG bsd_thread_stack_size, UINT bsd_thread_priority);
INT bind(INT sockID, struct sockaddr *localAddress, INT addressLength);
INT connect(INT sockID, struct sockaddr *remoteAddress, INT addressLength);
INT getpeername(INT sockID, struct sockaddr *remoteAddress, INT *addressLength);
INT getsockname(INT sockID, struct sockaddr *localAddress, INT *addressLength);
INT ioctl(INT sockID, INT command, INT *result);
in_addr_t inet_addr(const CHAR *buffer);
CHAR *inet_ntoa(struct in_addr address_to_convert);
INT inet_aton(const CHAR *cp_arg, struct in_addr *addr);
INT inet_pton(INT af, const CHAR *src, VOID *dst);
const CHAR *inet_ntop(INT af, const VOID *src, CHAR *dst, socklen_t size);
INT listen(INT sockID, INT backlog);
UINT nx_bsd_socket_set_inherited_settings(UINT master_sock_id, UINT secondary_sock_id);
INT recvfrom(INT sockID, CHAR *buffer, INT buffersize, INT flags,struct sockaddr *fromAddr, INT *fromAddrLen);
INT recv(INT sockID, VOID *rcvBuffer, INT bufferLength, INT flags);
INT sendto(INT sockID, CHAR *msg, INT msgLength, INT flags, struct sockaddr *destAddr, INT destAddrLen);
INT send(INT sockID, const CHAR *msg, INT msgLength, INT flags);
INT select(INT nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
INT soc_close( INT sockID);
INT socket(INT protocolFamily, INT type, INT protocol);
INT fcntl(INT sock_ID, UINT flag_type, UINT f_options);
INT getsockopt(INT sockID, INT option_level, INT option_name, VOID *option_value, INT *option_length);
INT setsockopt(INT sockID, INT option_level, INT option_name, const VOID *option_value, INT option_length);
INT getaddrinfo(const CHAR *node, const CHAR *service, const struct addrinfo *hints, struct addrinfo **res);
VOID freeaddrinfo(struct addrinfo *res);
INT getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);
VOID nx_bsd_set_service_list(struct NX_BSD_SERVICE_LIST *serv_list_ptr, ULONG serv_list_len);
#undef FD_SET
#undef FD_CLR
#undef FD_ISSET
#undef FD_ZERO
VOID FD_SET(INT fd, fd_set *fdset);
VOID FD_CLR(INT fd, fd_set *fdset);
INT FD_ISSET(INT fd, fd_set *fdset);
VOID FD_ZERO(fd_set *fdset);
VOID set_errno(INT tx_errno);
int _nx_get_errno(VOID);
#define errno (_nx_get_errno())
#if defined(NX_BSD_RAW_SUPPORT) || defined(NX_BSD_RAW_PPPOE_SUPPORT)
/* Link Layer Socket Addressing */
struct sockaddr_ll
{
USHORT sll_family; /* Address Family. Must be AF_PACKET */
USHORT sll_protocol; /* LL frame type */
INT sll_ifindex; /* Interface Index. */
USHORT sll_hatype; /* Header type */
UCHAR sll_pkttype; /* Packet type */
UCHAR sll_halen; /* Length of address */
UCHAR sll_addr[8]; /* Physical layer address */
};
#endif /* defined(NX_BSD_RAW_SUPPORT) || defined(NX_BSD_RAW_PPPOE_SUPPORT) */
#ifdef NX_BSD_RAW_SUPPORT
extern UINT _nx_driver_hardware_packet_send(NX_PACKET *packet_ptr); /* Send hardware packet. */
extern VOID (*_nx_driver_hardware_packet_received_callback)(NX_PACKET *packet_ptr, UCHAR *consumed);/* Callback function pointer when packet is received. */
#endif /* NX_BSD_RAW_SUPPORT */
/* Determine if a C++ compiler is being used. If so, complete the standard
C conditional started above. */
#ifdef __cplusplus
}
#endif
#endif /* NX_BSD_H */