From b14333f72085d5bc784dc9b9ff3df68ced32f7ae Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Thu, 4 Sep 2014 20:44:12 +0200 Subject: [PATCH] TCP acceptor and validation fixed, logs and dot consistency --- src/pva/pvaConstants.h | 2 +- src/remote/blockingTCPAcceptor.cpp | 11 +++++++---- src/remote/blockingTCPConnector.cpp | 2 +- src/remote/blockingUDPConnector.cpp | 8 ++++---- src/remote/blockingUDPTransport.cpp | 2 +- src/remote/codec.cpp | 19 ++++++++++++++++++- src/remoteClient/clientContextImpl.cpp | 2 +- 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/pva/pvaConstants.h b/src/pva/pvaConstants.h index 4ec619d..421f5dd 100644 --- a/src/pva/pvaConstants.h +++ b/src/pva/pvaConstants.h @@ -41,7 +41,7 @@ namespace pvAccess { const epics::pvData::int16 PVA_MESSAGE_HEADER_SIZE = 8; /** All messages must be aligned to 8-bytes (64-bit). */ - const epics::pvData::int32 PVA_ALIGNMENT = 1; // TODO + const epics::pvData::int32 PVA_ALIGNMENT = 1; /** * UDP maximum send message size. diff --git a/src/remote/blockingTCPAcceptor.cpp b/src/remote/blockingTCPAcceptor.cpp index a63587e..32ce611 100644 --- a/src/remote/blockingTCPAcceptor.cpp +++ b/src/remote/blockingTCPAcceptor.cpp @@ -205,12 +205,17 @@ namespace pvAccess { // validate connection if(!validateConnection(transport, ipAddrStr)) { + // TODO + // wait for negative response to be sent back and + // hold off the client for retrying at very high rate + epicsThreadSleep(1.0); + transport->close(); LOG( logLevelDebug, "Connection to PVA client %s failed to be validated, closing it.", ipAddrStr); - return; + continue; } LOG(logLevelDebug, "Serving to PVA client: %s.", ipAddrStr); @@ -223,9 +228,7 @@ namespace pvAccess { bool BlockingTCPAcceptor::validateConnection(Transport::shared_pointer const & transport, const char* address) { try { - // TODO constant - transport->verify(5000); - return true; + return transport->verify(5000); } catch(...) { LOG(logLevelDebug, "Validation of %s failed.", address); return false; diff --git a/src/remote/blockingTCPConnector.cpp b/src/remote/blockingTCPConnector.cpp index 0c8ea44..047f546 100644 --- a/src/remote/blockingTCPConnector.cpp +++ b/src/remote/blockingTCPConnector.cpp @@ -155,7 +155,7 @@ namespace epics { client, transportRevision, _heartbeatInterval, priority); // verify - if(!transport->verify(3000)) { + if(!transport->verify(5000)) { LOG( logLevelDebug, "Connection to PVA server %s failed to be validated, closing it.", diff --git a/src/remote/blockingUDPConnector.cpp b/src/remote/blockingUDPConnector.cpp index 2d919ab..10dc29f 100644 --- a/src/remote/blockingUDPConnector.cpp +++ b/src/remote/blockingUDPConnector.cpp @@ -22,14 +22,14 @@ namespace epics { auto_ptr& responseHandler, osiSockAddr& bindAddress, int8 transportRevision, int16 /*priority*/) { - LOG(logLevelDebug, "Creating datagram socket to: %s", + LOG(logLevelDebug, "Creating datagram socket to: %s.", inetAddressToString(bindAddress).c_str()); SOCKET socket = epicsSocketCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(socket==INVALID_SOCKET) { char errStr[64]; epicsSocketConvertErrnoToString(errStr, sizeof(errStr)); - LOG(logLevelError, "Error creating socket: %s", errStr); + LOG(logLevelError, "Error creating socket: %s.", errStr); return Transport::shared_pointer(); } @@ -39,7 +39,7 @@ namespace epics { { char errStr[64]; epicsSocketConvertErrnoToString(errStr, sizeof(errStr)); - LOG(logLevelError, "Error setting SO_BROADCAST: %s", errStr); + LOG(logLevelError, "Error setting SO_BROADCAST: %s.", errStr); epicsSocketDestroy (socket); return Transport::shared_pointer(); } @@ -62,7 +62,7 @@ namespace epics { if(retval<0) { char errStr[64]; epicsSocketConvertErrnoToString(errStr, sizeof(errStr)); - LOG(logLevelError, "Error binding socket: %s", errStr); + LOG(logLevelError, "Error binding socket: %s.", errStr); epicsSocketDestroy (socket); return Transport::shared_pointer(); } diff --git a/src/remote/blockingUDPTransport.cpp b/src/remote/blockingUDPTransport.cpp index 830f482..aac605f 100644 --- a/src/remote/blockingUDPTransport.cpp +++ b/src/remote/blockingUDPTransport.cpp @@ -70,7 +70,7 @@ inline int sendto(int s, const char *buf, size_t len, int flags, const struct so char strBuffer[64]; epicsSocketConvertErrnoToString(strBuffer, sizeof(strBuffer)); - LOG(logLevelDebug, "getsockname error: %s", strBuffer); + LOG(logLevelDebug, "getsockname error: %s.", strBuffer); } } diff --git a/src/remote/codec.cpp b/src/remote/codec.cpp index 80f85c1..02549fd 100644 --- a/src/remote/codec.cpp +++ b/src/remote/codec.cpp @@ -557,6 +557,17 @@ namespace epics { _socketBuffer->setPosition(newpos); } + static const char PADDING_BYTES[] = + { + static_cast(0xFF), + static_cast(0xFF), + static_cast(0xFF), + static_cast(0xFF), + static_cast(0xFF), + static_cast(0xFF), + static_cast(0xFF), + static_cast(0xFF) + }; void AbstractCodec::alignBuffer(std::size_t alignment) { @@ -566,9 +577,15 @@ namespace epics { if (pos == newpos) return; + /* // there is always enough of space // since sendBuffer capacity % PVA_ALIGNMENT == 0 _sendBuffer->setPosition(newpos); + */ + + // for safety reasons we really pad (override previous message data) + std::size_t padCount = newpos - pos; + _sendBuffer->put(PADDING_BYTES, 0, padCount); } @@ -1426,7 +1443,7 @@ namespace epics { bool BlockingTCPTransportCodec::verify(epics::pvData::int32 timeoutMs) { - return _verifiedEvent.wait(timeoutMs/1000.0); + return _verifiedEvent.wait(timeoutMs/1000.0) && _verified; } void BlockingTCPTransportCodec::verified(epics::pvData::Status const & status) { diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index 3de43f0..c5f3754 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -4240,7 +4240,7 @@ TODO for (size_t i = 0; broadcastAddresses.get() && i < broadcastAddresses->size(); i++) LOG(logLevelDebug, - "Broadcast address #%d: %s", i, inetAddressToString((*broadcastAddresses)[i]).c_str()); + "Broadcast address #%d: %s.", i, inetAddressToString((*broadcastAddresses)[i]).c_str()); // where to bind (listen) address osiSockAddr listenLocalAddress;