mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
149 lines
6.0 KiB
C
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
|
|
|