RTI Connext DDS Micro  Version 2.4.11
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
netio_udp.h
1 /*
2  * FILE: netio_udp.h - UDP API
3  *
4  * Copyright 2008-2015 Real-Time Innovations, Inc.
5  *
6  * No duplications, whole or partial, manual or electronic, may be made
7  * without express written permission. Any such copies, or
8  * revisions thereof, must display this notice unaltered.
9  * This code contains trade secrets of Real-Time Innovations, Inc.
10  *
11  * Modification History
12  * --------------------
13  * 19may2015,as MICRO-1193 Refactoring of Sequence API levels
14  * 13mar2013,eh Fix MICRO-352 (max message/send/receive sizes)
15  * 25apr2012,tk Written
16  *
17  */
18 /*ci
19  * \file
20  * \defgroup NETIO_UDPInterfaceClass UDP Interface
21  * \ingroup NETIOModule
22  * \brief NETIO UDP Interface
23  *
24  * \details
25  *
26  * The UDP interface is implemented as a NETIO interface and NETIO interface
27  * factory.
28  */
29 /*ci \addtogroup NETIO_UDPInterfaceClass
30  * @{
31  */
32 #ifndef netio_udp_h
33 #define netio_udp_h
34 
35 #ifndef RTI_EXPORT_REDA_SEQUENCE
36 #define RTI_EXPORT_REDA_SEQUENCE
37 #endif
38 
39 #ifndef osapi_config_h
40 #include "osapi/osapi_config.h"
41 #endif
42 #ifndef osapi_thread_h
43 #include "osapi/osapi_thread.h"
44 #endif
45 #ifndef rt_rt_h
46 #include "rt/rt_rt.h"
47 #endif
48 #ifndef reda_string_h
49 #include "reda/reda_string.h"
50 #endif
51 #ifndef reda_sequence_h
52 #include "reda/reda_sequence.h"
53 #endif
54 #ifndef netio_dll_h
55 #include "netio/netio_dll.h"
56 #endif
57 #ifndef netio_config_h
58 #include "netio/netio_config.h"
59 #endif
60 #ifndef netio_address_h
61 #include "netio/netio_address.h"
62 #endif
63 #ifndef netio_route_h
64 #include "netio/netio_route.h"
65 #endif
66 
67 #ifdef __cplusplus
68 extern "C"
69 {
70 #endif
71 
72 #ifndef RTI_CERT
73 struct UDP_NatEntry
74 {
75  struct NETIO_Address local_address;
76  struct NETIO_Address public_address;
77 };
78 
79 #define UDP_NatEntry_INITIALIZER \
80 {\
81  NETIO_Address_INITIALIZER,\
82  NETIO_Address_INITIALIZER,\
83 }
84 
85 #define T struct UDP_NatEntry
86 #define TSeq UDP_NatEntrySeq
87 #include <reda/reda_sequence_decl.h>
88 
89 #define UDP_NatEntrySeq_INITIALIZER \
90  REDA_DEFINE_SEQUENCE_INITIALIZER(struct UDP_NatEntry)
91 
92 #define UDP_NAT_INITIALIZER UDP_NatEntrySeq_INITIALIZER,
93 
94 #else /* !RTI_CERT */
95 #define UDP_NAT_INITIALIZER
96 #endif
97 
98 /*ci
99  * \def UDP_INTERFACE_MAX_IFNAME
100  * \brief Maximum length of a UDP network interface
101  */
102 #define UDP_INTERFACE_MAX_IFNAME 64
103 
104 /*ci
105  * \def UDP_INTERFACE_INTERFACE_UP_FLAG
106  * \brief Generic flag to indicate if a network stack is up
107  */
108 #define UDP_INTERFACE_INTERFACE_UP_FLAG 0x1
109 
110 /*ci
111  * \def UDP_INTERFACE_INTERFACE_MULTICAST_FLAG
112  * \brief Generic flag to indicate if a network stack supports multicast
113  */
114 #define UDP_INTERFACE_INTERFACE_MULTICAST_FLAG 0x2
115 
116 /*ci
117  * \brief The maximum number of bits in a UDP netmask
118  */
119 #define UDP_INTERFACE_MAX_NETMASK_BITS (32)
120 
121 /*ci
122  * \brief Generic structure to describe a network interface
123  */
124 struct DDSCPPDllExport UDP_InterfaceTableEntry
125 {
126  /*ci
127  * \brief Flags to indicate if the interface is up etc.
128  */
129  RTI_UINT32 flags;
130 
131  /*ci
132  * \brief The address of the interface as configured by the OS
133  */
134  RTI_UINT32 address;
135 
136  /*ci
137  * \brief The netmask of the interface as configured by the OS
138  */
139  RTI_UINT32 netmask;
140 
141  /*ci
142  * \brief The name of the interface as configured by the OS
143  */
144  char ifname[UDP_INTERFACE_MAX_IFNAME];
145 };
146 
147 /*ci
148  * \def UDP_InterfaceTableEntry_INITIALIZER
149  * \brief Constant to initialize \ref UDP_InterfaceTableEntry
150  */
151 #define UDP_InterfaceTableEntry_INITIALIZER \
152 {\
153  0,\
154  0,\
155  0,\
156  {0}\
157 }
158 
159 #define T struct UDP_InterfaceTableEntry
160 #define TSeq UDP_InterfaceTableEntrySeq
161 #include <reda/reda_sequence_decl.h>
162 
163 #define UDP_InterfaceTableEntrySeq_INITIALIZER \
164  REDA_DEFINE_SEQUENCE_INITIALIZER(struct UDP_InterfaceTableEntry)
165 
166 /*e \dref_UDP_InterfaceTable_add_entry
167  */
168 MUST_CHECK_RETURN NETIODllExport RTI_BOOL
169 UDP_InterfaceTable_add_entry(struct UDP_InterfaceTableEntrySeq *seq,
170  RTI_UINT32 address,
171  RTI_UINT32 netmask,
172  const char *ifname,
173  RTI_UINT32 flags);
174 
175 #ifdef __cplusplus
176 } /* extern "C" */
177 #endif
178 
179 #ifdef __cplusplus
180 extern "C"
181 {
182 #endif
183 
185 NETIODllExport RTI_BOOL
186 UDP_InterfaceFactoryProperty_initialize(
187  struct UDP_InterfaceFactoryProperty* self);
188 
189 #ifndef RTI_CERT
190 NETIODllExport RTI_BOOL
191 UDP_InterfaceFactoryProperty_finalize(
192  struct UDP_InterfaceFactoryProperty *p);
193 #endif /* !RTI_CERT */
194 
195 #ifdef __cplusplus
196 }
197 #endif
198 
199 #if UDP_TRANSFORMS_ENABLED
200 
201 #ifdef __cplusplus
202 extern "C"
203 {
204 #endif
205 
206 /*ce
207  * \brief Base-class for instances of a transform library.
208  */
209 typedef struct UDP_Transform
210 {
211  /*ci
212  * \brief Component base-class
213  */
214  struct RT_Component _parent;
216 
217 /*ce
218  * \brief Generic properties applicable to any transform.
219  */
221 {
222  /*ci
223  * \brief Component base-class
224  */
225  struct RT_ComponentProperty _parent;
226 
227  /*ce
228  * \brief The maximum size of a message to be sent before transformation
229  */
231 
232  /*ce
233  * \brief The maximum size of a message that can be received before transformation
234  */
236 };
237 
238 /*ce
239  * \brief UDP_TransformProperty initializer
240  */
241 #define UDP_TransformProperty_INITIALIZER \
242 { \
243  RT_ComponentProperty_INITIALIZER,\
244  -1,\
245  -1 \
246 }
247 
248 /*ce \dref_UDP_TransformI_create_destination_transform
249  * \ingroup UDPTransformModule
250  *
251  * \param[in] self UDP Transform instance that creates the transformation
252  * \param[out] context Pointer to a transformation context
253  * \param[in] destination Destination address for the transformation
254  * \param[in] user_data The user_data the rule was asserted with
255  * \param[in] property UDP transform specific properties
256  * \param[out] ec User defined error code
257  *
258  * \return RTI_TRUE on success, RTI_FALSE on failure
259  */
260 FUNCTION_MUST_TYPEDEF(
261 RTI_BOOL
263  UDP_Transform_T *const self,
264  void **const context,
265  const struct NETIO_Address *const destination,
266  const struct NETIO_Netmask *const netmask,
267  void *user_data,
268  const struct UDP_TransformProperty *const property,
269  RTI_INT32 *const ec)
270 )
271 
272 /*ce \dref_UDP_TransformI_create_source_transform
273  * \ingroup UDPTransformModule
274  *
275  * \param[in] self UDP Transform instance that creates the transformation
276  * \param[out] context Pointer to a transformation context
277  * \param[in] source Source address for the transformation
278  * \param[in] user_data The user_data the rule was asserted with
279  * \param[in] property UDP transform specific properties
280  * \param[out] ec User defined error code
281  *
282  * \return RTI_TRUE on success, RTI_FALSE on failure
283  */
284 FUNCTION_MUST_TYPEDEF(
285 RTI_BOOL
287  void **const context,
288  const struct NETIO_Address *const source,
289  const struct NETIO_Netmask *const netmask,
290  void *user_data,
291  const struct UDP_TransformProperty *const property,
292  RTI_INT32 *const ec)
293 )
294 
295 /*ce \dref_UDP_TransformI_delete_destination_transform
296  * \ingroup UDPTransformModule
297  *
298  * \param[in] self UDP Transform instance that creates the transformation
299  * \param[out] context Pointer to a transformation context
300  * \param[in] destination Destination address for the transformation
301  * \param[out] ec User defined error code
302  *
303  * \return RTI_TRUE on success, RTI_FALSE on failure
304  */
305 FUNCTION_MUST_TYPEDEF(
306 RTI_BOOL
308  void *context,
309  const struct NETIO_Address *const destination,
310  const struct NETIO_Netmask *const netmask,
311  RTI_INT32 *const ec)
312 )
313 
314 /*ce \dref_UDP_TransformI_delete_source_transform
315  * \ingroup UDPTransformModule
316  *
317  * \param[in] self UDP Transform instance that creates the transformation
318  * \param[out] context Pointer to a transformation context
319  * \param[in] source Source address for the transformation
320  * \param[out] ec User defined error code
321  *
322  * \return RTI_TRUE on success, RTI_FALSE on failure
323  */
324 FUNCTION_MUST_TYPEDEF(
325 RTI_BOOL
327  void *context,
328  const struct NETIO_Address *const source,
329  const struct NETIO_Netmask *const netmask,
330  RTI_INT32 *const ec)
331 )
332 
333 /*ce \dref_UDP_TransformI_transform_source
334  * \ingroup UDPTransformModule
335  *
336  * \param[in] self UDP_Transform_T that performs the transformation
337  * \param[in] source Source address for the transformation
338  * \param[in] context Reference to context created by create_source_transform
339  * \param[in] packet_in The NETIO packet to transform
340  * \param[out] packet_out The transformed NETIO packet
341  * \param[out] ec User defined error code
342  *
343  * \return RTI_TRUE on success, RTI_FALSE on failure
344  */
345 FUNCTION_MUST_TYPEDEF(
346 RTI_BOOL
348  void *context,
349  const struct NETIO_Address *const source,
350  const NETIO_Packet_T *const in_packet,
351  NETIO_Packet_T **out_packet,
352  RTI_INT32 *const ec)
353 )
354 
355 /*ce \dref_UDP_TransformI_transform_destination
356  * \ingroup UDPTransformModule
357  *
358  * \param[in] self UDP_Transform_T that performs the transformation
359  * \param[in] destination Destination address for the transformation
360  * \param[in] context Reference to context created by create_destination_transform
361  * \param[in] packet_in The NETIO packet to transform
362  * \param[out] packet_out The transformed NETIO packet
363  * \param[out] ec User defined error code
364  *
365  * \return RTI_TRUE on success, RTI_FALSE on failure
366  */
367 FUNCTION_MUST_TYPEDEF(
368 RTI_BOOL
370  void *context,
371  const struct NETIO_Address *const destination,
372  const NETIO_Packet_T *const in_packet,
373  NETIO_Packet_T **out_packet,
374  RTI_INT32 *const ec)
375 )
376 
377 /*e
378  * \ingroup UDPTransformModule
379  * \brief UDP Transformation interface
380  */
382 {
383  /*ci
384  * \brief Base-class interface
385  */
386  struct RT_ComponentI _parent;
387 
388  /*ce \dref_UDP_TransformI_create_destination_transform
389  * \brief Method to create a new destination transform
390  */
392 
393  /*ce \dref_UDP_TransformI_create_source_transform
394  * \brief Method to create a new source transform
395  */
397 
398  /*ce \dref_UDP_TransformI_transform_source
399  * \brief Method to transform a payload from a source
400  */
402 
403  /*ce \dref_UDP_TransformI_transform_destination
404  * \brief Method to transform a payload to a destination
405  */
407 
408  /*ce \dref_UDP_TransformI_delete_destination_transform
409  * \brief Method to delete a destination transform
410  */
412 
413  /*ce \dref_UDP_TransformI_delete_source_transform
414  * \brief Method to delete a source transform
415  */
417 };
418 
419 #define UDP_Transform_create_destination_transform(\
420  self_,context_,destination_,netmask_,user_data_,property_,ec_) \
421 ((struct UDP_TransformI*)self_->_parent._intf)->\
422  create_destination_transform(self_,context_,\
423  destination_,netmask_,user_data_,property_,ec_)
424 
425 #define UDP_Transform_create_source_transform(\
426  self_,context_,source_,netmask_,user_data_,property_,ec_) \
427 ((struct UDP_TransformI*)self_->_parent._intf)->\
428  create_source_transform(self_,context_,\
429  source_,netmask_,user_data_,property_,ec_)
430 
431 #define UDP_Transform_delete_destination_transform(\
432  self_,context_,destination_,netmask_,ec_) \
433 ((struct UDP_TransformI*)self_->_parent._intf)->\
434  delete_destination_transform(self_,context_,destination_,netmask_,ec_)
435 
436 #define UDP_Transform_delete_source_transform(\
437  self_,context_,source_,netmask_,ec_) \
438 ((struct UDP_TransformI*)self_->_parent._intf)->\
439  delete_source_transform(self_,context_,source_,netmask_,ec_)
440 
441 #define UDP_Transform_transform_source(\
442  self_,context_,source_,in_packet_,out_packet_,ec_) \
443 ((struct UDP_TransformI*)self_->_parent._intf)->\
444  transform_source(self_,context_,source_,\
445  in_packet_,out_packet_,ec_)
446 
447 #define UDP_Transform_transform_destination(\
448  self_,context_,destination_,in_packet_,out_packet_,ec_) \
449 ((struct UDP_TransformI*)self_->_parent._intf)->\
450  transform_destination(self_,context_,destination_,\
451  in_packet_,out_packet_,ec_)
452 
453 struct UDP_TransformRule
454 {
455  struct NETIO_Address address;
456  struct NETIO_Netmask netmask;
457  RT_ComponentFactoryId_T transformation;
458  void *user_data;
459 };
460 
461 #define T struct UDP_TransformRule
462 #define TSeq UDP_TransformRuleSeq
463 #include <reda/reda_sequence_decl.h>
464 
465 #define UDP_TransformRuleSeq_INITIALIZER \
466  REDA_DEFINE_SEQUENCE_INITIALIZER(struct UDP_TransformRule)
467 
468 /*e \dref_UDP_TransformRules_assert_source_rule
469  */
470 MUST_CHECK_RETURN NETIODllExport RTI_BOOL
472  struct UDP_TransformRuleSeq *src_rules,
473  RTI_INT32 ipv4_address,
474  RTI_UINT32 ipv4_netmask,
475  const char *transform_name,
476  void *user_data);
477 
478 /*e \dref_UDP_TransformRules_assert_destination_rule
479  */
480 MUST_CHECK_RETURN NETIODllExport RTI_BOOL
482  struct UDP_TransformRuleSeq *dst_rules,
483  RTI_INT32 ipv4_address,
484  RTI_UINT32 ipv4_netmask,
485  const char *transform_name,
486  void *user_data);
487 
488 #ifdef __cplusplus
489 }
490 #endif
491 
492 #endif /* UDP_TRANSFORMS_ENABLED */
493 
494 #if UDP_TRANSFORMS_ENABLED
495 
496 /*ce \dref_UDP_TransformUdpMode_T
497  * \brief Operation mode when UDP transformations are enabled
498  */
499 typedef enum
500 {
501  /*ce \dref_UDP_TransformUdpMode_T_UDP_TRANSFORM_UDP_MODE_DISABLED
502  * \brief Disable regular UDP, even when no transforms are enabled
503  */
505 
506  /*ce \dref_UDP_TransformUdpMode_T_UDP_TRANSFORM_UDP_MODE_ENABLED
507  * \brief Allow regular UDP, even when transforms are enabled
508  */
511 
512 #endif
513 
514 /*ce \dref_UDP_InterfaceFactoryProperty
515  * \brief Properties the UDP interface can be registered with.
516  */
517 struct DDSCPPDllExport UDP_InterfaceFactoryProperty
518 {
519  /*ci
520  * \brief Inherited property struct
521  */
522  struct NETIO_InterfaceFactoryProperty _parent;
523 
524  /*ce \dref_UDP_InterfaceFactoryProperty_allow_interface
525  * \brief Sequence of allowed interface names.
526  */
527  struct REDA_StringSeq allow_interface;
528 
529  /*ce \dref_UDP_InterfaceFactoryProperty_deny_interface
530  * \brief Sequence of denied interface names. This list is checked
531  * after the allow_interface list.
532  */
533  struct REDA_StringSeq deny_interface;
534 
535  /*ce \dref_UDP_InterfaceFactoryProperty_max_send_buffer_size
536  * \brief The size of the send socket buffer.
537  */
539 
540  /*ce \dref_UDP_InterfaceFactoryProperty_max_receive_buffer_size
541  * \brief The size of the receive socket buffer.
542  */
544 
545  /*ce \dref_UDP_InterfaceFactoryProperty_max_message_size
546  * \brief The maximum size of the message which can be received.
547  */
548  RTI_INT32 max_message_size;
549 
550  /*ce \dref_UDP_InterfaceFactoryProperty_max_send_message_size
551  * \brief The maximum size of the message which can be sent. This is
552  * only a hint and not enforced.
553  *
554  * \details
555  * This parameters is useful to UDP transformation functions which
556  * must allocate a buffer to put the result in.
557  */
559 
560  /*ce \dref_UDP_InterfaceFactoryProperty_multicast_ttl
561  * \brief The maximum TTL.
562  */
563  RTI_INT32 multicast_ttl;
564 
565 #ifndef RTI_CERT
566  /*ce \dref_UDP_InterfaceFactoryProperty_nat
567  */
568  struct UDP_NatEntrySeq nat;
569 #endif /* !RTI_CERT */
570 
571  /*ce \dref_UDP_InterfaceFactoryProperty_if_table
572  * \brief The interface table if interfaces are added manually.
573  */
574  struct UDP_InterfaceTableEntrySeq if_table;
575 
576  /*ce \dref_UDP_InterfaceFactoryProperty_multicast_interface
577  * \brief The network interface to use to send to multicast.
578  */
579  REDA_String_T multicast_interface;
580 
581  /*ce \dref_UDP_InterfaceFactoryProperty_is_default_interface
582  * \brief If this should be considered the default UDP interfaces if
583  * no other UDP interface is found to handle a route.
584  */
586 
587  /*ce \dref_UDP_InterfaceFactoryProperty_disable_auto_interface_config
588  * \brief Disable reading of available network interfaces using system
589  * information and instead rely on the manually configured
590  * interface table.
591  */
593 
594  /*ce \dref_UDP_InterfaceFactoryProperty_recv_thread
595  * \brief Thread properties for each receive thread created by this
596  * NETIO interface.
597  */
598  struct OSAPI_ThreadProperty recv_thread;
599 
600  /*ce \dref_UDP_InterfaceFactoryProperty_enable_interface_bind
601  * \brief Bind receive sockets to specific interfaces.
602  *
603  * \details
604  *
605  * When this is set to TRUE the UDP transport binds each
606  * receive port to a specific interface when the
607  * allow_interface/deny_interface lists are non-empty. This allows
608  * multiple UDP transports to be used by a single DomainParticipant at
609  * the expense of an increased number of threads. This property is
610  * ignored when transformations are enabled and the
611  * allow_interface/deny_interface lists are non-empty.
612  */
614 
615 #if UDP_TRANSFORMS_ENABLED
616  /*ce \dref_UDP_InterfaceFactoryProperty_source_rules
617  * \brief Rules for how to transform received UDP payloads based on the
618  * source address.
619  */
620  struct UDP_TransformRuleSeq source_rules;
621 
622  /*ce \dref_UDP_InterfaceFactoryProperty_destination_rules
623  * \brief Rules for how to transform sent UDP payloads based on the
624  * destination address.
625  */
626  struct UDP_TransformRuleSeq destination_rules;
627 
628  /*ce \dref_UDP_InterfaceFactoryProperty_transform_udp_mode
629  * \brief Determines how regular UDP is supported when transformations
630  * are supported.
631  */
633 
634  /*ce \dref_UDP_InterfaceFactoryProperty_transform_locator_kind
635  * \brief the locator to use for locators that have transformations.
636  *
637  * \details
638  * When transformation rules have been enabled they are announced
639  * as a vendor specific locator. This property overrides this value.
640  *
641  * NOTE: Changing this value may prevent communication.
642  *
643  * NOTE : must be greater or equal than NETIO_ADDRESS_KIND_USER and not
644  * equal to NETIO_ADDRESS_KIND_SHMEM or NETIO_ADDRESS_KIND_INTRA.
645  */
647 #endif
648 
649 #ifdef RTI_CPP
650  public:
652  {
653  UDP_InterfaceFactoryProperty_initialize(this);
654  }
655 
657  {
658 #ifndef RTI_CERT
659  UDP_InterfaceFactoryProperty_finalize(this);
660 #endif /* !RTI_CERT */
661  }
662 #endif /* RTI_CPP */
663 };
664 
665 #ifdef __cplusplus
666 extern "C"
667 {
668 #endif
669 
670 #if UDP_TRANSFORMS_ENABLED
671 #define UDP_TRANSFORMS_INITIALIZER \
672  ,UDP_TransformRuleSeq_INITIALIZER,\
673  UDP_TransformRuleSeq_INITIALIZER,\
674  UDP_TRANSFORM_UDP_MODE_DISABLED,\
675  NETIO_ADDRESS_KIND_TUDPv4
676 #else
677 #define UDP_TRANSFORMS_INITIALIZER
678 #endif
679 
680 /*e \ingroup OSAPI_ThreadClass
681  * Initializer for thread properties
682  */
683 #define UDP_THREAD_PROPERTY_DEFAULT \
684 { \
685  OSAPI_THREAD_USE_OSDEFAULT_STACKSIZE, \
686  OSAPI_THREAD_PRIORITY_NORMAL, \
687  OSAPI_THREAD_SUSPEND_ENABLE \
688 }
689 
690 /*ci
691  * \def UDP_InterfaceFactoryProperty_INITIALIZER
692  * \brief Constant to initialize UDP_InterfaceFactoryProperty
693  *
694  * NOTE: Do not add a comma (,) after UDP_NAT_INITIALIZER, it is
695  * part of the definition based on the RTI_CERT definition.
696  */
697 #define UDP_InterfaceFactoryProperty_INITIALIZER \
698 {\
699  NETIO_InterfaceFactoryProperty_INITIALIZER,\
700  REDA_StringSeq_INITIALIZER,\
701  REDA_StringSeq_INITIALIZER,\
702  (256*1024),\
703  (256*1024),\
704  (8*1024),\
705  -1,\
706  1,\
707  UDP_NAT_INITIALIZER \
708  UDP_InterfaceTableEntrySeq_INITIALIZER,\
709  NULL,\
710  RTI_TRUE,\
711  RTI_FALSE, \
712  UDP_THREAD_PROPERTY_DEFAULT, \
713  RTI_FALSE \
714  UDP_TRANSFORMS_INITIALIZER \
715 }
716 
717 #define UDP_INTERFACE_INTERFACE_ID RT_MKINTERFACEID(\
718  RT_COMPONENT_CLASS_NETIO,RT_COMPONENT_INSTANCE_UDP)
719 
720 extern NETIODllVariable
721 struct UDP_InterfaceFactoryProperty UDP_INTERFACE_FACTORY_PROPERTY_DEFAULT;
722 
723 /*ce \dref_UDP_InterfaceFactory_get_interface
724  */
725 MUST_CHECK_RETURN NETIODllExport struct RT_ComponentFactoryI*
727 
728 #ifdef __cplusplus
729 } /* extern "C" */
730 #endif
731 
732 #undef RTI_EXPORT_REDA_SEQUENCE
733 
734 #endif /* netio_udp_h */
735 
736 /*ci @} */
737 

RTI Connext DDS Micro Version 2.4.11 Copyright © Mon Jul 23 2018 Real-Time Innovations, Inc