Overte C++ Documentation
PacketHeaders.h
1 //
2 // PacketHeaders.h
3 // libraries/networking/src
4 //
5 // Created by Stephen Birarda on 4/8/13.
6 // Copyright 2013 High Fidelity, Inc.
7 // Copyright 2020 Vircadia contributors.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 // WEBRTC TODO: Rename / split up into files with better names.
14 
15 #ifndef hifi_PacketHeaders_h
16 #define hifi_PacketHeaders_h
17 
18 #pragma once
19 
20 #include <cstdint>
21 #include <map>
22 
23 #include <QtCore/QCryptographicHash>
24 #include <QtCore/QObject>
25 #include <QtCore/QSet>
26 #include <QtCore/QUuid>
27 
28 // The enums are inside this PacketTypeEnum for run-time conversion of enum value to string via
29 // Q_ENUMS, without requiring a macro that is called for each enum value.
30 class PacketTypeEnum {
31  Q_GADGET
32  Q_ENUMS(Value)
33 public:
34  // If adding a new packet packetType, you can replace one marked usable or add at the end.
35  // This enum must hold 256 or fewer packet types (so the value is <= 255) since it is statically typed as a uint8_t
36  enum class Value : uint8_t {
37  Unknown,
38  DomainConnectRequestPending,
39  DomainList,
40  Ping,
41  PingReply,
42  KillAvatar,
43  AvatarData,
44  InjectAudio,
45  MixedAudio,
46  MicrophoneAudioNoEcho,
47  MicrophoneAudioWithEcho,
48  BulkAvatarData,
49  SilentAudioFrame,
50  DomainListRequest,
51  RequestAssignment,
52  CreateAssignment,
53  DomainConnectionDenied,
54  MuteEnvironment,
55  AudioStreamStats,
56  DomainServerPathQuery,
57  DomainServerPathResponse,
58  DomainServerAddedNode,
59  ICEServerPeerInformation,
60  ICEServerQuery,
61  OctreeStats,
62  SetAvatarTraits,
63  InjectorGainSet,
64  AssignmentClientStatus,
65  NoisyMute,
66  AvatarIdentity,
67  NodeIgnoreRequest,
68  DomainConnectRequest,
69  DomainServerRequireDTLS,
70  NodeJsonStats,
71  OctreeDataNack,
72  StopNode,
73  AudioEnvironment,
74  EntityEditNack,
75  ICEServerHeartbeat,
76  ICEPing,
77  ICEPingReply,
78  EntityData,
79  EntityQuery,
80  EntityAdd,
81  EntityErase,
82  EntityEdit,
83  DomainServerConnectionToken,
84  DomainSettingsRequest,
85  DomainSettings,
86  AssetGet,
87  AssetGetReply,
88  AssetUpload,
89  AssetUploadReply,
90  AssetGetInfo,
91  AssetGetInfoReply,
92  DomainDisconnectRequest,
93  DomainServerRemovedNode,
94  MessagesData,
95  MessagesSubscribe,
96  MessagesUnsubscribe,
97  ICEServerHeartbeatDenied,
98  AssetMappingOperation,
99  AssetMappingOperationReply,
100  ICEServerHeartbeatACK,
101  NegotiateAudioFormat,
102  SelectedAudioFormat,
103  MoreEntityShapes,
104  NodeKickRequest,
105  NodeMuteRequest,
106  RadiusIgnoreRequest,
107  UsernameFromIDRequest,
108  UsernameFromIDReply,
109  AvatarQuery,
110  RequestsDomainListData,
111  PerAvatarGainSet,
112  EntityScriptGetStatus,
113  EntityScriptGetStatusReply,
114  ReloadEntityServerScript,
115  EntityPhysics,
116  EntityServerScriptLog,
117  AdjustAvatarSorting,
118  OctreeFileReplacement,
119  CollisionEventChanges,
120  ReplicatedMicrophoneAudioNoEcho,
121  ReplicatedMicrophoneAudioWithEcho,
122  ReplicatedInjectAudio,
123  ReplicatedSilentAudioFrame,
124  ReplicatedAvatarIdentity,
125  ReplicatedKillAvatar,
126  ReplicatedBulkAvatarData,
127  DomainContentReplacementFromUrl,
128  DropOnNextProtocolChange_1,
129  EntityScriptCallMethod,
130  DropOnNextProtocolChange_2,
131  DropOnNextProtocolChange_3,
132  OctreeDataFileRequest,
133  OctreeDataFileReply,
134  OctreeDataPersist,
135  EntityClone,
136  EntityQueryInitialResultsComplete,
137  BulkAvatarTraits,
138  AudioSoloRequest,
139  BulkAvatarTraitsAck,
140  StopInjector,
141  AvatarZonePresence,
142  WebRTCSignaling,
143  NUM_PACKET_TYPE
144  };
145 
146  const static QHash<PacketTypeEnum::Value, PacketTypeEnum::Value> getReplicatedPacketMapping() {
147  const static QHash<PacketTypeEnum::Value, PacketTypeEnum::Value> REPLICATED_PACKET_MAPPING {
148  { PacketTypeEnum::Value::MicrophoneAudioNoEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho },
149  { PacketTypeEnum::Value::MicrophoneAudioWithEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho },
150  { PacketTypeEnum::Value::InjectAudio, PacketTypeEnum::Value::ReplicatedInjectAudio },
151  { PacketTypeEnum::Value::SilentAudioFrame, PacketTypeEnum::Value::ReplicatedSilentAudioFrame },
152  { PacketTypeEnum::Value::AvatarIdentity, PacketTypeEnum::Value::ReplicatedAvatarIdentity },
153  { PacketTypeEnum::Value::KillAvatar, PacketTypeEnum::Value::ReplicatedKillAvatar },
154  { PacketTypeEnum::Value::BulkAvatarData, PacketTypeEnum::Value::ReplicatedBulkAvatarData }
155  };
156  return REPLICATED_PACKET_MAPPING;
157  }
158 
159  const static QSet<PacketTypeEnum::Value> getNonVerifiedPackets() {
160  const static QSet<PacketTypeEnum::Value> NON_VERIFIED_PACKETS = QSet<PacketTypeEnum::Value>()
161  << PacketTypeEnum::Value::NodeJsonStats
162  << PacketTypeEnum::Value::EntityQuery
163  << PacketTypeEnum::Value::OctreeDataNack
164  << PacketTypeEnum::Value::EntityEditNack
165  << PacketTypeEnum::Value::DomainListRequest
166  << PacketTypeEnum::Value::StopNode
167  << PacketTypeEnum::Value::DomainDisconnectRequest
168  << PacketTypeEnum::Value::UsernameFromIDRequest
169  << PacketTypeEnum::Value::NodeKickRequest
170  << PacketTypeEnum::Value::NodeMuteRequest;
171  return NON_VERIFIED_PACKETS;
172  }
173 
174  const static QSet<PacketTypeEnum::Value> getNonSourcedPackets() {
175  const static QSet<PacketTypeEnum::Value> NON_SOURCED_PACKETS = QSet<PacketTypeEnum::Value>()
176  << PacketTypeEnum::Value::DomainConnectRequestPending << PacketTypeEnum::Value::CreateAssignment
177  << PacketTypeEnum::Value::RequestAssignment << PacketTypeEnum::Value::DomainServerRequireDTLS
178  << PacketTypeEnum::Value::DomainConnectRequest << PacketTypeEnum::Value::DomainList
179  << PacketTypeEnum::Value::DomainConnectionDenied << PacketTypeEnum::Value::DomainServerPathQuery
180  << PacketTypeEnum::Value::DomainServerPathResponse << PacketTypeEnum::Value::DomainServerAddedNode
181  << PacketTypeEnum::Value::DomainServerConnectionToken << PacketTypeEnum::Value::DomainSettingsRequest
182  << PacketTypeEnum::Value::OctreeDataFileRequest << PacketTypeEnum::Value::OctreeDataFileReply
183  << PacketTypeEnum::Value::OctreeDataPersist << PacketTypeEnum::Value::DomainContentReplacementFromUrl
184  << PacketTypeEnum::Value::DomainSettings << PacketTypeEnum::Value::ICEServerPeerInformation
185  << PacketTypeEnum::Value::ICEServerQuery << PacketTypeEnum::Value::ICEServerHeartbeat
186  << PacketTypeEnum::Value::ICEServerHeartbeatACK << PacketTypeEnum::Value::ICEPing
187  << PacketTypeEnum::Value::ICEPingReply << PacketTypeEnum::Value::ICEServerHeartbeatDenied
188  << PacketTypeEnum::Value::AssignmentClientStatus << PacketTypeEnum::Value::StopNode
189  << PacketTypeEnum::Value::DomainServerRemovedNode << PacketTypeEnum::Value::UsernameFromIDReply
190  << PacketTypeEnum::Value::OctreeFileReplacement << PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho
191  << PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho << PacketTypeEnum::Value::ReplicatedInjectAudio
192  << PacketTypeEnum::Value::ReplicatedSilentAudioFrame << PacketTypeEnum::Value::ReplicatedAvatarIdentity
193  << PacketTypeEnum::Value::ReplicatedKillAvatar << PacketTypeEnum::Value::ReplicatedBulkAvatarData
194  << PacketTypeEnum::Value::AvatarZonePresence << PacketTypeEnum::Value::WebRTCSignaling;
195  return NON_SOURCED_PACKETS;
196  }
197 
198  const static QSet<PacketTypeEnum::Value> getDomainSourcedPackets() {
199  const static QSet<PacketTypeEnum::Value> DOMAIN_SOURCED_PACKETS = QSet<PacketTypeEnum::Value>()
200  << PacketTypeEnum::Value::AssetMappingOperation
201  << PacketTypeEnum::Value::AssetGet
202  << PacketTypeEnum::Value::AssetUpload;
203  return DOMAIN_SOURCED_PACKETS;
204  }
205 
206  const static QSet<PacketTypeEnum::Value> getDomainIgnoredVerificationPackets() {
207  const static QSet<PacketTypeEnum::Value> DOMAIN_IGNORED_VERIFICATION_PACKETS = QSet<PacketTypeEnum::Value>()
208  << PacketTypeEnum::Value::AssetMappingOperationReply
209  << PacketTypeEnum::Value::AssetGetReply
210  << PacketTypeEnum::Value::AssetUploadReply;
211  return DOMAIN_IGNORED_VERIFICATION_PACKETS;
212  }
213 };
214 
215 using PacketType = PacketTypeEnum::Value;
216 
217 const int NUM_BYTES_MD5_HASH = 16;
218 
219 // NOTE: There is a max limit of 255, hopefully we have a better way to manage this by then.
220 typedef uint8_t PacketVersion;
221 
222 PacketVersion versionForPacketType(PacketType packetType);
223 QByteArray protocolVersionsSignature();
224 QString protocolVersionsSignatureBase64();
225 
226 #if (PR_BUILD || DEV_BUILD)
227 void sendWrongProtocolVersionsSignature(bool sendWrongVersion);
228 #endif
229 
230 uint qHash(const PacketType& key, uint seed);
231 QDebug operator<<(QDebug debug, const PacketType& type);
232 
233 // Due to the different legacy behaviour, we need special processing for domains that were created before
234 // the zone inheritance modes were added. These have version numbers up to 80.
235 enum class EntityVersion : PacketVersion {
236  StrokeColorProperty = 0,
237  HasDynamicOwnershipTests,
238  HazeEffect,
239  StaticCertJsonVersionOne,
240  OwnershipChallengeFix,
241  ZoneLightInheritModes = 82,
242  ZoneStageRemoved,
243  SoftEntities,
244  MaterialEntities,
245  ShadowControl,
246  MaterialData,
247  CloneableData,
248  CollisionMask16Bytes,
249  YieldSimulationOwnership,
250  ParticleEntityFix,
251  ParticleSpin,
252  BloomEffect,
253  GrabProperties,
254  ScriptGlmVectors,
255  FixedLightSerialization,
256  MaterialRepeat,
257  EntityHostTypes,
258  CleanupProperties,
259  ImageEntities,
260  GridEntities,
261  MissingTextProperties,
262  GrabTraits,
263  MorePropertiesCleanup,
264  FixPropertiesFromCleanup,
265  UpdatedPolyLines,
266  FixProtocolVersionBumpMismatch,
267  MigrateOverlayRenderProperties,
268  MissingWebEntityProperties,
269  PulseProperties,
270  RingGizmoEntities,
271  AvatarPriorityZone,
272  ShowKeyboardFocusHighlight,
273  WebBillboardMode,
274  ModelScale,
275  ReOrderParentIDProperties,
276  CertificateTypeProperty,
277  DisableWebMedia,
278  ParticleShapeType,
279  ParticleShapeTypeDeadlockFix,
280  PrivateUserData,
281  TextUnlit,
282  ShadowBiasAndDistance,
283  TextEntityFonts,
284  ScriptServerKinematicMotion,
285  ScreenshareZone,
286  ZoneOcclusion,
287  ModelBlendshapes,
288  TransparentWeb,
289  UseOriginalPivot,
290  UserAgent,
291  AllBillboardMode,
292  TextAlignment,
293 
294  // Add new versions above here
295  NUM_PACKET_TYPE,
296  LAST_PACKET_TYPE = NUM_PACKET_TYPE - 1
297 };
298 
299 enum class EntityScriptCallMethodVersion : PacketVersion {
300  ServerCallable = 18,
301  ClientCallable = 19
302 };
303 
304 enum class EntityQueryPacketVersion: PacketVersion {
305  JSONFilter = 18,
306  JSONFilterWithFamilyTree = 19,
307  ConnectionIdentifier = 20,
308  RemovedJurisdictions = 21,
309  MultiFrustumQuery = 22,
310  ConicalFrustums = 23
311 };
312 
313 enum class AssetServerPacketVersion: PacketVersion {
314  VegasCongestionControl = 19,
315  RangeRequestSupport,
316  RedirectedMappings,
317  BakingTextureMeta
318 };
319 
320 enum class AvatarMixerPacketVersion : PacketVersion {
321  TranslationSupport = 17,
322  SoftAttachmentSupport,
323  AvatarEntities,
324  AbsoluteSixByteRotations,
325  SensorToWorldMat,
326  HandControllerJoints,
327  HasKillAvatarReason,
328  SessionDisplayName,
329  Unignore,
330  ImmediateSessionDisplayNameUpdates,
331  VariableAvatarData,
332  AvatarAsChildFixes,
333  StickAndBallDefaultAvatar,
334  IdentityPacketsIncludeUpdateTime,
335  AvatarIdentitySequenceId,
336  MannequinDefaultAvatar,
337  AvatarIdentitySequenceFront,
338  IsReplicatedInAvatarIdentity,
339  AvatarIdentityLookAtSnapping,
340  UpdatedMannequinDefaultAvatar,
341  AvatarJointDefaultPoseFlags,
342  FBXReaderNodeReparenting,
343  FixMannequinDefaultAvatarFeet,
344  ProceduralFaceMovementFlagsAndBlendshapes,
345  FarGrabJoints,
346  MigrateSkeletonURLToTraits,
347  MigrateAvatarEntitiesToTraits,
348  FarGrabJointsRedux,
349  JointTransScaled,
350  GrabTraits,
351  CollisionFlag,
352  AvatarTraitsAck,
353  FasterAvatarEntities,
354  SendMaxTranslationDimension,
355  FBXJointOrderChange,
356  HandControllerSection,
357  SendVerificationFailed,
358  ARKitBlendshapes
359 };
360 
361 enum class DomainConnectRequestVersion : PacketVersion {
362  NoHostname = 17,
363  HasHostname,
364  HasProtocolVersions,
365  HasMACAddress,
366  HasMachineFingerprint,
367  AlwaysHasMachineFingerprint,
368  HasTimestamp,
369  HasReason,
370  HasSystemInfo,
371  HasCompressedSystemInfo,
372  SocketTypes
373 };
374 
375 enum class DomainListRequestVersion : PacketVersion {
376  PreSocketTypes = 22,
377  SocketTypes
378 };
379 
380 enum class DomainConnectionDeniedVersion : PacketVersion {
381  ReasonMessageOnly = 17,
382  IncludesReasonCode,
383  IncludesExtraInfo
384 };
385 
386 enum class DomainServerAddedNodeVersion : PacketVersion {
387  PrePermissionsGrid = 17,
388  PermissionsGrid,
389  SocketTypes
390 };
391 
392 enum class DomainListVersion : PacketVersion {
393  PrePermissionsGrid = 18,
394  PermissionsGrid,
395  GetUsernameFromUUIDSupport,
396  GetMachineFingerprintFromUUIDSupport,
397  AuthenticationOptional,
398  HasTimestamp,
399  HasConnectReason,
400  SocketTypes
401 };
402 
403 enum class AudioVersion : PacketVersion {
404  HasCompressedAudio = 17,
405  CodecNameInAudioPackets,
406  Exactly10msAudioPackets,
407  TerminatingStreamStats,
408  SpaceBubbleChanges,
409  HasPersonalMute,
410  HighDynamicRangeVolume,
411  StopInjectors
412 };
413 
414 enum class MessageDataVersion : PacketVersion {
415  TextOrBinaryData = 18
416 };
417 
418 enum class IcePingVersion : PacketVersion {
419  SendICEPeerID = 18
420 };
421 
422 enum class PingVersion : PacketVersion {
423  IncludeConnectionID = 18
424 };
425 
426 enum class AvatarQueryVersion : PacketVersion {
427  SendMultipleFrustums = 21,
428  ConicalFrustums = 22
429 };
430 
431 #endif // hifi_PacketHeaders_h
@ Unknown
Socket type unknown or not set.