Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

149 lines
6.0 KiB
C

/*H********************************************************************************/
/*!
\File prototunnel.h
\Description
ProtoTunnel creates and manages a Virtual DirtySock Tunnel (VDST)
connection. The tunnel transparently bundles data sent from multiple ports
to a specific remote host into a single send, and optionally encrypts
portions of that packet. Only data sent over a UDP socket may be
tunneled.
\Copyright
Copyright (c) 2005 Electronic Arts Inc.
\Version 12/02/2005 (jbrookes) First Version
*/
/********************************************************************************H*/
#ifndef _prototunnel_h
#define _prototunnel_h
/*!
\Moduledef ProtoTunnel ProtoTunnel
\Modulemember Proto
*/
//@{
/*** Include files ****************************************************************/
#include "DirtySDK/platform.h"
/*** Defines **********************************************************************/
// prototunnel protocol versions (maj.min)
#define PROTOTUNNEL_VERSION_1_1 (0x0101)
#define PROTOTUNNEL_VERSION (PROTOTUNNEL_VERSION_1_1) //!< default protocol version
#define PROTOTUNNEL_VERSION_MIN (PROTOTUNNEL_VERSION_1_1) //!< minimum protocol version
#define PROTOTUNNEL_VERSION_MAX (PROTOTUNNEL_VERSION_1_1) //!< maximum protocol version
//! maximum number of ports that can be mapped to a tunnel
#define PROTOTUNNEL_MAXPORTS (8)
//! port flag indicating data is encrypted
#define PROTOTUNNEL_PORTFLAG_ENCRYPTED (1)
#define PROTOTUNNEL_PORTFLAG_AUTOFLUSH (2)
//! max key length
#define PROTOTUNNEL_MAXKEYLEN (128)
/*** Macros ***********************************************************************/
/*** Type Definitions *************************************************************/
//! tunnel event types
typedef enum ProtoTunnelEventE
{
PROTOTUNNEL_EVENT_RECVNOMATCH, //!< data received from source with no tunnel mapping
PROTOTUNNEL_NUMEVENTS //!< total number of events
} ProtoTunnelEventE;
//! map description
typedef struct ProtoTunnelInfoT
{
uint32_t uRemoteClientId; //!< unique client ID of remote client
uint32_t uRemoteAddr; //!< remote tunnel address
uint16_t uRemotePort; //!< remote tunnel port (if zero, use local port)
uint16_t aRemotePortList[PROTOTUNNEL_MAXPORTS]; //!< port(s) to map
uint8_t aPortFlags[PROTOTUNNEL_MAXPORTS]; //!< port flags
uint16_t uTunnelVers; //!< tunnel protocol version
uint8_t _pad[2];
} ProtoTunnelInfoT;
//! tunnel statistics
typedef struct ProtoTunnelStatT
{
uint32_t uLastPacketTime; //!< last time packet was snet or received
uint32_t uUpdateTime; //!< time when ProtoTunnelStatT was updated
uint32_t uPrevUpdateTime; //!< last time ProtoTunnelStatT was updated (can be used to keep track of update interval)
uint32_t uEfficiency; //!< send/receive efficiency for the last update interval
uint32_t uRawBytesPerSecond; //!< raw byte per second for the last update interval
uint32_t uBytePerSecond; //!< data bytes (user data) per second for the last update interval
uint32_t uNumBytes; //!< total number of bytes
uint32_t uNumSubpacketBytes; //!< total number of subpacket bytes (user data)
uint16_t uNumPackets; //!< total number of packets
uint16_t uNumSubpackets; //!< total number of subpackets
uint16_t uNumDiscards; //!< total number of out-of-order packet discards
uint16_t _pad;
} ProtoTunnelStatT;
//! opaque module ref
typedef struct ProtoTunnelRefT ProtoTunnelRefT;
//! prototunnel event callback
typedef void (ProtoTunnelCallbackT)(ProtoTunnelRefT *pProtoTunnel, ProtoTunnelEventE eEvent, const char *pData, int32_t iDataSize, struct sockaddr *pRecvAddr, void *pUserData);
//! raw inbound data receive callback (shall return 1 if it swallows the data, 0 otherwise)
typedef int32_t (RawRecvCallbackT)(SocketT *pSocket, uint8_t *pData, int32_t iRecvLen, const struct sockaddr *pFrom, int32_t iFromLen, void *pUserData);
/*** Variables ********************************************************************/
/*** Functions ********************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
// create the module
DIRTYCODE_API ProtoTunnelRefT *ProtoTunnelCreate(int32_t iMaxTunnels, int32_t iTunnelPort);
// destroy the module
DIRTYCODE_API void ProtoTunnelDestroy(ProtoTunnelRefT *pProtoTunnel);
// set event callback
DIRTYCODE_API void ProtoTunnelCallback(ProtoTunnelRefT *pProtoTunnel, ProtoTunnelCallbackT *pCallback, void *pUserData);
// allocate a tunnel
DIRTYCODE_API int32_t ProtoTunnelAlloc(ProtoTunnelRefT *pProtoTunnel, ProtoTunnelInfoT *pInfo, const char *pKey);
// free a tunnel
DIRTYCODE_API uint32_t ProtoTunnelFree(ProtoTunnelRefT *pProtoTunnel, uint32_t uTunnelId, const char *pKey);
// free a tunnel
DIRTYCODE_API uint32_t ProtoTunnelFree2(ProtoTunnelRefT *pProtoTunnel, uint32_t uTunnelId, const char *pKey, uint32_t uAddr);
// update port mapping for specified tunnel
DIRTYCODE_API int32_t ProtoTunnelUpdatePortList(ProtoTunnelRefT *pProtoTunnel, uint32_t uTunnelId, ProtoTunnelInfoT *pInfo);
// get module status
DIRTYCODE_API int32_t ProtoTunnelStatus(ProtoTunnelRefT *pProtoTunnel, int32_t iSelect, int32_t iValue, void *pBuf, int32_t iBufSize);
// control the module
DIRTYCODE_API int32_t ProtoTunnelControl(ProtoTunnelRefT *pProtoTunnel, int32_t iControl, int32_t iValue, int32_t iValue2, const void *pValue);
// update the module
DIRTYCODE_API void ProtoTunnelUpdate(ProtoTunnelRefT *pProtoTunnel);
// use this function to send raw data to a remote host from the prototunnel socket
DIRTYCODE_API int32_t ProtoTunnelRawSendto(ProtoTunnelRefT *pProtoTunnel, const char *pBuf, int32_t iLen, const struct sockaddr *pTo, int32_t iToLen);
#ifdef __cplusplus
}
#endif
//@}
#endif // _prototunnel_h