#include <UdpReceiveStrategy.h>
Public Member Functions | |
UdpReceiveStrategy (UdpDataLink *link) | |
virtual ACE_HANDLE | get_handle () const |
virtual int | handle_input (ACE_HANDLE fd) |
Protected Member Functions | |
virtual ssize_t | receive_bytes (iovec iov[], int n, ACE_INET_Addr &remote_address, ACE_HANDLE fd) |
Only our subclass knows how to do this. | |
virtual void | deliver_sample (ReceivedDataSample &sample, const ACE_INET_Addr &remote_address) |
Called when there is a ReceivedDataSample to be delivered. | |
virtual int | start_i () |
Let the subclass start. | |
virtual void | stop_i () |
Let the subclass stop. | |
virtual bool | check_header (const TransportHeader &header) |
Check the transport header for suitability. | |
virtual bool | check_header (const DataSampleHeader &header) |
Check the data sample header for suitability. | |
Private Types | |
typedef std::pair < TransportReassembly, SequenceNumber > | ReassemblyInfo |
Private Member Functions | |
virtual bool | reassemble (ReceivedDataSample &data) |
typedef | OPENDDS_MAP (ACE_INET_Addr, ReassemblyInfo) ReassemblyMap |
Private Attributes | |
UdpDataLink * | link_ |
SequenceNumber | expected_ |
ACE_INET_Addr | remote_address_ |
ReassemblyMap | reassembly_ |
Definition at line 25 of file UdpReceiveStrategy.h.
typedef std::pair<TransportReassembly, SequenceNumber> OpenDDS::DCPS::UdpReceiveStrategy::ReassemblyInfo [private] |
Definition at line 62 of file UdpReceiveStrategy.h.
OpenDDS::DCPS::UdpReceiveStrategy::UdpReceiveStrategy | ( | UdpDataLink * | link | ) | [explicit] |
Definition at line 18 of file UdpReceiveStrategy.cpp.
00019 : link_(link) 00020 , expected_(SequenceNumber::SEQUENCENUMBER_UNKNOWN()) 00021 { 00022 }
virtual bool OpenDDS::DCPS::UdpReceiveStrategy::check_header | ( | const DataSampleHeader & | header | ) | [inline, protected, virtual] |
Check the data sample header for suitability.
Reimplemented from OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 49 of file UdpReceiveStrategy.h.
00050 { 00051 return TransportReceiveStrategy<>::check_header(header); 00052 }
bool OpenDDS::DCPS::UdpReceiveStrategy::check_header | ( | const TransportHeader & | header | ) | [protected, virtual] |
Check the transport header for suitability.
Reimplemented from OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 110 of file UdpReceiveStrategy.cpp.
References ACE_TEXT(), expected_, OpenDDS::DCPS::SequenceNumber::getValue(), LM_WARNING, OpenDDS::DCPS::SequenceNumber::previous(), reassembly_, remote_address_, OpenDDS::DCPS::TransportHeader::sequence_, OpenDDS::DCPS::SequenceNumber::SEQUENCENUMBER_UNKNOWN(), and VDBG_LVL.
00111 { 00112 ReassemblyInfo& info = reassembly_[remote_address_]; 00113 00114 if (header.sequence_ != info.second && 00115 expected_ != SequenceNumber::SEQUENCENUMBER_UNKNOWN()) { 00116 VDBG_LVL((LM_WARNING, 00117 ACE_TEXT("(%P|%t) WARNING: UdpReceiveStrategy::check_header ") 00118 ACE_TEXT("expected %q received %q\n"), 00119 info.second.getValue(), header.sequence_.getValue()), 2); 00120 SequenceRange range(info.second, header.sequence_.previous()); 00121 info.first.data_unavailable(range); 00122 } 00123 00124 info.second = header.sequence_; 00125 ++info.second; 00126 return true; 00127 }
void OpenDDS::DCPS::UdpReceiveStrategy::deliver_sample | ( | ReceivedDataSample & | sample, | |
const ACE_INET_Addr & | remote_address | |||
) | [protected, virtual] |
Called when there is a ReceivedDataSample to be delivered.
Implements OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 49 of file UdpReceiveStrategy.cpp.
References OpenDDS::DCPS::UdpDataLink::control_received(), OpenDDS::DCPS::DataLink::data_received(), OpenDDS::DCPS::ReceivedDataSample::header_, link_, OpenDDS::DCPS::DataSampleHeader::message_id_, and OpenDDS::DCPS::TRANSPORT_CONTROL.
00051 { 00052 switch (sample.header_.message_id_) { 00053 00054 case TRANSPORT_CONTROL: 00055 this->link_->control_received(sample, remote_address); 00056 break; 00057 00058 default: 00059 this->link_->data_received(sample); 00060 break; 00061 } 00062 }
ACE_HANDLE OpenDDS::DCPS::UdpReceiveStrategy::get_handle | ( | void | ) | const [virtual] |
Reimplemented from ACE_Event_Handler.
Definition at line 25 of file UdpReceiveStrategy.cpp.
References ACE_IPC_SAP::get_handle(), link_, OpenDDS::DCPS::UdpDataLink::socket(), and socket().
00026 { 00027 ACE_SOCK_Dgram& socket = this->link_->socket(); 00028 return socket.get_handle(); 00029 }
int OpenDDS::DCPS::UdpReceiveStrategy::handle_input | ( | ACE_HANDLE | fd | ) | [virtual] |
Reimplemented from ACE_Event_Handler.
Definition at line 32 of file UdpReceiveStrategy.cpp.
References OpenDDS::DCPS::TransportReceiveStrategy<>::handle_dds_input().
00033 { 00034 return this->handle_dds_input(fd); 00035 }
typedef OpenDDS::DCPS::UdpReceiveStrategy::OPENDDS_MAP | ( | ACE_INET_Addr | , | |
ReassemblyInfo | ||||
) | [private] |
bool OpenDDS::DCPS::UdpReceiveStrategy::reassemble | ( | ReceivedDataSample & | data | ) | [private, virtual] |
Reimplemented from OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 130 of file UdpReceiveStrategy.cpp.
References OpenDDS::DCPS::TransportHeader::first_fragment_, header, reassembly_, OpenDDS::DCPS::TransportReceiveStrategy<>::received_header(), remote_address_, and OpenDDS::DCPS::TransportHeader::sequence_.
00131 { 00132 ReassemblyInfo& info = reassembly_[remote_address_]; 00133 const TransportHeader& header = received_header(); 00134 return info.first.reassemble(header.sequence_, header.first_fragment_, data); 00135 }
ssize_t OpenDDS::DCPS::UdpReceiveStrategy::receive_bytes | ( | iovec | iov[], | |
int | n, | |||
ACE_INET_Addr & | remote_address, | |||
ACE_HANDLE | fd | |||
) | [protected, virtual] |
Only our subclass knows how to do this.
Implements OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 38 of file UdpReceiveStrategy.cpp.
References link_, ACE_SOCK_Dgram::recv(), remote_address_, and OpenDDS::DCPS::UdpDataLink::socket().
00042 { 00043 const ssize_t ret = this->link_->socket().recv(iov, n, remote_address); 00044 remote_address_ = remote_address; 00045 return ret; 00046 }
int OpenDDS::DCPS::UdpReceiveStrategy::start_i | ( | ) | [protected, virtual] |
Let the subclass start.
Implements OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 65 of file UdpReceiveStrategy.cpp.
References ACE_TEXT(), ACE_INET_Addr::get_host_addr(), ACE_SOCK::get_local_addr(), ACE_INET_Addr::get_port_number(), OpenDDS::DCPS::UdpDataLink::get_reactor(), link_, LM_DEBUG, LM_ERROR, ACE_Event_Handler::reactor(), ACE_Event_Handler::READ_MASK, ACE_Reactor::register_handler(), OpenDDS::DCPS::UdpDataLink::socket(), and OpenDDS::DCPS::Transport_debug_level.
00066 { 00067 ACE_Reactor* reactor = this->link_->get_reactor(); 00068 if (reactor == 0) { 00069 ACE_ERROR_RETURN((LM_ERROR, 00070 ACE_TEXT("(%P|%t) ERROR: ") 00071 ACE_TEXT("UdpReceiveStrategy::start_i: ") 00072 ACE_TEXT("NULL reactor reference!\n")), 00073 -1); 00074 } 00075 00076 if (reactor->register_handler(this, ACE_Event_Handler::READ_MASK) != 0) { 00077 ACE_ERROR_RETURN((LM_ERROR, 00078 ACE_TEXT("(%P|%t) ERROR: ") 00079 ACE_TEXT("UdpReceiveStrategy::start_i: ") 00080 ACE_TEXT("failed to register handler for DataLink!\n")), 00081 -1); 00082 } 00083 00084 if (Transport_debug_level > 5) { 00085 ACE_INET_Addr addr; 00086 link_->socket().get_local_addr(addr); 00087 ACE_DEBUG((LM_DEBUG, "(%P|%t) UdpReceiveStrategy::start_i: " 00088 "listening on %C:%hu\n", 00089 addr.get_host_addr(), addr.get_port_number())); 00090 } 00091 return 0; 00092 }
void OpenDDS::DCPS::UdpReceiveStrategy::stop_i | ( | ) | [protected, virtual] |
Let the subclass stop.
Implements OpenDDS::DCPS::TransportReceiveStrategy<>.
Definition at line 95 of file UdpReceiveStrategy.cpp.
References ACE_TEXT(), OpenDDS::DCPS::UdpDataLink::get_reactor(), link_, LM_ERROR, ACE_Event_Handler::reactor(), ACE_Event_Handler::READ_MASK, and ACE_Reactor::remove_handler().
00096 { 00097 ACE_Reactor* reactor = this->link_->get_reactor(); 00098 if (reactor == 0) { 00099 ACE_ERROR((LM_ERROR, 00100 ACE_TEXT("(%P|%t) ERROR: ") 00101 ACE_TEXT("UdpReceiveStrategy::stop_i: ") 00102 ACE_TEXT("NULL reactor reference!\n"))); 00103 return; 00104 } 00105 00106 reactor->remove_handler(this, ACE_Event_Handler::READ_MASK); 00107 }
Definition at line 59 of file UdpReceiveStrategy.h.
Referenced by check_header().
Definition at line 58 of file UdpReceiveStrategy.h.
Referenced by deliver_sample(), get_handle(), receive_bytes(), start_i(), and stop_i().
ReassemblyMap OpenDDS::DCPS::UdpReceiveStrategy::reassembly_ [private] |
Definition at line 64 of file UdpReceiveStrategy.h.
Referenced by check_header(), and reassemble().
Definition at line 60 of file UdpReceiveStrategy.h.
Referenced by check_header(), reassemble(), and receive_bytes().