10 #ifdef epicsExportSharedSymbols 11 # define blockingUDPEpicsExportSharedSymbols 12 # undef epicsExportSharedSymbols 17 #include <epicsThread.h> 19 #include <pv/noDefaultMethods.h> 20 #include <pv/byteBuffer.h> 23 #include <pv/pvIntrospect.h> 25 #ifdef blockingUDPEpicsExportSharedSymbols 26 # define epicsExportSharedSymbols 27 # undef blockingUDPEpicsExportSharedSymbols 32 #include <pv/remote.h> 33 #include <pv/pvaConstants.h> 34 #include <pv/inetAddressUtil.h> 39 class ClientChannelImpl;
40 class BlockingUDPConnector;
42 enum InetAddressType { inetAddressType_all, inetAddressType_unicast, inetAddressType_broadcast_multicast };
44 class BlockingUDPTransport :
46 public TransportSendControl,
47 public epicsThreadRunable
49 EPICS_NOT_COPYABLE(BlockingUDPTransport)
51 POINTER_DEFINITIONS(BlockingUDPTransport);
53 static size_t num_instances;
56 std::tr1::weak_ptr<BlockingUDPTransport> internal_this;
57 friend class BlockingUDPConnector;
58 BlockingUDPTransport(
bool serverFlag,
59 ResponseHandler::shared_pointer
const & responseHandler,
60 SOCKET channel, osiSockAddr &bindAddress,
61 short remoteTransportRevision);
64 virtual ~BlockingUDPTransport();
70 virtual const osiSockAddr& getRemoteAddress()
const OVERRIDE FINAL {
71 return _remoteAddress;
74 virtual const std::string& getRemoteName()
const OVERRIDE FINAL {
79 return std::string(
"udp");
82 virtual std::size_t getReceiveBufferSize()
const OVERRIDE FINAL {
83 return _receiveBuffer.getSize();
86 virtual epics::pvData::int16 getPriority()
const OVERRIDE FINAL {
87 return PVA_DEFAULT_PRIORITY;
90 virtual void setRemoteTransportReceiveBufferSize(
95 virtual void setRemoteTransportSocketReceiveBufferSize(
105 virtual void verified(epics::pvData::Status
const & )
OVERRIDE FINAL {
109 virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer
const & data)
OVERRIDE FINAL {
116 _receiveBuffer.setEndianess(byteOrder);
119 _sendBuffer.setEndianess(byteOrder);
122 virtual void enqueueSendRequest(TransportSender::shared_pointer
const & sender)
OVERRIDE FINAL;
132 virtual void alignData(std::size_t alignment)
OVERRIDE FINAL {
133 _receiveBuffer.align(alignment);
136 virtual bool directSerialize(epics::pvData::ByteBuffer* ,
const char* ,
142 virtual bool directDeserialize(epics::pvData::ByteBuffer* ,
char* ,
148 virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize = 0)
OVERRIDE FINAL;
155 virtual void setRecipient(
const osiSockAddr& sendTo)
OVERRIDE FINAL {
156 _sendToEnabled =
true;
160 void setLocalMulticastAddress(
const osiSockAddr& sendTo) {
161 _localMulticastAddressEnabled =
true;
162 _localMulticastAddress = sendTo;
165 bool hasLocalMulticastAddress()
const {
166 return _localMulticastAddressEnabled;
169 const osiSockAddr& getLocalMulticastAddress()
const {
170 return _localMulticastAddress;
181 virtual void alignBuffer(std::size_t alignment)
OVERRIDE FINAL {
182 _sendBuffer.align(alignment);
185 virtual void cachedSerialize(
186 const std::tr1::shared_ptr<
const epics::pvData::Field>& field, epics::pvData::ByteBuffer* buffer)
OVERRIDE FINAL 189 field->serialize(buffer,
this);
192 virtual std::tr1::shared_ptr<
const epics::pvData::Field>
193 cachedDeserialize(epics::pvData::ByteBuffer* buffer)
OVERRIDE FINAL 197 return epics::pvData::getFieldCreate()->deserialize(buffer,
this);
200 virtual bool acquire(std::tr1::shared_ptr<ClientChannelImpl>
const & )
OVERRIDE FINAL 211 void setIgnoredAddresses(
const InetAddrVector& addresses) {
212 _ignoredAddresses = addresses;
219 const InetAddrVector& getIgnoredAddresses()
const {
220 return _ignoredAddresses;
227 void setTappedNIF(
const InetAddrVector& addresses) {
228 _tappedNIF = addresses;
235 const InetAddrVector& getTappedNIF()
const {
239 bool send(
const char* buffer, size_t length,
const osiSockAddr& address);
241 bool send(epics::pvData::ByteBuffer* buffer,
const osiSockAddr& address);
243 bool send(epics::pvData::ByteBuffer* buffer, InetAddressType target = inetAddressType_all);
249 const InetAddrVector& getSendAddresses() {
250 return _sendAddresses;
257 const osiSockAddr* getBindAddress()
const {
258 return &_bindAddress;
261 bool isBroadcastAddress(
const osiSockAddr* address,
const InetAddrVector& broadcastAddresses)
263 for (size_t i = 0; i < broadcastAddresses.size(); i++)
264 if (broadcastAddresses[i].ia.sin_addr.s_addr == address->ia.sin_addr.s_addr)
270 void setSendAddresses(InetAddrVector& addresses, std::vector<
bool>& address_types) {
271 _sendAddresses.swap(addresses);
272 _isSendAddressUnicast.swap(address_types);
275 void join(
const osiSockAddr & mcastAddr,
const osiSockAddr & nifAddr);
277 void setMutlicastNIF(
const osiSockAddr & nifAddr,
bool loopback);
280 AtomicBoolean _closed;
285 ResponseHandler::shared_pointer _responseHandler;
290 bool processBuffer(Transport::shared_pointer
const & transport, osiSockAddr& fromAddress, epics::pvData::ByteBuffer* receiveBuffer);
292 void close(
bool waitForThreadToComplete);
312 osiSockAddr _bindAddress;
317 osiSockAddr _remoteAddress;
318 std::string _remoteName;
323 InetAddrVector _sendAddresses;
325 std::vector<
bool> _isSendAddressUnicast;
330 InetAddrVector _ignoredAddresses;
335 InetAddrVector _tappedNIF;
346 osiSockAddr _localMulticastAddress;
347 bool _localMulticastAddressEnabled;
352 epics::pvData::ByteBuffer _receiveBuffer;
357 epics::pvData::ByteBuffer _sendBuffer;
362 int _lastMessageStartPosition;
367 epics::pvData::Mutex _mutex;
368 epics::pvData::Mutex _sendMutex;
373 epics::auto_ptr<epicsThread> _thread;
375 epics::pvData::int8 _clientServerWithEndianFlag;
379 class BlockingUDPConnector{
381 POINTER_DEFINITIONS(BlockingUDPConnector);
383 BlockingUDPConnector(
bool serverFlag) :_serverFlag(serverFlag) {}
388 BlockingUDPTransport::shared_pointer connect(
389 ResponseHandler::shared_pointer
const & responseHandler,
390 osiSockAddr& bindAddress,
391 epics::pvData::int8 transportRevision);
400 EPICS_NOT_COPYABLE(BlockingUDPConnector)
403 typedef std::vector<BlockingUDPTransport::shared_pointer> BlockingUDPTransportVector;
405 void initializeUDPTransports(
407 BlockingUDPTransportVector& udpTransports,
408 const IfaceNodeVector& ifaceList,
409 const ResponseHandler::shared_pointer& responseHandler,
410 BlockingUDPTransport::shared_pointer& sendTransport,
411 epics::pvData::int32& listenPort,
412 bool autoAddressList,
413 const std::string& addressList,
414 const std::string& ignoreAddressList);
virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer const &data)=0
Pass data to the active security plug-in session.
#define FINAL
Copyright - See the COPYRIGHT that is included with this distribution.