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