1 /**
2  @file  protocol.h
3  @brief ENet protocol
4 */
5 #ifndef __ENET_PROTOCOL_H__
6 #define __ENET_PROTOCOL_H__
7 
8 #include "enet/types.h"
9 
10 enum
11 {
12    ENET_PROTOCOL_MINIMUM_MTU             = 576,
13    ENET_PROTOCOL_MAXIMUM_MTU             = 4096,
14    ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS = 32,
15    ENET_PROTOCOL_MINIMUM_WINDOW_SIZE     = 4096,
16    ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE     = 32768,
17    ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT   = 1,
18    ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT   = 255,
19    ENET_PROTOCOL_MAXIMUM_PEER_ID         = 0xFFF,
20    ENET_PROTOCOL_MAXIMUM_PACKET_SIZE     = 1024 * 1024 * 1024,
21    ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT  = 1024 * 1024
22 };
23 
24 typedef enum _ENetProtocolCommand
25 {
26    ENET_PROTOCOL_COMMAND_NONE               = 0,
27    ENET_PROTOCOL_COMMAND_ACKNOWLEDGE        = 1,
28    ENET_PROTOCOL_COMMAND_CONNECT            = 2,
29    ENET_PROTOCOL_COMMAND_VERIFY_CONNECT     = 3,
30    ENET_PROTOCOL_COMMAND_DISCONNECT         = 4,
31    ENET_PROTOCOL_COMMAND_PING               = 5,
32    ENET_PROTOCOL_COMMAND_SEND_RELIABLE      = 6,
33    ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE    = 7,
34    ENET_PROTOCOL_COMMAND_SEND_FRAGMENT      = 8,
35    ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED   = 9,
36    ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT    = 10,
37    ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE = 11,
38    ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT = 12,
39    ENET_PROTOCOL_COMMAND_COUNT              = 13,
40 
41    ENET_PROTOCOL_COMMAND_MASK               = 0x0F
42 } ENetProtocolCommand;
43 
44 typedef enum _ENetProtocolFlag
45 {
46    ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7),
47    ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6),
48 
49    ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14),
50    ENET_PROTOCOL_HEADER_FLAG_SENT_TIME  = (1 << 15),
51    ENET_PROTOCOL_HEADER_FLAG_MASK       = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME,
52 
53    ENET_PROTOCOL_HEADER_SESSION_MASK    = (3 << 12),
54    ENET_PROTOCOL_HEADER_SESSION_SHIFT   = 12
55 } ENetProtocolFlag;
56 
57 #ifdef _MSC_VER_
58 #pragma pack(push, 1)
59 #define ENET_PACKED
60 #elif defined(__GNUC__)
61 #define ENET_PACKED __attribute__ ((packed))
62 #else
63 #define ENET_PACKED
64 #endif
65 
66 typedef struct _ENetProtocolHeader
67 {
68    enet_uint16 peerID;
69    enet_uint16 sentTime;
70 } ENET_PACKED ENetProtocolHeader;
71 
72 typedef struct _ENetProtocolCommandHeader
73 {
74    enet_uint8 command;
75    enet_uint8 channelID;
76    enet_uint16 reliableSequenceNumber;
77 } ENET_PACKED ENetProtocolCommandHeader;
78 
79 typedef struct _ENetProtocolAcknowledge
80 {
81    ENetProtocolCommandHeader header;
82    enet_uint16 receivedReliableSequenceNumber;
83    enet_uint16 receivedSentTime;
84 } ENET_PACKED ENetProtocolAcknowledge;
85 
86 typedef struct _ENetProtocolConnect
87 {
88    ENetProtocolCommandHeader header;
89    enet_uint16 outgoingPeerID;
90    enet_uint8  incomingSessionID;
91    enet_uint8  outgoingSessionID;
92    enet_uint32 mtu;
93    enet_uint32 windowSize;
94    enet_uint32 channelCount;
95    enet_uint32 incomingBandwidth;
96    enet_uint32 outgoingBandwidth;
97    enet_uint32 packetThrottleInterval;
98    enet_uint32 packetThrottleAcceleration;
99    enet_uint32 packetThrottleDeceleration;
100    enet_uint32 connectID;
101    enet_uint32 data;
102 } ENET_PACKED ENetProtocolConnect;
103 
104 typedef struct _ENetProtocolVerifyConnect
105 {
106    ENetProtocolCommandHeader header;
107    enet_uint16 outgoingPeerID;
108    enet_uint8  incomingSessionID;
109    enet_uint8  outgoingSessionID;
110    enet_uint32 mtu;
111    enet_uint32 windowSize;
112    enet_uint32 channelCount;
113    enet_uint32 incomingBandwidth;
114    enet_uint32 outgoingBandwidth;
115    enet_uint32 packetThrottleInterval;
116    enet_uint32 packetThrottleAcceleration;
117    enet_uint32 packetThrottleDeceleration;
118    enet_uint32 connectID;
119 } ENET_PACKED ENetProtocolVerifyConnect;
120 
121 typedef struct _ENetProtocolBandwidthLimit
122 {
123    ENetProtocolCommandHeader header;
124    enet_uint32 incomingBandwidth;
125    enet_uint32 outgoingBandwidth;
126 } ENET_PACKED ENetProtocolBandwidthLimit;
127 
128 typedef struct _ENetProtocolThrottleConfigure
129 {
130    ENetProtocolCommandHeader header;
131    enet_uint32 packetThrottleInterval;
132    enet_uint32 packetThrottleAcceleration;
133    enet_uint32 packetThrottleDeceleration;
134 } ENET_PACKED ENetProtocolThrottleConfigure;
135 
136 typedef struct _ENetProtocolDisconnect
137 {
138    ENetProtocolCommandHeader header;
139    enet_uint32 data;
140 } ENET_PACKED ENetProtocolDisconnect;
141 
142 typedef struct _ENetProtocolPing
143 {
144    ENetProtocolCommandHeader header;
145 } ENET_PACKED ENetProtocolPing;
146 
147 typedef struct _ENetProtocolSendReliable
148 {
149    ENetProtocolCommandHeader header;
150    enet_uint16 dataLength;
151 } ENET_PACKED ENetProtocolSendReliable;
152 
153 typedef struct _ENetProtocolSendUnreliable
154 {
155    ENetProtocolCommandHeader header;
156    enet_uint16 unreliableSequenceNumber;
157    enet_uint16 dataLength;
158 } ENET_PACKED ENetProtocolSendUnreliable;
159 
160 typedef struct _ENetProtocolSendUnsequenced
161 {
162    ENetProtocolCommandHeader header;
163    enet_uint16 unsequencedGroup;
164    enet_uint16 dataLength;
165 } ENET_PACKED ENetProtocolSendUnsequenced;
166 
167 typedef struct _ENetProtocolSendFragment
168 {
169    ENetProtocolCommandHeader header;
170    enet_uint16 startSequenceNumber;
171    enet_uint16 dataLength;
172    enet_uint32 fragmentCount;
173    enet_uint32 fragmentNumber;
174    enet_uint32 totalLength;
175    enet_uint32 fragmentOffset;
176 } ENET_PACKED ENetProtocolSendFragment;
177 
178 typedef union _ENetProtocol
179 {
180    ENetProtocolCommandHeader header;
181    ENetProtocolAcknowledge acknowledge;
182    ENetProtocolConnect connect;
183    ENetProtocolVerifyConnect verifyConnect;
184    ENetProtocolDisconnect disconnect;
185    ENetProtocolPing ping;
186    ENetProtocolSendReliable sendReliable;
187    ENetProtocolSendUnreliable sendUnreliable;
188    ENetProtocolSendUnsequenced sendUnsequenced;
189    ENetProtocolSendFragment sendFragment;
190    ENetProtocolBandwidthLimit bandwidthLimit;
191    ENetProtocolThrottleConfigure throttleConfigure;
192 } ENET_PACKED ENetProtocol;
193 
194 #ifdef _MSC_VER_
195 #pragma pack(pop)
196 #endif
197 
198 #endif /* __ENET_PROTOCOL_H__ */
199 
200