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