Skip to content

Commit 0a51dbe

Browse files
committed
Fix issues in Dynamic Network Interfaces (#5282)
* Refs #21690. Parse `--rescan` argument on communication applications. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Implement rescan mechanism. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Add docker infrastructure. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Add CMake infrastructure. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Ensure same domain and topic name are used. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Add `--loops` argument to publisher. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Publisher exits after publishing all samples. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Improve subscriber script. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Add test. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Make publisher wait subscriber. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Possible fix. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Clear locators before recalculating them. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Move local participant proxy update to PDP. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Improve new method's logic. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Include what you use. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Add empty method to update endpoint locators. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Add implementation for `update_endpoint_locators_if_default_nts`. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Compare against old default locators. Signed-off-by: Miguel Company <[email protected]> * Refs #21690. Update locators in attributes. Signed-off-by: Miguel Company <[email protected]> * Refs #17283. Avoid early return on `PDP::local_participant_attributes_update_nts`. Signed-off-by: Miguel Company <[email protected]> * Refs #17283. Apply suggestions. Signed-off-by: Miguel Company <[email protected]> --------- Signed-off-by: Miguel Company <[email protected]> (cherry picked from commit 91bd7c8)
1 parent 5ceebe0 commit 0a51dbe

21 files changed

+613
-37
lines changed

include/fastdds/rtps/builtin/discovery/participant/PDP.h

+49
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,14 @@
2222
#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
2323

2424
#include <atomic>
25+
#include <cstdint>
2526
#include <functional>
2627
#include <memory>
2728
#include <mutex>
29+
#include <string>
30+
#include <vector>
2831

32+
<<<<<<< HEAD:include/fastdds/rtps/builtin/discovery/participant/PDP.h
2933
#include <fastdds/rtps/attributes/RTPSParticipantAttributes.h>
3034
#include <fastdds/rtps/builtin/data/ReaderProxyData.h>
3135
#include <fastdds/rtps/builtin/data/WriterProxyData.h>
@@ -37,6 +41,35 @@
3741
#include <fastrtps/qos/QosPolicies.h>
3842
#include <fastrtps/utils/collections/ResourceLimitedVector.hpp>
3943
#include <fastrtps/utils/ProxyPool.hpp>
44+
=======
45+
#include <fastcdr/cdr/fixed_size_string.hpp>
46+
47+
#include <fastdds/dds/core/Time_t.hpp>
48+
#include <fastdds/dds/core/policy/ParameterTypes.hpp>
49+
#include <fastdds/dds/core/policy/QosPolicies.hpp>
50+
#include <fastdds/rtps/attributes/ReaderAttributes.hpp>
51+
#include <fastdds/rtps/attributes/RTPSParticipantAttributes.hpp>
52+
#include <fastdds/rtps/attributes/WriterAttributes.hpp>
53+
#include <fastdds/rtps/common/CDRMessage_t.hpp>
54+
#include <fastdds/rtps/common/Guid.hpp>
55+
#include <fastdds/rtps/common/GuidPrefix_t.hpp>
56+
#include <fastdds/rtps/common/InstanceHandle.hpp>
57+
#include <fastdds/rtps/common/LocatorList.hpp>
58+
#include <fastdds/rtps/common/Types.hpp>
59+
#include <fastdds/rtps/common/WriteParams.hpp>
60+
#include <fastdds/rtps/history/IPayloadPool.hpp>
61+
#include <fastdds/rtps/participant/ParticipantDiscoveryInfo.hpp>
62+
#include <fastdds/rtps/reader/ReaderDiscoveryStatus.hpp>
63+
#include <fastdds/rtps/writer/WriterDiscoveryStatus.hpp>
64+
#include <fastdds/utils/collections/ResourceLimitedVector.hpp>
65+
66+
#include <rtps/builtin/data/ParticipantProxyData.hpp>
67+
#include <rtps/builtin/data/ReaderProxyData.hpp>
68+
#include <rtps/builtin/data/WriterProxyData.hpp>
69+
#include <statistics/rtps/monitor-service/interfaces/IProxyObserver.hpp>
70+
#include <statistics/rtps/monitor-service/interfaces/IProxyQueryable.hpp>
71+
#include <utils/ProxyPool.hpp>
72+
>>>>>>> 91bd7c857 (Fix issues in Dynamic Network Interfaces (#5282)):src/cpp/rtps/builtin/discovery/participant/PDP.h
4073

4174
namespace eprosima {
4275

@@ -51,6 +84,7 @@ struct IProxyObserver;
5184

5285
namespace rtps {
5386

87+
<<<<<<< HEAD:include/fastdds/rtps/builtin/discovery/participant/PDP.h
5488
class PDPServerListener;
5589
class PDPEndpoints;
5690

@@ -68,8 +102,13 @@ namespace rtps {
68102

69103
class RTPSWriter;
70104
class RTPSReader;
105+
=======
106+
class BaseWriter;
107+
class BaseReader;
108+
>>>>>>> 91bd7c857 (Fix issues in Dynamic Network Interfaces (#5282)):src/cpp/rtps/builtin/discovery/participant/PDP.h
71109
class WriterHistory;
72110
class ReaderHistory;
111+
struct RTPSParticipantAllocationAttributes;
73112
class RTPSParticipantImpl;
74113
class RTPSParticipantListener;
75114
class BuiltinProtocols;
@@ -79,6 +118,7 @@ class ReaderProxyData;
79118
class WriterProxyData;
80119
class ParticipantProxyData;
81120
class ReaderListener;
121+
class PDPEndpoints;
82122
class PDPListener;
83123
class PDPServerListener;
84124
class ITopicPayloadPool;
@@ -493,6 +533,15 @@ class PDP : public fastdds::statistics::rtps::IProxyQueryable
493533

494534
#endif // FASTDDS_STATISTICS
495535

536+
virtual void local_participant_attributes_update_nts(
537+
const RTPSParticipantAttributes& new_atts);
538+
539+
virtual void update_endpoint_locators_if_default_nts(
540+
const std::vector<BaseWriter*>& writers,
541+
const std::vector<BaseReader*>& readers,
542+
const RTPSParticipantAttributes& old_atts,
543+
const RTPSParticipantAttributes& new_atts);
544+
496545
protected:
497546

498547
//!Pointer to the builtin protocols object.

src/cpp/rtps/builtin/discovery/participant/PDP.cpp

+161
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,52 @@
6666
#include <mutex>
6767
#include <chrono>
6868

69+
<<<<<<< HEAD
70+
=======
71+
#include <fastdds/config.hpp>
72+
#include <fastdds/dds/domain/DomainParticipant.hpp>
73+
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
74+
#include <fastdds/dds/log/Log.hpp>
75+
#include <fastdds/dds/topic/TypeSupport.hpp>
76+
#include <fastdds/rtps/builtin/data/BuiltinEndpoints.hpp>
77+
#include <fastdds/rtps/builtin/data/ParticipantBuiltinTopicData.hpp>
78+
#include <fastdds/rtps/common/LocatorList.hpp>
79+
#include <fastdds/rtps/history/ReaderHistory.hpp>
80+
#include <fastdds/rtps/history/WriterHistory.hpp>
81+
#include <fastdds/rtps/participant/RTPSParticipantListener.hpp>
82+
#include <fastdds/rtps/reader/ReaderDiscoveryStatus.hpp>
83+
#include <fastdds/rtps/writer/WriterDiscoveryStatus.hpp>
84+
#include <fastdds/utils/IPLocator.hpp>
85+
86+
#include <fastdds/builtin/type_lookup_service/TypeLookupManager.hpp>
87+
#include <fastdds/utils/TypePropagation.hpp>
88+
#include <rtps/builtin/BuiltinProtocols.h>
89+
#include <rtps/builtin/data/ParticipantProxyData.hpp>
90+
#include <rtps/builtin/data/ProxyDataConverters.hpp>
91+
#include <rtps/builtin/data/ProxyHashTables.hpp>
92+
#include <rtps/builtin/data/ReaderProxyData.hpp>
93+
#include <rtps/builtin/data/WriterProxyData.hpp>
94+
#include <rtps/builtin/discovery/endpoint/EDPSimple.h>
95+
#include <rtps/builtin/discovery/endpoint/EDPStatic.h>
96+
#include <rtps/builtin/discovery/participant/PDPEndpoints.hpp>
97+
#include <rtps/builtin/discovery/participant/PDPListener.h>
98+
#include <rtps/builtin/liveliness/WLP.hpp>
99+
#include <rtps/history/TopicPayloadPoolRegistry.hpp>
100+
#include <rtps/network/utils/external_locators.hpp>
101+
#include <rtps/participant/RTPSParticipantImpl.h>
102+
#include <rtps/reader/StatefulReader.hpp>
103+
#include <rtps/reader/StatelessReader.hpp>
104+
#include <rtps/resources/TimedEvent.h>
105+
#include <rtps/writer/StatelessWriter.hpp>
106+
#if HAVE_SECURITY
107+
#include <rtps/security/accesscontrol/ParticipantSecurityAttributes.h>
108+
#endif // if HAVE_SECURITY
109+
#include <utils/shared_mutex.hpp>
110+
#include <utils/TimeConversion.hpp>
111+
#include <rtps/writer/BaseWriter.hpp>
112+
#include <rtps/reader/BaseReader.hpp>
113+
114+
>>>>>>> 91bd7c857 (Fix issues in Dynamic Network Interfaces (#5282))
69115
namespace eprosima {
70116
namespace fastrtps {
71117
namespace rtps {
@@ -1662,6 +1708,121 @@ void PDP::add_builtin_security_attributes(
16621708

16631709
#endif // HAVE_SECURITY
16641710

1711+
void PDP::local_participant_attributes_update_nts(
1712+
const RTPSParticipantAttributes& new_atts)
1713+
{
1714+
// Update user data
1715+
auto participant_data = getLocalParticipantProxyData();
1716+
participant_data->m_userData.data_vec(new_atts.userData);
1717+
1718+
// If we are intraprocess only, we do not need to update locators
1719+
bool announce_locators = !mp_RTPSParticipant->is_intraprocess_only();
1720+
if (announce_locators)
1721+
{
1722+
// Clear all locators
1723+
participant_data->metatraffic_locators.unicast.clear();
1724+
participant_data->metatraffic_locators.multicast.clear();
1725+
participant_data->default_locators.unicast.clear();
1726+
participant_data->default_locators.multicast.clear();
1727+
1728+
// Update default locators
1729+
for (const Locator_t& loc : new_atts.defaultUnicastLocatorList)
1730+
{
1731+
participant_data->default_locators.add_unicast_locator(loc);
1732+
}
1733+
for (const Locator_t& loc : new_atts.defaultMulticastLocatorList)
1734+
{
1735+
participant_data->default_locators.add_multicast_locator(loc);
1736+
}
1737+
1738+
// Update metatraffic locators
1739+
for (const auto& locator : new_atts.builtin.metatrafficUnicastLocatorList)
1740+
{
1741+
participant_data->metatraffic_locators.add_unicast_locator(locator);
1742+
}
1743+
if (!new_atts.builtin.avoid_builtin_multicast || participant_data->metatraffic_locators.unicast.empty())
1744+
{
1745+
for (const auto& locator : new_atts.builtin.metatrafficMulticastLocatorList)
1746+
{
1747+
participant_data->metatraffic_locators.add_multicast_locator(locator);
1748+
}
1749+
}
1750+
1751+
fastdds::rtps::network::external_locators::add_external_locators(*participant_data,
1752+
new_atts.builtin.metatraffic_external_unicast_locators,
1753+
new_atts.default_external_unicast_locators);
1754+
}
1755+
}
1756+
1757+
void PDP::update_endpoint_locators_if_default_nts(
1758+
const std::vector<BaseWriter*>& writers,
1759+
const std::vector<BaseReader*>& readers,
1760+
const RTPSParticipantAttributes& old_atts,
1761+
const RTPSParticipantAttributes& new_atts)
1762+
{
1763+
// Check if default locators have changed
1764+
const auto& old_default_unicast = old_atts.defaultUnicastLocatorList;
1765+
const auto& old_default_multicast = old_atts.defaultMulticastLocatorList;
1766+
const auto& new_default_unicast = new_atts.defaultUnicastLocatorList;
1767+
const auto& new_default_multicast = new_atts.defaultMulticastLocatorList;
1768+
1769+
// Early return if there is no change in default unicast locators
1770+
if ((old_default_unicast == new_default_unicast) &&
1771+
(old_default_multicast == new_default_multicast))
1772+
{
1773+
return;
1774+
}
1775+
1776+
// Update proxies of endpoints with default configured locators
1777+
EDP* edp = get_edp();
1778+
for (BaseWriter* writer : writers)
1779+
{
1780+
if ((old_default_multicast == writer->getAttributes().multicastLocatorList) &&
1781+
(old_default_unicast == writer->getAttributes().unicastLocatorList))
1782+
{
1783+
writer->getAttributes().multicastLocatorList = new_default_multicast;
1784+
writer->getAttributes().unicastLocatorList = new_default_unicast;
1785+
1786+
WriterProxyData* wdata = nullptr;
1787+
GUID_t participant_guid;
1788+
wdata = addWriterProxyData(writer->getGuid(), participant_guid,
1789+
[](WriterProxyData* proxy, bool is_update, const ParticipantProxyData& participant)
1790+
{
1791+
static_cast<void>(is_update);
1792+
assert(is_update);
1793+
1794+
proxy->set_locators(participant.default_locators);
1795+
return true;
1796+
});
1797+
assert(wdata != nullptr);
1798+
edp->process_writer_proxy_data(writer, wdata);
1799+
}
1800+
}
1801+
for (BaseReader* reader : readers)
1802+
{
1803+
if ((old_default_multicast == reader->getAttributes().multicastLocatorList) &&
1804+
(old_default_unicast == reader->getAttributes().unicastLocatorList))
1805+
{
1806+
reader->getAttributes().multicastLocatorList = new_default_multicast;
1807+
reader->getAttributes().unicastLocatorList = new_default_unicast;
1808+
1809+
ReaderProxyData* rdata = nullptr;
1810+
GUID_t participant_guid;
1811+
rdata = addReaderProxyData(reader->getGuid(), participant_guid,
1812+
[](ReaderProxyData* proxy, bool is_update, const ParticipantProxyData& participant)
1813+
{
1814+
static_cast<void>(is_update);
1815+
assert(is_update);
1816+
1817+
proxy->set_locators(participant.default_locators);
1818+
return true;
1819+
});
1820+
assert(rdata != nullptr);
1821+
edp->process_reader_proxy_data(reader, rdata);
1822+
}
1823+
}
1824+
}
1825+
16651826
} /* namespace rtps */
16661827
} /* namespace fastrtps */
16671828
} /* namespace eprosima */

src/cpp/rtps/participant/RTPSParticipantImpl.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -1539,19 +1539,33 @@ void RTPSParticipantImpl::update_attributes(
15391539
// Check if new interfaces have been added
15401540
if (internal_metatraffic_locators_)
15411541
{
1542+
<<<<<<< HEAD
15421543
LocatorList_t metatraffic_unicast_locator_list = m_att.builtin.metatrafficUnicastLocatorList;
15431544
get_default_metatraffic_locators();
15441545
if (!(metatraffic_unicast_locator_list == m_att.builtin.metatrafficUnicastLocatorList))
1546+
=======
1547+
LocatorList_t metatraffic_unicast_locator_list = temp_atts.builtin.metatrafficUnicastLocatorList;
1548+
temp_atts.builtin.metatrafficUnicastLocatorList.clear();
1549+
get_default_metatraffic_locators(temp_atts);
1550+
if (!(metatraffic_unicast_locator_list == temp_atts.builtin.metatrafficUnicastLocatorList))
1551+
>>>>>>> 91bd7c857 (Fix issues in Dynamic Network Interfaces (#5282))
15451552
{
15461553
local_interfaces_changed = true;
15471554
EPROSIMA_LOG_INFO(RTPS_PARTICIPANT, m_att.getName() << " updated its metatraffic locators");
15481555
}
15491556
}
15501557
if (internal_default_locators_)
15511558
{
1559+
<<<<<<< HEAD
15521560
LocatorList_t default_unicast_locator_list = m_att.defaultUnicastLocatorList;
15531561
get_default_unicast_locators();
15541562
if (!(default_unicast_locator_list == m_att.defaultUnicastLocatorList))
1563+
=======
1564+
LocatorList_t default_unicast_locator_list = temp_atts.defaultUnicastLocatorList;
1565+
temp_atts.defaultUnicastLocatorList.clear();
1566+
get_default_unicast_locators(temp_atts);
1567+
if (!(default_unicast_locator_list == temp_atts.defaultUnicastLocatorList))
1568+
>>>>>>> 91bd7c857 (Fix issues in Dynamic Network Interfaces (#5282))
15551569
{
15561570
local_interfaces_changed = true;
15571571
EPROSIMA_LOG_INFO(RTPS_PARTICIPANT,
@@ -1673,7 +1687,9 @@ void RTPSParticipantImpl::update_attributes(
16731687

16741688
{
16751689
std::lock_guard<std::recursive_mutex> lock(*pdp->getMutex());
1690+
pdp->local_participant_attributes_update_nts(temp_atts);
16761691

1692+
<<<<<<< HEAD
16771693
// Update user data
16781694
auto local_participant_proxy_data = pdp->getLocalParticipantProxyData();
16791695
local_participant_proxy_data->m_userData.data_vec(m_att.userData);
@@ -1692,6 +1708,12 @@ void RTPSParticipantImpl::update_attributes(
16921708
for (auto locator : m_att.defaultUnicastLocatorList)
16931709
{
16941710
local_participant_proxy_data->default_locators.add_unicast_locator(locator);
1711+
=======
1712+
if (local_interfaces_changed && internal_default_locators_)
1713+
{
1714+
std::lock_guard<shared_mutex> _(endpoints_list_mutex);
1715+
pdp->update_endpoint_locators_if_default_nts(m_userWriterList, m_userReaderList, m_att, temp_atts);
1716+
>>>>>>> 91bd7c857 (Fix issues in Dynamic Network Interfaces (#5282))
16951717
}
16961718

16971719
if (local_interfaces_changed)

test/dds/communication/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,7 @@ if(Python3_Interpreter_FOUND)
314314
endif()
315315

316316
endif()
317+
318+
if(UNIX AND NOT(APPLE) AND NOT(QNXNTO) AND NOT(ANDROID))
319+
add_subdirectory(dyn_network)
320+
endif()

test/dds/communication/PubSubMain.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void publisher_run(
5252
publisher->wait_discovery(wait);
5353
}
5454

55-
publisher->run(samples, loops, interval);
55+
publisher->run(samples, 0, loops, interval);
5656
}
5757

5858
int main(
@@ -197,7 +197,7 @@ int main(
197197
DomainParticipantFactory::get_instance()->load_XML_profiles_file(xml_file);
198198
}
199199

200-
SubscriberModule subscriber(publishers, samples, fixed_type, zero_copy);
200+
SubscriberModule subscriber(publishers, samples, fixed_type, zero_copy, false, false);
201201
PublisherModule publisher(exit_on_lost_liveliness, fixed_type, zero_copy);
202202

203203
uint32_t result = 1;
@@ -208,7 +208,7 @@ int main(
208208

209209
if (subscriber.init(seed, magic))
210210
{
211-
result = subscriber.run(notexit, timeout) ? 0 : -1;
211+
result = subscriber.run(notexit, 0, timeout) ? 0 : -1;
212212
}
213213

214214
publisher_thread.join();

0 commit comments

Comments
 (0)