584 lines
23 KiB
C
584 lines
23 KiB
C
![]() |
/************************************************************************/
|
||
|
/* SOFTWARE MODULE HEADER ***********************************************/
|
||
|
/************************************************************************/
|
||
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
|
/* 2002 - 2007, All Rights Reserved */
|
||
|
/* */
|
||
|
/* MODULE NAME : gensock2.h */
|
||
|
/* PRODUCT(S) : General Sockets Interface */
|
||
|
/* */
|
||
|
/* */
|
||
|
/* MODIFICATION LOG : */
|
||
|
/* Date Who Rev Comments */
|
||
|
/* -------- --- ------ ------------------------------------------- */
|
||
|
/* 10/08/08 MDE 29 Allow variable len header, sockEventQueueFlush*/
|
||
|
/* 03/17/08 EJV 28 Chg MMSEASE_MOSI to !defined(MMS_LITE). */
|
||
|
/* 12/07/07 EJV 27 Impl SISCO's KeepAlive (disconnect idle cons)*/
|
||
|
/* GEN_SOCK_CTRL: added lastCheckIdleTime, */
|
||
|
/* GEN_SOCK_CTXT: added maxIdleTime, */
|
||
|
/* GEN_SOCK_STATS: added lastActivityTime. */
|
||
|
/* 11/01/07 EJV 26 Moved include winsock2.h to sysincs.h. */
|
||
|
/* Added new GS_DISCONNECT_* error codes. */
|
||
|
/* Added GS_DISCONNECT_REASON_STR macro & vars. */
|
||
|
/* 09/10/07 MDE 25 Added log_disable, to support IPC logging */
|
||
|
/* 05/18/07 RKR 24 Ported to Red Hat 5 */
|
||
|
/* 02/08/07 JRB 23 Add GEN_SOCK_EVENT, sockEventPut/Get. */
|
||
|
/* Repl uSockConnect with 2 separate pointers */
|
||
|
/* uSockConnectInd, uSockConnectConf. */
|
||
|
/* 01/30/07 JRB 22 Del obsolete params & sockServiceFreeList. */
|
||
|
/* 01/15/07 JRB 21 Del gs_poll_mode flag & poll_mode arg to */
|
||
|
/* sockStart (no longer supported). */
|
||
|
/* 01/03/07 EJV 20 GEN_SOCK_CTXT: del gSockMutex, txMutex fields*/
|
||
|
/* 11/29/06 EJV 19 HP-UX: chg to use socklen_t. */
|
||
|
/* 10/25/06 EJV 18 Ported to HP-UX. */
|
||
|
/* 02/17/06 EJV 17 __VMS: added SOCK_OPTLEN,SOCK_ADDRLEN. */
|
||
|
/* Aligned some defines. */
|
||
|
/* 12/19/05 EJV 28 sockUsrFun: chg args. */
|
||
|
/* GEN_SOCK: moved sockId, sockIdStr fields down*/
|
||
|
/* 09/28/05 EJV 27 Implemented GEN_SOCK_CTXT. */
|
||
|
/* Moved GENSOCK_MAX_HEADER_SIZE above struct. */
|
||
|
/* Moved MUTEX macros to gensock2.c and renamed */
|
||
|
/* GEN_SOCK: added sockId, sockIdStr, sockCtx. */
|
||
|
/* GEN_SOCK_CTRL: added sockCtx. */
|
||
|
/* Added GS_DISCONNECT_XXX_ERROR defines. */
|
||
|
/* _sockAddSock: chg from ST_VOID to ST_RET ret.*/
|
||
|
/* sockUsrFun: new func. */
|
||
|
/* 07/11/05 EJV 26 Add convertIPAddr proto. */
|
||
|
/* 06/10/05 JRB 25 Obsolete "_sockClose" function replaced with */
|
||
|
/* macro that calls normal "sockClose". */
|
||
|
/* 05/10/05 EJV 24 Added _sockAllocSock, _sockAddSock protos. */
|
||
|
/* 03/23/05 EJV 23 Added sockCreateWakeupSockets */
|
||
|
/* linux MMSEASE_MOSI:add GENSOCK_THREAD_SUPPORT*/
|
||
|
/* 03/16/05 JRB 22 Add GENSOCK_HUNT_DISCONNECT define. */
|
||
|
/* 02/21/05 JRB 21 Fix ioctlsocket define (deleted from tp0_sock)*/
|
||
|
/* 02/10/05 MDE 20 Added sockGetRemAddrInfo */
|
||
|
/* 07/22/04 EJV 19 sun: added GENSOCK_THREAD_SUPPORT */
|
||
|
/* 06/18/04 MDE 18 Include winsock2.h if needed */
|
||
|
/* 03/11/04 EJV 17 SOCK_OPTLEN,SOCK_ADDRLEN diff for each system*/
|
||
|
/* 02/25/04 EJV 16 _AIX: added GENSOCK_THREAD_SUPPORT */
|
||
|
/* Added SOCK_OPTLEN and SOCK_ADDRLEN. */
|
||
|
/* Chg SOCK_NOTSOCK to be EBADF (not ENOTSOCK). */
|
||
|
/* 01/27/04 EJV 15 Added SOCK_NOTSOCK error. */
|
||
|
/* 01/14/04 EJV 14 GEN_SOCK: added sockTxQueuedGroupCnt field. */
|
||
|
/* GEN_SOCK_DATA: added eot field. */
|
||
|
/* Added sockGetTxQueueGroupCnt proto. */
|
||
|
/* 10/23/03 JRB 13 Move all system includes to sysincs.h */
|
||
|
/* 06/25/03 JRB 12 Move log macros to "sock_log.h". */
|
||
|
/* 06/23/03 EJV 11 Added 'first' param to sockTxQueueAdd. */
|
||
|
/* 06/20/03 EJV 10 Rem param from gs_mutex_get. */
|
||
|
/* 06/20/03 EJV 09 Added sockTxQueueDestroy.Chg gSock w/pSock. */
|
||
|
/* Alligned struct fields. */
|
||
|
/* 06/19/03 EJV 08 _WIN32: added GENSOCK_THREAD_SUPPORT */
|
||
|
/* Added comments to struct, #else, #endif */
|
||
|
/* 06/19/03 JRB 07 Make Rx/Tx names more consistent. */
|
||
|
/* 06/18/03 JRB 06 Move defines to top & add SOCKADDR*, ioctlsocket*/
|
||
|
/* Del GENSOCK_THREAD_SUPPORT, define in makefile*/
|
||
|
/* Add forward reference. */
|
||
|
/* Add sockTxPend to GEN_SOCK. */
|
||
|
/* Add GSOCK_LOG_FLOWH. */
|
||
|
/* Del winsock2.h (windows.h gets right winsock)*/
|
||
|
/* Use "base" slog macros. */
|
||
|
/* Add uSockTxBufFree to GEN_SOCK_CONFIG. */
|
||
|
/* Add sockTxMsg, sockTxQueue* funcs. */
|
||
|
/* 06/13/03 MDE 05 More user poll featuresAdded sockGetFds */
|
||
|
/* 06/13/03 EJV 04 Added parameter to gs_mutex_get. */
|
||
|
/* 05/14/03 MDE 03 Added sockGetFds */
|
||
|
/* 05/09/03 JRB 02 Add SOCK_* defines for !_WIN32 */
|
||
|
/* 02/17/03 MDE 01 Created */
|
||
|
/************************************************************************/
|
||
|
|
||
|
#ifndef GENSOCK_INCLUDED
|
||
|
#define GENSOCK_INCLUDED
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include "glbtypes.h"
|
||
|
#include "sysincs.h"
|
||
|
#include "gen_list.h"
|
||
|
#include "glbsem.h"
|
||
|
#include "mem_chk.h"
|
||
|
#include "sock_log.h" /* logging macros */
|
||
|
|
||
|
/* Windows vs. the rest of the world ... */
|
||
|
#ifdef _WIN32
|
||
|
|
||
|
#if !defined(GENSOCK_THREAD_SUPPORT)
|
||
|
#define GENSOCK_THREAD_SUPPORT
|
||
|
#endif
|
||
|
#define SOCKET_ERRORNO WSAGetLastError()
|
||
|
#define SOCK_EADDRINUSE WSAEADDRINUSE
|
||
|
#define SOCK_WOULDBLOCK WSAEWOULDBLOCK
|
||
|
#define SOCK_INTR WSAEINTR
|
||
|
#define SOCK_NOBUFS WSAENOBUFS
|
||
|
#define SOCK_INPROGRESS WSAEINPROGRESS
|
||
|
#define SOCK_TIMEDOUT WSAETIMEDOUT
|
||
|
#define SOCK_NOTSOCK WSAENOTSOCK
|
||
|
#define CLOSE_SOCKET(x) closesocket(x)
|
||
|
|
||
|
#define SOCK_OPTLEN ST_INT /* in getsockopt */
|
||
|
#define SOCK_ADDRLEN ST_INT /* in accept */
|
||
|
|
||
|
#else /* !_WIN32 */
|
||
|
|
||
|
/* define multithread support for GENSOCK on some platforms */
|
||
|
#if defined(_AIX) || defined(sun) || defined(__hpux) || \
|
||
|
(defined(linux) && !defined(MMS_LITE))
|
||
|
#if !defined(GENSOCK_THREAD_SUPPORT)
|
||
|
#define GENSOCK_THREAD_SUPPORT
|
||
|
#endif
|
||
|
#endif /* defined(_AIX) || ... */
|
||
|
|
||
|
#define SOCKET_ERRORNO errno
|
||
|
#define SOCK_EADDRINUSE EADDRINUSE
|
||
|
#define SOCK_WOULDBLOCK EWOULDBLOCK
|
||
|
#define SOCK_INTR EINTR
|
||
|
#define SOCK_NOBUFS ENOBUFS
|
||
|
#define SOCK_INPROGRESS EINPROGRESS
|
||
|
#define SOCK_TIMEDOUT ETIMEDOUT
|
||
|
#define SOCK_NOTSOCK EBADF
|
||
|
#if defined(_NUCLEUS)
|
||
|
#define CLOSE_SOCKET(x) closesocket(x)
|
||
|
#else
|
||
|
#define CLOSE_SOCKET(x) close(x)
|
||
|
#endif
|
||
|
|
||
|
#define SOCKET int
|
||
|
#if !defined(INVALID_SOCKET)
|
||
|
#define INVALID_SOCKET (-1)
|
||
|
#endif
|
||
|
#define SOCKADDR struct sockaddr
|
||
|
#define SOCKADDR_IN struct sockaddr_in
|
||
|
|
||
|
#if defined (__OS2__) /* OS/2 ioctl has extra arg */
|
||
|
#define ioctlsocket(hSock,opt,valptr) ioctl(hSock, opt, (ST_CHAR *)valptr, sizeof(u_long))
|
||
|
#elif defined (VXWORKS) /* VXWORKS wants arg to be int */
|
||
|
#define ioctlsocket(hSock,opt,valptr) ioctl(hSock, opt, (int) valptr)
|
||
|
#else /* all other systems (e.g. UNIX) */
|
||
|
#define ioctlsocket ioctl
|
||
|
#endif
|
||
|
|
||
|
#if defined(_AIX) || defined(sun) || defined(__hpux) || defined(linux)
|
||
|
/* Note: __hpux will need these defines when passing access rights SCM_RIGHTS */
|
||
|
/* through domain socket is working properly for _XOPEN_SOURCE_EXTENDED. */
|
||
|
#define SOCK_OPTLEN socklen_t /* in getsockopt */
|
||
|
#define SOCK_ADDRLEN socklen_t /* in accept */
|
||
|
#elif defined(__VMS)
|
||
|
#define SOCK_OPTLEN __size_t /* in getsockopt */
|
||
|
#define SOCK_ADDRLEN __size_t /* in accept */
|
||
|
#else
|
||
|
/* all other no-Windows platforms not defined above */
|
||
|
#define SOCK_OPTLEN int /* in getsockopt */
|
||
|
#define SOCK_ADDRLEN int /* in accept */
|
||
|
#endif
|
||
|
#endif /* !_WIN32 */
|
||
|
|
||
|
struct tag_GEN_SOCK; /* Forward reference */
|
||
|
/************************************************************************/
|
||
|
/************************************************************************/
|
||
|
|
||
|
typedef struct tag_GEN_SOCK_DATA
|
||
|
{
|
||
|
/* User Send/Receive Queueing */
|
||
|
DBL_LNK l;
|
||
|
|
||
|
/* For user management of send/receive buffers */
|
||
|
ST_UCHAR * usrBufBase; /* Data buffer */
|
||
|
ST_INT usrBufLen; /* Total send buffer size */
|
||
|
|
||
|
ST_VOID * usr1; /* Misc. user use */
|
||
|
ST_VOID * usr2; /* Misc. user use */
|
||
|
|
||
|
/* Data to be sent/Received Data */
|
||
|
ST_UCHAR * data; /* Recv Data, Send Data */
|
||
|
ST_INT dataLen; /* Length of data recvd, or to be sent */
|
||
|
|
||
|
ST_INT result; /* For receive, SD_SUCCESS or error */
|
||
|
ST_BOOLEAN eot; /* SD_TRUE - if last msg in a group */
|
||
|
} GEN_SOCK_DATA;
|
||
|
|
||
|
/************************************************************************/
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
time_t createdTime;
|
||
|
time_t activeTime; /* connected or listening */
|
||
|
ST_LONG numSend; /* num of RFC1006 msgs sent */
|
||
|
ST_LONG numRecv; /* num of RFC1006 msgs received */
|
||
|
ST_DOUBLE lastActivityTime; /* for disconnecting idle connections */
|
||
|
} GEN_SOCK_STATS;
|
||
|
|
||
|
/************************************************************************/
|
||
|
|
||
|
typedef struct tag_GEN_SOCK_CONFIG
|
||
|
{
|
||
|
/* Config parameters */
|
||
|
ST_INT hdrSize; /* Default sizeof (ST_INT) */
|
||
|
ST_INT hdrAllocSize; /* Size to allocate for hdrBuf */
|
||
|
/* in GEN_SOCK struct */
|
||
|
/* If 0 then hdrSize is used */
|
||
|
|
||
|
/* setsockopt parameters */
|
||
|
ST_BOOLEAN setSockOpts;
|
||
|
ST_INT noDelay;
|
||
|
ST_INT keepAlive;
|
||
|
ST_INT reuseAddr;
|
||
|
ST_INT rcvBufSize;
|
||
|
ST_INT sndBufSize;
|
||
|
|
||
|
/* User can set to disable receive */
|
||
|
ST_BOOLEAN pauseRecv;
|
||
|
|
||
|
/* Listen backlog */
|
||
|
ST_INT listenBacklog;
|
||
|
|
||
|
/* User callbacks */
|
||
|
ST_RET (* uSockConnectInd ) ( struct tag_GEN_SOCK * pSock );
|
||
|
ST_RET (* uSockConnectConf ) ( struct tag_GEN_SOCK * pSock );
|
||
|
ST_VOID (* uSockDisconnect ) ( struct tag_GEN_SOCK * pSock );
|
||
|
ST_VOID (* uSockHunt ) ( struct tag_GEN_SOCK * pSock, ST_INT * huntStateIo,
|
||
|
ST_CHAR * buf, ST_INT bufCount, ST_INT * lenOut );
|
||
|
ST_VOID (* uSockRx ) ( struct tag_GEN_SOCK * pSock, GEN_SOCK_DATA * sockData );
|
||
|
ST_VOID (* uSockRxBufAlloc ) ( struct tag_GEN_SOCK * pSock, ST_INT dataLen, GEN_SOCK_DATA ** sockData );
|
||
|
ST_VOID (* uSockTxBufFree ) ( struct tag_GEN_SOCK * pSock, GEN_SOCK_DATA * sockData );
|
||
|
ST_VOID (* uSockWritable ) ( struct tag_GEN_SOCK * pSock );
|
||
|
|
||
|
/* User fields */
|
||
|
ST_EVENT_SEM recvEvent;
|
||
|
ST_VOID * usr1;
|
||
|
ST_VOID * usr2;
|
||
|
ST_VOID * usr3;
|
||
|
ST_VOID * usr4;
|
||
|
|
||
|
/* Internal Security Hooks: Set to NULL unless using security plug-in */
|
||
|
ST_BOOLEAN secEnable;
|
||
|
ST_RET (* secConnectProc ) ( struct tag_GEN_SOCK * pSock );
|
||
|
ST_VOID (* secDisconnectProc ) ( struct tag_GEN_SOCK * pSock );
|
||
|
ST_RET (* secRxProc ) ( struct tag_GEN_SOCK * pSock, ST_CHAR * dest, ST_INT maxRx,
|
||
|
ST_INT flags, ST_INT * rxCountOut, ST_BOOLEAN * secDataLeftOut );
|
||
|
ST_RET (* secTxProc ) ( struct tag_GEN_SOCK * pSock, GEN_SOCK_DATA * sockData, ST_INT * numSentOut );
|
||
|
ST_VOID (* secWritable ) ( struct tag_GEN_SOCK * pSock );
|
||
|
ST_VOID (* secSockFree ) ( struct tag_GEN_SOCK * pSock );
|
||
|
|
||
|
ST_VOID * secCtrl;
|
||
|
|
||
|
/* Set to enable write select */
|
||
|
ST_BOOLEAN chkWritable;
|
||
|
} GEN_SOCK_CONFIG;
|
||
|
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* State defines for GEN_SOCK */
|
||
|
#define GS_STATE_LISTENING 1
|
||
|
#define GS_STATE_STOPPING_LISTEN 2
|
||
|
#define GS_STATE_FAILED_LISTEN 3
|
||
|
#define GS_STATE_CONNECTING 4
|
||
|
#define GS_STATE_CONNECTED 5
|
||
|
#define GS_STATE_CLOSED 6
|
||
|
|
||
|
/* Role defines */
|
||
|
#define GS_ROLE_CALLING 1
|
||
|
#define GS_ROLE_LISTENING 2
|
||
|
#define GS_ROLE_CALLED 3
|
||
|
|
||
|
/* disconnectReason defines */
|
||
|
#define GS_DISCONNECT_UNKNOWN 0
|
||
|
#define GS_DISCONNECT_CONNECT_FAILED 1
|
||
|
#define GS_DISCONNECT_USR_REFUSED 2
|
||
|
#define GS_DISCONNECT_SEND_FAILURE 3
|
||
|
#define GS_DISCONNECT_RECV_FAILED 4
|
||
|
#define GS_DISCONNECT_ACCEPT_FAILED 5
|
||
|
#define GS_DISCONNECT_CLOSED 6
|
||
|
#define GS_DISCONNECT_TERMINATING 7
|
||
|
#define GS_DISCONNECT_RESOURCES_ERROR 8
|
||
|
#define GS_DISCONNECT_INTERNAL_ERROR 9
|
||
|
#define GS_DISCONNECT_NORMAL_DISCONNECT 10 /* normal disconnect */
|
||
|
/* disconnectReason for SSL connection */
|
||
|
#define GS_DISCONNECT_SSLE_LICENSE 11 /* SSL Engine licence expired */
|
||
|
#define GS_DISCONNECT_SSLE_INT_ERR 12 /* SSL Engine internal error */
|
||
|
#define GS_DISCONNECT_REKEY_FAILED 13 /* failed to rekey SSL conn */
|
||
|
#define GS_DISCONNECT_CERT_VERIFY_ERR 14 /* certificate not acceptable */
|
||
|
#define GS_DISCONNECT_CERT_ON_CRL 15 /* certificate on CRL */
|
||
|
#define GS_DISCONNECT_SEC_PARAM_ERR 16 /* cipher or cert ctrl err */
|
||
|
/* update gensock2.c sockDisconnReasonStr when more codes added */
|
||
|
|
||
|
extern ST_CHAR * sockDisconnReasonStr[];
|
||
|
extern ST_INT sockDisconnReasonStrCnt;
|
||
|
/* disconnectReason strings for logging */
|
||
|
#define GS_DISCONNECT_REASON_STR(reason) ((reason < sockDisconnReasonStrCnt) ? sockDisconnReasonStr[reason] : "DISCONNECT REASON: UNKNOWN")
|
||
|
|
||
|
/* Hunt state defines */
|
||
|
#define GENSOCK_HUNT_UNDERWAY 1
|
||
|
#define GENSOCK_HUNT_DONE 2
|
||
|
#define GENSOCK_HUNT_RESET 3
|
||
|
#define GENSOCK_HUNT_DISCONNECT 4 /* stop hunting and disconnect */
|
||
|
|
||
|
#define RECV_STATE_HUNT 1
|
||
|
#define RECV_STATE_DATA 2
|
||
|
|
||
|
#define GEN_SOCK_CTX_NAME_MAX_STR 32 /* Socket Context max name length */
|
||
|
#define GEN_SOCK_CTX_ID_MAX_STR 20
|
||
|
#define GEN_SOCK_SOCK_ID_MAX_STR (GEN_SOCK_CTX_NAME_MAX_STR + GEN_SOCK_CTX_ID_MAX_STR + 20)
|
||
|
|
||
|
struct tag_GEN_SOCK_CTXT; /* Forward reference */
|
||
|
|
||
|
typedef struct tag_GEN_SOCK
|
||
|
{
|
||
|
DBL_LNK l; /* internal use */
|
||
|
|
||
|
/* Socket state */
|
||
|
ST_INT sockState;
|
||
|
ST_INT role;
|
||
|
|
||
|
/* Valid in user socket disconnet call */
|
||
|
ST_INT disconnectReason;
|
||
|
|
||
|
/* Config parameters */
|
||
|
GEN_SOCK_CONFIG sockCfg;
|
||
|
|
||
|
GEN_SOCK_STATS sockStats;
|
||
|
|
||
|
/* For Listen socket only */
|
||
|
ST_UINT maxActive;
|
||
|
ST_UINT numActive;
|
||
|
|
||
|
/* For called socket, reference the listen socket */
|
||
|
struct tag_GEN_SOCK * listenSocket;
|
||
|
|
||
|
ST_INT callingAddrLen;
|
||
|
SOCKADDR_IN callingAddr;
|
||
|
|
||
|
/* Internal */
|
||
|
SOCKET hSock;
|
||
|
|
||
|
ST_INT recvState;
|
||
|
ST_CHAR * recvBuf;
|
||
|
ST_INT recvDoneCount;
|
||
|
ST_INT recvCurrCount;
|
||
|
ST_CHAR * hdrBuf; /* ptr to buffer allocated after this struct*/
|
||
|
GEN_SOCK_DATA * sockData;
|
||
|
|
||
|
struct sockaddr_in sockAddrIn;
|
||
|
ST_BOOLEAN usrCloseCalled;
|
||
|
ST_BOOLEAN recvUsing;
|
||
|
|
||
|
struct tag_GEN_SOCK_CTRL * serviceCtrl;
|
||
|
|
||
|
GEN_SOCK_DATA * sockTxPend; /* Queue of data to be sent. */
|
||
|
ST_UINT sockTxQueueGroupCnt; /* num of queued msgs w/eot to tx */
|
||
|
|
||
|
/* Fields added since MMS-SECURE, ICCP-SECURE v1.03 release */
|
||
|
ST_UINT sockId; /* different id for each socket */
|
||
|
ST_CHAR sockIdStr[GEN_SOCK_SOCK_ID_MAX_STR]; /* assemble for use in log later */
|
||
|
|
||
|
struct tag_GEN_SOCK_CTXT * sockCtx;
|
||
|
} GEN_SOCK;
|
||
|
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* Allow one for wakeup socket */
|
||
|
#define GS_MAX_SOCK_PER_SERVICE FD_SETSIZE - 1
|
||
|
|
||
|
typedef struct tag_GEN_SOCK_CTRL
|
||
|
{
|
||
|
DBL_LNK l;
|
||
|
ST_INT numSock;
|
||
|
GEN_SOCK * sockList;
|
||
|
ST_DOUBLE lastCheckIdleTime;
|
||
|
|
||
|
#if defined(GENSOCK_THREAD_SUPPORT)
|
||
|
ST_EVENT_SEM serviceEvent;
|
||
|
ST_THREAD_HANDLE thService;
|
||
|
ST_THREAD_ID tIdService;
|
||
|
|
||
|
ST_UINT16 wakeupPort;
|
||
|
SOCKET xCalledSock;
|
||
|
SOCKET xCallingSock;
|
||
|
#endif /* GENSOCK_THREAD_SUPPORT */
|
||
|
|
||
|
struct tag_GEN_SOCK_CTXT * sockCtx;
|
||
|
} GEN_SOCK_CTRL;
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* GEN_SOCK_EVENT: Socket event structure to store incoming event. */
|
||
|
|
||
|
/* Values for "eventType" member of GEN_SOCK_EVENT structure. */
|
||
|
#define GS_EVENT_CONNECT_IND 1 /* connect indication */
|
||
|
#define GS_EVENT_CONNECT_CONF 2 /* connect confirmation */
|
||
|
#define GS_EVENT_DISCONNECT 3 /* socket disconnected */
|
||
|
#define GS_EVENT_DATA_IND 4 /* data indication */
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
DBL_LNK l;
|
||
|
ST_INT eventType; /* type of event (GS_EVENT_DATA_IND, etc.)*/
|
||
|
GEN_SOCK * pSock;
|
||
|
GEN_SOCK_DATA * sockData;
|
||
|
} GEN_SOCK_EVENT;
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* gensock2 context */
|
||
|
/* each sockStart() call will create new context with its own lists, */
|
||
|
/* threads, and events handling. Call sockEnd() to clean. */
|
||
|
|
||
|
/* ctxStatus states */
|
||
|
#define GEN_SOCK_CTX_ACTIVE 0
|
||
|
#define GEN_SOCK_CTX_TERMINATING 1
|
||
|
|
||
|
typedef struct tag_GEN_SOCK_CTXT
|
||
|
{
|
||
|
DBL_LNK l; /* internal use */
|
||
|
|
||
|
ST_UINT ctxId; /* diff id for each context */
|
||
|
ST_INT ctxStatus; /* GEN_SOCK_CTX_xxx */
|
||
|
ST_CHAR ctxName[GEN_SOCK_CTX_NAME_MAX_STR + GEN_SOCK_CTX_ID_MAX_STR];
|
||
|
ST_BOOLEAN log_disable;
|
||
|
|
||
|
/* Lists */
|
||
|
GEN_SOCK_CTRL * sockServiceList;
|
||
|
|
||
|
GEN_SOCK_EVENT * sockEventList; /* socket event list */
|
||
|
/* maintained by sockEventPut/Get*/
|
||
|
ST_INT sockEventCount; /* num events on sockEventList */
|
||
|
/* maintained by sockEventPut/Get*/
|
||
|
|
||
|
ST_UINT maxIdleTime; /* ms, if>0 check for idle cons, */
|
||
|
/* SISCO's KeepAlive implementation */
|
||
|
|
||
|
#if defined(GENSOCK_THREAD_SUPPORT)
|
||
|
/* Port used for wakeup sockets */
|
||
|
ST_UINT16 gs_wakeup_port; /* default >= 55050 */
|
||
|
|
||
|
/* Used by list service thread */
|
||
|
ST_INT gs_select_timeout; /* default = 100000 */
|
||
|
|
||
|
ST_BOOLEAN gTerminateService;
|
||
|
|
||
|
#endif /* defined(GENSOCK_THREAD_SUPPORT) */
|
||
|
} GEN_SOCK_CTXT;
|
||
|
|
||
|
extern GEN_SOCK_CTXT * sockCtxList; /* contexts list */
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* gensock2 user functions */
|
||
|
|
||
|
ST_RET sockStart ( ST_CHAR * ctxName, GEN_SOCK_CTXT ** sockCtxOut );
|
||
|
ST_RET sockStartEx ( ST_CHAR * ctxName, GEN_SOCK_CTXT ** sockCtxOut, ST_BOOLEAN log_disable );
|
||
|
ST_RET sockEnd ( GEN_SOCK_CTXT * sockCtx );
|
||
|
|
||
|
ST_RET sockInitCalling ( GEN_SOCK_CTXT * sockCtx, GEN_SOCK_CONFIG * sockCfg,
|
||
|
ST_UINT16 portNo, ST_CHAR * ipAddr, GEN_SOCK ** pSockOut );
|
||
|
|
||
|
ST_RET sockInitListen ( GEN_SOCK_CTXT * sockCtx, GEN_SOCK_CONFIG * sockCfg,
|
||
|
ST_UINT16 portNo, ST_INT maxActive, GEN_SOCK ** pListenSockOut );
|
||
|
|
||
|
ST_RET sockTx ( GEN_SOCK * pSock, GEN_SOCK_DATA * sockData, ST_INT * numSentOut );
|
||
|
ST_RET sockTxMsg ( GEN_SOCK * pSock, GEN_SOCK_DATA * sockData );
|
||
|
ST_RET sockTxQueueAdd ( GEN_SOCK * pSock, GEN_SOCK_DATA * sockData, ST_BOOLEAN first );
|
||
|
ST_RET sockTxQueueDestroy ( GEN_SOCK * pSock );
|
||
|
ST_RET sockTxQueueProc ( GEN_SOCK * pSock );
|
||
|
ST_UINT sockTxQueueGroupCntGet ( GEN_SOCK * pSock );
|
||
|
ST_RET sockStopRecv ( GEN_SOCK * pSock );
|
||
|
ST_RET sockClose ( GEN_SOCK * pSock );
|
||
|
ST_RET sockFree ( GEN_SOCK * pSock );
|
||
|
|
||
|
/* Polling support */
|
||
|
|
||
|
/* Get socket descriptors */
|
||
|
typedef struct
|
||
|
{
|
||
|
ST_INT totalfds;
|
||
|
ST_UINT selectnfds;
|
||
|
|
||
|
ST_INT numReadfds;
|
||
|
fd_set readfds;
|
||
|
|
||
|
ST_INT numWritefds;
|
||
|
fd_set writefds;
|
||
|
|
||
|
ST_INT numExceptfds;
|
||
|
fd_set exceptfds;
|
||
|
} GENSOCK_FD_SET;
|
||
|
|
||
|
ST_VOID sockGetFds ( GEN_SOCK_CTRL * serviceCtrl, GENSOCK_FD_SET * sockFds );
|
||
|
|
||
|
/* Return values for sockCtrlService, sockSelectResultProcess */
|
||
|
#define GS_SELECT_NO_ACTIVE_SOCK 1
|
||
|
#define GS_SELECT_TIMEOUT 2
|
||
|
#define GS_SELECT_ERROR 3
|
||
|
#define GS_SELECT_ACTIVE 4
|
||
|
#define GS_SELECT_TERMINATED 5
|
||
|
|
||
|
ST_VOID sockServiceAll ( GEN_SOCK_CTXT * sockCtx, ST_LONG timeOut );
|
||
|
ST_INT sockCtrlService ( GEN_SOCK_CTRL * serviceCtrl, ST_LONG timeOut );
|
||
|
|
||
|
#if !defined(GENSOCK_THREAD_SUPPORT)
|
||
|
ST_VOID sockInitAllFds ( GENSOCK_FD_SET * sockFds );
|
||
|
#endif
|
||
|
|
||
|
ST_VOID sockInitFds ( GEN_SOCK_CTRL * serviceCtrl, GENSOCK_FD_SET * sockFds );
|
||
|
ST_VOID sockAddReadFds ( GENSOCK_FD_SET * sockFds, SOCKET hSock );
|
||
|
ST_VOID sockAddWriteFds ( GENSOCK_FD_SET * sockFds, SOCKET hSock );
|
||
|
ST_VOID sockAddExceptFds ( GENSOCK_FD_SET * sockFds, SOCKET hSock );
|
||
|
ST_INT sockSelectResultProcess ( GEN_SOCK_CTRL * serviceCtrl,
|
||
|
int nfds, GENSOCK_FD_SET * sockFds );
|
||
|
|
||
|
/* Thread support */
|
||
|
ST_RET sockCreateWakeupSockets ( GEN_SOCK_CTXT * sockCtx,
|
||
|
ST_UINT16 basePort, ST_UINT portRange,
|
||
|
ST_UINT16 * usedPort,
|
||
|
SOCKET * callingSock, SOCKET * calledSock );
|
||
|
ST_VOID sockServiceWakeAll ( GEN_SOCK_CTXT * sockCtx );
|
||
|
ST_VOID sockServiceWake ( GEN_SOCK_CTRL * serviceCtrl );
|
||
|
|
||
|
/* Logging */
|
||
|
ST_VOID sockLogState ( GEN_SOCK_CTXT * sockCtx );
|
||
|
ST_VOID sockLogSockState ( GEN_SOCK * pSock, ST_CHAR * prefix );
|
||
|
|
||
|
/* Socket info */
|
||
|
ST_RET sockGetRemAddrInfo ( GEN_SOCK * pSock, SOCKADDR_IN * remSockAddrDest,
|
||
|
ST_CHAR ** remAddrTxtOut, ST_INT * portOut );
|
||
|
|
||
|
/* Functions to maintain list of GEN_SOCK_EVENT. */
|
||
|
ST_VOID sockEventPut ( GEN_SOCK_CTXT * sockCtx, GEN_SOCK_EVENT * event ); /* put on list*/
|
||
|
GEN_SOCK_EVENT * sockEventGet ( GEN_SOCK_CTXT * sockCtx ); /* get from list*/
|
||
|
ST_VOID sockEventQueueFlush ( GEN_SOCK_CTXT * sockCtx, GEN_SOCK * pSock );
|
||
|
|
||
|
/************************************************************************/
|
||
|
/************************************************************************/
|
||
|
/* INTERNAL */
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* sockUsrFun calls usrFun for each socket in every context, if the */
|
||
|
/* usrFun doesn't return SD_SUCCESS then socket will be closed; */
|
||
|
/* errMsg will be logged on error. */
|
||
|
ST_VOID sockUsrFun ( ST_RET (* usrFun )( ST_VOID * secCtrl ), ST_CHAR * errMsg );
|
||
|
|
||
|
GEN_SOCK * _sockAllocSock ( GEN_SOCK_CTXT * sockCtx,
|
||
|
ST_INT role, ST_INT sockState, SOCKET hSock,
|
||
|
GEN_SOCK_CONFIG * sockCfg );
|
||
|
ST_RET _sockAddSock ( GEN_SOCK * pSock );
|
||
|
|
||
|
ST_RET _sockRecv ( GEN_SOCK * pSock, ST_CHAR * dest,
|
||
|
ST_INT maxRx, ST_INT flags, ST_INT * rxCountOut );
|
||
|
|
||
|
ST_RET _sockTx ( GEN_SOCK * pSock, GEN_SOCK_DATA * sockData, ST_INT * numSentOut );
|
||
|
|
||
|
/* OBSOLETE: For backward compatibility only. New code should use "sockClose".*/
|
||
|
#define _sockClose sockClose
|
||
|
|
||
|
/* -------------------------------------------- */
|
||
|
/* Misc socket related functions */
|
||
|
/* -------------------------------------------- */
|
||
|
|
||
|
ST_ULONG convertIPAddr ( ST_CHAR * ipAddrStr, ST_BOOLEAN useGetHostByName );
|
||
|
|
||
|
/************************************************************************/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* GENSOCK_INCLUDED */
|