Coverage Report

Created: 2025-04-11 06:50

/src/cyclonedds/install/include/dds/ddsi/ddsi_config.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright(c) 2006 to 2022 ZettaScale Technology and others
2
//
3
// This program and the accompanying materials are made available under the
4
// terms of the Eclipse Public License v. 2.0 which is available at
5
// http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
6
// v. 1.0 which is available at
7
// http://www.eclipse.org/org/documents/edl-v10.php.
8
//
9
// SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
10
11
#ifndef DDSI_CONFIG_H
12
#define DDSI_CONFIG_H
13
14
#include <stdio.h>
15
16
#include "dds/export.h"
17
#include "dds/features.h"
18
#include "dds/ddsrt/sched.h"
19
#include "dds/ddsrt/random.h"
20
#include "dds/ddsi/ddsi_portmapping.h"
21
#include "dds/ddsi/ddsi_protocol_version.h"
22
#include "dds/ddsi/ddsi_locator.h"
23
#include "dds/ddsi/ddsi_xqos.h"
24
25
#if defined (__cplusplus)
26
extern "C" {
27
#endif
28
29
struct ddsi_config;
30
31
enum ddsi_standards_conformance {
32
  DDSI_SC_PEDANTIC,
33
  DDSI_SC_STRICT,
34
  DDSI_SC_LAX
35
};
36
37
#define DDSI_SC_PEDANTIC_P(config) ((config).standards_conformance <= DDSI_SC_PEDANTIC)
38
#define DDSI_SC_STRICT_P(config) ((config).standards_conformance <= DDSI_SC_STRICT)
39
40
enum ddsi_besmode {
41
  DDSI_BESMODE_FULL,
42
  DDSI_BESMODE_WRITERS,
43
  DDSI_BESMODE_MINIMAL
44
};
45
46
enum ddsi_retransmit_merging {
47
  DDSI_REXMIT_MERGE_NEVER,
48
  DDSI_REXMIT_MERGE_ADAPTIVE,
49
  DDSI_REXMIT_MERGE_ALWAYS
50
};
51
52
enum ddsi_boolean_default {
53
  DDSI_BOOLDEF_DEFAULT,
54
  DDSI_BOOLDEF_FALSE,
55
  DDSI_BOOLDEF_TRUE
56
};
57
58
/* deprecated shm log level */
59
enum ddsi_shm_loglevel {
60
  DDSI_SHM_OFF = 0,
61
  DDSI_SHM_FATAL,
62
  DDSI_SHM_ERROR,
63
  DDSI_SHM_WARN,
64
  DDSI_SHM_INFO,
65
  DDSI_SHM_DEBUG,
66
  DDSI_SHM_VERBOSE
67
};
68
69
#define DDSI_PARTICIPANT_INDEX_AUTO -1
70
#define DDSI_PARTICIPANT_INDEX_NONE -2
71
#define DDSI_PARTICIPANT_INDEX_DEFAULT -3
72
73
/* ddsi_config_listelem must be an overlay for all used listelem types */
74
struct ddsi_config_listelem {
75
  struct ddsi_config_listelem *next;
76
};
77
78
#ifdef DDS_HAS_NETWORK_PARTITIONS
79
struct ddsi_networkpartition_address {
80
  struct ddsi_networkpartition_address *next;
81
  ddsi_locator_t loc;
82
};
83
84
struct ddsi_config_networkpartition_listelem {
85
  struct ddsi_config_networkpartition_listelem *next;
86
  char *name;
87
  char *address_string;
88
  char *interface_names;
89
  struct ddsi_networkpartition_address *uc_addresses;
90
  struct ddsi_networkpartition_address *asm_addresses;
91
#ifdef DDSRT_HAVE_SSM
92
  struct ddsi_networkpartition_address *ssm_addresses;
93
#endif
94
};
95
96
struct ddsi_config_ignoredpartition_listelem {
97
  struct ddsi_config_ignoredpartition_listelem *next;
98
  char *DCPSPartitionTopic;
99
};
100
101
struct ddsi_config_partitionmapping_listelem {
102
  struct ddsi_config_partitionmapping_listelem *next;
103
  char *networkPartition;
104
  char *DCPSPartitionTopic;
105
  struct ddsi_config_networkpartition_listelem *partition;
106
};
107
#endif /* DDS_HAS_NETWORK_PARTITIONS */
108
109
struct ddsi_config_maybe_int32 {
110
  int isdefault;
111
  int32_t value;
112
};
113
114
struct ddsi_config_maybe_uint32 {
115
  int isdefault;
116
  uint32_t value;
117
};
118
119
struct ddsi_config_maybe_duration {
120
  int isdefault;
121
  dds_duration_t value;
122
};
123
124
struct ddsi_config_uint32_array {
125
  uint32_t n;
126
  uint32_t *xs;
127
};
128
129
struct ddsi_config_thread_properties_listelem {
130
  struct ddsi_config_thread_properties_listelem *next;
131
  char *name;
132
  ddsrt_sched_t sched_class;
133
  struct ddsi_config_maybe_int32 schedule_priority;
134
  struct ddsi_config_maybe_uint32 stack_size;
135
  struct ddsi_config_uint32_array affinity;
136
};
137
138
struct ddsi_config_peer_listelem
139
{
140
  struct ddsi_config_peer_listelem *next;
141
  char *peer;
142
  struct ddsi_config_maybe_duration prune_delay;
143
};
144
145
struct ddsi_config_prune_deleted_ppant {
146
  int64_t delay;
147
  int enforce_delay;
148
};
149
150
/* allow multicast bits (default depends on network type): */
151
#define DDSI_AMC_FALSE 0u
152
#define DDSI_AMC_SPDP 1u
153
#define DDSI_AMC_ASM 2u
154
#ifdef DDSRT_HAVE_SSM
155
#define DDSI_AMC_SSM 4u
156
#define DDSI_AMC_TRUE (DDSI_AMC_SPDP | DDSI_AMC_ASM | DDSI_AMC_SSM)
157
#else
158
#define DDSI_AMC_TRUE (DDSI_AMC_SPDP | DDSI_AMC_ASM)
159
#endif
160
#define DDSI_AMC_DEFAULT 0x80000000u
161
162
/* FIXME: this should be fully dynamic ... but this is easier for a quick hack */
163
enum ddsi_transport_selector {
164
  DDSI_TRANS_DEFAULT, /* actually UDP, but this is so we can tell what has been set */
165
  DDSI_TRANS_UDP,
166
  DDSI_TRANS_UDP6,
167
  DDSI_TRANS_TCP,
168
  DDSI_TRANS_TCP6,
169
  DDSI_TRANS_RAWETH,
170
  DDSI_TRANS_NONE /* FIXME: see FIXME above ... :( */
171
};
172
173
enum ddsi_many_sockets_mode {
174
  DDSI_MSM_NO_UNICAST,
175
  DDSI_MSM_SINGLE_UNICAST,
176
  DDSI_MSM_MANY_UNICAST
177
};
178
179
#ifdef DDS_HAS_SECURITY
180
struct ddsi_plugin_library_properties {
181
  char *library_path;
182
  char *library_init;
183
  char *library_finalize;
184
};
185
186
struct ddsi_authentication_properties {
187
  char *identity_certificate;
188
  char *identity_ca;
189
  char *private_key;
190
  char *password;
191
  char *trusted_ca_dir;
192
  char *crl;
193
  int include_optional_fields;
194
};
195
196
struct ddsi_access_control_properties {
197
  char *permissions;
198
  char *permissions_ca;
199
  char *governance;
200
};
201
202
struct ddsi_config_omg_security {
203
  struct ddsi_authentication_properties authentication_properties;
204
  struct ddsi_access_control_properties access_control_properties;
205
  struct ddsi_plugin_library_properties authentication_plugin;
206
  struct ddsi_plugin_library_properties access_control_plugin;
207
  struct ddsi_plugin_library_properties cryptography_plugin;
208
};
209
210
struct ddsi_config_omg_security_listelem {
211
  struct ddsi_config_omg_security_listelem *next;
212
  struct ddsi_config_omg_security cfg;
213
};
214
#endif /* DDS_HAS_SECURITY */
215
216
#ifdef DDS_HAS_TCP_TLS
217
struct ddsi_config_ssl_min_version {
218
  int major;
219
  int minor;
220
};
221
#endif
222
223
struct ddsi_config_socket_buf_size {
224
  struct ddsi_config_maybe_uint32 min, max;
225
};
226
227
struct ddsi_config_network_interface {
228
  int automatic;
229
  char *name;
230
  char *address;
231
  int prefer_multicast;
232
  int presence_required;
233
  enum ddsi_boolean_default multicast;
234
  struct ddsi_config_maybe_int32 priority;
235
  uint32_t allow_multicast; // no need for a "maybe" type: DDSI_AMC_DEFAULT takes care of that
236
};
237
238
struct ddsi_config_network_interface_listelem {
239
  struct ddsi_config_network_interface_listelem *next;
240
  struct ddsi_config_network_interface cfg;
241
};
242
243
enum ddsi_config_entity_naming_mode {
244
  DDSI_ENTITY_NAMING_DEFAULT_EMPTY,
245
  DDSI_ENTITY_NAMING_DEFAULT_FANCY
246
};
247
248
struct ddsi_config_psmx {
249
  char *type;
250
  char *library;
251
  char *config;
252
  struct ddsi_config_maybe_int32 priority;
253
};
254
255
struct ddsi_config_psmx_listelem {
256
  struct ddsi_config_psmx_listelem *next;
257
  struct ddsi_config_psmx cfg;
258
};
259
260
/* Expensive checks (compiled in when NDEBUG not defined, enabled only if flag set in xchecks) */
261
#define DDSI_XCHECK_WHC 1u
262
#define DDSI_XCHECK_RHC 2u
263
#define DDSI_XCHECK_XEV 4u
264
265
/**
266
 * @brief Default-initialize a configuration (unstable)
267
 * @component config
268
 *
269
 * @param[out]  cfg The configuration struct to be initialized.
270
 */
271
DDS_EXPORT void ddsi_config_init_default (struct ddsi_config *cfg);
272
273
struct ddsi_config
274
{
275
  int valid;
276
  uint32_t tracemask;
277
  uint32_t enabled_xchecks;
278
  char *pcap_file;
279
280
  /* interfaces */
281
  struct ddsi_config_network_interface_listelem *network_interfaces;
282
  struct ddsi_config_psmx_listelem *psmx_instances;
283
284
  /* deprecated interface support */
285
  char *depr_networkAddressString;
286
  int depr_prefer_multicast;
287
  char *depr_assumeMulticastCapable;
288
289
  char **networkRecvAddressStrings;
290
  uint32_t allowMulticast;
291
  char *externalAddressString;
292
  char *externalMaskString;
293
  FILE *tracefp;
294
  char *tracefile;
295
  int tracingAppendToFile;
296
  enum ddsi_transport_selector transport_selector;
297
  enum ddsi_boolean_default compat_use_ipv6;
298
  enum ddsi_boolean_default compat_tcp_enable;
299
  int dontRoute;
300
  int enableMulticastLoopback;
301
  uint32_t domainId;
302
  struct ddsi_config_maybe_uint32 extDomainId; // domain id advertised in discovery
303
  char *domainTag;
304
  int participantIndex;
305
  int maxAutoParticipantIndex;
306
  char *spdpMulticastAddressString;
307
  char *defaultMulticastAddressString;
308
  struct ddsi_config_maybe_duration spdp_interval;
309
  int64_t spdp_response_delay_max;
310
  int64_t spdp_prune_delay_initial;
311
  int64_t spdp_prune_delay_discovered;
312
  int64_t lease_duration;
313
  int64_t const_hb_intv_sched;
314
  int64_t const_hb_intv_sched_min;
315
  int64_t const_hb_intv_sched_max;
316
  int64_t const_hb_intv_min;
317
  enum ddsi_retransmit_merging retransmit_merging;
318
  int64_t retransmit_merging_period;
319
  int squash_participants;
320
  int liveliness_monitoring;
321
  int noprogress_log_stacktraces;
322
  int64_t liveliness_monitoring_interval;
323
  int prioritize_retransmit;
324
  enum ddsi_boolean_default multiple_recv_threads;
325
  unsigned recv_thread_stop_maxretries;
326
327
  unsigned primary_reorder_maxsamples;
328
  unsigned secondary_reorder_maxsamples;
329
330
  unsigned delivery_queue_maxsamples;
331
332
  uint16_t fragment_size;
333
  uint32_t max_msg_size;
334
  uint32_t max_rexmit_msg_size;
335
  uint32_t init_transmit_extra_pct;
336
  uint32_t max_rexmit_burst_size;
337
  uint32_t max_frags_in_rexmit_of_sample;
338
339
  int publish_uc_locators; /* Publish discovery unicast locators */
340
  int enable_uc_locators; /* If false, don't even try to create a unicast socket */
341
342
#ifdef DDS_HAS_TOPIC_DISCOVERY
343
  int enable_topic_discovery_endpoints;
344
#endif
345
346
  /* TCP transport configuration */
347
  int tcp_nodelay;
348
  int tcp_port;
349
  int64_t tcp_read_timeout;
350
  int64_t tcp_write_timeout;
351
  int tcp_use_peeraddr_for_unicast;
352
353
#ifdef DDS_HAS_TCP_TLS
354
  /* SSL support for TCP */
355
  int ssl_enable;
356
  int ssl_verify;
357
  int ssl_verify_client;
358
  int ssl_self_signed;
359
  char * ssl_keystore;
360
  char * ssl_rand_file;
361
  char * ssl_key_pass;
362
  char * ssl_ciphers;
363
  struct ddsi_config_ssl_min_version ssl_min_version;
364
#endif
365
366
#ifdef DDS_HAS_NETWORK_PARTITIONS
367
  struct ddsi_config_networkpartition_listelem *networkPartitions;
368
  unsigned nof_networkPartitions;
369
  struct ddsi_config_ignoredpartition_listelem *ignoredPartitions;
370
  struct ddsi_config_partitionmapping_listelem *partitionMappings;
371
#endif /* DDS_HAS_NETWORK_PARTITIONS */
372
  enum ddsi_boolean_default add_localhost_to_peers;
373
  struct ddsi_config_peer_listelem *peers;
374
  struct ddsi_config_thread_properties_listelem *thread_properties;
375
376
  /* debug/test/undoc features: */
377
  int xmit_lossiness;           /**<< fraction of packets to drop on xmit, in units of 1e-3 */
378
  uint32_t rmsg_chunk_size;          /**<< size of a chunk in the receive buffer */
379
  uint32_t rbuf_size;                /* << size of a single receiver buffer */
380
  enum ddsi_besmode besmode;
381
  int meas_hb_to_ack_latency;
382
  int synchronous_delivery_priority_threshold;
383
  int64_t synchronous_delivery_latency_bound;
384
385
  /* Write cache */
386
387
  int whc_batch;
388
  uint32_t whc_lowwater_mark;
389
  uint32_t whc_highwater_mark;
390
  struct ddsi_config_maybe_uint32 whc_init_highwater_mark;
391
  int whc_adaptive;
392
393
  unsigned defrag_unreliable_maxsamples;
394
  unsigned defrag_reliable_maxsamples;
395
  unsigned accelerate_rexmit_block_size;
396
  int64_t responsiveness_timeout;
397
  uint32_t max_participants;
398
  int64_t writer_linger_duration;
399
  int multicast_ttl;
400
  struct ddsi_config_socket_buf_size socket_rcvbuf_size;
401
  struct ddsi_config_socket_buf_size socket_sndbuf_size;
402
  int64_t ack_delay;
403
  int64_t nack_delay;
404
  int64_t preemptive_ack_delay;
405
  int64_t auto_resched_nack_delay;
406
  int64_t ds_grace_period;
407
  uint32_t max_queued_rexmit_bytes;
408
  unsigned max_queued_rexmit_msgs;
409
  int late_ack_mode;
410
  int retry_on_reject_besteffort;
411
  int generate_keyhash;
412
  uint32_t max_sample_size;
413
  int extended_packet_info;
414
415
  /* compability options */
416
  enum ddsi_standards_conformance standards_conformance;
417
  int explicitly_publish_qos_set_to_default;
418
  enum ddsi_many_sockets_mode many_sockets_mode;
419
  int assume_rti_has_pmd_endpoints;
420
  ddsi_protocol_version_t protocol_version;
421
422
  struct ddsi_portmapping ports;
423
424
  int monitor_port;
425
426
  int enable_control_topic;
427
  int initial_deaf;
428
  int initial_mute;
429
  int64_t initial_deaf_mute_reset;
430
431
  int use_multicast_if_mreqn;
432
  struct ddsi_config_prune_deleted_ppant prune_deleted_ppant;
433
  int redundant_networking;
434
435
#ifdef DDS_HAS_SECURITY
436
  struct ddsi_config_omg_security_listelem *omg_security_configuration;
437
#endif
438
439
  /* deprecated shm options */
440
  int enable_shm;
441
  char *shm_locator;
442
  char *iceoryx_service;
443
  enum ddsi_shm_loglevel shm_log_lvl;
444
445
  enum ddsi_config_entity_naming_mode entity_naming_mode;
446
  ddsrt_prng_seed_t entity_naming_seed;
447
448
#if defined (__cplusplus)
449
public:
450
0
  ddsi_config() {
451
0
    ddsi_config_init_default (this);
452
0
  }
453
#endif
454
};
455
456
/** @component config */
457
struct ddsi_cfgst *ddsi_config_init (const char *config, struct ddsi_config *cfg, uint32_t domid) ddsrt_nonnull((1,2));
458
459
/** @component config */
460
DDS_EXPORT void ddsi_config_fini (struct ddsi_cfgst *cfgst);
461
462
#if defined (__cplusplus)
463
}
464
#endif
465
466
#endif /* DDSI_CONFIG_H */