/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 */ |