OpenDDS::DCPS::UdpReceiveStrategy Class Reference

#include <UdpReceiveStrategy.h>

Inheritance diagram for OpenDDS::DCPS::UdpReceiveStrategy:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::DCPS::UdpReceiveStrategy:
Collaboration graph
[legend]

List of all members.

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

UdpDataLinklink_
SequenceNumber expected_
ACE_INET_Addr remote_address_
ReassemblyMap reassembly_

Detailed Description

Definition at line 25 of file UdpReceiveStrategy.h.


Member Typedef Documentation

Definition at line 62 of file UdpReceiveStrategy.h.


Constructor & Destructor Documentation

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 }


Member Function Documentation

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:


Member Data Documentation

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().

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().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 10 Aug 2018 for OpenDDS by  doxygen 1.6.1