Handles requests on a single connection. More...
#include <DIOP_Connection_Handler.h>


Public Member Functions | |
| TAO_DIOP_Connection_Handler (ACE_Thread_Manager *t=0) | |
| TAO_DIOP_Connection_Handler (TAO_ORB_Core *orb_core) | |
| Constructor. | |
| ~TAO_DIOP_Connection_Handler (void) | |
| Destructor. | |
| virtual int | open (void *) |
| virtual int | open_server (void) |
| int | close (u_long=0) |
| int | add_transport_to_cache (void) |
| Add ourselves to Cache. | |
| int | set_dscp_codepoint (CORBA::Boolean set_network_priority) |
| Set Diff-Serv codepoint on outgoing packets. | |
| int | set_dscp_codepoint (CORBA::Long dscp_codepoint) |
| virtual int | open_handler (void *) |
Event Handler overloads | |
| virtual int | resume_handler (void) |
| virtual int | close_connection (void) |
| Close the underlying connection. | |
| virtual int | handle_input (ACE_HANDLE) |
| virtual int | handle_output (ACE_HANDLE) |
| virtual int | handle_close (ACE_HANDLE, ACE_Reactor_Mask) |
| virtual int | handle_timeout (const ACE_Time_Value ¤t_time, const void *act=0) |
Protected Member Functions | |
| int | set_tos (int tos) |
| Helper method used by the set_dscp_codepoint () methods. | |
TAO_Connection Handler overloads | |
| virtual int | release_os_resources (void) |
| Release the OS resources related to this handler. | |
| virtual int | handle_write_ready (const ACE_Time_Value *timeout) |
Private Attributes | |
| int | dscp_codepoint_ |
| Stores the type of service value. | |
The DIOP Additions | |
|
| |
| ACE_INET_Addr | addr_ |
| This is always the remote address. | |
| ACE_INET_Addr | local_addr_ |
| This is always the local address for the connector. | |
| const ACE_INET_Addr & | addr (void) |
| This is always the remote address. | |
| void | addr (const ACE_INET_Addr &addr) |
| This is always the remote address. | |
| const ACE_INET_Addr & | local_addr (void) |
| This is always the remote address. | |
| void | local_addr (const ACE_INET_Addr &addr) |
| This is always the remote address. | |
Handles requests on a single connection.
The Connection handler which is common for the Acceptor and the Connector
Definition at line 46 of file DIOP_Connection_Handler.h.
| TAO_DIOP_Connection_Handler::TAO_DIOP_Connection_Handler | ( | ACE_Thread_Manager * | t = 0 |
) |
Definition at line 30 of file DIOP_Connection_Handler.cpp.
: TAO_DIOP_SVC_HANDLER (t, 0 , 0), TAO_Connection_Handler (0), dscp_codepoint_ (IPDSFIELD_DSCP_DEFAULT << 2) { // This constructor should *never* get called, it is just here to // make the compiler happy: the default implementation of the // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. ACE_ASSERT (0); }
| TAO_DIOP_Connection_Handler::TAO_DIOP_Connection_Handler | ( | TAO_ORB_Core * | orb_core | ) |
Constructor.
Definition at line 43 of file DIOP_Connection_Handler.cpp.
: TAO_DIOP_SVC_HANDLER (orb_core->thr_mgr (), 0, 0), TAO_Connection_Handler (orb_core), dscp_codepoint_ (IPDSFIELD_DSCP_DEFAULT << 2) { TAO_DIOP_Transport* specific_transport = 0; ACE_NEW (specific_transport, TAO_DIOP_Transport (this, orb_core)); // store this pointer (indirectly increment ref count) this->transport (specific_transport); }
| TAO_DIOP_Connection_Handler::~TAO_DIOP_Connection_Handler | ( | void | ) |
Destructor.
Definition at line 56 of file DIOP_Connection_Handler.cpp.
{
delete this->transport ();
int const result =
this->release_os_resources ();
if (result == -1 && TAO_debug_level)
{
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("TAO (%P|%t) - DIOP_Connection_Handler::")
ACE_TEXT ("~DIOP_Connection_Handler, ")
ACE_TEXT ("release_os_resources() failed %m\n")));
}
}
| int TAO_DIOP_Connection_Handler::add_transport_to_cache | ( | void | ) |
Add ourselves to Cache.
Definition at line 334 of file DIOP_Connection_Handler.cpp.
{
ACE_INET_Addr addr;
// This function is called by the acceptor to add this
// transport to the transport cache. This is really
// important for proper shutdown. The address used
// is irrelevent, since DIOP is connectionless.
// Construct a DIOP_Endpoint object.
TAO_DIOP_Endpoint endpoint (
addr,
this->orb_core ()->orb_params ()->cache_incoming_by_dotted_decimal_address ());
// Construct a property object
TAO_Base_Transport_Property prop (&endpoint);
// Add the handler to Cache
return this->orb_core ()->lane_resources ()
.transport_cache ().cache_transport (&prop, this->transport ());
}
| const ACE_INET_Addr & TAO_DIOP_Connection_Handler::addr | ( | void | ) |
This is always the remote address.
Definition at line 73 of file DIOP_Connection_Handler.cpp.
{
return this->addr_;
}
| void TAO_DIOP_Connection_Handler::addr | ( | const ACE_INET_Addr & | addr | ) |
This is always the remote address.
Definition at line 79 of file DIOP_Connection_Handler.cpp.
{
this->addr_ = addr;
}
| int TAO_DIOP_Connection_Handler::close | ( | u_long | flags = 0 |
) |
Close called by the Acceptor or Connector when connection establishment fails.
Definition at line 322 of file DIOP_Connection_Handler.cpp.
{
return this->close_handler (flags);
}
| int TAO_DIOP_Connection_Handler::close_connection | ( | void | ) | [virtual] |
Close the underlying connection.
Used by the ORB to actively close connections that are idle, stale or somehow are determined to be broken before the Reactor does.
Implements TAO_Connection_Handler.
Definition at line 274 of file DIOP_Connection_Handler.cpp.
{
return this->close_connection_eh (this);
}
| int TAO_DIOP_Connection_Handler::handle_close | ( | ACE_HANDLE | , | |
| ACE_Reactor_Mask | ||||
| ) | [virtual] |
Definition at line 311 of file DIOP_Connection_Handler.cpp.
{
// No asserts here since the handler is registered with the Reactor
// and the handler ownership is given to the Reactor. When the
// Reactor closes, it will call handle_close() on the handler. It
// is however important to overwrite handle_close() to do nothing
// since the base class does too much.
return 0;
}
| int TAO_DIOP_Connection_Handler::handle_input | ( | ACE_HANDLE | fd | ) | [virtual] |
The event handler calls, here so that other objects who hold a reference to this object can call the event handler methods.
Implements TAO_Connection_Handler.
Definition at line 280 of file DIOP_Connection_Handler.cpp.
{
return this->handle_input_eh (h, this);
}
| int TAO_DIOP_Connection_Handler::handle_output | ( | ACE_HANDLE | handle | ) | [virtual] |
Definition at line 286 of file DIOP_Connection_Handler.cpp.
{
int const result =
this->handle_output_eh (handle, this);
if (result == -1)
{
this->close_connection ();
return 0;
}
return result;
}
| int TAO_DIOP_Connection_Handler::handle_timeout | ( | const ACE_Time_Value & | current_time, | |
| const void * | act = 0 | |||
| ) | [virtual] |
Definition at line 301 of file DIOP_Connection_Handler.cpp.
{
// We don't use this upcall from the Reactor. However, we should
// override this since the base class returns -1 which will result
// in handle_close() getting called.
return 0;
}
| int TAO_DIOP_Connection_Handler::handle_write_ready | ( | const ACE_Time_Value * | timeout | ) | [protected, virtual] |
Derived classes should implement this for proper support with the Blocking Flushing Strategy.
Reimplemented from TAO_Connection_Handler.
Definition at line 439 of file DIOP_Connection_Handler.cpp.
{
return ACE::handle_write_ready (this->peer ().get_handle (), t);
}
| void TAO_DIOP_Connection_Handler::local_addr | ( | const ACE_INET_Addr & | addr | ) |
This is always the remote address.
Definition at line 91 of file DIOP_Connection_Handler.cpp.
{
this->local_addr_ = addr;
}
| const ACE_INET_Addr & TAO_DIOP_Connection_Handler::local_addr | ( | void | ) |
This is always the remote address.
Definition at line 85 of file DIOP_Connection_Handler.cpp.
{
return this->local_addr_;
}
| int TAO_DIOP_Connection_Handler::open | ( | void * | ) | [virtual] |
Called by the <Strategy_Acceptor> when the handler is completely connected. Argument is unused.
Definition at line 104 of file DIOP_Connection_Handler.cpp.
{
TAO_DIOP_Protocol_Properties protocol_properties;
// Initialize values from ORB params.
protocol_properties.send_buffer_size_ =
this->orb_core ()->orb_params ()->sock_sndbuf_size ();
protocol_properties.recv_buffer_size_ =
this->orb_core ()->orb_params ()->sock_rcvbuf_size ();
protocol_properties.hop_limit_ =
this->orb_core ()->orb_params ()->ip_hoplimit ();
TAO_Protocols_Hooks *tph = this->orb_core ()->get_protocols_hooks ();
if (tph != 0)
{
try
{
if (this->transport ()->opened_as () == TAO::TAO_CLIENT_ROLE)
{
tph->client_protocol_properties_at_orb_level (protocol_properties);
}
else
{
tph->server_protocol_properties_at_orb_level (protocol_properties);
}
}
catch (const ::CORBA::Exception&)
{
return -1;
}
}
this->peer ().open (this->local_addr_);
if (this->set_socket_option (this->peer (),
protocol_properties.send_buffer_size_,
protocol_properties.recv_buffer_size_) == -1)
return -1;
if (protocol_properties.hop_limit_ >= 0)
{
int result = 0;
#if defined (ACE_HAS_IPV6)
if (this->local_addr_.get_type () == AF_INET6)
{
#if defined (ACE_WIN32)
DWORD hop_limit =
static_cast<DWORD> (protocol_properties.hop_limit_);
#else
int hop_limit =
static_cast<int> (protocol_properties.hop_limit_);
#endif
result = this->peer ().set_option (
IPPROTO_IPV6,
IPV6_UNICAST_HOPS,
(void *) &hop_limit,
sizeof (hop_limit));
}
else
#endif /* ACE_HAS_IPV6 */
{
#if defined (ACE_WIN32)
DWORD hop_limit =
static_cast<DWORD> (protocol_properties.hop_limit_);
#else
int hop_limit =
static_cast<int> (protocol_properties.hop_limit_);
#endif
result = this->peer ().set_option (
IPPROTO_IP,
IP_TTL,
(void *) &hop_limit,
sizeof (hop_limit));
}
if (result != 0)
{
if (TAO_debug_level)
{
ACE_ERROR ((LM_ERROR,
ACE_TEXT("TAO (%P|%t) - DIOP_Connection_Handler::open, ")
ACE_TEXT("couldn't set hop limit\n\n")));
}
return -1;
}
}
if (TAO_debug_level > 5)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT("TAO (%P|%t) - DIOP_Connection_Handler::open, ")
ACE_TEXT("listening on: <%C:%u>\n"),
this->local_addr_.get_host_name (),
this->local_addr_.get_port_number ()));
}
// Set that the transport is now connected, if fails we return -1
// Use C-style cast b/c otherwise we get warnings on lots of
// compilers
if (!this->transport ()->post_open ((size_t) this->peer ().get_handle ()))
return -1;
this->state_changed (TAO_LF_Event::LFS_SUCCESS,
this->orb_core ()->leader_follower ());
return 0;
}
| int TAO_DIOP_Connection_Handler::open_handler | ( | void * | v | ) | [virtual] |
Connection_Handler overloads
Implements TAO_Connection_Handler.
Definition at line 98 of file DIOP_Connection_Handler.cpp.
{
return this->open (v);
}
| int TAO_DIOP_Connection_Handler::open_server | ( | void | ) | [virtual] |
Definition at line 214 of file DIOP_Connection_Handler.cpp.
{
TAO_DIOP_Protocol_Properties protocol_properties;
// Initialize values from ORB params.
protocol_properties.send_buffer_size_ =
this->orb_core ()->orb_params ()->sock_sndbuf_size ();
protocol_properties.recv_buffer_size_ =
this->orb_core ()->orb_params ()->sock_rcvbuf_size ();
TAO_Protocols_Hooks *tph = this->orb_core ()->get_protocols_hooks ();
if (tph != 0)
{
try
{
if (this->transport ()->opened_as () == TAO::TAO_CLIENT_ROLE)
{
tph->client_protocol_properties_at_orb_level (protocol_properties);
}
else
{
tph->server_protocol_properties_at_orb_level (protocol_properties);
}
}
catch (const ::CORBA::Exception&)
{
return -1;
}
}
this->peer ().open (this->local_addr_);
if (this->set_socket_option (this->peer (),
protocol_properties.send_buffer_size_,
protocol_properties.recv_buffer_size_) == -1)
return -1;
if (TAO_debug_level > 5)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT("TAO (%P|%t) - DIOP_Connection_Handler::open_server, ")
ACE_TEXT("listening on %C:%d\n"),
this->local_addr_.get_host_name (),
this->local_addr_.get_port_number ()
));
}
this->transport ()->id ((size_t) this->peer ().get_handle ());
return 0;
}
| int TAO_DIOP_Connection_Handler::release_os_resources | ( | void | ) | [protected, virtual] |
Release the OS resources related to this handler.
Reimplemented from TAO_Connection_Handler.
Definition at line 328 of file DIOP_Connection_Handler.cpp.
{
return this->peer ().close ();
}
| int TAO_DIOP_Connection_Handler::resume_handler | ( | void | ) | [virtual] |
Definition at line 268 of file DIOP_Connection_Handler.cpp.
| int TAO_DIOP_Connection_Handler::set_dscp_codepoint | ( | CORBA::Boolean | set_network_priority | ) | [virtual] |
Set Diff-Serv codepoint on outgoing packets.
Reimplemented from TAO_Connection_Handler.
Definition at line 419 of file DIOP_Connection_Handler.cpp.
{
int tos = IPDSFIELD_DSCP_DEFAULT << 2;
if (set_network_priority)
{
TAO_Protocols_Hooks *tph = this->orb_core ()->get_protocols_hooks ();
if (tph != 0)
{
CORBA::Long codepoint = tph->get_dscp_codepoint ();
tos = (int)(codepoint) << 2;
this->set_tos (tos);
}
}
return 0;
}
| int TAO_DIOP_Connection_Handler::set_dscp_codepoint | ( | CORBA::Long | dscp_codepoint | ) | [virtual] |
Reimplemented from TAO_Connection_Handler.
Definition at line 410 of file DIOP_Connection_Handler.cpp.
{
int tos = IPDSFIELD_DSCP_DEFAULT << 2;
tos = (int)(dscp) << 2;
this->set_tos (tos);
return 0;
}
| int TAO_DIOP_Connection_Handler::set_tos | ( | int | tos | ) | [protected] |
Helper method used by the set_dscp_codepoint () methods.
Definition at line 357 of file DIOP_Connection_Handler.cpp.
{
if (tos != this->dscp_codepoint_)
{
int result = 0;
#if defined (ACE_HAS_IPV6)
ACE_INET_Addr local_addr;
if (this->peer ().get_local_addr (local_addr) == -1)
return -1;
else if (local_addr.get_type () == AF_INET6)
# if !defined (IPV6_TCLASS)
// IPv6 defines option IPV6_TCLASS for specifying traffic class/priority
// but not many implementations yet (very new;-).
{
if (TAO_debug_level)
{
ACE_DEBUG ((LM_DEBUG,
"TAO (%P|%t) - DIOP_Connection_Handler::"
"set_dscp_codepoint -> IPV6_TCLASS not supported yet\n"));
}
return 0;
}
# else /* !IPV6_TCLASS */
result = this->peer ().set_option (IPPROTO_IPV6,
IPV6_TCLASS,
(int *) &tos ,
(int) sizeof (tos));
else
# endif /* IPV6_TCLASS */
#endif /* ACE_HAS_IPV6 */
result = this->peer ().set_option (IPPROTO_IP,
IP_TOS,
(int *) &tos ,
(int) sizeof (tos));
if (TAO_debug_level)
{
ACE_DEBUG ((LM_DEBUG,
"TAO (%P|%t) - DIOP_Connection_Handler::"
"set_dscp_codepoint, dscp: %x; result: %d; %C\n",
tos,
result,
result == -1 ? "try running as superuser" : ""));
}
// On successful setting of TOS field.
if (result == 0)
this->dscp_codepoint_ = tos;
}
return 0;
}
ACE_INET_Addr TAO_DIOP_Connection_Handler::addr_ [protected] |
This is always the remote address.
Definition at line 140 of file DIOP_Connection_Handler.h.
int TAO_DIOP_Connection_Handler::dscp_codepoint_ [private] |
Stores the type of service value.
Definition at line 149 of file DIOP_Connection_Handler.h.
This is always the local address for the connector.
Definition at line 143 of file DIOP_Connection_Handler.h.
1.7.0