duplicate search responses from the same server bound to multiple NIFs filtered out

This commit is contained in:
Matej Sekoranja
2015-12-17 14:02:11 +01:00
parent 125822d18f
commit 523af71b7f
4 changed files with 27 additions and 13 deletions

View File

@@ -2862,7 +2862,7 @@ namespace epics {
{
transport->ensureData(4);
pvAccessID cid = payloadBuffer->getInt();
csm->searchResponse(cid, searchSequenceId, version, &serverAddress);
csm->searchResponse(guid, cid, searchSequenceId, version, &serverAddress);
}
@@ -3497,6 +3497,11 @@ namespace epics {
/// Used by SearchInstance.
int32_t m_userValue;
/**
* @brief Server GUID.
*/
GUID m_guid;
/**
* Constructor.
* @param context
@@ -3931,21 +3936,23 @@ namespace epics {
m_addressIndex = m_addresses->size()*STATIC_SEARCH_MAX_MULTIPLIER;
// NOTE: calls channelConnectFailed() on failure
searchResponse(PVA_PROTOCOL_REVISION, &((*m_addresses)[ix]));
static GUID guid = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
searchResponse(guid, PVA_PROTOCOL_REVISION, &((*m_addresses)[ix]));
}
virtual void timerStopped() {
// noop
}
virtual void searchResponse(int8 minorRevision, osiSockAddr* serverAddress) {
virtual void searchResponse(const GUID & guid, int8 minorRevision, osiSockAddr* serverAddress) {
Lock guard(m_channelMutex);
Transport::shared_pointer transport = m_transport;
if (transport.get())
{
// TODO use GUID to determine whether there are multiple servers with the same channel
// multiple defined PV or reconnect request (same server address)
if (!sockAddrAreIdentical(transport->getRemoteAddress(), serverAddress))
// GUID check case: same server listening on different NIF
if (!sockAddrAreIdentical(transport->getRemoteAddress(), serverAddress) &&
!std::equal(guid.value, guid.value + 12, m_guid.value))
{
EXCEPTION_GUARD(m_requester->message("More than one channel with name '" + m_name +
"' detected, connected to: " + inetAddressToString(*transport->getRemoteAddress()) + ", ignored: " + inetAddressToString(*serverAddress), warningMessage));
@@ -3960,6 +3967,10 @@ namespace epics {
return;
}
// remember GUID
std::copy(guid.value, guid.value + 12, m_guid.value);
// create channel
createChannel(transport);
}