You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
10 KiB
C
256 lines
10 KiB
C
1 year ago
|
#ifndef TP0_SOCK_INCLUDED
|
||
|
#define TP0_SOCK_INCLUDED
|
||
|
/************************************************************************/
|
||
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||
|
/************************************************************************/
|
||
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
|
/* 1997 - 2005 All Rights Reserved */
|
||
|
/* */
|
||
|
/* MODULE NAME : tp0_sock.h */
|
||
|
/* PRODUCT(S) : Lean-T Stack */
|
||
|
/* */
|
||
|
/* MODULE DESCRIPTION : */
|
||
|
/* TP0/RFC1006 header file for "sockets" interface. */
|
||
|
/* */
|
||
|
/* MODIFICATION LOG : */
|
||
|
/* Date Who Rev Comments */
|
||
|
/* -------- --- ------ ------------------------------------------- */
|
||
|
/* 08/03/05 EJV 28 SOCK_INFO: added rekeyTime */
|
||
|
/* 07/19/05 EJV 27 Added SOCK_STATE_CONNECT_CANCELLED. */
|
||
|
/* 06/30/05 EJV 26 SOCK_INFO: added recvCnt (for flow control) */
|
||
|
/* 06/06/05 EJV 25 MMSEASE_MOSE: few more chgs to RFC1006_IPC* */
|
||
|
/* 05/25/05 EJV 24 Added ssec.h */
|
||
|
/* 04/25/05 JRB,EJV 23 Add RFC1006_IPC_MSG, RFC1006_LISTENER_.. defs*/
|
||
|
/* 05/09/05 EJV 22 SOCK_INFO: added port field. sreadd add arg6.*/
|
||
|
/* 05/05/05 EJV 21 np_connect_req: added rem_port param. */
|
||
|
/* 03/08/05 JRB 20 Add RFC1006.. define. */
|
||
|
/* 02/22/05 JRB 19 slistend,sreadd: chg ret from void to int. */
|
||
|
/* 02/21/05 JRB 18 Del ioctlsocket define. Use def in gensock2.h*/
|
||
|
/* 01/14/04 EJV 17 np_data_req: added eot param. */
|
||
|
/* Added np_get_tx_queue_cnt func. */
|
||
|
/* 10/23/03 JRB 16 Move all system includes to sysincs.h */
|
||
|
/* 10/16/03 JRB 15 SOCK_INFO: add genSock. */
|
||
|
/* 09/11/03 EJV 14 Del winsock.h (windows.h gets right winsock) */
|
||
|
/* Added encrypt_ctrl arg to np_connect_req(). */
|
||
|
/* SOCK_INFO: Add DBL_LNK l and encrypt_ctrl. */
|
||
|
/* 07/16/02 JRB 13 Add arg to sreadd proto. */
|
||
|
/* 06/20/02 JRB 12 Chg np_connect_req 2nd arg to ulong ipAddr. */
|
||
|
/* 05/08/02 JRB 11 Chg connect_result to int (to store errno). */
|
||
|
/* 05/03/02 JRB 10 Add ip_addr to SOCK_INFO to pass to Read task.*/
|
||
|
/* 02/02/01 EJV 09 _AIX: added forward references for inet.h. */
|
||
|
/* 01/02/01 EJV 08 Ported to _AIX. */
|
||
|
/* 08/15/00 EJV 07 WIN32: Del pipe_msg_crit_sec, pipe_msg_count.*/
|
||
|
/* 05/18/00 JRB 06 Del "select.h". See "sysincs.h". */
|
||
|
/* Add <netinet/tcp.h> for VXWORKS. */
|
||
|
/* Improve "ioctlsocket" macros for non-WIN32. */
|
||
|
/* 08/13/98 JRB 05 Lint cleanup. */
|
||
|
/* Add <netinet/tcp.h> for default system. */
|
||
|
/* 12/09/97 JRB 04 Added __OS2__ support. */
|
||
|
/* 11/14/97 JRB 03 Make PIPE_MSG for VXWORKS like _WIN32. */
|
||
|
/* 11/10/97 JRB 02 Add VXWORKS support. */
|
||
|
/* 08/01/97 JRB 01 Created (compatible with MMS-EASE 7.0). */
|
||
|
/************************************************************************/
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include "gensock2.h" /* need GEN_SOCK definition */
|
||
|
#include "ssec.h" /* need S_SEC_ENCRYPT_CTRL */
|
||
|
|
||
|
/* Include sockets defs appropriate for this platform. */
|
||
|
#if !defined (_WIN32)
|
||
|
#define closesocket close
|
||
|
#define WSAEWOULDBLOCK EWOULDBLOCK
|
||
|
#define WSAEINPROGRESS EINPROGRESS
|
||
|
#if defined (__OS2__)
|
||
|
#define WSAGetLastError() sock_errno()
|
||
|
#define GetLastError() errno
|
||
|
#else /* !__OS2__ */
|
||
|
#define WSAGetLastError() errno
|
||
|
#endif /* !__OS2__ */
|
||
|
#define SOCKET int
|
||
|
#define SOCKADDR struct sockaddr
|
||
|
#define SOCKADDR_IN struct sockaddr_in
|
||
|
#define PSOCKADDR struct sockaddr *
|
||
|
#define HOSTENT struct hostent
|
||
|
#define INVALID_SOCKET (-1)
|
||
|
#endif /* !_WIN32 */
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* Constant definitions. */
|
||
|
/************************************************************************/
|
||
|
#define IPPORT_RFC1006 102
|
||
|
#define RFC1006_HEAD_LEN 4
|
||
|
#define RFC1006_VERSION 3 /* first byte of TPKT is version*/
|
||
|
#define INVALID_CONN_ID (-1L)
|
||
|
#define LISTEN_TASK_NAME "slistend" /* "Listen" task exe name*/
|
||
|
#define READ_TASK_NAME "sreadd" /* "Read" task exe name */
|
||
|
#define PIPE_TO_MAIN_NAME "/tmp/pipetp0main"
|
||
|
#define PIPE_TO_LISTEN_NAME "/tmp/pipetp0list"
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* Variable type definitions. */
|
||
|
/************************************************************************/
|
||
|
|
||
|
/* Defines of possible values for "state" in SOCK_INFO struct. */
|
||
|
#define SOCK_STATE_ACCEPTED 0
|
||
|
#define SOCK_STATE_CONNECTING 1
|
||
|
#define SOCK_STATE_CONNECTED 2
|
||
|
#define SOCK_STATE_DISCONNECTING 3
|
||
|
#define SOCK_STATE_CONNECT_CANCELLED 4
|
||
|
typedef struct
|
||
|
{
|
||
|
DBL_LNK l; /* needed to store this struct on linked list */
|
||
|
GEN_SOCK *genSock; /* Use with gensock2. Otherwise, use "hSock" */
|
||
|
SOCKET hSock;
|
||
|
ST_INT state;
|
||
|
ST_LONG user_conn_id; /* Received from user on N-CONNECT.req/rsp */
|
||
|
ST_UINT32 ip_addr; /* IP addr as long int in network byte order. */
|
||
|
ST_UINT16 port; /* RFC1006 port, defaults to 102 */
|
||
|
#if !(defined(_WIN32) || defined (__OS2__))
|
||
|
pid_t pid_read; /* Save READ process PID */
|
||
|
#endif
|
||
|
S_SEC_ENCRYPT_CTRL encrypt_ctrl;
|
||
|
ST_UINT recvCnt; /* num of received (queued) data msgs */
|
||
|
ST_DOUBLE rekeyTime; /* next time to check rekey if we are idle */
|
||
|
} SOCK_INFO;
|
||
|
|
||
|
|
||
|
/* Info to pass to spawned thread. Can only pass 1 arg to thread, so */
|
||
|
/* make it a structure, and put whatever we need in it. */
|
||
|
typedef struct
|
||
|
{
|
||
|
SOCK_INFO *sock_info; /* to pass back to main in PIPE_MSG. */
|
||
|
SOCKET hSock; /* copied from "sock_info" */
|
||
|
ST_INT state; /* copied from "sock_info" */
|
||
|
ST_UINT16 max_tpkt_len; /* Max len of RFC1006 TPKT. */
|
||
|
} THREAD_INFO;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
SOCK_INFO *sock_info;
|
||
|
ST_INT connect_result; /* errno (WSAGetLastErr() for Windows)*/
|
||
|
ST_UINT16 tpkt_len;
|
||
|
#if (defined (_WIN32) || defined (VXWORKS) || defined (__OS2__))
|
||
|
ST_UCHAR *tpkt_ptr;
|
||
|
#else
|
||
|
ST_UCHAR tpkt_buf [1]; /* Beginning of buffer attached to this struct*/
|
||
|
#endif
|
||
|
} PIPE_MSG;
|
||
|
|
||
|
/* Use define for Length of PIPE_MSG without tpkt_buf at end. */
|
||
|
#define PIPE_MSG_HEAD_LEN (sizeof(PIPE_MSG)-1)
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* Global variables. */
|
||
|
/************************************************************************/
|
||
|
extern ST_UCHAR *g_tpkt_enc_buf; /* Buffer for encoding TPKTs. */
|
||
|
extern SOCKET hSockListen; /* listen socket handle */
|
||
|
|
||
|
#if defined _WIN32
|
||
|
extern HANDLE hPipeMainRead; /* read handle for pipe */
|
||
|
extern HANDLE hPipeMainWrite; /* write handle for pipe */
|
||
|
extern HANDLE hEventListenGo;
|
||
|
#endif
|
||
|
#if defined (__OS2__)
|
||
|
extern HFILE hPipeMainRead; /* read handle for pipe */
|
||
|
extern HFILE hPipeMainWrite; /* write handle for pipe */
|
||
|
extern HEV hEventListenGo;
|
||
|
extern ST_INT pipe_msg_count;
|
||
|
#endif /* __OS2__ */
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* Function Prototypes. */
|
||
|
/************************************************************************/
|
||
|
ST_RET np_init (ST_INT max_num_conns);
|
||
|
ST_RET np_end (ST_VOID);
|
||
|
ST_BOOLEAN np_event (ST_VOID);
|
||
|
|
||
|
SOCK_INFO * np_connect_req (ST_LONG user_conn_id, ST_ULONG ipAddr, ST_UINT16 rem_port,
|
||
|
S_SEC_ENCRYPT_CTRL *encrypt_ctrl);
|
||
|
ST_VOID np_connect_cnf_pos (SOCK_INFO *sock_info, ST_LONG user_conn_id);
|
||
|
/* NOTE: np_connect_ind & np_connect_rsp not needed because user only */
|
||
|
/* cares about Transport conn. Doesn't need to know about Network conn.*/
|
||
|
|
||
|
ST_RET np_data_req (SOCK_INFO *sock_info, ST_INT pdu_len, ST_UCHAR *pdu_ptr, ST_BOOLEAN eot);
|
||
|
ST_VOID np_data_ind (SOCK_INFO *sock_info, ST_UCHAR *pdu_ptr, ST_UINT16 pdu_len);
|
||
|
ST_UINT np_get_tx_queue_cnt (SOCK_INFO *sock_info);
|
||
|
|
||
|
ST_RET np_disconnect_req (SOCK_INFO *sock_info);
|
||
|
ST_VOID np_disconnect_ind (SOCK_INFO *sock_info);
|
||
|
|
||
|
ST_RET sockets_init (ST_INT max_num_conns);
|
||
|
ST_VOID sockets_end (ST_VOID);
|
||
|
ST_RET spawn_listen (SOCKET hSock);
|
||
|
ST_RET spawn_read (SOCK_INFO *sock_info);
|
||
|
ST_VOID handle_accepted_conn (SOCK_INFO *sock_info);
|
||
|
ST_VOID handle_connect_success (SOCK_INFO *sock_info);
|
||
|
ST_VOID handle_connect_fail (SOCK_INFO *sock_info);
|
||
|
ST_VOID handle_data (SOCK_INFO *sock_info, ST_UCHAR *tpkt_ptr, ST_UINT16 tpkt_len);
|
||
|
ST_VOID handle_disconnect (SOCK_INFO *sock_info);
|
||
|
SOCK_INFO *sock_info_alloc (SOCKET hSock, ST_INT state, ST_LONG user_conn_id);
|
||
|
ST_VOID sock_info_free (SOCK_INFO *sock_info);
|
||
|
|
||
|
#if defined (_WIN32)
|
||
|
void ThreadSockListen (void *param);
|
||
|
void ThreadSockRead (void *param);
|
||
|
#endif /* _WIN32 */
|
||
|
#if defined (__OS2__)
|
||
|
void _Optlink ThreadSockListen (void *param);
|
||
|
void _Optlink ThreadSockRead (void *param);
|
||
|
#endif /* __OS2__ */
|
||
|
|
||
|
int slistend (int arg1);
|
||
|
int sreadd (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6);
|
||
|
|
||
|
/************************************************************************/
|
||
|
/* Code used by MMSEASE_MOSI. */
|
||
|
/* Defines, etc. for interfacing to "rfc1006_listener" task. */
|
||
|
/* Only used on LINUX, but the code should be portable to most UNIX-like*/
|
||
|
/* systems. */
|
||
|
/************************************************************************/
|
||
|
|
||
|
#if defined(MMSEASE_MOSI)
|
||
|
/* use the same task name and the UNIX domain listen socket name to */
|
||
|
/* easy associate each other when viewing for example network stats */
|
||
|
#if defined(linux)
|
||
|
#define RFC1006_LISTENER_EXE_PATH "/usr/sisco/bin"
|
||
|
#define RFC1006_LISTENER_IPC_PATH "/tmp"
|
||
|
#endif
|
||
|
#define RFC1006_LISTENER_NAME "rfc1006listenerd"
|
||
|
#define RFC1006_LISTENER_DOMSOCK "rfc1006listenerd.domsock"
|
||
|
#define RFC1006_LISTENER_LOG "rfc1006listenerd.log"
|
||
|
|
||
|
#define RFC1006_IPC_MAGIC_NUM 0xBADC
|
||
|
/* defines for "opcode" in RFC1006_IPC_MSG. */
|
||
|
#define RFC1006_IPC_OP_START 1 /* start RFC1006_LISTENER daemon */
|
||
|
#define RFC1006_IPC_OP_STOP 2 /* stop RFC1006_LISTENER daemon */
|
||
|
#define RFC1006_IPC_OP_BIND 3
|
||
|
#define RFC1006_IPC_OP_UNBIND 4
|
||
|
#define RFC1006_IPC_OP_CONNECT 5 /* TP0 connect indication */
|
||
|
#define RFC1006_IPC_OP_SET_LOG 6 /* change RFC1006_LISTENER log masks */
|
||
|
|
||
|
typedef struct rfc1006_ipc_msg_tag
|
||
|
{
|
||
|
ST_UINT16 magic; /* always == RFC1006_IPC_MAGIC_NUM */
|
||
|
ST_UINT16 opcode; /* one of RFC1006_IPC_OP.. values */
|
||
|
ST_UINT16 data_len; /* length of data following this msg */
|
||
|
} RFC1006_IPC_MSG;
|
||
|
|
||
|
extern ST_BOOLEAN use_rfc1006_listener_task;
|
||
|
extern SOCKET domsock_listener; /* domain socket connected to the */
|
||
|
/* RFC1006_LISTENER task. */
|
||
|
ST_INT recvwait (SOCKET hSock, ST_VOID *buf, ST_INT numBytes, int flags);
|
||
|
ST_INT sendwait (SOCKET hSock, ST_VOID *buf, ST_INT numBytes, int flags);
|
||
|
|
||
|
ST_RET setListenerIPCDir (ST_CHAR *dirPath);
|
||
|
|
||
|
#endif /* defined(MMSEASE_MOSI) */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* !TP0_SOCK_INCLUDED */
|
||
|
|