engage-engine 1.236.90760003 → 1.240.90800005

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1085,7 +1085,10 @@ namespace AppConfigurationObjects
1085
1085
  bptAppBinary = 3,
1086
1086
 
1087
1087
  /** @brief Biometrics payload. Used to send biometric series data. <a href="https://github.com/rallytac/pub/wiki/Engage-Human-Biometrics" target="_blank">See WIKI post for more info</a> */
1088
- bptEngageBinaryHumanBiometrics = 4
1088
+ bptEngageBinaryHumanBiometrics = 4,
1089
+
1090
+ /** @brief The payload is MIME-encoded as per RFC 2045 */
1091
+ bptAppMimeMessage = 5
1089
1092
  } PayloadType_t;
1090
1093
 
1091
1094
  /** @brief [Optional, Default : 0] Size of the payload */
@@ -1863,6 +1866,46 @@ namespace AppConfigurationObjects
1863
1866
  getOptional<Power>("power", p.power, j);
1864
1867
  }
1865
1868
 
1869
+ /**
1870
+ * @brief Network Transmission Priority.
1871
+ *
1872
+ * Priority to set on the packets in order for the network to optimize routing of the packets
1873
+ */
1874
+ typedef enum
1875
+ {
1876
+ /** @brief best effort */
1877
+ priBestEffort = 0,
1878
+
1879
+ /** @brief signaling */
1880
+ priSignaling = 1,
1881
+
1882
+ /** @brief video */
1883
+ priVideo = 2,
1884
+
1885
+ /** @brief voice */
1886
+ priVoice = 3
1887
+ } TxPriority_t;
1888
+
1889
+ /**
1890
+ * @brief Address family resolution policy
1891
+ *
1892
+ * Defines the policy on how to resolve/prefer IPv4 vs IPv6 names
1893
+ */
1894
+ typedef enum
1895
+ {
1896
+ /** @brief IPv4 only */
1897
+ arpIpv4Only = 4,
1898
+
1899
+ /** @brief IPv6 only */
1900
+ arpIpv6Only = 6,
1901
+
1902
+ /** @brief IPv4 then IPv6 */
1903
+ arpIpv4ThenIpv6 = 46,
1904
+
1905
+ /** @brief IPv6 then IPv4 */
1906
+ arpIpv6ThenIpv4 = 64
1907
+ } AddressResolutionPolicy_t;
1908
+
1866
1909
  //-----------------------------------------------------------
1867
1910
  JSON_SERIALIZED_CLASS(NetworkTxOptions)
1868
1911
  /**
@@ -1882,27 +1925,6 @@ namespace AppConfigurationObjects
1882
1925
  IMPLEMENT_JSON_DOCUMENTATION(NetworkTxOptions)
1883
1926
 
1884
1927
  public:
1885
-
1886
- /**
1887
- * @brief Network Transmission Priority.
1888
- *
1889
- * Priority to set on the packets in order for the network to optimize routing of the packets
1890
- */
1891
- typedef enum
1892
- {
1893
- /** @brief best effort */
1894
- priBestEffort = 0,
1895
-
1896
- /** @brief signaling */
1897
- priSignaling = 1,
1898
-
1899
- /** @brief video */
1900
- priVideo = 2,
1901
-
1902
- /** @brief voice */
1903
- priVoice = 3
1904
- } TxPriority_t;
1905
-
1906
1928
  /** @brief [Optional, Default: @ref priVoice] Transmission priority. This has meaning on some operating systems based on how their IP stack operates. It may or may not affect final packet marking. */
1907
1929
  TxPriority_t priority;
1908
1930
 
@@ -1939,7 +1961,7 @@ namespace AppConfigurationObjects
1939
1961
  static void from_json(const nlohmann::json& j, NetworkTxOptions& p)
1940
1962
  {
1941
1963
  p.clear();
1942
- getOptional<NetworkTxOptions::TxPriority_t>("priority", p.priority, j, NetworkTxOptions::priVoice);
1964
+ getOptional<TxPriority_t>("priority", p.priority, j, TxPriority_t::priVoice);
1943
1965
  getOptional<int>("ttl", p.ttl, j, 1);
1944
1966
  }
1945
1967
 
@@ -1985,10 +2007,22 @@ namespace AppConfigurationObjects
1985
2007
  static void from_json(const nlohmann::json& j, TcpNetworkTxOptions& p)
1986
2008
  {
1987
2009
  p.clear();
1988
- getOptional<NetworkTxOptions::TxPriority_t>("priority", p.priority, j, NetworkTxOptions::priVoice);
2010
+ getOptional<TxPriority_t>("priority", p.priority, j, TxPriority_t::priVoice);
1989
2011
  getOptional<int>("ttl", p.ttl, j, -1);
1990
2012
  }
1991
2013
 
2014
+ typedef enum
2015
+ {
2016
+ /** @brief Unspecified */
2017
+ ifIpUnspec = 0,
2018
+
2019
+ /** @brief IPv4 */
2020
+ ifIp4 = 4,
2021
+
2022
+ /** @brief IPv6 */
2023
+ ifIp6 = 6
2024
+ } IpFamilyType_t;
2025
+
1992
2026
  //-----------------------------------------------------------
1993
2027
  JSON_SERIALIZED_CLASS(NetworkAddress)
1994
2028
  /**
@@ -2105,6 +2139,22 @@ namespace AppConfigurationObjects
2105
2139
  getOptional<NetworkAddress>("tx", p.tx, j);
2106
2140
  }
2107
2141
 
2142
+ /** @brief Enum describing restriction types. */
2143
+ typedef enum
2144
+ {
2145
+ /** @brief Registration for groups is allowed by default */
2146
+ graptPermissive = 0,
2147
+
2148
+ /** @brief Registration for groups is NOT allowed by default - requires definitive access through something like a whitelist*/
2149
+ graptStrict = 1
2150
+ } GroupRestrictionAccessPolicyType_t;
2151
+
2152
+ static bool isValidGroupRestrictionAccessPolicyType(GroupRestrictionAccessPolicyType_t t)
2153
+ {
2154
+ return (t == GroupRestrictionAccessPolicyType_t::graptPermissive ||
2155
+ t == GroupRestrictionAccessPolicyType_t::graptStrict );
2156
+ }
2157
+
2108
2158
  /** @brief Enum describing restriction types. */
2109
2159
  typedef enum
2110
2160
  {
@@ -2125,6 +2175,43 @@ namespace AppConfigurationObjects
2125
2175
  t == RestrictionType_t::rtBlacklist );
2126
2176
  }
2127
2177
 
2178
+ /** @brief Enum describing restriction element types. */
2179
+ typedef enum
2180
+ {
2181
+ /** @brief A literal group ID */
2182
+ retGroupId = 0,
2183
+
2184
+ /** @brief Elements are group ID regex patterns */
2185
+ retGroupIdPattern = 1,
2186
+
2187
+ /** @brief Elements are generic access tags regex patterns */
2188
+ retGenericAccessTagPattern = 2,
2189
+
2190
+ /** @brief Elements are X.509 certificate serial number regex patterns */
2191
+ retCertificateSerialNumberPattern = 3,
2192
+
2193
+ /** @brief Elements are X.509 certificate fingerprint regex patterns */
2194
+ retCertificateFingerprintPattern = 4,
2195
+
2196
+ /** @brief Elements are X.509 certificate subject regex patterns */
2197
+ retCertificateSubjectPattern = 5,
2198
+
2199
+ /** @brief Elements are X.509 certificate issuer regex patterns */
2200
+ retCertificateIssuerPattern = 6
2201
+ } RestrictionElementType_t;
2202
+
2203
+ static bool isValidRestrictionElementType(RestrictionElementType_t t)
2204
+ {
2205
+ return (t == RestrictionElementType_t::retGroupId ||
2206
+ t == RestrictionElementType_t::retGroupIdPattern ||
2207
+ t == RestrictionElementType_t::retGenericAccessTagPattern ||
2208
+ t == RestrictionElementType_t::retCertificateSerialNumberPattern ||
2209
+ t == RestrictionElementType_t::retCertificateFingerprintPattern ||
2210
+ t == RestrictionElementType_t::retCertificateSubjectPattern ||
2211
+ t == RestrictionElementType_t::retCertificateIssuerPattern);
2212
+ }
2213
+
2214
+
2128
2215
  //-----------------------------------------------------------
2129
2216
  JSON_SERIALIZED_CLASS(NetworkAddressRestrictionList)
2130
2217
  /**
@@ -2196,12 +2283,16 @@ namespace AppConfigurationObjects
2196
2283
  /** @brief Type indicating how the elements are to be treated **/
2197
2284
  RestrictionType_t type;
2198
2285
 
2286
+ /** @brief Type indicating what kind of data each element contains **/
2287
+ RestrictionElementType_t elementsType;
2288
+
2199
2289
  /** @brief List of elements */
2200
- std::vector<std::string> elements;
2290
+ std::vector<std::string> elements;
2201
2291
 
2202
2292
  StringRestrictionList()
2203
2293
  {
2204
2294
  type = RestrictionType_t::rtUndefined;
2295
+ elementsType = RestrictionElementType_t::retGroupId;
2205
2296
  clear();
2206
2297
  }
2207
2298
 
@@ -2215,6 +2306,7 @@ namespace AppConfigurationObjects
2215
2306
  {
2216
2307
  j = nlohmann::json{
2217
2308
  TOJSON_IMPL(type),
2309
+ TOJSON_IMPL(elementsType),
2218
2310
  TOJSON_IMPL(elements)
2219
2311
  };
2220
2312
  }
@@ -2222,6 +2314,7 @@ namespace AppConfigurationObjects
2222
2314
  {
2223
2315
  p.clear();
2224
2316
  getOptional<RestrictionType_t>("type", p.type, j, RestrictionType_t::rtUndefined);
2317
+ getOptional<RestrictionElementType_t>("elementsType", p.elementsType, j, RestrictionElementType_t::retGroupId);
2225
2318
  getOptional<std::vector<std::string>>("elements", p.elements, j);
2226
2319
  }
2227
2320
 
@@ -2842,6 +2935,79 @@ namespace AppConfigurationObjects
2842
2935
  getOptional("extra", p.extra, j);
2843
2936
  }
2844
2937
 
2938
+ //-----------------------------------------------------------
2939
+ JSON_SERIALIZED_CLASS(AudioGate)
2940
+ /**
2941
+ * @brief Description of an audio gate
2942
+ *
2943
+ * Helper C++ class to serialize and de-serialize AudioGate JSON.
2944
+ *
2945
+ * Example: @include[doc] examples/AudioGate.json
2946
+ *
2947
+ */
2948
+ class AudioGate : public ConfigurationObjectBase
2949
+ {
2950
+ IMPLEMENT_JSON_SERIALIZATION()
2951
+ IMPLEMENT_JSON_DOCUMENTATION(AudioGate)
2952
+
2953
+ public:
2954
+ /** @brief [Optional. Default: false] Enables the audio gate if true */
2955
+ bool enabled;
2956
+
2957
+ /** @brief [Optional. Default: false] Use voice activity detection rather than audio energy */
2958
+ bool useVad;
2959
+
2960
+ /** @brief [Optional. Default: 1500] Hang timer in milliseconds */
2961
+ uint32_t hangMs;
2962
+
2963
+ /** @brief [Optional. Default: 25] Number of 10ms history samples to gather before calculating the noise floor - ignored if useVad is true */
2964
+ uint32_t windowMin;
2965
+
2966
+ /** @brief [Optional. Default: 125] Maximum number of 10ms history samples - ignored if useVad is true */
2967
+ uint32_t windowMax;
2968
+
2969
+ /** @brief [Optional. Default: 1.75] Coefficient by which to multiply the current history average to determine the floor - ignored if useVad is true */
2970
+ double coefficient;
2971
+
2972
+
2973
+ AudioGate()
2974
+ {
2975
+ clear();
2976
+ }
2977
+
2978
+ void clear()
2979
+ {
2980
+ enabled = false;
2981
+ useVad = false;
2982
+ hangMs = 1500;
2983
+ windowMin = 25;
2984
+ windowMax = 125;
2985
+ coefficient = 1.75;
2986
+ }
2987
+ };
2988
+
2989
+ static void to_json(nlohmann::json& j, const AudioGate& p)
2990
+ {
2991
+ j = nlohmann::json{
2992
+ TOJSON_IMPL(enabled),
2993
+ TOJSON_IMPL(useVad),
2994
+ TOJSON_IMPL(hangMs),
2995
+ TOJSON_IMPL(windowMin),
2996
+ TOJSON_IMPL(windowMax),
2997
+ TOJSON_IMPL(coefficient)
2998
+ };
2999
+ }
3000
+ static void from_json(const nlohmann::json& j, AudioGate& p)
3001
+ {
3002
+ p.clear();
3003
+ getOptional<bool>("enabled", p.enabled, j, false);
3004
+ getOptional<bool>("useVad", p.useVad, j, false);
3005
+ getOptional<uint32_t>("hangMs", p.hangMs, j, 1500);
3006
+ getOptional<uint32_t>("windowMin", p.windowMin, j, 25);
3007
+ getOptional<uint32_t>("windowMax", p.windowMax, j, 125);
3008
+ getOptional<double>("coefficient", p.coefficient, j, 1.75);
3009
+ }
3010
+
2845
3011
  //-----------------------------------------------------------
2846
3012
  JSON_SERIALIZED_CLASS(TxAudio)
2847
3013
  /**
@@ -3018,6 +3184,9 @@ namespace AppConfigurationObjects
3018
3184
  ctMelpe2400 = 52
3019
3185
  } TxCodec_t;
3020
3186
 
3187
+ /** @brief [Optional, Default: true] Audio transmission is enabled */
3188
+ bool enabled;
3189
+
3021
3190
  /** @brief [Optional, Default: @ref ctOpus8000] Specifies the Codec Type to use for the transmission. See @ref TxCodec_t for all codec types */
3022
3191
  TxCodec_t encoder;
3023
3192
 
@@ -3088,6 +3257,7 @@ namespace AppConfigurationObjects
3088
3257
 
3089
3258
  void clear()
3090
3259
  {
3260
+ enabled = true;
3091
3261
  encoder = TxAudio::TxCodec_t::ctUnknown;
3092
3262
  encoderName.clear();
3093
3263
  framingMs = 60;
@@ -3110,6 +3280,7 @@ namespace AppConfigurationObjects
3110
3280
  static void to_json(nlohmann::json& j, const TxAudio& p)
3111
3281
  {
3112
3282
  j = nlohmann::json{
3283
+ TOJSON_IMPL(enabled),
3113
3284
  TOJSON_IMPL(encoder),
3114
3285
  TOJSON_IMPL(encoderName),
3115
3286
  TOJSON_IMPL(framingMs),
@@ -3132,6 +3303,7 @@ namespace AppConfigurationObjects
3132
3303
  static void from_json(const nlohmann::json& j, TxAudio& p)
3133
3304
  {
3134
3305
  p.clear();
3306
+ getOptional<bool>("enabled", p.enabled, j, true);
3135
3307
  getOptional<TxAudio::TxCodec_t>("encoder", p.encoder, j, TxAudio::TxCodec_t::ctOpus8000);
3136
3308
  getOptional<std::string>("encoderName", p.encoderName, j, EMPTY_STRING);
3137
3309
  getOptional("framingMs", p.framingMs, j, 60);
@@ -3146,7 +3318,7 @@ namespace AppConfigurationObjects
3146
3318
  getOptional("resetRtpOnTx", p.resetRtpOnTx, j, true);
3147
3319
  getOptional("enableSmoothing", p.enableSmoothing, j, true);
3148
3320
  getOptional("dtx", p.dtx, j, false);
3149
- getOptional("smoothedHangTimeMs", p.smoothedHangTimeMs, j, 0);
3321
+ getOptional("smoothedHangTimeMs", p.smoothedHangTimeMs, j, 0);
3150
3322
 
3151
3323
  // internalKey is not serialized
3152
3324
  }
@@ -3879,93 +4051,71 @@ namespace AppConfigurationObjects
3879
4051
  ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_SECURITY_CLASSIFICATION_LEVEL_TOO_HIGH = "SecurityClassificationLevelTooHigh";
3880
4052
  /** @brief The Rallypoint has denied the registration for no specific reason **/
3881
4053
  ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_GENERAL_DENIAL = "GeneralDenial";
3882
- /** @} */
3883
4054
 
4055
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate does not have an access tag for the group **/
4056
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_NO_ACCESS_TAG = "NoAccessTag";
4057
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate does not have an access tag for the group **/
4058
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_EXCLUDED_ACCESS_TAG = "ExcludedAccessTag";
4059
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate does not have an an approved serial number **/
4060
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_NO_SERIAL = "NoSerial";
4061
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate serial number has been excluded **/
4062
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_EXCLUDED_SERIAL = "ExcludedSerial";
4063
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate does not have an an approved fingerprint **/
4064
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_NO_FINGERPRINT = "NoFingerprint";
4065
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate fingerprint has been excluded **/
4066
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_EXCLUDED_FINGERPRINT = "ExcludedFingerprint";
4067
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate does not have an an approved subject **/
4068
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_NO_SUBJECT = "NoSubject";
4069
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate subject has been excluded **/
4070
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_EXCLUDED_SUBJECT = "ExcludedSubject";
4071
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate does not have an an approved issuer **/
4072
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_NO_ISSUER = "NoIssuer";
4073
+ /** @brief The Rallypoint denied the registration request because the far-end's certificate issuer has been excluded **/
4074
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_EXCLUDED_ISSUER = "ExcludedIssuer";
4075
+ /** @brief The Rallypoint denied the registration request because the far-end does not appear in any whitelist criteria **/
4076
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_NOT_ON_WHITELIST = "NotOnWhitelist";
4077
+ /** @brief The Rallypoint denied the registration request because the far-end does appears in blackist criteria **/
4078
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *GROUP_DISCONNECTED_REASON_ON_BLACKLIST = "OnBlacklist";
3884
4079
 
3885
- //-----------------------------------------------------------
3886
- JSON_SERIALIZED_CLASS(GroupSatPaq)
3887
- /**
3888
- * @brief Configuration for the optional SatPaq transport functionality for Group.
3889
- *
3890
- * Helper C++ class to serialize and de-serialize GroupSatPaq JSON
4080
+ /** @} */
4081
+
4082
+ /** @addtogroup OID IANA-type object identifiers
3891
4083
  *
3892
- * Example: @include[doc] examples/GroupSatPaq.json
4084
+ * Object Identifiers we commonly use
3893
4085
  *
3894
- * @see ConfigurationObjects::Group
4086
+ * @{
3895
4087
  */
3896
- class GroupSatPaq : public ConfigurationObjectBase
3897
- {
3898
- IMPLEMENT_JSON_SERIALIZATION()
3899
- IMPLEMENT_JSON_DOCUMENTATION(GroupSatPaq)
3900
-
3901
- public:
3902
- /** @brief [Optional, Default: false] Enables SatPaq feature. */
3903
- bool enabled;
3904
-
3905
- /** @brief The sender ID. */
3906
- uint16_t senderId;
3907
-
3908
- /** @brief The talkgroup ID. */
3909
- uint8_t talkgroupId;
3910
-
3911
- GroupSatPaq()
3912
- {
3913
- clear();
3914
- }
3915
-
3916
- void clear()
3917
- {
3918
- enabled = false;
3919
- senderId = 0;
3920
- talkgroupId = 0;
3921
- }
3922
- };
3923
-
3924
- static void to_json(nlohmann::json& j, const GroupSatPaq& p)
3925
- {
3926
- j = nlohmann::json{
3927
- TOJSON_IMPL(enabled),
3928
- TOJSON_IMPL(senderId),
3929
- TOJSON_IMPL(talkgroupId)
3930
- };
3931
- }
3932
- static void from_json(const nlohmann::json& j, GroupSatPaq& p)
3933
- {
3934
- p.clear();
3935
- getOptional<bool>("enabled", p.enabled, j, false);
3936
- getOptional<uint16_t>("senderId", p.senderId, j, 0);
3937
- getOptional<uint8_t>("talkgroupId", p.talkgroupId, j, 0);
3938
- }
3939
-
4088
+ /** @brief Rally Tactical Systems' PEN as assigned by IANA */
4089
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *OID_RTS_PEM = "58217";
4090
+ /** @brief The link to the Rallypoint is down */
4091
+ ENGAGE_IGNORE_COMPILER_UNUSED_WARNING static const char *OID_RTS_CERT_SUBJ_ACCESS_TAGS = "1.3.6.1.4.1.58217.1";
4092
+ /** @} */
3940
4093
 
3941
4094
 
3942
4095
  //-----------------------------------------------------------
3943
- JSON_SERIALIZED_CLASS(GroupLynQPro)
4096
+ JSON_SERIALIZED_CLASS(GroupAppTransport)
3944
4097
  /**
3945
- * @brief Configuration for the optional LynQ Pro transport functionality for Group.
4098
+ * @brief Configuration for the optional custom transport functionality for Group.
3946
4099
  *
3947
- * Helper C++ class to serialize and de-serialize GroupLynQPro JSON
4100
+ * Helper C++ class to serialize and de-serialize GroupAppTransport JSON
3948
4101
  *
3949
- * Example: @include[doc] examples/GroupLynQPro.json
4102
+ * Example: @include[doc] examples/GroupAppTransport.json
3950
4103
  *
3951
4104
  * @see ConfigurationObjects::Group
3952
4105
  */
3953
- class GroupLynQPro : public ConfigurationObjectBase
4106
+ class GroupAppTransport : public ConfigurationObjectBase
3954
4107
  {
3955
4108
  IMPLEMENT_JSON_SERIALIZATION()
3956
- IMPLEMENT_JSON_DOCUMENTATION(GroupLynQPro)
4109
+ IMPLEMENT_JSON_DOCUMENTATION(GroupAppTransport)
3957
4110
 
3958
4111
  public:
3959
- /** @brief [Optional, Default: false] Enables SatPaq feature. */
4112
+ /** @brief [Optional, Default: false] Enables custom feature. */
3960
4113
  bool enabled;
3961
4114
 
3962
- /** @brief The sender ID. */
3963
- uint16_t senderId;
3964
-
3965
- /** @brief The talkgroup ID. */
3966
- uint8_t talkgroupId;
4115
+ /** @brief The id/name of the transport. This must match the id/name supplied when registering the app transport.*/
4116
+ std::string id;
3967
4117
 
3968
- GroupLynQPro()
4118
+ GroupAppTransport()
3969
4119
  {
3970
4120
  clear();
3971
4121
  }
@@ -3973,25 +4123,22 @@ namespace AppConfigurationObjects
3973
4123
  void clear()
3974
4124
  {
3975
4125
  enabled = false;
3976
- senderId = 0;
3977
- talkgroupId = 0;
4126
+ id.clear();
3978
4127
  }
3979
4128
  };
3980
4129
 
3981
- static void to_json(nlohmann::json& j, const GroupLynQPro& p)
4130
+ static void to_json(nlohmann::json& j, const GroupAppTransport& p)
3982
4131
  {
3983
4132
  j = nlohmann::json{
3984
4133
  TOJSON_IMPL(enabled),
3985
- TOJSON_IMPL(senderId),
3986
- TOJSON_IMPL(talkgroupId)
4134
+ TOJSON_IMPL(id)
3987
4135
  };
3988
4136
  }
3989
- static void from_json(const nlohmann::json& j, GroupLynQPro& p)
4137
+ static void from_json(const nlohmann::json& j, GroupAppTransport& p)
3990
4138
  {
3991
4139
  p.clear();
3992
4140
  getOptional<bool>("enabled", p.enabled, j, false);
3993
- getOptional<uint16_t>("senderId", p.senderId, j, 0);
3994
- getOptional<uint8_t>("talkgroupId", p.talkgroupId, j, 0);
4141
+ getOptional<std::string>("id", p.id, j);
3995
4142
  }
3996
4143
 
3997
4144
  //-----------------------------------------------------------
@@ -4389,6 +4536,16 @@ namespace AppConfigurationObjects
4389
4536
  bomLanguageTranslation = 3
4390
4537
  } BridgingOpMode_t;
4391
4538
 
4539
+ /** @brief Enum describing the alias generation policy. */
4540
+ typedef enum
4541
+ {
4542
+ /** @brief Use the anonymousAlias if present */
4543
+ iagpAnonymousAlias = 0,
4544
+
4545
+ /** @brief Generate hex representation of SSRC. */
4546
+ iagpSsrcInHex = 1
4547
+ } InboundAliasGenerationPolicy_t;
4548
+
4392
4549
  /** @brief Specifies the group type (see @ref Type_t). */
4393
4550
  Type_t type;
4394
4551
 
@@ -4500,14 +4657,8 @@ namespace AppConfigurationObjects
4500
4657
  /** @brief [Optional] Alias to use for inbound streams that do not have an alias component */
4501
4658
  std::string anonymousAlias;
4502
4659
 
4503
- /** @brief [Optional] Settings necessary if the group is transported via the SatPaq protocol */
4504
- GroupSatPaq satPaq;
4505
-
4506
- /** @brief [Optional] Settings necessary if the group is transported via the LynQPro protocol */
4507
- GroupLynQPro lynqPro;
4508
-
4509
- /** @brief [Optional] The name of the registered transport to use */
4510
- std::string transportName;
4660
+ /** @brief [Optional] Settings necessary if the group is transported via an application-supplied custom transport */
4661
+ GroupAppTransport appTransport;
4511
4662
 
4512
4663
  /** @brief [Optional, Default: false] Allows for processing of looped back packets - primarily meant for debugging */
4513
4664
  bool allowLoopback;
@@ -4548,6 +4699,15 @@ namespace AppConfigurationObjects
4548
4699
  /** @brief Details for capture of transmitted packets */
4549
4700
  PacketCapturer txCapture;
4550
4701
 
4702
+ /** @brief [Optional, Default: 66] The RTP payload type to be used for blobs sent over RTP (see BlobInfo) */
4703
+ uint16_t blobRtpPayloadType;
4704
+
4705
+ /** @brief [Optional, Default: iagpAnonymousAlias] */
4706
+ InboundAliasGenerationPolicy_t inboundAliasGenerationPolicy;
4707
+
4708
+ /** @brief [Optional] Inbound gating of audio - only audio allowed through by the gate will be processed */
4709
+ AudioGate gateIn;
4710
+
4551
4711
  Group()
4552
4712
  {
4553
4713
  clear();
@@ -4600,9 +4760,7 @@ namespace AppConfigurationObjects
4600
4760
  anonymousAlias.clear();
4601
4761
  lbCrypto = false;
4602
4762
 
4603
- satPaq.clear();
4604
- lynqPro.clear();
4605
- transportName.clear();
4763
+ appTransport.clear();
4606
4764
  allowLoopback = false;
4607
4765
 
4608
4766
  rtpProfile.clear();
@@ -4624,6 +4782,10 @@ namespace AppConfigurationObjects
4624
4782
 
4625
4783
  rxCapture.clear();
4626
4784
  txCapture.clear();
4785
+
4786
+ blobRtpPayloadType = 66;
4787
+ inboundAliasGenerationPolicy = iagpAnonymousAlias;
4788
+ gateIn.clear();
4627
4789
  }
4628
4790
  };
4629
4791
 
@@ -4666,9 +4828,7 @@ namespace AppConfigurationObjects
4666
4828
  TOJSON_IMPL(stickyTidHangSecs),
4667
4829
  TOJSON_IMPL(anonymousAlias),
4668
4830
  TOJSON_IMPL(lbCrypto),
4669
- TOJSON_IMPL(satPaq),
4670
- TOJSON_IMPL(lynqPro),
4671
- TOJSON_IMPL(transportName),
4831
+ TOJSON_IMPL(appTransport),
4672
4832
  TOJSON_IMPL(allowLoopback),
4673
4833
  TOJSON_IMPL(rangerPackets),
4674
4834
 
@@ -4685,7 +4845,13 @@ namespace AppConfigurationObjects
4685
4845
  TOJSON_IMPL(synVoice),
4686
4846
 
4687
4847
  TOJSON_IMPL(rxCapture),
4688
- TOJSON_IMPL(txCapture)
4848
+ TOJSON_IMPL(txCapture),
4849
+
4850
+ TOJSON_IMPL(blobRtpPayloadType),
4851
+
4852
+ TOJSON_IMPL(inboundAliasGenerationPolicy),
4853
+
4854
+ TOJSON_IMPL(gateIn)
4689
4855
  };
4690
4856
 
4691
4857
  TOJSON_BASE_IMPL();
@@ -4749,9 +4915,7 @@ namespace AppConfigurationObjects
4749
4915
  getOptional<int>("stickyTidHangSecs", p.stickyTidHangSecs, j, 10);
4750
4916
  getOptional<std::string>("anonymousAlias", p.anonymousAlias, j);
4751
4917
  getOptional<bool>("lbCrypto", p.lbCrypto, j, false);
4752
- getOptional<GroupSatPaq>("satPaq", p.satPaq, j);
4753
- getOptional<GroupLynQPro>("lynqPro", p.lynqPro, j);
4754
- getOptional<std::string>("transportName", p.transportName, j);
4918
+ getOptional<GroupAppTransport>("appTransport", p.appTransport, j);
4755
4919
  getOptional<bool>("allowLoopback", p.allowLoopback, j, false);
4756
4920
  getOptionalWithIndicator<RtpProfile>("rtpProfile", p.rtpProfile, j, &p._wasDeserialized_rtpProfile);
4757
4921
  getOptional<RangerPackets>("rangerPackets", p.rangerPackets, j);
@@ -4766,6 +4930,12 @@ namespace AppConfigurationObjects
4766
4930
  getOptional<PacketCapturer>("rxCapture", p.rxCapture, j);
4767
4931
  getOptional<PacketCapturer>("txCapture", p.txCapture, j);
4768
4932
 
4933
+ getOptional<uint16_t>("blobRtpPayloadType", p.blobRtpPayloadType, j, 66);
4934
+
4935
+ getOptional<Group::InboundAliasGenerationPolicy_t>("inboundAliasGenerationPolicy", p.inboundAliasGenerationPolicy, j, Group::InboundAliasGenerationPolicy_t::iagpAnonymousAlias);
4936
+
4937
+ getOptional<AudioGate>("gateIn", p.gateIn, j);
4938
+
4769
4939
  FROMJSON_BASE_IMPL();
4770
4940
  }
4771
4941
 
@@ -5010,20 +5180,17 @@ namespace AppConfigurationObjects
5010
5180
  /** @brief [Optional, false] Enables UDP streaming if the RP supports it */
5011
5181
  bool enabled;
5012
5182
 
5013
- /** @brief [Optional, EnginePolicyNetworking::defaultNic] Name of NIC to bind to - uses Engine defaultNic if empty */
5014
- std::string nic;
5015
-
5016
5183
  /** @brief [Optional, 0] The port to be used for Rallypoint UDP streaming. A value of 0 will result in an ephemeral port being assigned.*/
5017
- int port;
5184
+ int port;
5018
5185
 
5019
- /** @brief Optional, Default: 10] Seconds interval at which to send UDP keepalives to Rallypoints. This is important for NAT "hole-punching". */
5020
- int keepAliveIntervalSecs;
5186
+ /** @brief Optional, Default: 15] Seconds interval at which to send UDP keepalives to Rallypoints. This is important for NAT "hole-punching". */
5187
+ int keepaliveIntervalSecs;
5021
5188
 
5022
5189
  /** @brief [Optional, Default: @ref priVoice] Transmission priority. This has meaning on some operating systems based on how their IP stack operates. It may or may not affect final packet marking. */
5023
- NetworkTxOptions::TxPriority_t priority;
5190
+ TxPriority_t priority;
5024
5191
 
5025
5192
  /** @brief [Optional, Default: 64] Time to live or hop limit is a mechanism that limits the lifespan or lifetime of data in a network. TTL prevents a data packet from circulating indefinitely. */
5026
- int ttl;
5193
+ int ttl;
5027
5194
 
5028
5195
  EngineNetworkingRpUdpStreaming()
5029
5196
  {
@@ -5033,9 +5200,9 @@ namespace AppConfigurationObjects
5033
5200
  void clear()
5034
5201
  {
5035
5202
  enabled = false;
5036
- nic.clear();
5037
- keepAliveIntervalSecs = 10;
5038
- priority = NetworkTxOptions::priVoice;
5203
+ port = 0;
5204
+ keepaliveIntervalSecs = 15;
5205
+ priority = TxPriority_t::priVoice;
5039
5206
  ttl = 64;
5040
5207
  }
5041
5208
 
@@ -5048,9 +5215,8 @@ namespace AppConfigurationObjects
5048
5215
  {
5049
5216
  j = nlohmann::json{
5050
5217
  TOJSON_IMPL(enabled),
5051
- TOJSON_IMPL(nic),
5052
5218
  TOJSON_IMPL(port),
5053
- TOJSON_IMPL(keepAliveIntervalSecs),
5219
+ TOJSON_IMPL(keepaliveIntervalSecs),
5054
5220
  TOJSON_IMPL(priority),
5055
5221
  TOJSON_IMPL(ttl)
5056
5222
  };
@@ -5059,10 +5225,9 @@ namespace AppConfigurationObjects
5059
5225
  {
5060
5226
  p.clear();
5061
5227
  getOptional<bool>("enabled", p.enabled, j, false);
5062
- getOptional<std::string>("nic", p.nic, j, EMPTY_STRING);
5063
5228
  getOptional<int>("port", p.port, j, 0);
5064
- getOptional<int>("keepAliveIntervalSecs", p.keepAliveIntervalSecs, j, 10);
5065
- getOptional<NetworkTxOptions::TxPriority_t>("priority", p.priority, j, NetworkTxOptions::priVoice);
5229
+ getOptional<int>("keepaliveIntervalSecs", p.keepaliveIntervalSecs, j, 15);
5230
+ getOptional<TxPriority_t>("priority", p.priority, j, TxPriority_t::priVoice);
5066
5231
  getOptional<int>("ttl", p.ttl, j, 64);
5067
5232
  }
5068
5233
 
@@ -5083,25 +5248,28 @@ namespace AppConfigurationObjects
5083
5248
 
5084
5249
  public:
5085
5250
  /** @brief The default network interface card the Engage Engine should bind to. */
5086
- std::string defaultNic;
5251
+ std::string defaultNic;
5087
5252
 
5088
5253
  /** @brief [Optional, Default: 8] Number of seconds elapsed between RX of multicast packets before an IGMP rejoin is made */
5089
- int multicastRejoinSecs;
5254
+ int multicastRejoinSecs;
5090
5255
 
5091
5256
  /** @brief [Optional, Default: 60000] Milliseconds between sending Rallypoint round-trip test requests */
5092
- int rallypointRtTestIntervalMs;
5257
+ int rallypointRtTestIntervalMs;
5093
5258
 
5094
5259
  /** @brief [Optional, Default: false] If true, logs RTP jitter buffer statistics periodically */
5095
- bool logRtpJitterBufferStats;
5260
+ bool logRtpJitterBufferStats;
5096
5261
 
5097
5262
  /** @brief [Optional, Default: false] Overrides/cancels group-level multicast failover if set to true */
5098
- bool preventMulticastFailover;
5263
+ bool preventMulticastFailover;
5099
5264
 
5100
5265
  /** @brief [Optional] Configuration for UDP streaming */
5101
- EngineNetworkingRpUdpStreaming rpUdpStreaming;
5266
+ EngineNetworkingRpUdpStreaming rpUdpStreaming;
5102
5267
 
5103
5268
  /** @brief [Optional] Configuration for RTP profile */
5104
- RtpProfile rtpProfile;
5269
+ RtpProfile rtpProfile;
5270
+
5271
+ /** @brief [Optional, Default 64] Address resolution policy */
5272
+ AddressResolutionPolicy_t addressResolutionPolicy;
5105
5273
 
5106
5274
  EnginePolicyNetworking()
5107
5275
  {
@@ -5115,6 +5283,7 @@ namespace AppConfigurationObjects
5115
5283
  rallypointRtTestIntervalMs = 60000;
5116
5284
  logRtpJitterBufferStats = false;
5117
5285
  preventMulticastFailover = false;
5286
+ addressResolutionPolicy = AddressResolutionPolicy_t::arpIpv6ThenIpv4;
5118
5287
 
5119
5288
  rpUdpStreaming.clear();
5120
5289
  rtpProfile.clear();
@@ -5132,7 +5301,8 @@ namespace AppConfigurationObjects
5132
5301
  TOJSON_IMPL(preventMulticastFailover),
5133
5302
 
5134
5303
  TOJSON_IMPL(rpUdpStreaming),
5135
- TOJSON_IMPL(rtpProfile)
5304
+ TOJSON_IMPL(rtpProfile),
5305
+ TOJSON_IMPL(addressResolutionPolicy)
5136
5306
  };
5137
5307
  }
5138
5308
  static void from_json(const nlohmann::json& j, EnginePolicyNetworking& p)
@@ -5146,6 +5316,7 @@ namespace AppConfigurationObjects
5146
5316
 
5147
5317
  getOptional<EngineNetworkingRpUdpStreaming>("rpUdpStreaming", p.rpUdpStreaming, j);
5148
5318
  getOptional<RtpProfile>("rtpProfile", p.rtpProfile, j);
5319
+ getOptional<AddressResolutionPolicy_t>("addressResolutionPolicy", p.addressResolutionPolicy, j, AddressResolutionPolicy_t::arpIpv6ThenIpv4);
5149
5320
  }
5150
5321
 
5151
5322
  //-----------------------------------------------------------
@@ -5498,6 +5669,9 @@ namespace AppConfigurationObjects
5498
5669
  /** @brief [Optional, Default: true] Enables audio processing */
5499
5670
  bool enabled;
5500
5671
 
5672
+ /** @brief [Optional, Default: true] Enables local machine hardware audio */
5673
+ bool hardwareEnabled;
5674
+
5501
5675
  /** @brief [Optional, Default: 16000] Internal sampling rate - 8000 or 16000 */
5502
5676
  int internalRate;
5503
5677
 
@@ -5536,6 +5710,7 @@ namespace AppConfigurationObjects
5536
5710
  void clear()
5537
5711
  {
5538
5712
  enabled = true;
5713
+ hardwareEnabled = true;
5539
5714
  internalRate = 16000;
5540
5715
  internalChannels = 2;
5541
5716
  muteTxOnTx = false;
@@ -5553,6 +5728,7 @@ namespace AppConfigurationObjects
5553
5728
  {
5554
5729
  j = nlohmann::json{
5555
5730
  TOJSON_IMPL(enabled),
5731
+ TOJSON_IMPL(hardwareEnabled),
5556
5732
  TOJSON_IMPL(internalRate),
5557
5733
  TOJSON_IMPL(internalChannels),
5558
5734
  TOJSON_IMPL(muteTxOnTx),
@@ -5569,6 +5745,7 @@ namespace AppConfigurationObjects
5569
5745
  {
5570
5746
  p.clear();
5571
5747
  getOptional<bool>("enabled", p.enabled, j, true);
5748
+ getOptional<bool>("hardwareEnabled", p.hardwareEnabled, j, true);
5572
5749
  FROMJSON_IMPL(internalRate, int, 16000);
5573
5750
  FROMJSON_IMPL(internalChannels, int, 2);
5574
5751
 
@@ -5820,6 +5997,61 @@ namespace AppConfigurationObjects
5820
5997
  FROMJSON_IMPL(reclaimSpace, bool, false);
5821
5998
  }
5822
5999
 
6000
+
6001
+ //-----------------------------------------------------------
6002
+ JSON_SERIALIZED_CLASS(SecureSignature)
6003
+ /**
6004
+ * @brief Configuration for a secure signature.
6005
+ *
6006
+ * Helper C++ class to serialize and de-serialize SecureSignature JSON
6007
+ *
6008
+ * Example: @include[doc] examples/SecureSignature.json
6009
+ */
6010
+ class SecureSignature : public ConfigurationObjectBase
6011
+ {
6012
+ IMPLEMENT_JSON_SERIALIZATION()
6013
+ IMPLEMENT_JSON_DOCUMENTATION(SecureSignature)
6014
+
6015
+ public:
6016
+
6017
+ /** @brief Contains the PEM-formatted text of the certificate */
6018
+ std::string certificate;
6019
+
6020
+ // /** @brief Contains the PEM-formatted text of the certificate's public key */
6021
+ //std::string publicKey;
6022
+
6023
+ /** @brief Contains the signature */
6024
+ std::string signature;
6025
+
6026
+ SecureSignature()
6027
+ {
6028
+ clear();
6029
+ }
6030
+
6031
+ void clear()
6032
+ {
6033
+ certificate.clear();
6034
+ //publicKey.clear();
6035
+ signature.clear();
6036
+ }
6037
+ };
6038
+
6039
+ static void to_json(nlohmann::json& j, const SecureSignature& p)
6040
+ {
6041
+ j = nlohmann::json{
6042
+ TOJSON_IMPL(certificate),
6043
+ //TOJSON_IMPL(publicKey),
6044
+ TOJSON_IMPL(signature)
6045
+ };
6046
+ }
6047
+ static void from_json(const nlohmann::json& j, SecureSignature& p)
6048
+ {
6049
+ p.clear();
6050
+ FROMJSON_IMPL(certificate, std::string, EMPTY_STRING);
6051
+ //FROMJSON_IMPL(publicKey, std::string, EMPTY_STRING);
6052
+ FROMJSON_IMPL(signature, std::string, EMPTY_STRING);
6053
+ }
6054
+
5823
6055
  //-----------------------------------------------------------
5824
6056
  JSON_SERIALIZED_CLASS(NamedAudioDevice)
5825
6057
  class NamedAudioDevice : public ConfigurationObjectBase
@@ -7062,6 +7294,9 @@ namespace AppConfigurationObjects
7062
7294
  /** @brief [Optional, Default: 0 - OS platform default] Connection timeout in seconds to the peer */
7063
7295
  int connectionTimeoutSecs;
7064
7296
 
7297
+ /** @brief Internal enablement setting. */
7298
+ bool forceIsMeshLeaf;
7299
+
7065
7300
  RallypointPeer()
7066
7301
  {
7067
7302
  clear();
@@ -7074,6 +7309,7 @@ namespace AppConfigurationObjects
7074
7309
  host.clear();
7075
7310
  certificate.clear();
7076
7311
  connectionTimeoutSecs = 0;
7312
+ forceIsMeshLeaf = false;
7077
7313
  }
7078
7314
  };
7079
7315
 
@@ -7084,7 +7320,8 @@ namespace AppConfigurationObjects
7084
7320
  TOJSON_IMPL(enabled),
7085
7321
  TOJSON_IMPL(host),
7086
7322
  TOJSON_IMPL(certificate),
7087
- TOJSON_IMPL(connectionTimeoutSecs)
7323
+ TOJSON_IMPL(connectionTimeoutSecs),
7324
+ TOJSON_IMPL(forceIsMeshLeaf)
7088
7325
  };
7089
7326
  }
7090
7327
  static void from_json(const nlohmann::json& j, RallypointPeer& p)
@@ -7095,6 +7332,7 @@ namespace AppConfigurationObjects
7095
7332
  getOptional<NetworkAddress>("host", p.host, j);
7096
7333
  getOptional<SecurityCertificate>("certificate", p.certificate, j);
7097
7334
  getOptional<int>("connectionTimeoutSecs", p.connectionTimeoutSecs, j, 0);
7335
+ getOptional<bool>("forceIsMeshLeaf", p.forceIsMeshLeaf, j, false);
7098
7336
  }
7099
7337
 
7100
7338
  //-----------------------------------------------------------
@@ -7672,6 +7910,52 @@ namespace AppConfigurationObjects
7672
7910
  }
7673
7911
 
7674
7912
 
7913
+ //-----------------------------------------------------------
7914
+ JSON_SERIALIZED_CLASS(RallypointUdpStreamingIpvX)
7915
+ /**
7916
+ * @brief Streaming configuration for RP clients
7917
+ *
7918
+ * Example: @include[doc] examples/RallypointUdpStreamingIpvX.json
7919
+ *
7920
+ */
7921
+ class RallypointUdpStreamingIpvX : public ConfigurationObjectBase
7922
+ {
7923
+ IMPLEMENT_JSON_SERIALIZATION()
7924
+ IMPLEMENT_JSON_DOCUMENTATION(RallypointUdpStreamingIpvX)
7925
+
7926
+ public:
7927
+ /** @brief [Optional, Default true] If true, enables UDP streaming for vX. */
7928
+ bool enabled;
7929
+
7930
+ /** @brief Network address for external entities to transmit to. Defaults to the address of the local interface and port 7444 */
7931
+ NetworkAddress external;
7932
+
7933
+ RallypointUdpStreamingIpvX()
7934
+ {
7935
+ clear();
7936
+ }
7937
+
7938
+ void clear()
7939
+ {
7940
+ enabled = true;
7941
+ external.clear();
7942
+ }
7943
+ };
7944
+
7945
+ static void to_json(nlohmann::json& j, const RallypointUdpStreamingIpvX& p)
7946
+ {
7947
+ j = nlohmann::json{
7948
+ TOJSON_IMPL(enabled),
7949
+ TOJSON_IMPL(external)
7950
+ };
7951
+ }
7952
+ static void from_json(const nlohmann::json& j, RallypointUdpStreamingIpvX& p)
7953
+ {
7954
+ p.clear();
7955
+ getOptional<bool>("enabled", p.enabled, j, true);
7956
+ getOptional<NetworkAddress>("external", p.external, j);
7957
+ }
7958
+
7675
7959
  //-----------------------------------------------------------
7676
7960
  JSON_SERIALIZED_CLASS(RallypointUdpStreaming)
7677
7961
  /**
@@ -7690,20 +7974,45 @@ namespace AppConfigurationObjects
7690
7974
  typedef enum
7691
7975
  {
7692
7976
  /** @brief Unknown */
7693
- etUnknown,
7977
+ ctUnknown = 0,
7694
7978
 
7695
- /** @brief Shared-key encryption */
7696
- etSharedKey
7697
- } EnvelopeType_t;
7979
+ /** @brief Shared-key, AES256 full IV */
7980
+ ctSharedKeyAes256FullIv = 1,
7698
7981
 
7699
- /** @brief Specifies the streaming mode type (see @ref EnvelopeType_t). */
7700
- EnvelopeType_t envelopeType;
7982
+ /** @brief Shared-key, AES256 indexed IV */
7983
+ ctSharedKeyAes256IdxIv = 2,
7701
7984
 
7702
- /** @brief Network address for listening */
7703
- NetworkAddress listen;
7985
+ /** @brief Shared-key, ChaCha20 full IV */
7986
+ ctSharedKeyChaCha20FullIv = 3,
7987
+
7988
+ /** @brief Shared-key, ChaCha20 indexed IV */
7989
+ ctSharedKeyChaCha20IdxIv = 4
7990
+ } CryptoType_t;
7991
+
7992
+ /** @brief [Optional, Default true] If true, enables UDP streaming unless turned off on a per-family basis. */
7993
+ bool enabled;
7994
+
7995
+ /** @brief [Optional, Default ctSharedKeyAes256FullIv] The crypto method to be used */
7996
+ CryptoType_t cryptoType;
7997
+
7998
+ /** @brief UDP port to listen on. Default is 7444. */
7999
+ int listenPort;
8000
+
8001
+ /** @brief IPv4 */
8002
+ RallypointUdpStreamingIpvX ipv4;
8003
+
8004
+ /** @brief IPv6 */
8005
+ RallypointUdpStreamingIpvX ipv6;
8006
+
8007
+ /** @brief [Optional, Default: 15] Interval (seconds) at which to send UDP keepalives */
8008
+ int keepaliveIntervalSecs;
8009
+
8010
+ /** @brief [Optional, Default: @ref priVoice] Transmission priority. This has meaning on some operating systems based on how their IP stack operates. It may or may not affect final packet marking. */
8011
+ TxPriority_t priority;
8012
+
8013
+ /** @brief [Optional, Default: 64] Time to live or hop limit. */
8014
+ int ttl;
7704
8015
 
7705
- /** @brief Network address for external entities to transmit to */
7706
- NetworkAddress external;
7707
8016
 
7708
8017
  RallypointUdpStreaming()
7709
8018
  {
@@ -7712,27 +8021,42 @@ namespace AppConfigurationObjects
7712
8021
 
7713
8022
  void clear()
7714
8023
  {
7715
- envelopeType = etUnknown;
7716
- listen.clear();
7717
- external.clear();
8024
+ enabled = true;
8025
+ cryptoType = CryptoType_t::ctSharedKeyAes256FullIv;
8026
+ listenPort = 7444;
8027
+ ipv4.clear();
8028
+ ipv6.clear();
8029
+ keepaliveIntervalSecs = 15;
8030
+ priority = TxPriority_t::priVoice;
8031
+ ttl = 64;
7718
8032
  }
7719
8033
  };
7720
8034
 
7721
8035
  static void to_json(nlohmann::json& j, const RallypointUdpStreaming& p)
7722
8036
  {
7723
8037
  j = nlohmann::json{
7724
- TOJSON_IMPL(envelopeType),
7725
- TOJSON_IMPL(listen),
7726
- TOJSON_IMPL(external)
8038
+ TOJSON_IMPL(enabled),
8039
+ TOJSON_IMPL(cryptoType),
8040
+ TOJSON_IMPL(listenPort),
8041
+ TOJSON_IMPL(keepaliveIntervalSecs),
8042
+ TOJSON_IMPL(ipv4),
8043
+ TOJSON_IMPL(ipv6),
8044
+ TOJSON_IMPL(priority),
8045
+ TOJSON_IMPL(ttl)
7727
8046
  };
7728
8047
  }
7729
8048
  static void from_json(const nlohmann::json& j, RallypointUdpStreaming& p)
7730
8049
  {
7731
8050
  p.clear();
7732
- j.at("envelopeType").get_to(p.envelopeType);
7733
- j.at("listen").get_to(p.listen);
7734
- j.at("external").get_to(p.external);
7735
- }
8051
+ getOptional<bool>("enabled", p.enabled, j, true);
8052
+ getOptional<RallypointUdpStreaming::CryptoType_t>("cryptoType", p.cryptoType, j, RallypointUdpStreaming::CryptoType_t::ctSharedKeyAes256FullIv);
8053
+ getOptional<int>("listenPort", p.listenPort, j, 7444);
8054
+ getOptional<int>("keepaliveIntervalSecs", p.keepaliveIntervalSecs, j, 15);
8055
+ getOptional<RallypointUdpStreamingIpvX>("ipv4", p.ipv4, j);
8056
+ getOptional<RallypointUdpStreamingIpvX>("ipv6", p.ipv6, j);
8057
+ getOptional<TxPriority_t>("priority", p.priority, j, TxPriority_t::priVoice);
8058
+ getOptional<int>("ttl", p.ttl, j, 64);
8059
+ }
7736
8060
 
7737
8061
  //-----------------------------------------------------------
7738
8062
  JSON_SERIALIZED_CLASS(RallypointRpRtTimingBehavior)
@@ -7944,6 +8268,54 @@ namespace AppConfigurationObjects
7944
8268
  getOptional<std::vector<std::string>>("extraMeshes", p.extraMeshes, j);
7945
8269
  }
7946
8270
 
8271
+
8272
+ //-----------------------------------------------------------
8273
+ JSON_SERIALIZED_CLASS(RallypointExtendedGroupRestriction)
8274
+ /**
8275
+ * @brief Defines settings for Rallypoint extended group restrictions
8276
+ *
8277
+ * Example: @include[doc] examples/RallypointExtendedGroupRestriction.json
8278
+ *
8279
+ */
8280
+ class RallypointExtendedGroupRestriction : public ConfigurationObjectBase
8281
+ {
8282
+ IMPLEMENT_JSON_SERIALIZATION()
8283
+ IMPLEMENT_JSON_DOCUMENTATION(RallypointExtendedGroupRestriction)
8284
+
8285
+ public:
8286
+ /** @brief Group ID */
8287
+ std::string id;
8288
+
8289
+ /** @brief Restrictions */
8290
+ std::vector<StringRestrictionList> restrictions;
8291
+
8292
+ RallypointExtendedGroupRestriction()
8293
+ {
8294
+ clear();
8295
+ }
8296
+
8297
+ void clear()
8298
+ {
8299
+ id.clear();
8300
+ restrictions.clear();
8301
+ }
8302
+ };
8303
+
8304
+ static void to_json(nlohmann::json& j, const RallypointExtendedGroupRestriction& p)
8305
+ {
8306
+ j = nlohmann::json{
8307
+ TOJSON_IMPL(id),
8308
+ TOJSON_IMPL(restrictions)
8309
+ };
8310
+ }
8311
+ static void from_json(const nlohmann::json& j, RallypointExtendedGroupRestriction& p)
8312
+ {
8313
+ p.clear();
8314
+ getOptional<std::string>("id", p.id, j);
8315
+ getOptional<std::vector<StringRestrictionList>>("restrictions", p.restrictions, j);
8316
+ }
8317
+
8318
+
7947
8319
  //-----------------------------------------------------------
7948
8320
  JSON_SERIALIZED_CLASS(RallypointServer)
7949
8321
  /**
@@ -7959,7 +8331,7 @@ namespace AppConfigurationObjects
7959
8331
  IMPLEMENT_JSON_SERIALIZATION()
7960
8332
  IMPLEMENT_JSON_DOCUMENTATION(RallypointServer)
7961
8333
 
7962
- public:
8334
+ public:
7963
8335
  /** @brief [Optional] Settings for the FIPS crypto. */
7964
8336
  FipsCryptoSettings fipsCrypto;
7965
8337
 
@@ -7972,6 +8344,9 @@ namespace AppConfigurationObjects
7972
8344
  /** @brief TCP port to listen on. Default is 7443. */
7973
8345
  int listenPort;
7974
8346
 
8347
+ /** @brief [Optional, Default IpFamilyType_t::ifIp4] Address familiy to be used for listening */
8348
+ IpFamilyType_t ipFamily;
8349
+
7975
8350
  /** @brief Name of the NIC to bind to for listening for incoming TCP connections. */
7976
8351
  std::string interfaceName;
7977
8352
 
@@ -8056,6 +8431,12 @@ namespace AppConfigurationObjects
8056
8431
  /** @brief Group IDs to be restricted (inclusive or exclusive) */
8057
8432
  StringRestrictionList groupRestrictions;
8058
8433
 
8434
+ /** @brief The policy employed to allow group registration */
8435
+ GroupRestrictionAccessPolicyType_t groupRestrictionAccessPolicyType;
8436
+
8437
+ /** @brief Extended group restrictions */
8438
+ std::vector<RallypointExtendedGroupRestriction> extendedGroupRestrictions;
8439
+
8059
8440
  /** @brief Name to use for signalling a configuration check */
8060
8441
  std::string configurationCheckSignalName;
8061
8442
 
@@ -8159,6 +8540,9 @@ namespace AppConfigurationObjects
8159
8540
  websocket.clear();
8160
8541
  nsm.clear();
8161
8542
  advertising.clear();
8543
+ extendedGroupRestrictions.clear();
8544
+ groupRestrictionAccessPolicyType = GroupRestrictionAccessPolicyType_t::graptPermissive;
8545
+ ipFamily = IpFamilyType_t::ifIpUnspec;
8162
8546
  }
8163
8547
  };
8164
8548
 
@@ -8212,7 +8596,10 @@ namespace AppConfigurationObjects
8212
8596
  TOJSON_IMPL(peerRtBehaviors),
8213
8597
  TOJSON_IMPL(websocket),
8214
8598
  TOJSON_IMPL(nsm),
8215
- TOJSON_IMPL(advertising)
8599
+ TOJSON_IMPL(advertising),
8600
+ TOJSON_IMPL(extendedGroupRestrictions),
8601
+ TOJSON_IMPL(groupRestrictionAccessPolicyType),
8602
+ TOJSON_IMPL(ipFamily)
8216
8603
  };
8217
8604
  }
8218
8605
  static void from_json(const nlohmann::json& j, RallypointServer& p)
@@ -8266,6 +8653,9 @@ namespace AppConfigurationObjects
8266
8653
  getOptional<RallypointWebsocketSettings>("websocket", p.websocket, j);
8267
8654
  getOptional<NsmConfiguration>("nsm", p.nsm, j);
8268
8655
  getOptional<RallypointAdvertisingSettings>("advertising", p.advertising, j);
8656
+ getOptional<std::vector<RallypointExtendedGroupRestriction>>("extendedGroupRestrictions", p.extendedGroupRestrictions, j);
8657
+ getOptional<GroupRestrictionAccessPolicyType_t>("groupRestrictionAccessPolicyType", p.groupRestrictionAccessPolicyType, j, GroupRestrictionAccessPolicyType_t::graptPermissive);
8658
+ getOptional<IpFamilyType_t>("ipFamily", p.ipFamily, j, IpFamilyType_t::ifIpUnspec);
8269
8659
  }
8270
8660
 
8271
8661
  //-----------------------------------------------------------
@@ -8703,6 +9093,53 @@ namespace AppConfigurationObjects
8703
9093
  getOptional<std::vector<CertStoreCertificateElement>>("certificates", p.certificates, j);
8704
9094
  }
8705
9095
 
9096
+ //-----------------------------------------------------------
9097
+ JSON_SERIALIZED_CLASS(CertificateSubjectElement)
9098
+ /**
9099
+ * @brief Description of a certificate subject element
9100
+ *
9101
+ * Helper C++ class to serialize and de-serialize CertificateSubjectElement JSON
9102
+ *
9103
+ */
9104
+ class CertificateSubjectElement : public ConfigurationObjectBase
9105
+ {
9106
+ IMPLEMENT_JSON_SERIALIZATION()
9107
+ IMPLEMENT_JSON_DOCUMENTATION(CertificateSubjectElement)
9108
+
9109
+ public:
9110
+ /** @brief Name */
9111
+ std::string name;
9112
+
9113
+ /** @brief Value */
9114
+ std::string value;
9115
+
9116
+ CertificateSubjectElement()
9117
+ {
9118
+ clear();
9119
+ }
9120
+
9121
+ void clear()
9122
+ {
9123
+ name.clear();
9124
+ value.clear();
9125
+ }
9126
+ };
9127
+
9128
+ static void to_json(nlohmann::json& j, const CertificateSubjectElement& p)
9129
+ {
9130
+ j = nlohmann::json{
9131
+ TOJSON_IMPL(name),
9132
+ TOJSON_IMPL(value)
9133
+ };
9134
+ }
9135
+ static void from_json(const nlohmann::json& j, CertificateSubjectElement& p)
9136
+ {
9137
+ p.clear();
9138
+ getOptional<std::string>("name", p.name, j, EMPTY_STRING);
9139
+ getOptional<std::string>("value", p.value, j, EMPTY_STRING);
9140
+ }
9141
+
9142
+
8706
9143
  //-----------------------------------------------------------
8707
9144
  JSON_SERIALIZED_CLASS(CertificateDescriptor)
8708
9145
  /**
@@ -8741,6 +9178,15 @@ namespace AppConfigurationObjects
8741
9178
  /** @brief Fingerprint */
8742
9179
  std::string fingerprint;
8743
9180
 
9181
+ /** @brief Array of subject elements */
9182
+ std::vector<CertificateSubjectElement> subjectElements;
9183
+
9184
+ /** @brief PEM version of the certificate */
9185
+ std::string certificatePem;
9186
+
9187
+ /** @brief PEM version of the public key */
9188
+ std::string publicKeyPem;
9189
+
8744
9190
  CertificateDescriptor()
8745
9191
  {
8746
9192
  clear();
@@ -8756,6 +9202,9 @@ namespace AppConfigurationObjects
8756
9202
  notAfter.clear();
8757
9203
  serial.clear();
8758
9204
  fingerprint.clear();
9205
+ subjectElements.clear();
9206
+ certificatePem.clear();
9207
+ publicKeyPem.clear();
8759
9208
  }
8760
9209
  };
8761
9210
 
@@ -8769,7 +9218,10 @@ namespace AppConfigurationObjects
8769
9218
  TOJSON_IMPL(notBefore),
8770
9219
  TOJSON_IMPL(notAfter),
8771
9220
  TOJSON_IMPL(serial),
8772
- TOJSON_IMPL(fingerprint)
9221
+ TOJSON_IMPL(fingerprint),
9222
+ TOJSON_IMPL(subjectElements),
9223
+ TOJSON_IMPL(certificatePem),
9224
+ TOJSON_IMPL(publicKeyPem)
8773
9225
  };
8774
9226
  }
8775
9227
  static void from_json(const nlohmann::json& j, CertificateDescriptor& p)
@@ -8783,6 +9235,9 @@ namespace AppConfigurationObjects
8783
9235
  getOptional<std::string>("notAfter", p.notAfter, j, EMPTY_STRING);
8784
9236
  getOptional<std::string>("serial", p.serial, j, EMPTY_STRING);
8785
9237
  getOptional<std::string>("fingerprint", p.fingerprint, j, EMPTY_STRING);
9238
+ getOptional<std::string>("certificatePem", p.certificatePem, j, EMPTY_STRING);
9239
+ getOptional<std::string>("publicKeyPem", p.publicKeyPem, j, EMPTY_STRING);
9240
+ getOptional<std::vector<CertificateSubjectElement>>("subjectElements", p.subjectElements, j);
8786
9241
  }
8787
9242
 
8788
9243
 
@@ -10790,8 +11245,7 @@ namespace AppConfigurationObjects
10790
11245
  Advertising::document();
10791
11246
  GroupPriorityTranslation::document();
10792
11247
  GroupTimeline::document();
10793
- GroupSatPaq::document();
10794
- GroupLynQPro::document();
11248
+ GroupAppTransport::document();
10795
11249
  RtpProfile::document();
10796
11250
  Group::document();
10797
11251
  Mission::document();