diff --git a/include/fastdds/dds/core/policy/QosPolicies.hpp b/include/fastdds/dds/core/policy/QosPolicies.hpp index 78e59bca8e9..8148f8084fa 100644 --- a/include/fastdds/dds/core/policy/QosPolicies.hpp +++ b/include/fastdds/dds/core/policy/QosPolicies.hpp @@ -23,11 +23,13 @@ #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -35,7 +37,6 @@ #include #include #include -#include #include #include @@ -2664,6 +2665,7 @@ class WireProtocolConfigQos : public QosPolicy FASTDDS_EXPORTED_API WireProtocolConfigQos() : QosPolicy(false) , participant_id(-1) + , easy_mode_("") { } @@ -2683,6 +2685,7 @@ class WireProtocolConfigQos : public QosPolicy (this->default_multicast_locator_list == b.default_multicast_locator_list) && (this->default_external_unicast_locators == b.default_external_unicast_locators) && (this->ignore_non_matching_locators == b.ignore_non_matching_locators) && + (this->easy_mode_ == b.easy_mode()) && QosPolicy::operator ==(b); } @@ -2725,6 +2728,51 @@ class WireProtocolConfigQos : public QosPolicy * Whether locators that don't match with the announced locators should be kept. */ bool ignore_non_matching_locators = false; + + /** + * @brief Setter for ROS 2 Easy Mode IP + * + * @param ip IP address to set + * @note The IP address must be an IPv4 address. If it is not, the IP address will not be set. + * + * @return RETCODE_OK if the IP address is set, an specific error code otherwise: + * RETCODE_BAD_PARAMETER if the IP address is not an IPv4 address. + */ + ReturnCode_t easy_mode( + const std::string& ip) + { + // Check if the input is empty + if (!ip.empty()) + { + // Check if the input is a valid IP + if (!rtps::IPLocator::isIPv4(ip)) + { + EPROSIMA_LOG_ERROR( + WIREPROTOCOLQOS, "Invalid IP address format for ROS 2 Easy Mode. It must be an IPv4 address."); + + return RETCODE_BAD_PARAMETER; + } + } + + easy_mode_ = ip; + + return RETCODE_OK; + } + + /** + * @brief Getter for ROS 2 Easy Mode IP + * + * @return IP address if set, empty string otherwise + */ + const std::string& easy_mode() const + { + return easy_mode_; + } + +private: + + //! ROS 2 Easy Mode IP + std::string easy_mode_; }; //! Qos Policy to configure the transport layer diff --git a/include/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp b/include/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp index ba2d71f45fc..afd9d840c1d 100644 --- a/include/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp +++ b/include/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp @@ -444,6 +444,7 @@ class RTPSParticipantAttributes (this->port == b.port) && (this->userData == b.userData) && (this->participantID == b.participantID) && + (this->easy_mode_ip == b.easy_mode_ip) && (this->useBuiltinTransports == b.useBuiltinTransports) && (this->properties == b.properties) && (this->prefix == b.prefix) && @@ -527,6 +528,9 @@ class RTPSParticipantAttributes //! Participant ID int32_t participantID = -1; + //! IP of the Host where master Server is located (EASY_MODE context) + std::string easy_mode_ip = ""; + //! User defined transports to use alongside or in place of builtins. std::vector> userTransports; diff --git a/resources/xsd/fastdds_profiles.xsd b/resources/xsd/fastdds_profiles.xsd index 56395e79518..6e064f9e7a2 100644 --- a/resources/xsd/fastdds_profiles.xsd +++ b/resources/xsd/fastdds_profiles.xsd @@ -131,6 +131,7 @@ ├ builtin [0~1], ├ port [0~1], ├ participantID [int32], + ├ easy_mode_ip [string], ├ userTransports [0~1], | └ transport_id [1~*] [string], ├ useBuiltinTransports [bool], @@ -172,6 +173,7 @@ + diff --git a/src/cpp/fastdds/utils/QosConverters.cpp b/src/cpp/fastdds/utils/QosConverters.cpp index 3ec726ab75e..b6080f246d6 100644 --- a/src/cpp/fastdds/utils/QosConverters.cpp +++ b/src/cpp/fastdds/utils/QosConverters.cpp @@ -148,6 +148,7 @@ void set_qos_from_attributes( qos.wire_protocol().default_multicast_locator_list = attr.defaultMulticastLocatorList; qos.wire_protocol().default_external_unicast_locators = attr.default_external_unicast_locators; qos.wire_protocol().ignore_non_matching_locators = attr.ignore_non_matching_locators; + qos.wire_protocol().easy_mode(attr.easy_mode_ip); qos.transport().user_transports = attr.userTransports; qos.transport().use_builtin_transports = attr.useBuiltinTransports; qos.transport().send_socket_buffer_size = attr.sendSocketBufferSize; @@ -198,6 +199,7 @@ void set_attributes_from_qos( attr.setName(qos.name()); attr.prefix = qos.wire_protocol().prefix; attr.participantID = qos.wire_protocol().participant_id; + attr.easy_mode_ip = qos.wire_protocol().easy_mode(); attr.builtin = qos.wire_protocol().builtin; attr.port = qos.wire_protocol().port; attr.defaultUnicastLocatorList = qos.wire_protocol().default_unicast_locator_list; diff --git a/src/cpp/rtps/attributes/ServerAttributes.cpp b/src/cpp/rtps/attributes/ServerAttributes.cpp index 7dedec4c4a6..65e38cc72a8 100644 --- a/src/cpp/rtps/attributes/ServerAttributes.cpp +++ b/src/cpp/rtps/attributes/ServerAttributes.cpp @@ -73,6 +73,20 @@ const std::string& ros_easy_mode_env() { static std::string ip_value; SystemInfo::get_env(ROS2_EASY_MODE_URI, ip_value); + + if (!ip_value.empty()) + { + // Check that the value is a valid IPv4 address + if (!IPLocator::isIPv4(ip_value)) + { + EPROSIMA_LOG_WARNING( + SERVERATTRIBUTES, + "Invalid format: Easy Mode IP must be a valid IPv4 address. " + "Ignoring " << ROS2_EASY_MODE_URI << " value."); + + ip_value = ""; + } + } return ip_value; } diff --git a/src/cpp/rtps/attributes/ServerAttributes.hpp b/src/cpp/rtps/attributes/ServerAttributes.hpp index 5744c89f5d6..f81917421ff 100644 --- a/src/cpp/rtps/attributes/ServerAttributes.hpp +++ b/src/cpp/rtps/attributes/ServerAttributes.hpp @@ -198,7 +198,8 @@ const std::string& ros_discovery_server_env(); /** * Get the value of environment variable ROS2_EASY_MODE_URI - * @return The value of environment variable ROS2_EASY_MODE_URI. Empty string if the variable is not defined. + * @return The value of environment variable ROS2_EASY_MODE_URI. + * Empty string if the variable is not defined or does not have a valid IPv4 format. */ const std::string& ros_easy_mode_env(); diff --git a/src/cpp/xmlparser/XMLParser.cpp b/src/cpp/xmlparser/XMLParser.cpp index 17356d4d10f..cf028284c35 100644 --- a/src/cpp/xmlparser/XMLParser.cpp +++ b/src/cpp/xmlparser/XMLParser.cpp @@ -2230,27 +2230,55 @@ XMLP_ret XMLParser::fillDataNode( DataNode& participant_node) { /* - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ @@ -2286,7 +2314,7 @@ XMLP_ret XMLParser::fillDataNode( if (strcmp(p_element->Name(), DOMAIN_ID) == 0) { - // domainId - uint32Type + // domainId - uint32 if (XMLP_ret::XML_OK != getXMLUint(p_element, &participant_node.get()->domainId, ident)) { return XMLP_ret::XML_ERROR; @@ -2343,7 +2371,7 @@ XMLP_ret XMLParser::fillDataNode( } else if (strcmp(name, IGN_NON_MATCHING_LOCS) == 0) { - // ignore_non_matching_locators - boolType + // ignore_non_matching_locators - boolean if (XMLP_ret::XML_OK != getXMLBool(p_aux0, &participant_node.get()->rtps.ignore_non_matching_locators, ident)) { @@ -2380,7 +2408,7 @@ XMLP_ret XMLParser::fillDataNode( } else if (strcmp(name, SEND_SOCK_BUF_SIZE) == 0) { - // sendSocketBufferSize - uint32Type + // sendSocketBufferSize - uint32 if (XMLP_ret::XML_OK != getXMLUint(p_aux0, &participant_node.get()->rtps.sendSocketBufferSize, ident)) { return XMLP_ret::XML_ERROR; @@ -2388,7 +2416,7 @@ XMLP_ret XMLParser::fillDataNode( } else if (strcmp(name, LIST_SOCK_BUF_SIZE) == 0) { - // listenSocketBufferSize - uint32Type + // listenSocketBufferSize - uint32 if (XMLP_ret::XML_OK != getXMLUint(p_aux0, &participant_node.get()->rtps.listenSocketBufferSize, ident)) { return XMLP_ret::XML_ERROR; @@ -2440,12 +2468,30 @@ XMLP_ret XMLParser::fillDataNode( } else if (strcmp(name, PART_ID) == 0) { - // participantID - int32Type + // participantID - int32 if (XMLP_ret::XML_OK != getXMLInt(p_aux0, &participant_node.get()->rtps.participantID, ident)) { return XMLP_ret::XML_ERROR; } } + else if (strcmp(name, EASY_MODE_IP) == 0) + { + // easy_mode_ip - string + std::string str_aux; + if (XMLP_ret::XML_OK != getXMLString(p_aux0, &str_aux, ident)) + { + return XMLP_ret::XML_ERROR; + } + + // Check that the string is a valid IPv4 address + if (!fastdds::rtps::IPLocator::isIPv4(str_aux)) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "'easy_mode_ip' is not a valid IPv4 address."); + return XMLP_ret::XML_ERROR; + } + + participant_node.get()->rtps.easy_mode_ip = str_aux; + } else if (strcmp(name, FLOW_CONTROLLER_DESCRIPTOR_LIST) == 0) { // flow_controller_descriptors @@ -2465,7 +2511,7 @@ XMLP_ret XMLParser::fillDataNode( } else if (strcmp(name, USE_BUILTIN_TRANS) == 0) { - // useBuiltinTransports - boolType + // useBuiltinTransports - boolean if (XMLP_ret::XML_OK != getXMLBool(p_aux0, &participant_node.get()->rtps.useBuiltinTransports, ident)) { return XMLP_ret::XML_ERROR; @@ -2492,7 +2538,7 @@ XMLP_ret XMLParser::fillDataNode( } else if (strcmp(name, NAME) == 0) { - // name - stringType + // name - string std::string s; if (XMLP_ret::XML_OK != getXMLString(p_aux0, &s, ident)) { diff --git a/src/cpp/xmlparser/XMLParserCommon.cpp b/src/cpp/xmlparser/XMLParserCommon.cpp index 237e774b24d..8bb5c031fb5 100644 --- a/src/cpp/xmlparser/XMLParserCommon.cpp +++ b/src/cpp/xmlparser/XMLParserCommon.cpp @@ -123,6 +123,7 @@ const char* LOGICAL_PORT = "logical_port"; const char* PHYSICAL_PORT = "physical_port"; const char* USER_DATA = "userData"; const char* PART_ID = "participantID"; +const char* EASY_MODE_IP = "easy_mode_ip"; const char* FLOW_CONTROLLER_DESCRIPTOR_LIST = "flow_controller_descriptor_list"; const char* USER_TRANS = "userTransports"; const char* USE_BUILTIN_TRANS = "useBuiltinTransports"; diff --git a/src/cpp/xmlparser/XMLParserCommon.h b/src/cpp/xmlparser/XMLParserCommon.h index 1d33dc58299..7e08798eb9d 100644 --- a/src/cpp/xmlparser/XMLParserCommon.h +++ b/src/cpp/xmlparser/XMLParserCommon.h @@ -137,6 +137,7 @@ extern const char* LOGICAL_PORT; extern const char* PHYSICAL_PORT; extern const char* USER_DATA; extern const char* PART_ID; +extern const char* EASY_MODE_IP; extern const char* IP4_TO_SEND; extern const char* IP6_TO_SEND; extern const char* FLOW_CONTROLLER_DESCRIPTOR_LIST; diff --git a/test/blackbox/common/DDSBlackboxTestsDSEasyMode.cpp b/test/blackbox/common/DDSBlackboxTestsDSEasyMode.cpp index 99425024528..279a5e35ed8 100644 --- a/test/blackbox/common/DDSBlackboxTestsDSEasyMode.cpp +++ b/test/blackbox/common/DDSBlackboxTestsDSEasyMode.cpp @@ -361,3 +361,79 @@ TEST(DSEasyMode, easy_discovery_mode_env_inconsistent_ip) stop_background_servers(); #endif // _WIN32 } + +/** + * Check that the environment variable ROS2_EASY_MODE is ignored if + * it does not have a valid IPv4 format. + */ +TEST(DSEasyMode, easy_discovery_mode_env_invalid) +{ +#ifndef _WIN32 // The feature is not supported on Windows yet + + PubSubWriter writer(TEST_TOPIC_NAME); + PubSubReader reader(TEST_TOPIC_NAME); + + // Set ROS2_EASY_MODE to an invalid string value + set_easy_discovery_mode_env("Foo"); + + std::atomic writer_background_ds_discovered(false); + std::atomic reader_background_ds_discovered(false); + + writer.set_on_discovery_function( + [&writer_background_ds_discovered]( + const eprosima::fastdds::rtps::ParticipantBuiltinTopicData& data, + eprosima::fastdds::rtps::ParticipantDiscoveryStatus) + { + if (data.participant_name == "DiscoveryServerAuto") + { + writer_background_ds_discovered.store(true); + } + return true; + }); + writer.init(); + + reader.set_on_discovery_function( + [&reader_background_ds_discovered](const eprosima::fastdds::rtps::ParticipantBuiltinTopicData& data, + eprosima::fastdds::rtps::ParticipantDiscoveryStatus) + { + if (data.participant_name == "DiscoveryServerAuto") + { + reader_background_ds_discovered.store(true); + } + return true; + }); + reader.init(); + + ASSERT_TRUE(writer.isInitialized()); + ASSERT_TRUE(reader.isInitialized()); + + // Wait for endpoint discovery first + writer.wait_discovery(); + reader.wait_discovery(); + + // Check that no Background DS was discovered, + // only the other reader or writer + ASSERT_GE(writer.get_participants_matched(), 1u); + ASSERT_GE(reader.get_participants_matched(), 1u); + ASSERT_FALSE(writer_background_ds_discovered.load()); + ASSERT_FALSE(reader_background_ds_discovered.load()); +#endif // _WIN32 +} + +/** + * Check that easy mode configuration is ignored when setting it + * with code using WireProtocolConfigQos. + * + * Note: This test only checks that the configuration is ignored. + * Probably it should be extended similarly to easy_discovery_mode_env_invalid + * when Configuring Easy Mode via c++ and XML is implemented. + */ +TEST(DSEasyMode, wire_protocol_qos_params_invalid) +{ + eprosima::fastdds::dds::WireProtocolConfigQos wire_protocol_qos; + + // Try to set easy mode IP using an invalid IP address + ASSERT_EQ(wire_protocol_qos.easy_mode("Foo"), eprosima::fastdds::dds::RETCODE_BAD_PARAMETER); + + ASSERT_TRUE(wire_protocol_qos.easy_mode().empty()); +} diff --git a/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp b/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp index 8b952f277d6..c9f80d0c23a 100644 --- a/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp +++ b/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp @@ -433,6 +433,7 @@ class RTPSParticipantAttributes (this->port == b.port) && (this->userData == b.userData) && (this->participantID == b.participantID) && + (this->easy_mode_ip == b.easy_mode_ip) && (this->useBuiltinTransports == b.useBuiltinTransports) && (this->properties == b.properties) && (this->prefix == b.prefix) && @@ -553,6 +554,9 @@ class RTPSParticipantAttributes //! Participant ID int32_t participantID = -1; + //! IP of the Host where master Server is located (EASY_MODE context) + std::string easy_mode_ip = ""; + //! User defined transports to use alongside or in place of builtins. std::vector> userTransports; diff --git a/test/unittest/xmlparser/XMLParserTests.cpp b/test/unittest/xmlparser/XMLParserTests.cpp index 98010b49ed8..4233555c23a 100644 --- a/test/unittest/xmlparser/XMLParserTests.cpp +++ b/test/unittest/xmlparser/XMLParserTests.cpp @@ -543,6 +543,7 @@ TEST_F(XMLParserTests, Data) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -638,6 +639,7 @@ TEST_F(XMLParserTests, DataDeprecated) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -733,6 +735,7 @@ TEST_F(XMLParserTests, DataBuffer) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -828,6 +831,7 @@ TEST_F(XMLParserTests, DataBufferDeprecated) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -1809,6 +1813,7 @@ TEST_F(XMLParserTests, parseLogConfig) * 2. Check missing DomainId value in tag * 3. Check bad values for all attributes * 4. Check a non existant attribute tag + * 5. Check a non valid Easy Mode IP */ TEST_F(XMLParserTests, fillDataNodeParticipantNegativeClauses) { @@ -1862,6 +1867,7 @@ TEST_F(XMLParserTests, fillDataNodeParticipantNegativeClauses) "", "", "", + "", "", "", "", @@ -1880,6 +1886,13 @@ TEST_F(XMLParserTests, fillDataNodeParticipantNegativeClauses) EXPECT_EQ(XMLP_ret::XML_ERROR, XMLParserTest::fillDataNode_wrapper(titleElement, *participant_node)); } + + // Check invalid easy_mode_ip value (not a valid IPv4 address) + std::string invalid_easy_mode_ip = "Foo"; + snprintf(xml, xml_len, xml_p, invalid_easy_mode_ip.c_str()); + ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); + titleElement = xml_doc.RootElement(); + EXPECT_EQ(XMLP_ret::XML_ERROR, XMLParserTest::fillDataNode_wrapper(titleElement, *participant_node)); } } diff --git a/test/unittest/xmlparser/XMLProfileParserTests.cpp b/test/unittest/xmlparser/XMLProfileParserTests.cpp index 3a45a0e8390..c0a9e8ab0a2 100644 --- a/test/unittest/xmlparser/XMLProfileParserTests.cpp +++ b/test/unittest/xmlparser/XMLProfileParserTests.cpp @@ -136,7 +136,7 @@ class XMLProfileParserTests : public XMLProfileParserBasicTests, public testing: std::string xml_filename_ = "test_xml_profile.xml"; - const std::pair c_environment_values_[168] + const std::pair c_environment_values_[169] { {"XML_PROFILES_ENV_VAR_1", "123"}, {"XML_PROFILES_ENV_VAR_2", "4"}, @@ -305,7 +305,8 @@ class XMLProfileParserTests : public XMLProfileParserBasicTests, public testing: {"XML_PROFILES_ENV_VAR_165", "2048"}, {"XML_PROFILES_ENV_VAR_166", "45"}, {"XML_PROFILES_ENV_VAR_167", "test_flow_controller"}, - {"XML_PROFILES_ENV_VAR_168", "251"} + {"XML_PROFILES_ENV_VAR_168", "251"}, + {"XML_PROFILES_ENV_VAR_169", "127.0.0.1"} }; }; @@ -568,6 +569,7 @@ TEST_P(XMLProfileParserTests, XMLParserParticipant) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -669,6 +671,7 @@ TEST_F(XMLProfileParserBasicTests, XMLParserParticipantDeprecated) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -753,6 +756,7 @@ TEST_P(XMLProfileParserTests, XMLParserDefaultParticipantProfile) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); @@ -837,6 +841,7 @@ TEST_F(XMLProfileParserBasicTests, XMLParserDefaultParticipantProfileDeprecated) EXPECT_EQ(port.offsetd3, 456); EXPECT_EQ(port.offsetd4, 251); EXPECT_EQ(rtps_atts.participantID, 9898); + EXPECT_EQ(rtps_atts.easy_mode_ip, "127.0.0.1"); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->max_bytes_per_period, 2048); EXPECT_EQ(rtps_atts.flow_controllers.at(0)->period_ms, 45u); EXPECT_EQ(rtps_atts.useBuiltinTransports, true); diff --git a/test/unittest/xmlparser/test_xml_deprecated.xml b/test/unittest/xmlparser/test_xml_deprecated.xml index 1f1f31613a4..4c481f0080d 100644 --- a/test/unittest/xmlparser/test_xml_deprecated.xml +++ b/test/unittest/xmlparser/test_xml_deprecated.xml @@ -144,6 +144,7 @@ 251 9898 + 127.0.0.1 test_flow_controller diff --git a/test/unittest/xmlparser/test_xml_profile.xml b/test/unittest/xmlparser/test_xml_profile.xml index 44bde2970cb..a057cf0ba36 100644 --- a/test/unittest/xmlparser/test_xml_profile.xml +++ b/test/unittest/xmlparser/test_xml_profile.xml @@ -163,6 +163,7 @@ 251 9898 + 127.0.0.1 true ON test_name diff --git a/test/unittest/xmlparser/test_xml_profile_env_var.xml b/test/unittest/xmlparser/test_xml_profile_env_var.xml index 1206c814dda..9d0c26d8229 100644 --- a/test/unittest/xmlparser/test_xml_profile_env_var.xml +++ b/test/unittest/xmlparser/test_xml_profile_env_var.xml @@ -144,6 +144,7 @@ ${XML_PROFILES_ENV_VAR_168} ${XML_PROFILES_ENV_VAR_63} + ${XML_PROFILES_ENV_VAR_169} ${XML_PROFILES_ENV_VAR_64} ${XML_PROFILES_ENV_VAR_162} ${XML_PROFILES_ENV_VAR_65} diff --git a/test/unittest/xmlparser/test_xml_rooted_deprecated.xml b/test/unittest/xmlparser/test_xml_rooted_deprecated.xml index 3b02180fa24..8f8f7387a15 100644 --- a/test/unittest/xmlparser/test_xml_rooted_deprecated.xml +++ b/test/unittest/xmlparser/test_xml_rooted_deprecated.xml @@ -117,6 +117,7 @@ 251 9898 + 127.0.0.1 test_flow_controller diff --git a/test/unittest/xmlparser/test_xml_rooted_profile.xml b/test/unittest/xmlparser/test_xml_rooted_profile.xml index 06875a7feac..c7463c5679e 100644 --- a/test/unittest/xmlparser/test_xml_rooted_profile.xml +++ b/test/unittest/xmlparser/test_xml_rooted_profile.xml @@ -136,6 +136,7 @@ 251 9898 + 127.0.0.1 true test_name diff --git a/versions.md b/versions.md index 44955349da8..de992e73191 100644 --- a/versions.md +++ b/versions.md @@ -17,6 +17,7 @@ Forthcoming * New `ROS2_EASY_MODE` environment variable * Extended CLI ``discovery`` command to handle Fast DDS daemon. * Added P2P builtin transport. + * Added new `easy_mode_ip` XML tag and `easy_mode` setter in `WireProtocolConfigQos` for Easy Mode IP configuration through XML and code. Version v3.1.0 --------------