Protected discovery preparation.
Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>
This commit is contained in:
		
							parent
							
								
									7f59a46ff8
								
							
						
					
					
						commit
						d0035cfdbd
					
				
					 12 changed files with 764 additions and 122 deletions
				
			
		| 
						 | 
					@ -18,6 +18,7 @@ PREPEND(srcs_ddsi "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
				
			||||||
    ddsi_raweth.c
 | 
					    ddsi_raweth.c
 | 
				
			||||||
    ddsi_ipaddr.c
 | 
					    ddsi_ipaddr.c
 | 
				
			||||||
    ddsi_mcgroup.c
 | 
					    ddsi_mcgroup.c
 | 
				
			||||||
 | 
					    ddsi_security_omg.c
 | 
				
			||||||
    ddsi_serdata.c
 | 
					    ddsi_serdata.c
 | 
				
			||||||
    ddsi_serdata_default.c
 | 
					    ddsi_serdata_default.c
 | 
				
			||||||
    ddsi_sertopic.c
 | 
					    ddsi_sertopic.c
 | 
				
			||||||
| 
						 | 
					@ -70,6 +71,7 @@ PREPEND(hdrs_private_ddsi "${CMAKE_CURRENT_LIST_DIR}/include/dds/ddsi"
 | 
				
			||||||
    ddsi_ipaddr.h
 | 
					    ddsi_ipaddr.h
 | 
				
			||||||
    ddsi_mcgroup.h
 | 
					    ddsi_mcgroup.h
 | 
				
			||||||
    ddsi_plist_generic.h
 | 
					    ddsi_plist_generic.h
 | 
				
			||||||
 | 
					    ddsi_security_omg.h
 | 
				
			||||||
    ddsi_serdata.h
 | 
					    ddsi_serdata.h
 | 
				
			||||||
    ddsi_sertopic.h
 | 
					    ddsi_sertopic.h
 | 
				
			||||||
    ddsi_serdata_default.h
 | 
					    ddsi_serdata_default.h
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										152
									
								
								src/core/ddsi/include/dds/ddsi/ddsi_security_omg.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								src/core/ddsi/include/dds/ddsi/ddsi_security_omg.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,152 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program and the accompanying materials are made available under the
 | 
				
			||||||
 | 
					 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
				
			||||||
 | 
					 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
				
			||||||
 | 
					 * v. 1.0 which is available at
 | 
				
			||||||
 | 
					 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef DDSI_OMG_SECURITY_H
 | 
				
			||||||
 | 
					#define DDSI_OMG_SECURITY_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/ddsi/q_entity.h"
 | 
				
			||||||
 | 
					#include "dds/ddsi/q_plist.h"
 | 
				
			||||||
 | 
					#include "dds/ddsi/q_globals.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (__cplusplus)
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Check if security is enabled for the participant.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in] pp  Participant to check if it is secure.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns bool
 | 
				
			||||||
 | 
					 * @retval true   Participant is secure
 | 
				
			||||||
 | 
					 * @retval false  Participant is not secure
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool q_omg_participant_is_secure(const struct participant *pp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Get security info flags of the given writer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]  wr    Writer to get the security info from.
 | 
				
			||||||
 | 
					 * @param[out] info  The security info.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns bool
 | 
				
			||||||
 | 
					 * @retval true   Security info set.
 | 
				
			||||||
 | 
					 * @retval false  Security info not set (probably unsecure writer).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool q_omg_get_writer_security_info(const struct writer *wr, nn_security_info_t *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Get security info flags of the given reader.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]  rd    Reader to get the security info from.
 | 
				
			||||||
 | 
					 * @param[out] info  The security info.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns bool
 | 
				
			||||||
 | 
					 * @retval true   Security info set.
 | 
				
			||||||
 | 
					 * @retval false  Security info not set (probably unsecure reader).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool q_omg_get_reader_security_info(const struct reader *rd, nn_security_info_t *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Return the builtin writer id for this readers' discovery.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return builtin entity id of the writer to use for the subscription
 | 
				
			||||||
 | 
					 * discovery information.
 | 
				
			||||||
 | 
					 * Depending on whether the discovery is protected or not (for the
 | 
				
			||||||
 | 
					 * given reader), either the default writer or protected writer needs
 | 
				
			||||||
 | 
					 * to be used.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in] rd Reader to determine the subscription writer from.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns unsigned
 | 
				
			||||||
 | 
					 * @retval NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER
 | 
				
			||||||
 | 
					 * @retval NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					unsigned determine_subscription_writer(const struct reader *rd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Return the builtin writer id for this writers' discovery.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return builtin entity id of the writer to use for the publication
 | 
				
			||||||
 | 
					 * discovery information.
 | 
				
			||||||
 | 
					 * Depending on whether the discovery is protected or not (for the
 | 
				
			||||||
 | 
					 * given writer), either the default writer or protected writer needs
 | 
				
			||||||
 | 
					 * to be used.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in] wr Writer to determine the publication writer from.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns unsigned
 | 
				
			||||||
 | 
					 * @retval NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER
 | 
				
			||||||
 | 
					 * @retval NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					unsigned determine_publication_writer(const struct writer *wr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Determine if the proxy participant is allowed to be deleted
 | 
				
			||||||
 | 
					 *        by the given writer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If an proxy participant is authenticated, it is only allowed to
 | 
				
			||||||
 | 
					 * to deleted when a dispose is received from the proper protected
 | 
				
			||||||
 | 
					 * discovery writer.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in] gv           Used for tracing.
 | 
				
			||||||
 | 
					 * @param[in] guid         Guid of the proxy participant to be deleted.
 | 
				
			||||||
 | 
					 * @param[in] pwr_entityid Writer that send the dispose.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns bool
 | 
				
			||||||
 | 
					 * @retval true   The proxy participant may be deleted.
 | 
				
			||||||
 | 
					 * @retval false  The proxy participant may not be deleted by this writer.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool allow_proxy_participant_deletion(struct q_globals * const gv, const struct ddsi_guid *guid, const ddsi_entityid_t pwr_entityid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else /* DDSI_INCLUDE_SECURITY */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/ddsi/q_unused.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool
 | 
				
			||||||
 | 
					q_omg_participant_is_secure(
 | 
				
			||||||
 | 
					  UNUSED_ARG(const struct participant *pp))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline unsigned
 | 
				
			||||||
 | 
					determine_subscription_writer(
 | 
				
			||||||
 | 
					  UNUSED_ARG(const struct reader *rd))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline unsigned
 | 
				
			||||||
 | 
					determine_publication_writer(
 | 
				
			||||||
 | 
					  UNUSED_ARG(const struct writer *wr))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool
 | 
				
			||||||
 | 
					allow_proxy_participant_deletion(
 | 
				
			||||||
 | 
					  UNUSED_ARG(struct q_globals * const gv),
 | 
				
			||||||
 | 
					  UNUSED_ARG(const struct ddsi_guid *guid),
 | 
				
			||||||
 | 
					  UNUSED_ARG(const ddsi_entityid_t pwr_entityid))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* DDSI_INCLUDE_SECURITY */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (__cplusplus)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* DDSI_OMG_SECURITY_H */
 | 
				
			||||||
| 
						 | 
					@ -237,6 +237,10 @@ struct q_globals {
 | 
				
			||||||
  dds_qos_t spdp_endpoint_xqos;
 | 
					  dds_qos_t spdp_endpoint_xqos;
 | 
				
			||||||
  dds_qos_t builtin_endpoint_xqos_rd;
 | 
					  dds_qos_t builtin_endpoint_xqos_rd;
 | 
				
			||||||
  dds_qos_t builtin_endpoint_xqos_wr;
 | 
					  dds_qos_t builtin_endpoint_xqos_wr;
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  dds_qos_t builtin_stateless_xqos_rd;
 | 
				
			||||||
 | 
					  dds_qos_t builtin_stateless_xqos_wr;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* SPDP packets get very special treatment (they're the only packets
 | 
					  /* SPDP packets get very special treatment (they're the only packets
 | 
				
			||||||
     we accept from writers we don't know) and have their very own
 | 
					     we accept from writers we don't know) and have their very own
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,6 +172,9 @@ typedef struct nn_security_info
 | 
				
			||||||
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_RTPS_AUTHENTICATED           (1u <<  3)
 | 
					#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_RTPS_AUTHENTICATED           (1u <<  3)
 | 
				
			||||||
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_AUTHENTICATED      (1u <<  4)
 | 
					#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_AUTHENTICATED      (1u <<  4)
 | 
				
			||||||
#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_AUTHENTICATED     (1u <<  5)
 | 
					#define NN_PLUGIN_PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_AUTHENTICATED     (1u <<  5)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					struct nn_security_info;
 | 
				
			||||||
 | 
					typedef struct nn_security_info nn_security_info_t;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,6 +89,19 @@ typedef struct {
 | 
				
			||||||
#define NN_DISC_BUILTIN_ENDPOINT_TOPIC_ANNOUNCER (1u << 12)
 | 
					#define NN_DISC_BUILTIN_ENDPOINT_TOPIC_ANNOUNCER (1u << 12)
 | 
				
			||||||
#define NN_DISC_BUILTIN_ENDPOINT_TOPIC_DETECTOR (1u << 13)
 | 
					#define NN_DISC_BUILTIN_ENDPOINT_TOPIC_DETECTOR (1u << 13)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Security extensions: */
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_PUBLICATION_MESSAGE_SECURE_ANNOUNCER (1u<<16)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_PUBLICATION_MESSAGE_SECURE_DETECTOR (1u<<17)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_SUBSCRIPTION_MESSAGE_SECURE_ANNOUNCER (1u<<18)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_SUBSCRIPTION_MESSAGE_SECURE_DETECTOR (1u<<19)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_SECURE_ANNOUNCER (1u<<20)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_SECURE_DETECTOR (1u<<21)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_PARTICIPANT_STATELESS_MESSAGE_ANNOUNCER (1u<<22)
 | 
				
			||||||
 | 
					#define NN_BUILTIN_ENDPOINT_PARTICIPANT_STATELESS_MESSAGE_DETECTOR (1u<<23)
 | 
				
			||||||
 | 
					/* TODO: ENDPOINT_PARTICIPANT_VOLATILE */
 | 
				
			||||||
 | 
					#define NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_SECURE_ANNOUNCER (1u << 26)
 | 
				
			||||||
 | 
					#define NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_SECURE_DETECTOR (1u << 27)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PrismTech extensions: */
 | 
					/* PrismTech extensions: */
 | 
				
			||||||
#define NN_DISC_BUILTIN_ENDPOINT_CM_PARTICIPANT_WRITER (1u << 0)
 | 
					#define NN_DISC_BUILTIN_ENDPOINT_CM_PARTICIPANT_WRITER (1u << 0)
 | 
				
			||||||
#define NN_DISC_BUILTIN_ENDPOINT_CM_PARTICIPANT_READER (1u << 1)
 | 
					#define NN_DISC_BUILTIN_ENDPOINT_CM_PARTICIPANT_READER (1u << 1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,19 @@ typedef int64_t seqno_t;
 | 
				
			||||||
#define NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_READER 0x100c7
 | 
					#define NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_READER 0x100c7
 | 
				
			||||||
#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER 0x200c2
 | 
					#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER 0x200c2
 | 
				
			||||||
#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER 0x200c7
 | 
					#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER 0x200c7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER 0xff0003c2
 | 
				
			||||||
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_READER 0xff0003c7
 | 
				
			||||||
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER 0xff0004c2
 | 
				
			||||||
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_READER 0xff0004c7
 | 
				
			||||||
 | 
					#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER 0x201c3
 | 
				
			||||||
 | 
					#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_READER 0x201c4
 | 
				
			||||||
 | 
					#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER 0xff0200c2
 | 
				
			||||||
 | 
					#define NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_READER 0xff0200c7
 | 
				
			||||||
 | 
					/* TODO: ENDPOINT_PARTICIPANT_VOLATILE */
 | 
				
			||||||
 | 
					#define NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER 0xff0101c2
 | 
				
			||||||
 | 
					#define NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_READER 0xff0101c7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER 0x142
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER 0x142
 | 
				
			||||||
#define NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_READER 0x147
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_READER 0x147
 | 
				
			||||||
#define NN_ENTITYID_SEDP_BUILTIN_CM_PUBLISHER_WRITER 0x242
 | 
					#define NN_ENTITYID_SEDP_BUILTIN_CM_PUBLISHER_WRITER 0x242
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										148
									
								
								src/core/ddsi/src/ddsi_security_omg.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								src/core/ddsi/src/ddsi_security_omg.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,148 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program and the accompanying materials are made available under the
 | 
				
			||||||
 | 
					 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
				
			||||||
 | 
					 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
				
			||||||
 | 
					 * v. 1.0 which is available at
 | 
				
			||||||
 | 
					 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/ddsrt/misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/ddsi/q_unused.h"
 | 
				
			||||||
 | 
					#include "dds/ddsi/ddsi_security_omg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					q_omg_participant_is_secure(
 | 
				
			||||||
 | 
					  const struct participant *pp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* TODO: Register local participant. */
 | 
				
			||||||
 | 
					  DDSRT_UNUSED_ARG(pp);
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					q_omg_writer_is_discovery_protected(
 | 
				
			||||||
 | 
					  const struct writer *wr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* TODO: Register local writer. */
 | 
				
			||||||
 | 
					  DDSRT_UNUSED_ARG(wr);
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					q_omg_reader_is_discovery_protected(
 | 
				
			||||||
 | 
					  const struct reader *rd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* TODO: Register local reader. */
 | 
				
			||||||
 | 
					  DDSRT_UNUSED_ARG(rd);
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					q_omg_get_writer_security_info(
 | 
				
			||||||
 | 
					  const struct writer *wr,
 | 
				
			||||||
 | 
					  nn_security_info_t *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  assert(wr);
 | 
				
			||||||
 | 
					  assert(info);
 | 
				
			||||||
 | 
					  /* TODO: Register local writer. */
 | 
				
			||||||
 | 
					  DDSRT_UNUSED_ARG(wr);
 | 
				
			||||||
 | 
					  info->plugin_security_attributes = 0;
 | 
				
			||||||
 | 
					  info->security_attributes = 0;
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					q_omg_get_reader_security_info(
 | 
				
			||||||
 | 
					  const struct reader *rd,
 | 
				
			||||||
 | 
					  nn_security_info_t *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  assert(rd);
 | 
				
			||||||
 | 
					  assert(info);
 | 
				
			||||||
 | 
					  /* TODO: Register local reader. */
 | 
				
			||||||
 | 
					  DDSRT_UNUSED_ARG(rd);
 | 
				
			||||||
 | 
					  info->plugin_security_attributes = 0;
 | 
				
			||||||
 | 
					  info->security_attributes = 0;
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool
 | 
				
			||||||
 | 
					q_omg_proxyparticipant_is_authenticated(
 | 
				
			||||||
 | 
					  struct proxy_participant *proxypp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* TODO: Handshake */
 | 
				
			||||||
 | 
					  DDSRT_UNUSED_ARG(proxypp);
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned
 | 
				
			||||||
 | 
					determine_subscription_writer(
 | 
				
			||||||
 | 
					  const struct reader *rd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (q_omg_reader_is_discovery_protected(rd))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned
 | 
				
			||||||
 | 
					determine_publication_writer(
 | 
				
			||||||
 | 
					  const struct writer *wr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (q_omg_writer_is_discovery_protected(wr))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					allow_proxy_participant_deletion(
 | 
				
			||||||
 | 
					  struct q_globals * const gv,
 | 
				
			||||||
 | 
					  const struct ddsi_guid *guid,
 | 
				
			||||||
 | 
					  const ddsi_entityid_t pwr_entityid)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  struct proxy_participant *proxypp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  assert(gv);
 | 
				
			||||||
 | 
					  assert(guid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Always allow deletion from a secure proxy writer. */
 | 
				
			||||||
 | 
					  if (pwr_entityid.u == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER)
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Not from a secure proxy writer.
 | 
				
			||||||
 | 
					   * Only allow deletion when proxy participant is not authenticated. */
 | 
				
			||||||
 | 
					  proxypp = ephash_lookup_proxy_participant_guid(gv->guid_hash, guid);
 | 
				
			||||||
 | 
					  if (!proxypp)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    GVLOGDISC (" unknown");
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return (!q_omg_proxyparticipant_is_authenticated(proxypp));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else /* DDSI_INCLUDE_SECURITY */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dds/ddsi/ddsi_security_omg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern inline bool q_omg_participant_is_secure(UNUSED_ARG(const struct participant *pp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern inline unsigned determine_subscription_writer(UNUSED_ARG(const struct reader *rd));
 | 
				
			||||||
 | 
					extern inline unsigned determine_publication_writer(UNUSED_ARG(const struct writer *wr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern inline bool allow_proxy_participant_deletion(
 | 
				
			||||||
 | 
					  UNUSED_ARG(struct q_globals * const gv),
 | 
				
			||||||
 | 
					  UNUSED_ARG(const struct ddsi_guid *guid),
 | 
				
			||||||
 | 
					  UNUSED_ARG(const ddsi_entityid_t pwr_entityid));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* DDSI_INCLUDE_SECURITY */
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@
 | 
				
			||||||
#include "dds/ddsi/q_lease.h"
 | 
					#include "dds/ddsi/q_lease.h"
 | 
				
			||||||
#include "dds/ddsi/ddsi_serdata_default.h"
 | 
					#include "dds/ddsi/ddsi_serdata_default.h"
 | 
				
			||||||
#include "dds/ddsi/q_feature_check.h"
 | 
					#include "dds/ddsi/q_feature_check.h"
 | 
				
			||||||
 | 
					#include "dds/ddsi/ddsi_security_omg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int get_locator (const struct q_globals *gv, nn_locator_t *loc, const nn_locators_t *locs, int uc_same_subnet)
 | 
					static int get_locator (const struct q_globals *gv, nn_locator_t *loc, const nn_locators_t *locs, int uc_same_subnet)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -327,16 +328,18 @@ int spdp_write (struct participant *pp)
 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int spdp_dispose_unregister (struct participant *pp)
 | 
					static int spdp_dispose_unregister_with_wr (struct participant *pp, unsigned entityid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct nn_xmsg *mpayload;
 | 
					  struct nn_xmsg *mpayload;
 | 
				
			||||||
  nn_plist_t ps;
 | 
					  nn_plist_t ps;
 | 
				
			||||||
  struct writer *wr;
 | 
					  struct writer *wr;
 | 
				
			||||||
  int ret;
 | 
					  int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((wr = get_builtin_writer (pp, NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER)) == NULL)
 | 
					  if ((wr = get_builtin_writer (pp, entityid)) == NULL)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    ETRACE (pp, "spdp_dispose_unregister("PGUIDFMT") - builtin participant writer not found\n", PGUID (pp->e.guid));
 | 
					    ETRACE (pp, "spdp_dispose_unregister("PGUIDFMT") - builtin participant %s writer not found\n",
 | 
				
			||||||
 | 
					            PGUID (pp->e.guid),
 | 
				
			||||||
 | 
					            entityid == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER ? "secure" : "");
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -353,6 +356,21 @@ int spdp_dispose_unregister (struct participant *pp)
 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int spdp_dispose_unregister (struct participant *pp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					   * When disposing a participant, it should be announced on both the
 | 
				
			||||||
 | 
					   * non-secure and secure writers.
 | 
				
			||||||
 | 
					   * The receiver will decide from which writer it accepts the dispose.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  int ret = spdp_dispose_unregister_with_wr(pp, NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER);
 | 
				
			||||||
 | 
					  if ((ret > 0) && q_omg_participant_is_secure(pp))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    ret = spdp_dispose_unregister_with_wr(pp, NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static unsigned pseudo_random_delay (const ddsi_guid_t *x, const ddsi_guid_t *y, nn_mtime_t tnow)
 | 
					static unsigned pseudo_random_delay (const ddsi_guid_t *x, const ddsi_guid_t *y, nn_mtime_t tnow)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  /* You know, an ordinary random generator would be even better, but
 | 
					  /* You know, an ordinary random generator would be even better, but
 | 
				
			||||||
| 
						 | 
					@ -407,7 +425,7 @@ static void respond_to_spdp (const struct q_globals *gv, const ddsi_guid_t *dest
 | 
				
			||||||
  ephash_enum_participant_fini (&est);
 | 
					  ephash_enum_participant_fini (&est);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int handle_SPDP_dead (const struct receiver_state *rst, nn_wctime_t timestamp, const nn_plist_t *datap, unsigned statusinfo)
 | 
					static int handle_SPDP_dead (const struct receiver_state *rst, ddsi_entityid_t pwr_entityid, nn_wctime_t timestamp, const nn_plist_t *datap, unsigned statusinfo)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct q_globals * const gv = rst->gv;
 | 
					  struct q_globals * const gv = rst->gv;
 | 
				
			||||||
  ddsi_guid_t guid;
 | 
					  ddsi_guid_t guid;
 | 
				
			||||||
| 
						 | 
					@ -419,13 +437,20 @@ static int handle_SPDP_dead (const struct receiver_state *rst, nn_wctime_t times
 | 
				
			||||||
    guid = datap->participant_guid;
 | 
					    guid = datap->participant_guid;
 | 
				
			||||||
    GVLOGDISC (" %"PRIx32":%"PRIx32":%"PRIx32":%"PRIx32, PGUID (guid));
 | 
					    GVLOGDISC (" %"PRIx32":%"PRIx32":%"PRIx32":%"PRIx32, PGUID (guid));
 | 
				
			||||||
    assert (guid.entityid.u == NN_ENTITYID_PARTICIPANT);
 | 
					    assert (guid.entityid.u == NN_ENTITYID_PARTICIPANT);
 | 
				
			||||||
    if (delete_proxy_participant_by_guid (gv, &guid, timestamp, 0) < 0)
 | 
					    if (allow_proxy_participant_deletion(gv, &guid, pwr_entityid))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      GVLOGDISC (" unknown");
 | 
					      if (delete_proxy_participant_by_guid (gv, &guid, timestamp, 0) < 0)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        GVLOGDISC (" unknown");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        GVLOGDISC (" delete");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      GVLOGDISC (" delete");
 | 
					      GVLOGDISC (" not allowed");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
| 
						 | 
					@ -793,7 +818,7 @@ static int handle_SPDP_alive (const struct receiver_state *rst, seqno_t seq, nn_
 | 
				
			||||||
  return 1;
 | 
					  return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void handle_SPDP (const struct receiver_state *rst, seqno_t seq, nn_wctime_t timestamp, unsigned statusinfo, const void *vdata, uint32_t len)
 | 
					static void handle_SPDP (const struct receiver_state *rst, ddsi_entityid_t pwr_entityid, seqno_t seq, nn_wctime_t timestamp, unsigned statusinfo, const void *vdata, uint32_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct q_globals * const gv = rst->gv;
 | 
					  struct q_globals * const gv = rst->gv;
 | 
				
			||||||
  const struct CDRHeader *data = vdata; /* built-ins not deserialized (yet) */
 | 
					  const struct CDRHeader *data = vdata; /* built-ins not deserialized (yet) */
 | 
				
			||||||
| 
						 | 
					@ -832,7 +857,7 @@ static void handle_SPDP (const struct receiver_state *rst, seqno_t seq, nn_wctim
 | 
				
			||||||
      case NN_STATUSINFO_DISPOSE:
 | 
					      case NN_STATUSINFO_DISPOSE:
 | 
				
			||||||
      case NN_STATUSINFO_UNREGISTER:
 | 
					      case NN_STATUSINFO_UNREGISTER:
 | 
				
			||||||
      case (NN_STATUSINFO_DISPOSE | NN_STATUSINFO_UNREGISTER):
 | 
					      case (NN_STATUSINFO_DISPOSE | NN_STATUSINFO_UNREGISTER):
 | 
				
			||||||
        interesting = handle_SPDP_dead (rst, timestamp, &decoded_data, statusinfo);
 | 
					        interesting = handle_SPDP_dead (rst, pwr_entityid, timestamp, &decoded_data, statusinfo);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -888,7 +913,7 @@ static int sedp_write_endpoint
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
   struct writer *wr, int alive, const ddsi_guid_t *epguid,
 | 
					   struct writer *wr, int alive, const ddsi_guid_t *epguid,
 | 
				
			||||||
   const struct entity_common *common, const struct endpoint_common *epcommon,
 | 
					   const struct entity_common *common, const struct endpoint_common *epcommon,
 | 
				
			||||||
   const dds_qos_t *xqos, struct addrset *as)
 | 
					   const dds_qos_t *xqos, struct addrset *as, nn_security_info_t *security)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct q_globals * const gv = wr->e.gv;
 | 
					  struct q_globals * const gv = wr->e.gv;
 | 
				
			||||||
  const dds_qos_t *defqos = is_writer_entityid (epguid->entityid) ? &gv->default_xqos_wr : &gv->default_xqos_rd;
 | 
					  const dds_qos_t *defqos = is_writer_entityid (epguid->entityid) ? &gv->default_xqos_wr : &gv->default_xqos_rd;
 | 
				
			||||||
| 
						 | 
					@ -908,6 +933,17 @@ static int sedp_write_endpoint
 | 
				
			||||||
    ps.entity_name = common->name;
 | 
					    ps.entity_name = common->name;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  if (security)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    ps.present |= PP_ENDPOINT_SECURITY_INFO;
 | 
				
			||||||
 | 
					    memcpy(&ps.endpoint_security_info, security, sizeof(nn_security_info_t));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  (void)security;
 | 
				
			||||||
 | 
					  assert(security == NULL);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!alive)
 | 
					  if (!alive)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    assert (xqos == NULL);
 | 
					    assert (xqos == NULL);
 | 
				
			||||||
| 
						 | 
					@ -987,13 +1023,22 @@ int sedp_write_writer (struct writer *wr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if ((!is_builtin_entityid(wr->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!wr->e.onlylocal))
 | 
					  if ((!is_builtin_entityid(wr->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!wr->e.onlylocal))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    struct writer *sedp_wr = get_sedp_writer (wr->c.pp, NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER);
 | 
					    unsigned entityid = determine_publication_writer(wr);
 | 
				
			||||||
 | 
					    struct writer *sedp_wr = get_sedp_writer (wr->c.pp, entityid);
 | 
				
			||||||
 | 
					    nn_security_info_t *security = NULL;
 | 
				
			||||||
#ifdef DDSI_INCLUDE_SSM
 | 
					#ifdef DDSI_INCLUDE_SSM
 | 
				
			||||||
    struct addrset *as = wr->ssm_as;
 | 
					    struct addrset *as = wr->ssm_as;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    struct addrset *as = NULL;
 | 
					    struct addrset *as = NULL;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    return sedp_write_endpoint (sedp_wr, 1, &wr->e.guid, &wr->e, &wr->c, wr->xqos, as);
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					    nn_security_info_t tmp;
 | 
				
			||||||
 | 
					    if (q_omg_get_writer_security_info(wr, &tmp))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      security = &tmp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return sedp_write_endpoint (sedp_wr, 1, &wr->e.guid, &wr->e, &wr->c, wr->xqos, as, security);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1002,13 +1047,22 @@ int sedp_write_reader (struct reader *rd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if ((!is_builtin_entityid (rd->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!rd->e.onlylocal))
 | 
					  if ((!is_builtin_entityid (rd->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!rd->e.onlylocal))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    struct writer *sedp_wr = get_sedp_writer (rd->c.pp, NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER);
 | 
					    unsigned entityid = determine_subscription_writer(rd);
 | 
				
			||||||
 | 
					    struct writer *sedp_wr = get_sedp_writer (rd->c.pp, entityid);
 | 
				
			||||||
 | 
					    nn_security_info_t *security = NULL;
 | 
				
			||||||
#ifdef DDSI_INCLUDE_NETWORK_PARTITIONS
 | 
					#ifdef DDSI_INCLUDE_NETWORK_PARTITIONS
 | 
				
			||||||
    struct addrset *as = rd->as;
 | 
					    struct addrset *as = rd->as;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    struct addrset *as = NULL;
 | 
					    struct addrset *as = NULL;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    return sedp_write_endpoint (sedp_wr, 1, &rd->e.guid, &rd->e, &rd->c, rd->xqos, as);
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					    nn_security_info_t tmp;
 | 
				
			||||||
 | 
					    if (q_omg_get_reader_security_info(rd, &tmp))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      security = &tmp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return sedp_write_endpoint (sedp_wr, 1, &rd->e.guid, &rd->e, &rd->c, rd->xqos, as, security);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1017,8 +1071,9 @@ int sedp_dispose_unregister_writer (struct writer *wr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if ((!is_builtin_entityid(wr->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!wr->e.onlylocal))
 | 
					  if ((!is_builtin_entityid(wr->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!wr->e.onlylocal))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    struct writer *sedp_wr = get_sedp_writer (wr->c.pp, NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER);
 | 
					    unsigned entityid = determine_publication_writer(wr);
 | 
				
			||||||
    return sedp_write_endpoint (sedp_wr, 0, &wr->e.guid, NULL, NULL, NULL, NULL);
 | 
					    struct writer *sedp_wr = get_sedp_writer (wr->c.pp, entityid);
 | 
				
			||||||
 | 
					    return sedp_write_endpoint (sedp_wr, 0, &wr->e.guid, NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1027,8 +1082,9 @@ int sedp_dispose_unregister_reader (struct reader *rd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if ((!is_builtin_entityid(rd->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!rd->e.onlylocal))
 | 
					  if ((!is_builtin_entityid(rd->e.guid.entityid, NN_VENDORID_ECLIPSE)) && (!rd->e.onlylocal))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    struct writer *sedp_wr = get_sedp_writer (rd->c.pp, NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER);
 | 
					    unsigned entityid = determine_subscription_writer(rd);
 | 
				
			||||||
    return sedp_write_endpoint (sedp_wr, 0, &rd->e.guid, NULL, NULL, NULL, NULL);
 | 
					    struct writer *sedp_wr = get_sedp_writer (rd->c.pp, entityid);
 | 
				
			||||||
 | 
					    return sedp_write_endpoint (sedp_wr, 0, &rd->e.guid, NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1594,7 +1650,13 @@ int builtins_dqueue_handler (const struct nn_rsample_info *sampleinfo, const str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pwr = sampleinfo->pwr;
 | 
					  pwr = sampleinfo->pwr;
 | 
				
			||||||
  if (pwr == NULL)
 | 
					  if (pwr == NULL)
 | 
				
			||||||
    assert (srcguid.entityid.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER);
 | 
					  {
 | 
				
			||||||
 | 
					    /* NULL with NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER is normal. It is possible that
 | 
				
			||||||
 | 
					     * NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER has NULL as well if there
 | 
				
			||||||
 | 
					     * is a security mismatch being handled. */
 | 
				
			||||||
 | 
					    assert ((srcguid.entityid.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER) ||
 | 
				
			||||||
 | 
					            (srcguid.entityid.u == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    assert (is_builtin_entityid (pwr->e.guid.entityid, pwr->c.vendor));
 | 
					    assert (is_builtin_entityid (pwr->e.guid.entityid, pwr->c.vendor));
 | 
				
			||||||
| 
						 | 
					@ -1690,6 +1752,7 @@ int builtins_dqueue_handler (const struct nn_rsample_info *sampleinfo, const str
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        case NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER:
 | 
					        case NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER:
 | 
				
			||||||
        case NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER:
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER:
 | 
				
			||||||
 | 
					        case NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER:
 | 
				
			||||||
          pid = PID_PARTICIPANT_GUID;
 | 
					          pid = PID_PARTICIPANT_GUID;
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case NN_ENTITYID_SEDP_BUILTIN_CM_PUBLISHER_WRITER:
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_CM_PUBLISHER_WRITER:
 | 
				
			||||||
| 
						 | 
					@ -1698,6 +1761,8 @@ int builtins_dqueue_handler (const struct nn_rsample_info *sampleinfo, const str
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER:
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER:
 | 
				
			||||||
        case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER:
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER:
 | 
				
			||||||
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER:
 | 
				
			||||||
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER:
 | 
				
			||||||
          pid = PID_ENDPOINT_GUID;
 | 
					          pid = PID_ENDPOINT_GUID;
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case NN_ENTITYID_SEDP_BUILTIN_TOPIC_WRITER:
 | 
					        case NN_ENTITYID_SEDP_BUILTIN_TOPIC_WRITER:
 | 
				
			||||||
| 
						 | 
					@ -1736,18 +1801,27 @@ int builtins_dqueue_handler (const struct nn_rsample_info *sampleinfo, const str
 | 
				
			||||||
  switch (srcguid.entityid.u)
 | 
					  switch (srcguid.entityid.u)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    case NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER:
 | 
					    case NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER:
 | 
				
			||||||
      handle_SPDP (sampleinfo->rst, sampleinfo->seq, timestamp, statusinfo, datap, datasz);
 | 
					    case NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER:
 | 
				
			||||||
 | 
					      handle_SPDP (sampleinfo->rst, srcguid.entityid, sampleinfo->seq, timestamp, statusinfo, datap, datasz);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER:
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER:
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER:
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER:
 | 
				
			||||||
      handle_SEDP (sampleinfo->rst, sampleinfo->seq, timestamp, statusinfo, datap, datasz);
 | 
					      handle_SEDP (sampleinfo->rst, sampleinfo->seq, timestamp, statusinfo, datap, datasz);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER:
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER:
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER:
 | 
				
			||||||
      handle_PMD (sampleinfo->rst, timestamp, statusinfo, datap, datasz);
 | 
					      handle_PMD (sampleinfo->rst, timestamp, statusinfo, datap, datasz);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER:
 | 
				
			||||||
      handle_SEDP_CM (sampleinfo->rst, srcguid.entityid, timestamp, statusinfo, datap, datasz);
 | 
					      handle_SEDP_CM (sampleinfo->rst, srcguid.entityid, timestamp, statusinfo, datap, datasz);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER:
 | 
				
			||||||
 | 
					      /* TODO: Handshake */
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      GVLOGDISC ("data(builtin, vendor %u.%u): "PGUIDFMT" #%"PRId64": not handled\n",
 | 
					      GVLOGDISC ("data(builtin, vendor %u.%u): "PGUIDFMT" #%"PRId64": not handled\n",
 | 
				
			||||||
                 sampleinfo->rst->vendor.id[0], sampleinfo->rst->vendor.id[1],
 | 
					                 sampleinfo->rst->vendor.id[0], sampleinfo->rst->vendor.id[1],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,7 @@
 | 
				
			||||||
#include "dds__whc.h"
 | 
					#include "dds__whc.h"
 | 
				
			||||||
#include "dds/ddsi/ddsi_iid.h"
 | 
					#include "dds/ddsi/ddsi_iid.h"
 | 
				
			||||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
					#include "dds/ddsi/ddsi_tkmap.h"
 | 
				
			||||||
 | 
					#include "dds/ddsi/ddsi_security_omg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct deleted_participant {
 | 
					struct deleted_participant {
 | 
				
			||||||
  ddsrt_avl_node_t avlnode;
 | 
					  ddsrt_avl_node_t avlnode;
 | 
				
			||||||
| 
						 | 
					@ -461,6 +462,76 @@ static void pp_release_entityid(struct participant *pp, ddsi_entityid_t id)
 | 
				
			||||||
  ddsrt_mutex_unlock (&pp->e.lock);
 | 
					  ddsrt_mutex_unlock (&pp->e.lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void force_as_disc_address(struct q_globals *gv, const ddsi_guid_t *subguid)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  struct writer *wr = ephash_lookup_writer_guid (gv->guid_hash, subguid);
 | 
				
			||||||
 | 
					  assert (wr != NULL);
 | 
				
			||||||
 | 
					  ddsrt_mutex_lock (&wr->e.lock);
 | 
				
			||||||
 | 
					  unref_addrset (wr->as);
 | 
				
			||||||
 | 
					  unref_addrset (wr->as_group);
 | 
				
			||||||
 | 
					  wr->as = ref_addrset (gv->as_disc);
 | 
				
			||||||
 | 
					  wr->as_group = ref_addrset (gv->as_disc_group);
 | 
				
			||||||
 | 
					  ddsrt_mutex_unlock (&wr->e.lock);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					static void add_security_builtin_endpoints(struct participant *pp, ddsi_guid_t *subguid, const ddsi_guid_t *group_guid, struct q_globals *gv, bool add_writers, bool add_readers)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (add_writers)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER);
 | 
				
			||||||
 | 
					    new_writer_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_wr, whc_new(gv, 1, 1, 1), NULL, NULL);
 | 
				
			||||||
 | 
					    /* But we need the as_disc address set for SPDP, because we need to
 | 
				
			||||||
 | 
					       send it to everyone regardless of the existence of readers. */
 | 
				
			||||||
 | 
					    force_as_disc_address(gv, subguid);
 | 
				
			||||||
 | 
					    pp->bes |= NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER);
 | 
				
			||||||
 | 
					    new_writer_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_stateless_xqos_wr, whc_new(gv, 0, 1, 1), NULL, NULL);
 | 
				
			||||||
 | 
					    pp->bes |= NN_BUILTIN_ENDPOINT_PARTICIPANT_STATELESS_MESSAGE_ANNOUNCER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER);
 | 
				
			||||||
 | 
					    new_writer_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_wr, whc_new(gv, 1, 1, 1), NULL, NULL);
 | 
				
			||||||
 | 
					    pp->bes |= NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER);
 | 
				
			||||||
 | 
					    new_writer_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_wr, whc_new(gv, 1, 1, 1), NULL, NULL);
 | 
				
			||||||
 | 
					    pp->bes |= NN_BUILTIN_ENDPOINT_PUBLICATION_MESSAGE_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER);
 | 
				
			||||||
 | 
					    new_writer_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_wr, whc_new(gv, 1, 1, 1), NULL, NULL);
 | 
				
			||||||
 | 
					    pp->bes |= NN_BUILTIN_ENDPOINT_SUBSCRIPTION_MESSAGE_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (add_readers)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_READER);
 | 
				
			||||||
 | 
					    new_reader_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_rd, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					    pp->bes |= NN_BUILTIN_ENDPOINT_SUBSCRIPTION_MESSAGE_SECURE_DETECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subguid->entityid = to_entityid (NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_READER);
 | 
				
			||||||
 | 
					    new_reader_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_rd, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					    pp->bes |= NN_BUILTIN_ENDPOINT_PUBLICATION_MESSAGE_SECURE_DETECTOR;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					   * When security is enabled configure the associated necessary builtin readers independent of the
 | 
				
			||||||
 | 
					   * besmode flag setting, because all participant do require authentication.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  subguid->entityid = to_entityid (NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_READER);
 | 
				
			||||||
 | 
					  new_reader_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_rd, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					  pp->bes |= NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_SECURE_DETECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  subguid->entityid = to_entityid (NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_READER);
 | 
				
			||||||
 | 
					  new_reader_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_stateless_xqos_rd, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					  pp->bes |= NN_BUILTIN_ENDPOINT_PARTICIPANT_STATELESS_MESSAGE_DETECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  subguid->entityid = to_entityid (NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_READER);
 | 
				
			||||||
 | 
					  new_reader_guid (NULL, subguid, group_guid, pp, NULL, &gv->builtin_endpoint_xqos_rd, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					  pp->bes |= NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_SECURE_DETECTOR;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct q_globals *gv, unsigned flags, const nn_plist_t *plist)
 | 
					dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct q_globals *gv, unsigned flags, const nn_plist_t *plist)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct participant *pp;
 | 
					  struct participant *pp;
 | 
				
			||||||
| 
						 | 
					@ -591,16 +662,7 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct q_globals *
 | 
				
			||||||
    new_writer_guid (NULL, &subguid, &group_guid, pp, NULL, &gv->spdp_endpoint_xqos, whc_new(gv, 1, 1, 1), LAST_WR_PARAMS);
 | 
					    new_writer_guid (NULL, &subguid, &group_guid, pp, NULL, &gv->spdp_endpoint_xqos, whc_new(gv, 1, 1, 1), LAST_WR_PARAMS);
 | 
				
			||||||
    /* But we need the as_disc address set for SPDP, because we need to
 | 
					    /* But we need the as_disc address set for SPDP, because we need to
 | 
				
			||||||
       send it to everyone regardless of the existence of readers. */
 | 
					       send it to everyone regardless of the existence of readers. */
 | 
				
			||||||
    {
 | 
					    force_as_disc_address(gv, &subguid);
 | 
				
			||||||
      struct writer *wr = ephash_lookup_writer_guid (gv->guid_hash, &subguid);
 | 
					 | 
				
			||||||
      assert (wr != NULL);
 | 
					 | 
				
			||||||
      ddsrt_mutex_lock (&wr->e.lock);
 | 
					 | 
				
			||||||
      unref_addrset (wr->as);
 | 
					 | 
				
			||||||
      unref_addrset (wr->as_group);
 | 
					 | 
				
			||||||
      wr->as = ref_addrset (gv->as_disc);
 | 
					 | 
				
			||||||
      wr->as_group = ref_addrset (gv->as_disc_group);
 | 
					 | 
				
			||||||
      ddsrt_mutex_unlock (&wr->e.lock);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    pp->bes |= NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_ANNOUNCER;
 | 
					    pp->bes |= NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_ANNOUNCER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -679,6 +741,14 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct q_globals *
 | 
				
			||||||
    pp->prismtech_bes |= NN_DISC_BUILTIN_ENDPOINT_CM_SUBSCRIBER_READER;
 | 
					    pp->prismtech_bes |= NN_DISC_BUILTIN_ENDPOINT_CM_SUBSCRIBER_READER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  if (q_omg_participant_is_secure(pp))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    add_security_builtin_endpoints(pp, &subguid, &group_guid, gv, !(flags & RTPS_PF_NO_BUILTIN_WRITERS), !(flags & RTPS_PF_NO_BUILTIN_READERS));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef LAST_WR_PARAMS
 | 
					#undef LAST_WR_PARAMS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* If the participant doesn't have the full set of builtin writers
 | 
					  /* If the participant doesn't have the full set of builtin writers
 | 
				
			||||||
| 
						 | 
					@ -830,6 +900,17 @@ static void unref_participant (struct participant *pp, const struct ddsi_guid *g
 | 
				
			||||||
    NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_READER,
 | 
					    NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_READER,
 | 
				
			||||||
    NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_READER,
 | 
					    NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_READER,
 | 
				
			||||||
    NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER,
 | 
					    NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER,
 | 
				
			||||||
 | 
					    /* Security ones: */
 | 
				
			||||||
 | 
					    NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_READER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_READER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_READER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_READER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER,
 | 
				
			||||||
 | 
					    NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_READER,
 | 
				
			||||||
    /* PrismTech ones: */
 | 
					    /* PrismTech ones: */
 | 
				
			||||||
    NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER,
 | 
					    NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER,
 | 
				
			||||||
    NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_READER,
 | 
					    NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_READER,
 | 
				
			||||||
| 
						 | 
					@ -913,7 +994,7 @@ static void unref_participant (struct participant *pp, const struct ddsi_guid *g
 | 
				
			||||||
          (pp->prismtech_bes & prismtech_builtin_writers_besmask) != prismtech_builtin_writers_besmask)
 | 
					          (pp->prismtech_bes & prismtech_builtin_writers_besmask) != prismtech_builtin_writers_besmask)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        /* Participant doesn't have a full complement of built-in
 | 
					        /* Participant doesn't have a full complement of built-in
 | 
				
			||||||
           writers, therefore, it relies on gv.privileged_pp, and
 | 
					           writers, therefore, it relies on gv->privileged_pp, and
 | 
				
			||||||
           therefore we must decrement the reference count of that one.
 | 
					           therefore we must decrement the reference count of that one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
           Why read it with the lock held, only to release it and use it
 | 
					           Why read it with the lock held, only to release it and use it
 | 
				
			||||||
| 
						 | 
					@ -1002,9 +1083,15 @@ struct writer *get_builtin_writer (const struct participant *pp, unsigned entity
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER:
 | 
				
			||||||
      bes_mask = NN_DISC_BUILTIN_ENDPOINT_SUBSCRIPTION_ANNOUNCER;
 | 
					      bes_mask = NN_DISC_BUILTIN_ENDPOINT_SUBSCRIPTION_ANNOUNCER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER:
 | 
				
			||||||
 | 
					      bes_mask = NN_BUILTIN_ENDPOINT_SUBSCRIPTION_MESSAGE_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER:
 | 
				
			||||||
      bes_mask = NN_DISC_BUILTIN_ENDPOINT_PUBLICATION_ANNOUNCER;
 | 
					      bes_mask = NN_DISC_BUILTIN_ENDPOINT_PUBLICATION_ANNOUNCER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER:
 | 
				
			||||||
 | 
					      bes_mask = NN_BUILTIN_ENDPOINT_PUBLICATION_MESSAGE_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER:
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER:
 | 
				
			||||||
      bes_mask = NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_DATA_WRITER;
 | 
					      bes_mask = NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_DATA_WRITER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
| 
						 | 
					@ -1020,6 +1107,15 @@ struct writer *get_builtin_writer (const struct participant *pp, unsigned entity
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_TOPIC_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_TOPIC_WRITER:
 | 
				
			||||||
      bes_mask = NN_DISC_BUILTIN_ENDPOINT_TOPIC_ANNOUNCER;
 | 
					      bes_mask = NN_DISC_BUILTIN_ENDPOINT_TOPIC_ANNOUNCER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER:
 | 
				
			||||||
 | 
					      bes_mask = NN_DISC_BUILTIN_ENDPOINT_PARTICIPANT_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER:
 | 
				
			||||||
 | 
					      bes_mask = NN_BUILTIN_ENDPOINT_PARTICIPANT_STATELESS_MESSAGE_ANNOUNCER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER:
 | 
				
			||||||
 | 
					      bes_mask = NN_BUILTIN_ENDPOINT_PARTICIPANT_MESSAGE_SECURE_ANNOUNCER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      DDS_FATAL ("get_builtin_writer called with entityid %x\n", entityid);
 | 
					      DDS_FATAL ("get_builtin_writer called with entityid %x\n", entityid);
 | 
				
			||||||
      return NULL;
 | 
					      return NULL;
 | 
				
			||||||
| 
						 | 
					@ -1385,7 +1481,7 @@ void rebuild_or_clear_writer_addrsets (struct q_globals *gv, int rebuild)
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      /* SPDP writers have no matched readers, instead they all use the same address space,
 | 
					      /* SPDP writers have no matched readers, instead they all use the same address space,
 | 
				
			||||||
         gv.as_disc. Keep as_disc unchanged, and instead make the participants point to the
 | 
					         gv->as_disc. Keep as_disc unchanged, and instead make the participants point to the
 | 
				
			||||||
         empty one. */
 | 
					         empty one. */
 | 
				
			||||||
      unref_addrset(wr->as);
 | 
					      unref_addrset(wr->as);
 | 
				
			||||||
      if (rebuild)
 | 
					      if (rebuild)
 | 
				
			||||||
| 
						 | 
					@ -2112,6 +2208,13 @@ static ddsi_entityid_t builtin_entityid_match (ddsi_entityid_t x)
 | 
				
			||||||
      res.u = NN_ENTITYID_UNKNOWN;
 | 
					      res.u = NN_ENTITYID_UNKNOWN;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_READER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_READER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_READER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_READER:
 | 
				
			||||||
      res.u = NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER;
 | 
					      res.u = NN_ENTITYID_SEDP_BUILTIN_CM_PARTICIPANT_WRITER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
| 
						 | 
					@ -2130,6 +2233,30 @@ static ddsi_entityid_t builtin_entityid_match (ddsi_entityid_t x)
 | 
				
			||||||
    case NN_ENTITYID_SEDP_BUILTIN_CM_SUBSCRIBER_WRITER:
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_CM_SUBSCRIBER_WRITER:
 | 
				
			||||||
      res.u = NN_ENTITYID_SEDP_BUILTIN_CM_SUBSCRIBER_READER;
 | 
					      res.u = NN_ENTITYID_SEDP_BUILTIN_CM_SUBSCRIBER_READER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_READER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_READER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_READER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_READER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_SECURE_WRITER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_READER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_READER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_SECURE_WRITER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_READER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_READER:
 | 
				
			||||||
 | 
					      res.u = NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_SECURE_WRITER;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      assert (0);
 | 
					      assert (0);
 | 
				
			||||||
| 
						 | 
					@ -2815,7 +2942,8 @@ static void new_writer_guid_common_init (struct writer *wr, const struct ddsi_se
 | 
				
			||||||
  if (is_builtin_entityid (wr->e.guid.entityid, NN_VENDORID_ECLIPSE))
 | 
					  if (is_builtin_entityid (wr->e.guid.entityid, NN_VENDORID_ECLIPSE))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    assert (wr->xqos->history.kind == DDS_HISTORY_KEEP_LAST);
 | 
					    assert (wr->xqos->history.kind == DDS_HISTORY_KEEP_LAST);
 | 
				
			||||||
    assert (wr->xqos->durability.kind == DDS_DURABILITY_TRANSIENT_LOCAL);
 | 
					    assert (wr->xqos->durability.kind == DDS_DURABILITY_TRANSIENT_LOCAL ||
 | 
				
			||||||
 | 
					            wr->e.guid.entityid.u == NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  wr->handle_as_transient_local = (wr->xqos->durability.kind == DDS_DURABILITY_TRANSIENT_LOCAL);
 | 
					  wr->handle_as_transient_local = (wr->xqos->durability.kind == DDS_DURABILITY_TRANSIENT_LOCAL);
 | 
				
			||||||
  wr->include_keyhash =
 | 
					  wr->include_keyhash =
 | 
				
			||||||
| 
						 | 
					@ -3614,6 +3742,158 @@ void proxy_participant_reassign_lease (struct proxy_participant *proxypp, struct
 | 
				
			||||||
  ddsrt_mutex_unlock (&proxypp->e.lock);
 | 
					  ddsrt_mutex_unlock (&proxypp->e.lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct bestab {
 | 
				
			||||||
 | 
					  unsigned besflag;
 | 
				
			||||||
 | 
					  unsigned prismtech_besflag;
 | 
				
			||||||
 | 
					  unsigned entityid;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void create_proxy_builtin_endpoints(
 | 
				
			||||||
 | 
					  struct q_globals *gv,
 | 
				
			||||||
 | 
					  const struct bestab *bestab,
 | 
				
			||||||
 | 
					  int nbes,
 | 
				
			||||||
 | 
					  const struct ddsi_guid *ppguid,
 | 
				
			||||||
 | 
					  struct proxy_participant *proxypp,
 | 
				
			||||||
 | 
					  nn_wctime_t timestamp,
 | 
				
			||||||
 | 
					  dds_qos_t *xqos_wr,
 | 
				
			||||||
 | 
					  dds_qos_t *xqos_rd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  nn_plist_t plist_rd, plist_wr;
 | 
				
			||||||
 | 
					  int i;
 | 
				
			||||||
 | 
					  /* Note: no entity name or group GUID supplied, but that shouldn't
 | 
				
			||||||
 | 
					   * matter, as these are internal to DDSI and don't use group
 | 
				
			||||||
 | 
					   * coherency
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  nn_plist_init_empty (&plist_wr);
 | 
				
			||||||
 | 
					  nn_plist_init_empty (&plist_rd);
 | 
				
			||||||
 | 
					  nn_xqos_copy (&plist_wr.qos, xqos_wr);
 | 
				
			||||||
 | 
					  nn_xqos_copy (&plist_rd.qos, xqos_rd);
 | 
				
			||||||
 | 
					  for (i = 0; i < nbes; i++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    const struct bestab *te = &bestab[i];
 | 
				
			||||||
 | 
					    if ((proxypp->bes & te->besflag) || (proxypp->prismtech_bes & te->prismtech_besflag))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ddsi_guid_t guid1;
 | 
				
			||||||
 | 
					      guid1.prefix = proxypp->e.guid.prefix;
 | 
				
			||||||
 | 
					      guid1.entityid.u = te->entityid;
 | 
				
			||||||
 | 
					      assert (is_builtin_entityid (guid1.entityid, proxypp->vendor));
 | 
				
			||||||
 | 
					      if (is_writer_entityid (guid1.entityid))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        new_proxy_writer (gv, ppguid, &guid1, proxypp->as_meta, &plist_wr, gv->builtins_dqueue, gv->xevents, timestamp, 0);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SSM
 | 
				
			||||||
 | 
					        const int ssm = addrset_contains_ssm (gv, proxypp->as_meta);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        const int ssm = 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        new_proxy_reader (gv, ppguid, &guid1, proxypp->as_meta, &plist_rd, timestamp, 0, ssm);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  nn_plist_fini (&plist_wr);
 | 
				
			||||||
 | 
					  nn_plist_fini (&plist_rd);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void add_proxy_builtin_endpoints(
 | 
				
			||||||
 | 
					  struct q_globals *gv,
 | 
				
			||||||
 | 
					  const struct ddsi_guid *ppguid,
 | 
				
			||||||
 | 
					  struct proxy_participant *proxypp,
 | 
				
			||||||
 | 
					  nn_wctime_t timestamp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* Add proxy endpoints based on the advertised (& possibly augmented
 | 
				
			||||||
 | 
					     ...) built-in endpoint set. */
 | 
				
			||||||
 | 
					#define PT_TE(ap_, a_, bp_, b_) { 0, NN_##ap_##BUILTIN_ENDPOINT_##a_, NN_ENTITYID_##bp_##_BUILTIN_##b_ }
 | 
				
			||||||
 | 
					#define TE(ap_, a_, bp_, b_) { NN_##ap_##BUILTIN_ENDPOINT_##a_, 0, NN_ENTITYID_##bp_##_BUILTIN_##b_ }
 | 
				
			||||||
 | 
					#define LTE(a_, bp_, b_) { NN_##BUILTIN_ENDPOINT_##a_, 0, NN_ENTITYID_##bp_##_BUILTIN_##b_ }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* 'Default' proxy endpoints. */
 | 
				
			||||||
 | 
					  static const struct bestab bestab_default[] = {
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					    /* SPDP gets special treatment => no need for proxy
 | 
				
			||||||
 | 
					       writers/readers */
 | 
				
			||||||
 | 
					    TE (DISC_, PARTICIPANT_ANNOUNCER, SPDP, PARTICIPANT_WRITER),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    TE (DISC_, PARTICIPANT_DETECTOR, SPDP, PARTICIPANT_READER),
 | 
				
			||||||
 | 
					    TE (DISC_, PUBLICATION_ANNOUNCER, SEDP, PUBLICATIONS_WRITER),
 | 
				
			||||||
 | 
					    TE (DISC_, PUBLICATION_DETECTOR, SEDP, PUBLICATIONS_READER),
 | 
				
			||||||
 | 
					    TE (DISC_, SUBSCRIPTION_ANNOUNCER, SEDP, SUBSCRIPTIONS_WRITER),
 | 
				
			||||||
 | 
					    TE (DISC_, SUBSCRIPTION_DETECTOR, SEDP, SUBSCRIPTIONS_READER),
 | 
				
			||||||
 | 
					    LTE (PARTICIPANT_MESSAGE_DATA_WRITER, P2P, PARTICIPANT_MESSAGE_WRITER),
 | 
				
			||||||
 | 
					    LTE (PARTICIPANT_MESSAGE_DATA_READER, P2P, PARTICIPANT_MESSAGE_READER),
 | 
				
			||||||
 | 
					    TE (DISC_, TOPIC_ANNOUNCER, SEDP, TOPIC_WRITER),
 | 
				
			||||||
 | 
					    TE (DISC_, TOPIC_DETECTOR, SEDP, TOPIC_READER),
 | 
				
			||||||
 | 
					    PT_TE (DISC_, CM_PARTICIPANT_READER, SEDP, CM_PARTICIPANT_READER),
 | 
				
			||||||
 | 
					    PT_TE (DISC_, CM_PARTICIPANT_WRITER, SEDP, CM_PARTICIPANT_WRITER),
 | 
				
			||||||
 | 
					    PT_TE (DISC_, CM_PUBLISHER_READER, SEDP, CM_PUBLISHER_READER),
 | 
				
			||||||
 | 
					    PT_TE (DISC_, CM_PUBLISHER_WRITER, SEDP, CM_PUBLISHER_WRITER),
 | 
				
			||||||
 | 
					    PT_TE (DISC_, CM_SUBSCRIBER_READER, SEDP, CM_SUBSCRIBER_READER),
 | 
				
			||||||
 | 
					    PT_TE (DISC_, CM_SUBSCRIBER_WRITER, SEDP, CM_SUBSCRIBER_WRITER)
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  create_proxy_builtin_endpoints(gv,
 | 
				
			||||||
 | 
					                                 bestab_default,
 | 
				
			||||||
 | 
					                                 (int)(sizeof (bestab_default) / sizeof (*bestab_default)),
 | 
				
			||||||
 | 
					                                 ppguid,
 | 
				
			||||||
 | 
					                                 proxypp,
 | 
				
			||||||
 | 
					                                 timestamp,
 | 
				
			||||||
 | 
					                                 &gv->builtin_endpoint_xqos_wr,
 | 
				
			||||||
 | 
					                                 &gv->builtin_endpoint_xqos_rd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  /* Security 'default' proxy endpoints. */
 | 
				
			||||||
 | 
					  static const struct bestab bestab_security[] = {
 | 
				
			||||||
 | 
					    LTE (PUBLICATION_MESSAGE_SECURE_ANNOUNCER, SEDP, PUBLICATIONS_SECURE_WRITER),
 | 
				
			||||||
 | 
					    LTE (PUBLICATION_MESSAGE_SECURE_DETECTOR, SEDP, PUBLICATIONS_SECURE_READER),
 | 
				
			||||||
 | 
					    LTE (SUBSCRIPTION_MESSAGE_SECURE_ANNOUNCER, SEDP, SUBSCRIPTIONS_SECURE_WRITER),
 | 
				
			||||||
 | 
					    LTE (SUBSCRIPTION_MESSAGE_SECURE_DETECTOR, SEDP, SUBSCRIPTIONS_SECURE_READER),
 | 
				
			||||||
 | 
					    LTE (PARTICIPANT_MESSAGE_SECURE_ANNOUNCER, P2P, PARTICIPANT_MESSAGE_SECURE_WRITER),
 | 
				
			||||||
 | 
					    LTE (PARTICIPANT_MESSAGE_SECURE_DETECTOR, P2P, PARTICIPANT_MESSAGE_SECURE_READER),
 | 
				
			||||||
 | 
					    TE (DISC_, PARTICIPANT_SECURE_ANNOUNCER, SPDP_RELIABLE, PARTICIPANT_SECURE_WRITER),
 | 
				
			||||||
 | 
					    TE (DISC_, PARTICIPANT_SECURE_DETECTOR, SPDP_RELIABLE, PARTICIPANT_SECURE_READER)
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  create_proxy_builtin_endpoints(gv,
 | 
				
			||||||
 | 
					                                 bestab_security,
 | 
				
			||||||
 | 
					                                 (int)(sizeof (bestab_security) / sizeof (*bestab_security)),
 | 
				
			||||||
 | 
					                                 ppguid,
 | 
				
			||||||
 | 
					                                 proxypp,
 | 
				
			||||||
 | 
					                                 timestamp,
 | 
				
			||||||
 | 
					                                 &gv->builtin_endpoint_xqos_wr,
 | 
				
			||||||
 | 
					                                 &gv->builtin_endpoint_xqos_rd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Security 'stateless' proxy endpoints. */
 | 
				
			||||||
 | 
					  static const struct bestab bestab_stateless[] = {
 | 
				
			||||||
 | 
					    LTE (PARTICIPANT_STATELESS_MESSAGE_ANNOUNCER, P2P, PARTICIPANT_STATELESS_MESSAGE_WRITER),
 | 
				
			||||||
 | 
					    LTE (PARTICIPANT_STATELESS_MESSAGE_DETECTOR, P2P, PARTICIPANT_STATELESS_MESSAGE_READER)
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  create_proxy_builtin_endpoints(gv,
 | 
				
			||||||
 | 
					                                 bestab_stateless,
 | 
				
			||||||
 | 
					                                 (int)(sizeof (bestab_stateless) / sizeof (*bestab_stateless)),
 | 
				
			||||||
 | 
					                                 ppguid,
 | 
				
			||||||
 | 
					                                 proxypp,
 | 
				
			||||||
 | 
					                                 timestamp,
 | 
				
			||||||
 | 
					                                 &gv->builtin_stateless_xqos_wr,
 | 
				
			||||||
 | 
					                                 &gv->builtin_stateless_xqos_rd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Register lease, but be careful not to accidentally re-register
 | 
				
			||||||
 | 
					     DDSI2's lease, as we may have become dependent on DDSI2 any time
 | 
				
			||||||
 | 
					     after ephash_insert_proxy_participant_guid even if
 | 
				
			||||||
 | 
					     privileged_pp_guid was NULL originally */
 | 
				
			||||||
 | 
					  ddsrt_mutex_lock (&proxypp->e.lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (proxypp->owns_lease)
 | 
				
			||||||
 | 
					    lease_register (ddsrt_atomic_ldvoidp (&proxypp->lease));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  builtintopic_write (gv->builtin_topic_interface, &proxypp->e, timestamp, true);
 | 
				
			||||||
 | 
					  ddsrt_mutex_unlock (&proxypp->e.lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef PT_TE
 | 
				
			||||||
 | 
					#undef TE
 | 
				
			||||||
 | 
					#undef LTE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void new_proxy_participant
 | 
					void new_proxy_participant
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
  struct q_globals *gv,
 | 
					  struct q_globals *gv,
 | 
				
			||||||
| 
						 | 
					@ -3720,89 +4000,8 @@ void new_proxy_participant
 | 
				
			||||||
     new_proxy_{writer,reader} to work */
 | 
					     new_proxy_{writer,reader} to work */
 | 
				
			||||||
  ephash_insert_proxy_participant_guid (gv->guid_hash, proxypp);
 | 
					  ephash_insert_proxy_participant_guid (gv->guid_hash, proxypp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Add proxy endpoints based on the advertised (& possibly augmented
 | 
					  /* TODO: Do security checks on the proxy participant. Either add the endpoints or delete the proxy. */
 | 
				
			||||||
     ...) built-in endpoint set. */
 | 
					  add_proxy_builtin_endpoints(gv, ppguid, proxypp, timestamp);
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
#define PT_TE(ap_, a_, bp_, b_) { 0, NN_##ap_##BUILTIN_ENDPOINT_##a_, NN_ENTITYID_##bp_##_BUILTIN_##b_ }
 | 
					 | 
				
			||||||
#define TE(ap_, a_, bp_, b_) { NN_##ap_##BUILTIN_ENDPOINT_##a_, 0, NN_ENTITYID_##bp_##_BUILTIN_##b_ }
 | 
					 | 
				
			||||||
#define LTE(a_, bp_, b_) { NN_##BUILTIN_ENDPOINT_##a_, 0, NN_ENTITYID_##bp_##_BUILTIN_##b_ }
 | 
					 | 
				
			||||||
    static const struct bestab {
 | 
					 | 
				
			||||||
      unsigned besflag;
 | 
					 | 
				
			||||||
      unsigned prismtech_besflag;
 | 
					 | 
				
			||||||
      unsigned entityid;
 | 
					 | 
				
			||||||
    } bestab[] = {
 | 
					 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
      /* SPDP gets special treatment => no need for proxy
 | 
					 | 
				
			||||||
         writers/readers */
 | 
					 | 
				
			||||||
      TE (DISC_, PARTICIPANT_ANNOUNCER, SPDP, PARTICIPANT_WRITER),
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
      TE (DISC_, PARTICIPANT_DETECTOR, SPDP, PARTICIPANT_READER),
 | 
					 | 
				
			||||||
      TE (DISC_, PUBLICATION_ANNOUNCER, SEDP, PUBLICATIONS_WRITER),
 | 
					 | 
				
			||||||
      TE (DISC_, PUBLICATION_DETECTOR, SEDP, PUBLICATIONS_READER),
 | 
					 | 
				
			||||||
      TE (DISC_, SUBSCRIPTION_ANNOUNCER, SEDP, SUBSCRIPTIONS_WRITER),
 | 
					 | 
				
			||||||
      TE (DISC_, SUBSCRIPTION_DETECTOR, SEDP, SUBSCRIPTIONS_READER),
 | 
					 | 
				
			||||||
      LTE (PARTICIPANT_MESSAGE_DATA_WRITER, P2P, PARTICIPANT_MESSAGE_WRITER),
 | 
					 | 
				
			||||||
      LTE (PARTICIPANT_MESSAGE_DATA_READER, P2P, PARTICIPANT_MESSAGE_READER),
 | 
					 | 
				
			||||||
      TE (DISC_, TOPIC_ANNOUNCER, SEDP, TOPIC_WRITER),
 | 
					 | 
				
			||||||
      TE (DISC_, TOPIC_DETECTOR, SEDP, TOPIC_READER),
 | 
					 | 
				
			||||||
      PT_TE (DISC_, CM_PARTICIPANT_READER, SEDP, CM_PARTICIPANT_READER),
 | 
					 | 
				
			||||||
      PT_TE (DISC_, CM_PARTICIPANT_WRITER, SEDP, CM_PARTICIPANT_WRITER),
 | 
					 | 
				
			||||||
      PT_TE (DISC_, CM_PUBLISHER_READER, SEDP, CM_PUBLISHER_READER),
 | 
					 | 
				
			||||||
      PT_TE (DISC_, CM_PUBLISHER_WRITER, SEDP, CM_PUBLISHER_WRITER),
 | 
					 | 
				
			||||||
      PT_TE (DISC_, CM_SUBSCRIBER_READER, SEDP, CM_SUBSCRIBER_READER),
 | 
					 | 
				
			||||||
      PT_TE (DISC_, CM_SUBSCRIBER_WRITER, SEDP, CM_SUBSCRIBER_WRITER)
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
#undef PT_TE
 | 
					 | 
				
			||||||
#undef TE
 | 
					 | 
				
			||||||
#undef LTE
 | 
					 | 
				
			||||||
    nn_plist_t plist_rd, plist_wr;
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
    /* Note: no entity name or group GUID supplied, but that shouldn't
 | 
					 | 
				
			||||||
       matter, as these are internal to DDSI and don't use group
 | 
					 | 
				
			||||||
       coherency */
 | 
					 | 
				
			||||||
    nn_plist_init_empty (&plist_wr);
 | 
					 | 
				
			||||||
    nn_plist_init_empty (&plist_rd);
 | 
					 | 
				
			||||||
    nn_xqos_copy (&plist_wr.qos, &gv->builtin_endpoint_xqos_wr);
 | 
					 | 
				
			||||||
    nn_xqos_copy (&plist_rd.qos, &gv->builtin_endpoint_xqos_rd);
 | 
					 | 
				
			||||||
    for (i = 0; i < (int) (sizeof (bestab) / sizeof (*bestab)); i++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      const struct bestab *te = &bestab[i];
 | 
					 | 
				
			||||||
      if ((proxypp->bes & te->besflag) || (proxypp->prismtech_bes & te->prismtech_besflag))
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        ddsi_guid_t guid1;
 | 
					 | 
				
			||||||
        guid1.prefix = proxypp->e.guid.prefix;
 | 
					 | 
				
			||||||
        guid1.entityid.u = te->entityid;
 | 
					 | 
				
			||||||
        assert (is_builtin_entityid (guid1.entityid, proxypp->vendor));
 | 
					 | 
				
			||||||
        if (is_writer_entityid (guid1.entityid))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          new_proxy_writer (gv, ppguid, &guid1, proxypp->as_meta, &plist_wr, gv->builtins_dqueue, gv->xevents, timestamp, 0);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
#ifdef DDSI_INCLUDE_SSM
 | 
					 | 
				
			||||||
          const int ssm = addrset_contains_ssm (gv, proxypp->as_meta);
 | 
					 | 
				
			||||||
          new_proxy_reader (gv, ppguid, &guid1, proxypp->as_meta, &plist_rd, timestamp, 0, ssm);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
          new_proxy_reader (gv, ppguid, &guid1, proxypp->as_meta, &plist_rd, timestamp, 0);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nn_plist_fini (&plist_wr);
 | 
					 | 
				
			||||||
    nn_plist_fini (&plist_rd);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Register lease, but be careful not to accidentally re-register
 | 
					 | 
				
			||||||
     DDSI2's lease, as we may have become dependent on DDSI2 any time
 | 
					 | 
				
			||||||
     after ephash_insert_proxy_participant_guid even if
 | 
					 | 
				
			||||||
     privileged_pp_guid was NULL originally */
 | 
					 | 
				
			||||||
  ddsrt_mutex_lock (&proxypp->e.lock);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (proxypp->owns_lease)
 | 
					 | 
				
			||||||
    lease_register (ddsrt_atomic_ldvoidp (&proxypp->lease));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  builtintopic_write (gv->builtin_topic_interface, &proxypp->e, timestamp, true);
 | 
					 | 
				
			||||||
  ddsrt_mutex_unlock (&proxypp->e.lock);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, seqno_t seq, const struct nn_plist *datap, enum update_proxy_participant_source source, nn_wctime_t timestamp)
 | 
					int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, seqno_t seq, const struct nn_plist *datap, enum update_proxy_participant_source source, nn_wctime_t timestamp)
 | 
				
			||||||
| 
						 | 
					@ -4104,12 +4303,27 @@ static void proxy_endpoint_common_fini (struct entity_common *e, struct proxy_en
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PROXY-WRITER ----------------------------------------------------- */
 | 
					/* PROXY-WRITER ----------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static enum nn_reorder_mode
 | 
				
			||||||
 | 
					get_proxy_writer_reorder_mode(const ddsi_entityid_t pwr_entityid, int isreliable)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (isreliable)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return NN_REORDER_MODE_NORMAL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (pwr_entityid.u == NN_ENTITYID_P2P_BUILTIN_PARTICIPANT_STATELESS_MESSAGE_WRITER)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return NN_REORDER_MODE_ALWAYS_DELIVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return NN_REORDER_MODE_MONOTONICALLY_INCREASING;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int new_proxy_writer (struct q_globals *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const nn_plist_t *plist, struct nn_dqueue *dqueue, struct xeventq *evq, nn_wctime_t timestamp, seqno_t seq)
 | 
					int new_proxy_writer (struct q_globals *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const nn_plist_t *plist, struct nn_dqueue *dqueue, struct xeventq *evq, nn_wctime_t timestamp, seqno_t seq)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  struct proxy_participant *proxypp;
 | 
					  struct proxy_participant *proxypp;
 | 
				
			||||||
  struct proxy_writer *pwr;
 | 
					  struct proxy_writer *pwr;
 | 
				
			||||||
  int isreliable;
 | 
					  int isreliable;
 | 
				
			||||||
  nn_mtime_t tnow = now_mt ();
 | 
					  nn_mtime_t tnow = now_mt ();
 | 
				
			||||||
 | 
					  enum nn_reorder_mode reorder_mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assert (is_writer_entityid (guid->entityid));
 | 
					  assert (is_writer_entityid (guid->entityid));
 | 
				
			||||||
  assert (ephash_lookup_proxy_writer_guid (gv->guid_hash, guid) == NULL);
 | 
					  assert (ephash_lookup_proxy_writer_guid (gv->guid_hash, guid) == NULL);
 | 
				
			||||||
| 
						 | 
					@ -4168,13 +4382,13 @@ int new_proxy_writer (struct q_globals *gv, const struct ddsi_guid *ppguid, cons
 | 
				
			||||||
  if (isreliable)
 | 
					  if (isreliable)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    pwr->defrag = nn_defrag_new (&gv->logconfig, NN_DEFRAG_DROP_LATEST, gv->config.defrag_reliable_maxsamples);
 | 
					    pwr->defrag = nn_defrag_new (&gv->logconfig, NN_DEFRAG_DROP_LATEST, gv->config.defrag_reliable_maxsamples);
 | 
				
			||||||
    pwr->reorder = nn_reorder_new (&gv->logconfig, NN_REORDER_MODE_NORMAL, gv->config.primary_reorder_maxsamples, gv->config.late_ack_mode);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    pwr->defrag = nn_defrag_new (&gv->logconfig, NN_DEFRAG_DROP_OLDEST, gv->config.defrag_unreliable_maxsamples);
 | 
					    pwr->defrag = nn_defrag_new (&gv->logconfig, NN_DEFRAG_DROP_OLDEST, gv->config.defrag_unreliable_maxsamples);
 | 
				
			||||||
    pwr->reorder = nn_reorder_new (&gv->logconfig, NN_REORDER_MODE_MONOTONICALLY_INCREASING, gv->config.primary_reorder_maxsamples, gv->config.late_ack_mode);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  reorder_mode = get_proxy_writer_reorder_mode(pwr->e.guid.entityid, isreliable);
 | 
				
			||||||
 | 
					  pwr->reorder = nn_reorder_new (&gv->logconfig, reorder_mode, gv->config.primary_reorder_maxsamples, gv->config.late_ack_mode);
 | 
				
			||||||
  pwr->dqueue = dqueue;
 | 
					  pwr->dqueue = dqueue;
 | 
				
			||||||
  pwr->evq = evq;
 | 
					  pwr->evq = evq;
 | 
				
			||||||
  pwr->ddsi2direct_cb = 0;
 | 
					  pwr->ddsi2direct_cb = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1013,6 +1013,12 @@ int rtps_init (struct q_globals *gv)
 | 
				
			||||||
  gv->spdp_endpoint_xqos.durability.kind = DDS_DURABILITY_TRANSIENT_LOCAL;
 | 
					  gv->spdp_endpoint_xqos.durability.kind = DDS_DURABILITY_TRANSIENT_LOCAL;
 | 
				
			||||||
  make_builtin_endpoint_xqos (&gv->builtin_endpoint_xqos_rd, &gv->default_xqos_rd);
 | 
					  make_builtin_endpoint_xqos (&gv->builtin_endpoint_xqos_rd, &gv->default_xqos_rd);
 | 
				
			||||||
  make_builtin_endpoint_xqos (&gv->builtin_endpoint_xqos_wr, &gv->default_xqos_wr);
 | 
					  make_builtin_endpoint_xqos (&gv->builtin_endpoint_xqos_wr, &gv->default_xqos_wr);
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  nn_xqos_copy (&gv->builtin_stateless_xqos_rd, &gv->default_xqos_rd);
 | 
				
			||||||
 | 
					  nn_xqos_copy (&gv->builtin_stateless_xqos_wr, &gv->default_xqos_wr);
 | 
				
			||||||
 | 
					  gv->builtin_stateless_xqos_wr.reliability.kind = DDS_RELIABILITY_BEST_EFFORT;
 | 
				
			||||||
 | 
					  gv->builtin_stateless_xqos_wr.durability.kind = DDS_DURABILITY_VOLATILE;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  make_special_topics (gv);
 | 
					  make_special_topics (gv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1329,6 +1335,10 @@ err_unicast_sockets:
 | 
				
			||||||
  ddsrt_cond_destroy (&gv->participant_set_cond);
 | 
					  ddsrt_cond_destroy (&gv->participant_set_cond);
 | 
				
			||||||
  ddsrt_mutex_destroy (&gv->participant_set_lock);
 | 
					  ddsrt_mutex_destroy (&gv->participant_set_lock);
 | 
				
			||||||
  free_special_topics (gv);
 | 
					  free_special_topics (gv);
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  nn_xqos_fini (&gv->builtin_stateless_xqos_wr);
 | 
				
			||||||
 | 
					  nn_xqos_fini (&gv->builtin_stateless_xqos_rd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  nn_xqos_fini (&gv->builtin_endpoint_xqos_wr);
 | 
					  nn_xqos_fini (&gv->builtin_endpoint_xqos_wr);
 | 
				
			||||||
  nn_xqos_fini (&gv->builtin_endpoint_xqos_rd);
 | 
					  nn_xqos_fini (&gv->builtin_endpoint_xqos_rd);
 | 
				
			||||||
  nn_xqos_fini (&gv->spdp_endpoint_xqos);
 | 
					  nn_xqos_fini (&gv->spdp_endpoint_xqos);
 | 
				
			||||||
| 
						 | 
					@ -1657,6 +1667,10 @@ void rtps_fini (struct q_globals *gv)
 | 
				
			||||||
  ddsrt_cond_destroy (&gv->participant_set_cond);
 | 
					  ddsrt_cond_destroy (&gv->participant_set_cond);
 | 
				
			||||||
  free_special_topics (gv);
 | 
					  free_special_topics (gv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DDSI_INCLUDE_SECURITY
 | 
				
			||||||
 | 
					  nn_xqos_fini (&gv->builtin_stateless_xqos_wr);
 | 
				
			||||||
 | 
					  nn_xqos_fini (&gv->builtin_stateless_xqos_rd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  nn_xqos_fini (&gv->builtin_endpoint_xqos_wr);
 | 
					  nn_xqos_fini (&gv->builtin_endpoint_xqos_wr);
 | 
				
			||||||
  nn_xqos_fini (&gv->builtin_endpoint_xqos_rd);
 | 
					  nn_xqos_fini (&gv->builtin_endpoint_xqos_rd);
 | 
				
			||||||
  nn_xqos_fini (&gv->spdp_endpoint_xqos);
 | 
					  nn_xqos_fini (&gv->spdp_endpoint_xqos);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2305,7 +2305,8 @@ static void drop_oversize (struct receiver_state *rst, struct nn_rmsg *rmsg, con
 | 
				
			||||||
    /* No proxy writer means nothing really gets done with, unless it
 | 
					    /* No proxy writer means nothing really gets done with, unless it
 | 
				
			||||||
       is SPDP.  SPDP is periodic, so oversize discovery packets would
 | 
					       is SPDP.  SPDP is periodic, so oversize discovery packets would
 | 
				
			||||||
       cause periodic warnings. */
 | 
					       cause periodic warnings. */
 | 
				
			||||||
    if (msg->writerId.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER)
 | 
					    if ((msg->writerId.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER) ||
 | 
				
			||||||
 | 
					        (msg->writerId.u == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      DDS_CWARNING (&rst->gv->logconfig, "dropping oversize (%"PRIu32" > %"PRIu32") SPDP sample %"PRId64" from remote writer "PGUIDFMT"\n",
 | 
					      DDS_CWARNING (&rst->gv->logconfig, "dropping oversize (%"PRIu32" > %"PRIu32") SPDP sample %"PRId64" from remote writer "PGUIDFMT"\n",
 | 
				
			||||||
                    sampleinfo->size, rst->gv->config.max_sample_size, sampleinfo->seq,
 | 
					                    sampleinfo->size, rst->gv->config.max_sample_size, sampleinfo->seq,
 | 
				
			||||||
| 
						 | 
					@ -2374,7 +2375,8 @@ static int handle_Data (struct receiver_state *rst, nn_etime_t tnow, struct nn_r
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    rdata = nn_rdata_new (rmsg, 0, sampleinfo->size, submsg_offset, payload_offset);
 | 
					    rdata = nn_rdata_new (rmsg, 0, sampleinfo->size, submsg_offset, payload_offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (msg->x.writerId.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER)
 | 
					    if ((msg->x.writerId.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER) ||
 | 
				
			||||||
 | 
					        (msg->x.writerId.u == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER))
 | 
				
			||||||
      /* SPDP needs special treatment: there are no proxy writers for it
 | 
					      /* SPDP needs special treatment: there are no proxy writers for it
 | 
				
			||||||
         and we accept data from unknown sources */
 | 
					         and we accept data from unknown sources */
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -2409,7 +2411,8 @@ static int handle_DataFrag (struct receiver_state *rst, nn_etime_t tnow, struct
 | 
				
			||||||
    struct nn_rdata *rdata;
 | 
					    struct nn_rdata *rdata;
 | 
				
			||||||
    unsigned submsg_offset, payload_offset;
 | 
					    unsigned submsg_offset, payload_offset;
 | 
				
			||||||
    uint32_t begin, endp1;
 | 
					    uint32_t begin, endp1;
 | 
				
			||||||
    if (msg->x.writerId.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER)
 | 
					    if ((msg->x.writerId.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER) ||
 | 
				
			||||||
 | 
					        (msg->x.writerId.u == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      DDS_CWARNING (&rst->gv->logconfig, "DATAFRAG("PGUIDFMT" #%"PRId64" -> "PGUIDFMT") - fragmented builtin data not yet supported\n",
 | 
					      DDS_CWARNING (&rst->gv->logconfig, "DATAFRAG("PGUIDFMT" #%"PRId64" -> "PGUIDFMT") - fragmented builtin data not yet supported\n",
 | 
				
			||||||
                    PGUIDPREFIX (rst->src_guid_prefix), msg->x.writerId.u, fromSN (msg->x.writerSN),
 | 
					                    PGUIDPREFIX (rst->src_guid_prefix), msg->x.writerId.u, fromSN (msg->x.writerSN),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -884,7 +884,9 @@ static int insert_sample_in_whc (struct writer *wr, seqno_t seq, struct nn_plist
 | 
				
			||||||
    res = 1;
 | 
					    res = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef NDEBUG
 | 
					#ifndef NDEBUG
 | 
				
			||||||
  if (wr->e.guid.entityid.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER && !is_local_orphan_endpoint (&wr->e))
 | 
					  if (((wr->e.guid.entityid.u == NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER) ||
 | 
				
			||||||
 | 
					       (wr->e.guid.entityid.u == NN_ENTITYID_SPDP_RELIABLE_BUILTIN_PARTICIPANT_SECURE_WRITER)) &&
 | 
				
			||||||
 | 
					       !is_local_orphan_endpoint (&wr->e))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    struct whc_state whcst;
 | 
					    struct whc_state whcst;
 | 
				
			||||||
    whc_get_state(wr->whc, &whcst);
 | 
					    whc_get_state(wr->whc, &whcst);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue