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 
43  enum class Value : uint8_t {
44  Unknown,
45  DomainConnectRequestPending,
46  DomainList,
47  Ping,
48  PingReply,
49  KillAvatar,
50  AvatarData,
51  InjectAudio,
52  MixedAudio,
53  MicrophoneAudioNoEcho,
54  MicrophoneAudioWithEcho,
55  BulkAvatarData,
56  SilentAudioFrame,
57  DomainListRequest,
58  RequestAssignment,
59  CreateAssignment,
60  DomainConnectionDenied,
61  MuteEnvironment,
62  AudioStreamStats,
63  DomainServerPathQuery,
64  DomainServerPathResponse,
65  DomainServerAddedNode,
66  ICEServerPeerInformation,
67  ICEServerQuery,
68  OctreeStats,
69  SetAvatarTraits,
70  InjectorGainSet,
71  AssignmentClientStatus,
72  NoisyMute,
73  AvatarIdentity,
74  NodeIgnoreRequest,
75  DomainConnectRequest,
76  DomainServerRequireDTLS,
77  NodeJsonStats,
78  OctreeDataNack,
79  StopNode,
80  AudioEnvironment,
81  EntityEditNack,
82  ICEServerHeartbeat,
83  ICEPing,
84  ICEPingReply,
85  EntityData,
86  EntityQuery,
87  EntityAdd,
88  EntityErase,
89  EntityEdit,
90  DomainServerConnectionToken,
91  DomainSettingsRequest,
92  DomainSettings,
93  AssetGet,
94  AssetGetReply,
95  AssetUpload,
96  AssetUploadReply,
97  AssetGetInfo,
98  AssetGetInfoReply,
99  DomainDisconnectRequest,
100  DomainServerRemovedNode,
101  MessagesData,
102  MessagesSubscribe,
103  MessagesUnsubscribe,
104  ICEServerHeartbeatDenied,
105  AssetMappingOperation,
106  AssetMappingOperationReply,
107  ICEServerHeartbeatACK,
108  NegotiateAudioFormat,
109  SelectedAudioFormat,
110  MoreEntityShapes,
111  NodeKickRequest,
112  NodeMuteRequest,
113  RadiusIgnoreRequest,
114  UsernameFromIDRequest,
115  UsernameFromIDReply,
116  AvatarQuery,
117  RequestsDomainListData,
118  PerAvatarGainSet,
119  EntityScriptGetStatus,
120  EntityScriptGetStatusReply,
121  ReloadEntityServerScript,
122  EntityPhysics,
123  EntityServerScriptLog,
124  AdjustAvatarSorting,
125  OctreeFileReplacement,
126  CollisionEventChanges,
127  ReplicatedMicrophoneAudioNoEcho,
128  ReplicatedMicrophoneAudioWithEcho,
129  ReplicatedInjectAudio,
130  ReplicatedSilentAudioFrame,
131  ReplicatedAvatarIdentity,
132  ReplicatedKillAvatar,
133  ReplicatedBulkAvatarData,
134  DomainContentReplacementFromUrl,
135  DropOnNextProtocolChange_1,
136  EntityScriptCallMethod,
137  DropOnNextProtocolChange_2,
138  DropOnNextProtocolChange_3,
139  OctreeDataFileRequest,
140  OctreeDataFileReply,
141  OctreeDataPersist,
142  EntityClone,
143  EntityQueryInitialResultsComplete,
144  BulkAvatarTraits,
145  AudioSoloRequest,
146  BulkAvatarTraitsAck,
147  StopInjector,
148  AvatarZonePresence,
149  WebRTCSignaling,
150  NUM_PACKET_TYPE
151  };
152 
153  Q_ENUM(Value)
154 
155  const static QHash<PacketTypeEnum::Value, PacketTypeEnum::Value> getReplicatedPacketMapping() {
156  const static QHash<PacketTypeEnum::Value, PacketTypeEnum::Value> REPLICATED_PACKET_MAPPING {
157  { PacketTypeEnum::Value::MicrophoneAudioNoEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho },
158  { PacketTypeEnum::Value::MicrophoneAudioWithEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho },
159  { PacketTypeEnum::Value::InjectAudio, PacketTypeEnum::Value::ReplicatedInjectAudio },
160  { PacketTypeEnum::Value::SilentAudioFrame, PacketTypeEnum::Value::ReplicatedSilentAudioFrame },
161  { PacketTypeEnum::Value::AvatarIdentity, PacketTypeEnum::Value::ReplicatedAvatarIdentity },
162  { PacketTypeEnum::Value::KillAvatar, PacketTypeEnum::Value::ReplicatedKillAvatar },
163  { PacketTypeEnum::Value::BulkAvatarData, PacketTypeEnum::Value::ReplicatedBulkAvatarData }
164  };
165  return REPLICATED_PACKET_MAPPING;
166  }
167 
168  const static QSet<PacketTypeEnum::Value> getNonVerifiedPackets() {
169  const static QSet<PacketTypeEnum::Value> NON_VERIFIED_PACKETS = QSet<PacketTypeEnum::Value>()
170  << PacketTypeEnum::Value::NodeJsonStats
171  << PacketTypeEnum::Value::EntityQuery
172  << PacketTypeEnum::Value::OctreeDataNack
173  << PacketTypeEnum::Value::EntityEditNack
174  << PacketTypeEnum::Value::DomainListRequest
175  << PacketTypeEnum::Value::StopNode
176  << PacketTypeEnum::Value::DomainDisconnectRequest
177  << PacketTypeEnum::Value::UsernameFromIDRequest
178  << PacketTypeEnum::Value::NodeKickRequest
179  << PacketTypeEnum::Value::NodeMuteRequest;
180  return NON_VERIFIED_PACKETS;
181  }
182 
183  const static QSet<PacketTypeEnum::Value> getNonSourcedPackets() {
184  const static QSet<PacketTypeEnum::Value> NON_SOURCED_PACKETS = QSet<PacketTypeEnum::Value>()
185  << PacketTypeEnum::Value::DomainConnectRequestPending << PacketTypeEnum::Value::CreateAssignment
186  << PacketTypeEnum::Value::RequestAssignment << PacketTypeEnum::Value::DomainServerRequireDTLS
187  << PacketTypeEnum::Value::DomainConnectRequest << PacketTypeEnum::Value::DomainList
188  << PacketTypeEnum::Value::DomainConnectionDenied << PacketTypeEnum::Value::DomainServerPathQuery
189  << PacketTypeEnum::Value::DomainServerPathResponse << PacketTypeEnum::Value::DomainServerAddedNode
190  << PacketTypeEnum::Value::DomainServerConnectionToken << PacketTypeEnum::Value::DomainSettingsRequest
191  << PacketTypeEnum::Value::OctreeDataFileRequest << PacketTypeEnum::Value::OctreeDataFileReply
192  << PacketTypeEnum::Value::OctreeDataPersist << PacketTypeEnum::Value::DomainContentReplacementFromUrl
193  << PacketTypeEnum::Value::DomainSettings << PacketTypeEnum::Value::ICEServerPeerInformation
194  << PacketTypeEnum::Value::ICEServerQuery << PacketTypeEnum::Value::ICEServerHeartbeat
195  << PacketTypeEnum::Value::ICEServerHeartbeatACK << PacketTypeEnum::Value::ICEPing
196  << PacketTypeEnum::Value::ICEPingReply << PacketTypeEnum::Value::ICEServerHeartbeatDenied
197  << PacketTypeEnum::Value::AssignmentClientStatus << PacketTypeEnum::Value::StopNode
198  << PacketTypeEnum::Value::DomainServerRemovedNode << PacketTypeEnum::Value::UsernameFromIDReply
199  << PacketTypeEnum::Value::OctreeFileReplacement << PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho
200  << PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho << PacketTypeEnum::Value::ReplicatedInjectAudio
201  << PacketTypeEnum::Value::ReplicatedSilentAudioFrame << PacketTypeEnum::Value::ReplicatedAvatarIdentity
202  << PacketTypeEnum::Value::ReplicatedKillAvatar << PacketTypeEnum::Value::ReplicatedBulkAvatarData
203  << PacketTypeEnum::Value::AvatarZonePresence << PacketTypeEnum::Value::WebRTCSignaling;
204  return NON_SOURCED_PACKETS;
205  }
206 
207  const static QSet<PacketTypeEnum::Value> getDomainSourcedPackets() {
208  const static QSet<PacketTypeEnum::Value> DOMAIN_SOURCED_PACKETS = QSet<PacketTypeEnum::Value>()
209  << PacketTypeEnum::Value::AssetMappingOperation
210  << PacketTypeEnum::Value::AssetGet
211  << PacketTypeEnum::Value::AssetUpload;
212  return DOMAIN_SOURCED_PACKETS;
213  }
214 
215  const static QSet<PacketTypeEnum::Value> getDomainIgnoredVerificationPackets() {
216  const static QSet<PacketTypeEnum::Value> DOMAIN_IGNORED_VERIFICATION_PACKETS = QSet<PacketTypeEnum::Value>()
217  << PacketTypeEnum::Value::AssetMappingOperationReply
218  << PacketTypeEnum::Value::AssetGetReply
219  << PacketTypeEnum::Value::AssetUploadReply;
220  return DOMAIN_IGNORED_VERIFICATION_PACKETS;
221  }
222 };
223 
224 using PacketType = PacketTypeEnum::Value;
225 
226 const int NUM_BYTES_MD5_HASH = 16;
227 
228 // NOTE: There is a max limit of 255, hopefully we have a better way to manage this by then.
229 typedef uint8_t PacketVersion;
230 
244 PacketVersion versionForPacketType(PacketType packetType);
245 
259 QByteArray protocolVersionsSignature();
260 
261 /***
262  * @brief Returns a unique signature for all the current protocols
263  *
264  * Same as protocolVersionsSignature(), in base64.
265  */
266 QString protocolVersionsSignatureBase64();
267 
268 /***
269  * @brief Returns a unique signature for all the current protocols
270  *
271  * Same as protocolVersionsSignature(), in hex;
272  */
273 QString protocolVersionsSignatureHex();
274 
275 /***
276  * @brief Returns the data used to compute the protocol version
277  *
278  * The key is the packet type. The value is the version for that packet type.
279  *
280  * Used for aiding in development.
281  */
282 QMap<PacketType, uint8_t> protocolVersionsSignatureMap();
283 
284 
285 #if (PR_BUILD || DEV_BUILD)
286 void sendWrongProtocolVersionsSignature(bool sendWrongVersion);
287 #endif
288 
289 uint qHash(const PacketType& key, uint seed);
290 QDebug operator<<(QDebug debug, const PacketType& type);
291 
292 // Due to the different legacy behaviour, we need special processing for domains that were created before
293 // the zone inheritance modes were added. These have version numbers up to 80.
294 enum class EntityVersion : PacketVersion {
295  StrokeColorProperty = 0,
296  HasDynamicOwnershipTests,
297  HazeEffect,
298  StaticCertJsonVersionOne,
299  OwnershipChallengeFix,
300  ZoneLightInheritModes = 82,
301  ZoneStageRemoved,
302  SoftEntities,
303  MaterialEntities,
304  ShadowControl,
305  MaterialData,
306  CloneableData,
307  CollisionMask16Bytes,
308  YieldSimulationOwnership,
309  ParticleEntityFix,
310  ParticleSpin,
311  BloomEffect,
312  GrabProperties,
313  ScriptGlmVectors,
314  FixedLightSerialization,
315  MaterialRepeat,
316  EntityHostTypes,
317  CleanupProperties,
318  ImageEntities,
319  GridEntities,
320  MissingTextProperties,
321  GrabTraits,
322  MorePropertiesCleanup,
323  FixPropertiesFromCleanup,
324  UpdatedPolyLines,
325  FixProtocolVersionBumpMismatch,
326  MigrateOverlayRenderProperties,
327  MissingWebEntityProperties,
328  PulseProperties,
329  RingGizmoEntities,
330  AvatarPriorityZone,
331  ShowKeyboardFocusHighlight,
332  WebBillboardMode,
333  ModelScale,
334  ReOrderParentIDProperties,
335  CertificateTypeProperty,
336  DisableWebMedia,
337  ParticleShapeType,
338  ParticleShapeTypeDeadlockFix,
339  PrivateUserData,
340  TextUnlit,
341  ShadowBiasAndDistance,
342  TextEntityFonts,
343  ScriptServerKinematicMotion,
344  // This was ScreenshareZone, property was dropped.
345  ScreenshareZoneUnused,
346  ZoneOcclusion,
347  ModelBlendshapes,
348  TransparentWeb,
349  UseOriginalPivot,
350  UserAgent,
351  AllBillboardMode,
352  TextAlignment,
353  Mirror,
354  EntityTags,
355  WantsKeyboardFocus,
356  AudioZones,
357  AnimationSmoothFrames,
358  ProceduralParticles,
359  ShapeUnlit,
360  AmbientColor,
361  SoundEntities,
362  TonemappingAndAmbientOcclusion,
363  ModelLoadPriority,
364  PropertyCleanup,
365  TextVerticalAlignment,
366  RemoveScreenshare,
367  TorusInnerRadius,
368  NormalMapAttenuation,
369  EmptyEntity,
370  ScriptEntities,
371  Fading,
372  Sampler,
373  CanvasEntity,
374 
375  // Add new versions above here
376  NUM_PACKET_TYPE,
377  LAST_PACKET_TYPE = NUM_PACKET_TYPE - 1
378 };
379 
380 enum class EntityScriptCallMethodVersion : PacketVersion {
381  ServerCallable = 18,
382  ClientCallable = 19
383 };
384 
385 enum class EntityQueryPacketVersion: PacketVersion {
386  JSONFilter = 18,
387  JSONFilterWithFamilyTree = 19,
388  ConnectionIdentifier = 20,
389  RemovedJurisdictions = 21,
390  MultiFrustumQuery = 22,
391  ConicalFrustums = 23,
392  CborData = 24,
393 };
394 
395 enum class AssetServerPacketVersion: PacketVersion {
396  VegasCongestionControl = 19,
397  RangeRequestSupport,
398  RedirectedMappings,
399  BakingTextureMeta
400 };
401 
402 enum class AvatarMixerPacketVersion : PacketVersion {
403  TranslationSupport = 17,
404  SoftAttachmentSupport,
405  AvatarEntities,
406  AbsoluteSixByteRotations,
407  SensorToWorldMat,
408  HandControllerJoints,
409  HasKillAvatarReason,
410  SessionDisplayName,
411  Unignore,
412  ImmediateSessionDisplayNameUpdates,
413  VariableAvatarData,
414  AvatarAsChildFixes,
415  StickAndBallDefaultAvatar,
416  IdentityPacketsIncludeUpdateTime,
417  AvatarIdentitySequenceId,
418  MannequinDefaultAvatar,
419  AvatarIdentitySequenceFront,
420  IsReplicatedInAvatarIdentity,
421  AvatarIdentityLookAtSnapping,
422  UpdatedMannequinDefaultAvatar,
423  AvatarJointDefaultPoseFlags,
424  FBXReaderNodeReparenting,
425  FixMannequinDefaultAvatarFeet,
426  ProceduralFaceMovementFlagsAndBlendshapes,
427  FarGrabJoints,
428  MigrateSkeletonURLToTraits,
429  MigrateAvatarEntitiesToTraits,
430  FarGrabJointsRedux,
431  JointTransScaled,
432  GrabTraits,
433  CollisionFlag,
434  AvatarTraitsAck,
435  FasterAvatarEntities,
436  SendMaxTranslationDimension,
437  FBXJointOrderChange,
438  HandControllerSection,
439  SendVerificationFailed,
440  ARKitBlendshapes,
441  RemoveAttachments,
442 };
443 
444 enum class DomainConnectRequestVersion : PacketVersion {
445  NoHostname = 17,
446  HasHostname,
447  HasProtocolVersions,
448  HasMACAddress,
449  HasMachineFingerprint,
450  AlwaysHasMachineFingerprint,
451  HasTimestamp,
452  HasReason,
453  HasSystemInfo,
454  HasCompressedSystemInfo,
455  SocketTypes
456 };
457 
458 enum class DomainListRequestVersion : PacketVersion {
459  PreSocketTypes = 22,
460  SocketTypes
461 };
462 
463 enum class DomainConnectionDeniedVersion : PacketVersion {
464  ReasonMessageOnly = 17,
465  IncludesReasonCode,
466  IncludesExtraInfo
467 };
468 
469 enum class DomainServerAddedNodeVersion : PacketVersion {
470  PrePermissionsGrid = 17,
471  PermissionsGrid,
472  SocketTypes
473 };
474 
475 enum class DomainListVersion : PacketVersion {
476  PrePermissionsGrid = 18,
477  PermissionsGrid,
478  GetUsernameFromUUIDSupport,
479  GetMachineFingerprintFromUUIDSupport,
480  AuthenticationOptional,
481  HasTimestamp,
482  HasConnectReason,
483  SocketTypes
484 };
485 
486 enum class AudioVersion : PacketVersion {
487  HasCompressedAudio = 17,
488  CodecNameInAudioPackets,
489  Exactly10msAudioPackets,
490  TerminatingStreamStats,
491  SpaceBubbleChanges,
492  HasPersonalMute,
493  HighDynamicRangeVolume,
494  StopInjectors
495 };
496 
497 enum class MessageDataVersion : PacketVersion {
498  TextOrBinaryData = 18
499 };
500 
501 enum class IcePingVersion : PacketVersion {
502  SendICEPeerID = 18
503 };
504 
505 enum class PingVersion : PacketVersion {
506  IncludeConnectionID = 18
507 };
508 
509 enum class AvatarQueryVersion : PacketVersion {
510  SendMultipleFrustums = 21,
511  ConicalFrustums = 22
512 };
513 
514 
515 #endif // hifi_PacketHeaders_h
@ Unknown
Socket type unknown or not set.