SCTP_SEQ.cpp

Go to the documentation of this file.
00001 // $Id: SCTP_SEQ.cpp 71526 2006-03-14 06:14:35Z jtc $
00002 
00003 #include "orbsvcs/AV/SCTP_SEQ.h"
00004 
00005 #if defined (ACE_HAS_SCTP)
00006 
00007 #include "orbsvcs/AV/AVStreams_i.h"
00008 #include "ace/Multihomed_INET_Addr.h"
00009 #include "tao/debug.h"
00010 #include "ace/Arg_Shifter.h"
00011 
00012 ACE_RCSID (AV,
00013            SCTP_SEQ,
00014            "SCTP_SEQ.cpp,v 1.3 2003/11/05 21:06:53 yamuna Exp")
00015 
00016 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00017 
00018 //------------------------------------------------------------
00019 // TAO_AV_SCTP_SEQ_Transport
00020 //------------------------------------------------------------
00021 
00022 TAO_AV_SCTP_SEQ_Transport::TAO_AV_SCTP_SEQ_Transport (void)
00023   :handler_ (0)
00024 {
00025 }
00026 
00027 TAO_AV_SCTP_SEQ_Transport::TAO_AV_SCTP_SEQ_Transport (TAO_AV_SCTP_SEQ_Flow_Handler *handler)
00028   :handler_ (handler)
00029 {
00030 }
00031 
00032 TAO_AV_SCTP_SEQ_Transport::~TAO_AV_SCTP_SEQ_Transport (void)
00033 {
00034 }
00035 
00036 int
00037 TAO_AV_SCTP_SEQ_Transport::open (ACE_Addr * /*address*/)
00038 {
00039   return 0;
00040 }
00041 
00042 int
00043 TAO_AV_SCTP_SEQ_Transport::close (void)
00044 {
00045   return 0;
00046 }
00047 
00048 int
00049 TAO_AV_SCTP_SEQ_Transport::mtu (void)
00050 {
00051   return 0;
00052 }
00053 
00054 ACE_Addr*
00055 TAO_AV_SCTP_SEQ_Transport::get_peer_addr (void)
00056 {
00057   return 0;
00058 }
00059 
00060 ssize_t
00061 TAO_AV_SCTP_SEQ_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
00062 {
00063   // For the most part this was copied from GIOP::send_request and
00064   // friends.
00065 
00066   //  ACE_Time_Value timeout;
00067 
00068   iovec iov[ACE_IOV_MAX];
00069   int iovcnt = 0;
00070   ssize_t n = 0;
00071   ssize_t nbytes = 0;
00072 
00073   for (const ACE_Message_Block *i = mblk;
00074        i != 0;
00075        i = i->cont ())
00076     {
00077       // Make sure there is something to send!
00078       if (i->length () > 0)
00079         {
00080           iov[iovcnt].iov_base = i->rd_ptr ();
00081           iov[iovcnt].iov_len  = static_cast<u_long> (i->length ());
00082           iovcnt++;
00083 
00084           // The buffer is full make a OS call.  @@ TODO this should
00085           // be optimized on a per-platform basis, for instance, some
00086           // platforms do not implement writev() there we should copy
00087           // the data into a buffer and call send_n(). In other cases
00088           // there may be some limits on the size of the iovec, there
00089           // we should set ACE_IOV_MAX to that limit.
00090           if (iovcnt == ACE_IOV_MAX)
00091             {
00092               n = this->handler_->peer ().sendv_n ((const iovec *) iov,
00093                                                    iovcnt);
00094           //&timeout);
00095               if (n < 1)
00096                 return n;
00097 
00098               nbytes += n;
00099               iovcnt = 0;
00100             }
00101         }
00102     }
00103 
00104   // Check for remaining buffers to be sent!
00105   if (iovcnt != 0)
00106     {
00107       n = this->handler_->peer ().sendv_n ((const iovec *) iov,
00108                                            iovcnt);
00109       if (n < 1)
00110         return n;
00111 
00112       nbytes += n;
00113     }
00114 
00115   return nbytes;
00116 }
00117 
00118 ssize_t
00119 TAO_AV_SCTP_SEQ_Transport::send (const char *buf,
00120                  size_t len,
00121                  ACE_Time_Value *)
00122 {
00123   return this->handler_->peer ().send_n (buf, len);
00124 }
00125 
00126 ssize_t
00127 TAO_AV_SCTP_SEQ_Transport::send (const iovec *iov,
00128                  int iovcnt,
00129                  ACE_Time_Value *)
00130 {
00131   return this->handler_->peer ().sendv_n (iov,
00132                                           iovcnt);
00133 }
00134 
00135 ssize_t
00136 TAO_AV_SCTP_SEQ_Transport::recv (char *buf,
00137                           size_t len,
00138                           ACE_Time_Value *)
00139 {
00140   return this->handler_->peer ().recv (buf, len);
00141 }
00142 
00143 ssize_t
00144 TAO_AV_SCTP_SEQ_Transport::recv (char *buf,
00145                             size_t len,
00146                             int flags,
00147                             ACE_Time_Value *)
00148 {
00149   return this->handler_->peer ().recv (buf,
00150                                        len,
00151                                        flags);
00152 }
00153 
00154 ssize_t
00155 TAO_AV_SCTP_SEQ_Transport::recv (iovec *iov,
00156                             int iovcnt,
00157                             ACE_Time_Value *)
00158 {
00159   return handler_->peer ().recvv_n (iov, iovcnt);
00160 }
00161 
00162 //------------------------------------------------------------
00163 // TAO_AV_SCTP_SEQ_Base_Acceptor
00164 //------------------------------------------------------------
00165 
00166 int
00167 TAO_AV_SCTP_SEQ_Base_Acceptor::acceptor_open (TAO_AV_SCTP_SEQ_Acceptor *acceptor,
00168                           ACE_Reactor *reactor,
00169                           const ACE_INET_Addr &local_addr,
00170                           TAO_FlowSpec_Entry *entry)
00171 {
00172   ACE_DEBUG ((LM_DEBUG,
00173           "In base acceptor open"));
00174 
00175   this->acceptor_ = acceptor;
00176   this->reactor_ = reactor;
00177   this->entry_ = entry;
00178 
00179   ACE_UINT32 local_ip_addr [entry->num_local_sec_addrs ()];
00180   ACE_INET_Addr ip_addr;
00181   char** addrs = entry->get_local_sec_addr ();
00182   for (int i = 0; i < entry->num_local_sec_addrs (); i++)
00183     {
00184       ACE_CString addr_str (addrs[i]);
00185       addr_str += ":";
00186       ip_addr.set (addr_str.c_str ());
00187       local_ip_addr [i] = ip_addr.get_ip_address ();
00188     }
00189 
00190 
00191   ACE_Multihomed_INET_Addr multi_addr;
00192   multi_addr.set (local_addr.get_port_number (),
00193           local_addr.get_ip_address (),
00194           1,
00195           local_ip_addr,
00196           entry->num_local_sec_addrs ());
00197 
00198   char buf[BUFSIZ];
00199   multi_addr.addr_to_string (buf,
00200                  BUFSIZ);
00201 
00202   if (TAO_debug_level > 0)
00203     ACE_DEBUG ((LM_DEBUG,
00204                 "TAO_AV_SCTP_SEQ_Base_Acceptor::open: %s",
00205                 buf
00206                 ));
00207 
00208   int result = this->open (multi_addr,reactor);
00209   if (result < 0)
00210     ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Base_Acceptor::open failed\n"),-1);
00211 
00212   return 0;
00213 }
00214 
00215 int
00216 TAO_AV_SCTP_SEQ_Base_Acceptor::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&handler)
00217 {
00218   int result = this->acceptor_->make_svc_handler (handler);
00219   if (result < 0)
00220     return result;
00221   handler->reactor (this->reactor_);
00222   this->entry_->handler (handler);
00223 
00224   return 0;
00225 }
00226 
00227 //------------------------------------------------------------
00228 // TAO_AV_SCTP_SEQ_Acceptor
00229 //------------------------------------------------------------
00230 
00231 TAO_AV_SCTP_SEQ_Acceptor::TAO_AV_SCTP_SEQ_Acceptor (void)
00232 {
00233 }
00234 
00235 TAO_AV_SCTP_SEQ_Acceptor::~TAO_AV_SCTP_SEQ_Acceptor (void)
00236 {
00237 }
00238 
00239 int
00240 TAO_AV_SCTP_SEQ_Acceptor::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&sctp_handler)
00241 {
00242   if (TAO_debug_level > 0)
00243     ACE_DEBUG ((LM_DEBUG,
00244                 "TAO_AV_SCTP_SEQ_Acceptor::make_svc_handler\n"
00245                 ));
00246 
00247   if (this->endpoint_ != 0)
00248     {
00249       ACE_NEW_RETURN (sctp_handler,
00250                       TAO_AV_SCTP_SEQ_Flow_Handler,
00251                       -1);
00252 
00253       TAO_AV_Protocol_Object *object =
00254         this->flow_protocol_factory_->make_protocol_object (this->entry_,
00255                                                             this->endpoint_,
00256                                                             sctp_handler,
00257                                                             sctp_handler->transport ());
00258 
00259       sctp_handler->protocol_object (object);
00260       this->endpoint_->set_flow_handler (this->flowname_.c_str (),sctp_handler);
00261       this->entry_->protocol_object (object);
00262       this->entry_->handler (sctp_handler);
00263     }
00264   return 0;
00265 }
00266 
00267 int
00268 TAO_AV_SCTP_SEQ_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
00269                 TAO_AV_Core *av_core,
00270                 TAO_FlowSpec_Entry *entry,
00271                 TAO_AV_Flow_Protocol_Factory *factory,
00272                 TAO_AV_Core::Flow_Component flow_comp)
00273 {
00274   this->flow_protocol_factory_ = factory;
00275 
00276   this->av_core_ = av_core;
00277   this->endpoint_ = endpoint;
00278   this->entry_ = entry;
00279 
00280   if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
00281     this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
00282   else
00283   this->flowname_ = entry->flowname ();
00284 
00285   ACE_Addr *address = entry->address ();
00286 
00287   ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) address;
00288 
00289   char buf[BUFSIZ];
00290   inet_addr->addr_to_string (buf,
00291                              BUFSIZ);
00292 
00293   if (TAO_debug_level > 0)
00294     ACE_DEBUG ((LM_DEBUG,
00295                 "TAO_AV_SCTP_SEQ_Acceptor::open: %s",
00296                 buf
00297                 ));
00298 
00299   //Add code for reading multihomed addresses and pass the multihomed
00300   //addr to the following method. ACE_Multihomed_addr derives from
00301   //ACE_INET_Addr, hence this should not be an issue.
00302   int result = this->acceptor_.acceptor_open (this,
00303                           av_core->reactor (),
00304                           *inet_addr,
00305                           entry);
00306   if (result < 0)
00307     ACE_ERROR_RETURN ((LM_ERROR,
00308                        "TAO_AV_SCTP_SEQ_Acceptor::open failed"),
00309                       -1);
00310 
00311   entry->set_local_addr (address);
00312   return 0;
00313 }
00314 
00315 int
00316 TAO_AV_SCTP_SEQ_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
00317                     TAO_AV_Core *av_core,
00318                     TAO_FlowSpec_Entry *entry,
00319                     TAO_AV_Flow_Protocol_Factory *factory,
00320                     TAO_AV_Core::Flow_Component flow_comp)
00321 {
00322   this->flow_protocol_factory_ = factory;
00323   this->av_core_ = av_core;
00324   this->endpoint_ = endpoint;
00325   this->entry_ = entry;
00326   if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
00327     this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname());
00328   else
00329   this->flowname_ = entry->flowname ();
00330 
00331   ACE_INET_Addr *address;
00332   ACE_NEW_RETURN (address,
00333                   ACE_INET_Addr ("0"),
00334                   -1);
00335 
00336   int result = this->acceptor_.acceptor_open (this,
00337                           av_core->reactor (),
00338                           *address,
00339                           entry);
00340 
00341 
00342   if (result < 0)
00343     ACE_ERROR_RETURN ((LM_ERROR,
00344                        "TAO_AV_SCTP_SEQ_Acceptor::open failed"),
00345                       -1);
00346 
00347   this->acceptor_.acceptor ().get_local_addr (*address);
00348 
00349   address->set (address->get_port_number (),
00350                 address->get_host_name ());
00351 
00352   char buf[BUFSIZ];
00353   address->addr_to_string (buf,BUFSIZ);
00354 
00355   if (TAO_debug_level > 0)
00356     ACE_DEBUG ((LM_DEBUG,
00357                 "TAO_AV_SCTP_SEQ_Acceptor::open_default: %s\n",
00358                 buf));
00359 
00360   entry->set_local_addr (address);
00361 
00362   return 0;
00363 }
00364 
00365 
00366 int
00367 TAO_AV_SCTP_SEQ_Acceptor::close (void)
00368 {
00369   return 0;
00370 }
00371 
00372 //------------------------------------------------------------
00373 // TAO_AV_SCTP_SEQ_Base_Connector
00374 //------------------------------------------------------------
00375 
00376 int
00377 TAO_AV_SCTP_SEQ_Base_Connector::connector_open (TAO_AV_SCTP_SEQ_Connector *connector,
00378                         ACE_Reactor *reactor)
00379 {
00380   this->connector_ = connector;
00381   this->reactor_ = reactor;
00382 
00383   int result = this->open (reactor);
00384   if (result < 0)
00385     ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Base_Connector::open failed\n"),-1);
00386   return 0;
00387 }
00388 
00389 int
00390 TAO_AV_SCTP_SEQ_Base_Connector::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&sctp_handler)
00391 {
00392   int result =
00393     this->connector_->make_svc_handler (sctp_handler);
00394   if (result < 0)
00395     return result;
00396   sctp_handler->reactor (this->reactor_);
00397   return 0;
00398 }
00399 
00400 int
00401 TAO_AV_SCTP_SEQ_Base_Connector::connector_connect (TAO_AV_SCTP_SEQ_Flow_Handler *&handler,
00402                            const ACE_Multihomed_INET_Addr &remote_addr,
00403                            const ACE_Multihomed_INET_Addr &local_addr)
00404 {
00405   int result = this->connect (handler,
00406                   remote_addr,
00407                   0,
00408                   local_addr);
00409 
00410   if (result < 0)
00411     ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Base_Connector::connect failed\n"),-1);
00412   return 0;
00413 }
00414 
00415 //------------------------------------------------------------
00416 // TAO_AV_SCTP_SEQ_Connector
00417 //------------------------------------------------------------
00418 TAO_AV_SCTP_SEQ_Connector::TAO_AV_SCTP_SEQ_Connector (void)
00419 {
00420 }
00421 
00422 TAO_AV_SCTP_SEQ_Connector::~TAO_AV_SCTP_SEQ_Connector (void)
00423 {
00424 }
00425 
00426 int
00427 TAO_AV_SCTP_SEQ_Connector::make_svc_handler (TAO_AV_SCTP_SEQ_Flow_Handler *&sctp_handler)
00428 {
00429   if (TAO_debug_level > 0)
00430     ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Connector::make_svc_handler\n"));
00431 
00432   //  TAO_AV_Callback *callback = 0;
00433   if (this->endpoint_ != 0)
00434     {
00435       //       this->endpoint_->get_callback (this->flowname_.c_str (),
00436       //                                      callback);
00437       ACE_NEW_RETURN (sctp_handler,
00438                       //                      TAO_AV_SCTP_SEQ_Flow_Handler (callback),
00439                       TAO_AV_SCTP_SEQ_Flow_Handler,
00440                       -1);
00441       TAO_AV_Protocol_Object *object =
00442         this->flow_protocol_factory_->make_protocol_object (this->entry_,
00443                                                             this->endpoint_,
00444                                                             sctp_handler,
00445                                                             sctp_handler->transport ());
00446       sctp_handler->protocol_object (object);
00447       //      callback->protocol_object (object);
00448       //       this->endpoint_->set_protocol_object (this->flowname_.c_str (),
00449       //                                             object);
00450       this->endpoint_->set_flow_handler (this->flowname_.c_str (),sctp_handler);
00451       this->entry_->protocol_object (object);
00452       this->entry_->handler (sctp_handler);
00453     }
00454   return 0;
00455 }
00456 
00457 int
00458 TAO_AV_SCTP_SEQ_Connector::open (TAO_Base_StreamEndPoint *endpoint,
00459                  TAO_AV_Core *av_core,
00460                  TAO_AV_Flow_Protocol_Factory *factory)
00461 
00462 {
00463   this->endpoint_ = endpoint;
00464   this->flow_protocol_factory_ = factory;
00465   if (TAO_debug_level > 0)
00466     ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Connector::open "));
00467   int result = this->connector_.connector_open(this,
00468                                                av_core->reactor ());
00469   return result;
00470 }
00471 
00472 int
00473 TAO_AV_SCTP_SEQ_Connector::connect (TAO_FlowSpec_Entry *entry,
00474                     TAO_AV_Transport *&transport,
00475                     TAO_AV_Core::Flow_Component flow_comp)
00476 {
00477   this->entry_ = entry;
00478   if (flow_comp == TAO_AV_Core::TAO_AV_CONTROL)
00479     this->flowname_ = TAO_AV_Core::get_control_flowname (entry->flowname ());
00480   else
00481     this->flowname_ = entry->flowname ();
00482   ACE_Addr *remote_addr = entry->address ();
00483   ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr *> (remote_addr);
00484   TAO_AV_SCTP_SEQ_Flow_Handler *handler = 0;
00485 
00486   ACE_Multihomed_INET_Addr remote_multi_addr;
00487   remote_multi_addr.set (inet_addr->get_port_number (),
00488              inet_addr->get_ip_address (),
00489              1,
00490              0,
00491              0);
00492 
00493   ACE_Multihomed_INET_Addr local_addr; //This can be a multihomed address
00494   ACE_INET_Addr *addr;
00495   if (entry->get_peer_addr () != 0)
00496     {
00497       addr = dynamic_cast<ACE_INET_Addr *> (entry->get_peer_addr ());
00498     }
00499   else
00500     {
00501       ACE_NEW_RETURN (addr,
00502               ACE_INET_Addr ("0"),
00503               -1);
00504     }
00505 
00506   ACE_UINT32 local_ip_addr [entry->num_peer_sec_addrs ()];
00507   ACE_INET_Addr ip_addr;
00508   char** addrs = entry->get_peer_sec_addr ();
00509   for (int i = 0; i < entry->num_peer_sec_addrs (); i++)
00510     {
00511       ACE_CString addr_str (addrs[i]);
00512       addr_str += ":";
00513       ip_addr.set (addr_str.c_str ());
00514       local_ip_addr [i] = ip_addr.get_ip_address ();
00515     }
00516 
00517   if (entry->num_peer_sec_addrs () != 0)
00518     local_addr.set (addr->get_port_number (),
00519             addr->get_ip_address (),
00520             1,
00521             local_ip_addr,
00522             entry->num_peer_sec_addrs ());
00523   else
00524     local_addr.set (addr->get_port_number (),
00525             addr->get_ip_address (),
00526             1,
00527             0,
00528             entry->num_peer_sec_addrs ());
00529 
00530 
00531   int result = this->connector_.connector_connect (handler,
00532                            remote_multi_addr,
00533                            local_addr);
00534 
00535   if (result < 0)
00536     ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_connector::connect failed\n"),-1);
00537   entry->handler (handler);
00538   transport = handler->transport ();
00539 
00540   if (TAO_debug_level > 0)
00541     {
00542       ACE_DEBUG ((LM_DEBUG,
00543           "Local Addrs\n"));
00544       char buf [BUFSIZ];
00545       size_t size = BUFSIZ;
00546       ACE_INET_Addr *peer_addrs = 0;
00547       ACE_NEW_RETURN (peer_addrs,ACE_INET_Addr [size], -1);
00548       handler->peer ().get_local_addrs (peer_addrs, size);
00549       for (unsigned int i=0; i < size;i++)
00550     {
00551       peer_addrs [i].addr_to_string (buf,
00552                      BUFSIZ);
00553       ACE_DEBUG ((LM_DEBUG,
00554               "%s %d\n",
00555               buf,
00556               size));
00557     }
00558 
00559       ACE_DEBUG ((LM_DEBUG,
00560           "Remote Addrs\n"));
00561 
00562       size = BUFSIZ;
00563       handler->peer ().get_remote_addrs (peer_addrs, size);
00564       for (unsigned int i=0; i < size;i++)
00565     {
00566       peer_addrs [i].addr_to_string (buf,
00567                      BUFSIZ);
00568       ACE_DEBUG ((LM_DEBUG,
00569               "%s %d\n",
00570               buf,
00571               size));
00572     }
00573       //delete peer_addrs;
00574     }
00575 
00576   return 0;
00577 }
00578 
00579 int
00580 TAO_AV_SCTP_SEQ_Connector::close (void)
00581 {
00582   return 0;
00583 }
00584 
00585 //------------------------------------------------------------
00586 // TAO_AV_SCTP_SEQ_Protocol_Factory
00587 //------------------------------------------------------------
00588 
00589 
00590 TAO_AV_SCTP_SEQ_Factory::TAO_AV_SCTP_SEQ_Factory (void)
00591 {
00592 }
00593 
00594 TAO_AV_SCTP_SEQ_Factory::~TAO_AV_SCTP_SEQ_Factory (void)
00595 {
00596 }
00597 
00598 
00599 int
00600 TAO_AV_SCTP_SEQ_Factory::match_protocol (const char *protocol_string)
00601 {
00602   if (ACE_OS::strcasecmp (protocol_string,"SCTP_SEQ") == 0)
00603     return 1;
00604   return 0;
00605 }
00606 
00607 TAO_AV_Acceptor*
00608 TAO_AV_SCTP_SEQ_Factory::make_acceptor (void)
00609 {
00610   if (TAO_debug_level > 0)
00611     ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Factory::make_acceptor\n"));
00612   TAO_AV_Acceptor *acceptor = 0;
00613   ACE_NEW_RETURN (acceptor,
00614                   TAO_AV_SCTP_SEQ_Acceptor,
00615                   0);
00616   return acceptor;
00617 }
00618 
00619 TAO_AV_Connector*
00620 TAO_AV_SCTP_SEQ_Factory::make_connector (void)
00621 {
00622   if (TAO_debug_level > 0)
00623     ACE_DEBUG ((LM_DEBUG,"TAO_AV_SCTP_SEQ_Factory::make_connector\n"));
00624   TAO_AV_Connector *connector = 0;
00625   ACE_NEW_RETURN (connector,
00626                   TAO_AV_SCTP_SEQ_Connector,
00627                   0);
00628   return connector;
00629 }
00630 
00631 
00632 int
00633 TAO_AV_SCTP_SEQ_Factory::init (int,
00634                    char *[])
00635 {
00636 
00637   return 0;
00638 }
00639 
00640 //------------------------------------------------------------
00641 // TAO_AV_SCTP_SEQ_Object
00642 //------------------------------------------------------------
00643 
00644 int
00645 TAO_AV_SCTP_SEQ_Object::handle_input (void)
00646 {
00647   int n = this->transport_->recv (this->frame_.rd_ptr (),
00648                                   this->frame_.size ());
00649   if (n == -1)
00650     ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Flow_Handler::handle_input recv failed\n"),-1);
00651   if (n == 0)
00652     ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_SCTP_SEQ_Flow_Handler::handle_input connection closed\n"),-1);
00653   this->frame_.wr_ptr (this->frame_.rd_ptr () + n);
00654 
00655   return this->callback_->receive_frame (&this->frame_);
00656 }
00657 
00658 int
00659 TAO_AV_SCTP_SEQ_Object::send_frame (ACE_Message_Block *frame,
00660                     TAO_AV_frame_info * /*frame_info*/)
00661 {
00662   int result = this->transport_->send (frame);
00663   return result;
00664 }
00665 
00666 int
00667 TAO_AV_SCTP_SEQ_Object::send_frame (const iovec *iov,
00668                     int iovcnt,
00669                     TAO_AV_frame_info * /*frame_info*/)
00670 {
00671   return this->transport_->send (iov,iovcnt);
00672 }
00673 
00674 int
00675 TAO_AV_SCTP_SEQ_Object::send_frame (const char*buf,
00676                     size_t len)
00677 {
00678   int result = this->transport_->send (buf, len, 0);
00679   return result;
00680 }
00681 
00682 
00683 TAO_AV_SCTP_SEQ_Object::TAO_AV_SCTP_SEQ_Object (TAO_AV_Callback *callback,
00684                         TAO_AV_Transport *transport)
00685   :TAO_AV_Protocol_Object (callback,transport)
00686 {
00687   // @@ Is this a good size?
00688   this->frame_.size (BUFSIZ);
00689 }
00690 
00691 TAO_AV_SCTP_SEQ_Object::~TAO_AV_SCTP_SEQ_Object (void)
00692 {
00693   // No-op
00694 }
00695 int
00696 TAO_AV_SCTP_SEQ_Object::destroy (void)
00697 {
00698   this->callback_->handle_destroy ();
00699   delete this;
00700   return 0;
00701 }
00702 
00703 //------------------------------------------------------------
00704 // TAO_AV_SCTP_SEQ_Flow_Handler
00705 //------------------------------------------------------------
00706 
00707 TAO_AV_SCTP_SEQ_Flow_Handler::TAO_AV_SCTP_SEQ_Flow_Handler (TAO_AV_Callback * /*callback*/)
00708   //  :TAO_AV_Flow_Handler (callback)
00709 {
00710   ACE_NEW (this->transport_,
00711            TAO_AV_SCTP_SEQ_Transport (this));
00712 }
00713 
00714 TAO_AV_SCTP_SEQ_Flow_Handler::~TAO_AV_SCTP_SEQ_Flow_Handler (void)
00715 {
00716   delete this->transport_;
00717 }
00718 
00719 TAO_AV_Transport *
00720 TAO_AV_SCTP_SEQ_Flow_Handler::transport (void)
00721 {
00722   return this->transport_;
00723 }
00724 
00725 int
00726 TAO_AV_SCTP_SEQ_Flow_Handler::change_qos (AVStreams::QoS qos)
00727 {
00728   if( TAO_debug_level > 0 )
00729     {
00730       ACE_DEBUG ((LM_DEBUG,
00731                   "(%N,%l) TAO_AV_SCTP_SEQ_Flow_Handler::change_qos\n"));
00732     }
00733 
00734   unsigned int i=0;
00735 
00736   int ret = 0;
00737   CORBA::Long dscp = 0;
00738   CORBA::Long ecn = 0;
00739   int dscp_flag=0;
00740   for(i=0; i < qos.QoSParams.length(); i++)
00741     {
00742 
00743       if( ACE_OS::strcmp( qos.QoSParams[i].property_name.in(), "Diffserv_Codepoint") == 0)
00744         {
00745           qos.QoSParams[i].property_value >>= dscp;
00746       ACE_DEBUG ((LM_DEBUG,
00747               "DSCP %d\n",
00748               dscp));
00749           dscp_flag=1;
00750           // DSCP value can only be 6 bits wide
00751           if(!((dscp >= 0) && (dscp <= 63)))
00752             {
00753               dscp_flag = 0;
00754               ACE_DEBUG((LM_DEBUG, "(%N,%l) ECN value can only be (0-3) not %d\n", ecn));
00755               return -1;
00756             }
00757         }
00758 
00759       if( ACE_OS::strcmp( qos.QoSParams[i].property_name.in(), "ECN") == 0)
00760         {
00761           qos.QoSParams[i].property_value >>= ecn;
00762           // ECN value can only occupy bits 6 and 7 of the
00763           // IP Diffserv byte
00764           if(!((ecn >= 0) && (ecn <= 3)))
00765             {
00766               ACE_DEBUG((LM_DEBUG, "(%N,%l) ECN value can only be (0-3) not %d\n", ecn));
00767               ecn = 0;
00768             }
00769 
00770         }
00771     }
00772   // Set the Diffserv byte only if we specified
00773   // the Diffserv Codepoint (DSCP) or ECN via QoSParams
00774   // passed into this method
00775   if(dscp_flag || ecn)
00776     {
00777       int tos;
00778       tos = (int)(dscp << 2);
00779       if(ecn)
00780     {
00781       tos |= ecn;
00782     }
00783       ret = this->peer ().set_option(IPPROTO_IP, IP_TOS, (int *)&tos , (int)sizeof(tos));
00784 
00785       if(TAO_debug_level > 0)
00786     {
00787       ACE_DEBUG((LM_DEBUG, "(%N,%l) set tos: ret: %d %d\n", tos, ret));
00788     }
00789     }
00790 
00791   if(TAO_debug_level > 0)
00792     {
00793       if(ret < 0 )
00794     {
00795       ACE_DEBUG((LM_DEBUG, "(%N,%l) errno: %p\n"));
00796     }
00797     }
00798   return ret;
00799 }
00800 
00801 int
00802 TAO_AV_SCTP_SEQ_Flow_Handler::open (void * /*arg*/)
00803 {
00804   ACE_CDR::Long nodelay = 1;
00805 
00806 #if defined (SCTP_NODELAY)
00807   if (this->peer ().set_option (IPPROTO_SCTP,
00808                                 SCTP_NODELAY,
00809                                 (void *) &nodelay,
00810                                 sizeof (nodelay)) == -1)
00811     ACE_ERROR_RETURN ((LM_ERROR,
00812                        "NODELAY failed\n"),
00813                       -1);
00814 #endif /* SCTP_NODELAY */
00815 
00816   // Called by the <Strategy_Acceptor> when the handler is completely
00817   // connected.
00818   ACE_INET_Addr addr;
00819 
00820   if (this->peer ().get_remote_addr (addr) == -1)
00821     return -1;
00822 
00823   char server[MAXHOSTNAMELEN + 16];
00824 
00825   (void) addr.addr_to_string (server, sizeof (server));
00826 
00827   if (TAO_debug_level > 0)
00828     if (TAO_debug_level > 0)
00829       ACE_DEBUG ((LM_DEBUG,
00830           "(%P|%t) connection to server <%s> on %d\n",
00831           server, this->peer ().get_handle ()));
00832 
00833   this->peer ().disable (ACE_NONBLOCK);
00834 
00835   // Register the handler with the reactor.
00836   if (this->reactor ()
00837       && this->reactor ()->register_handler
00838       (this,
00839        ACE_Event_Handler::READ_MASK) == -1)
00840     ACE_ERROR_RETURN ((LM_ERROR,
00841                        ACE_TEXT ("%p\n"),
00842                        ACE_TEXT ("unable to register client handler")),
00843                       -1);
00844   return 0;
00845 }
00846 
00847 int
00848 TAO_AV_SCTP_SEQ_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
00849 {
00850   return this->protocol_object_->handle_input ();
00851 }
00852 
00853 int
00854 TAO_AV_SCTP_SEQ_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
00855                                                const void *arg)
00856 {
00857   return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
00858 }
00859 
00860 
00861 //------------------------------------------------------------
00862 // TAO_AV_SCTP_SEQ_Flow_Factory
00863 //------------------------------------------------------------
00864 TAO_AV_SCTP_SEQ_Flow_Factory::TAO_AV_SCTP_SEQ_Flow_Factory (void)
00865 {
00866 }
00867 
00868 TAO_AV_SCTP_SEQ_Flow_Factory::~TAO_AV_SCTP_SEQ_Flow_Factory (void)
00869 {
00870 }
00871 
00872 int
00873 TAO_AV_SCTP_SEQ_Flow_Factory::init (int /* argc */,
00874                                char * /* argv */ [])
00875 {
00876   return 0;
00877 }
00878 
00879 int
00880 TAO_AV_SCTP_SEQ_Flow_Factory::match_protocol (const char *flow_string)
00881 {
00882   if (ACE_OS::strcasecmp (flow_string,"SCTP_SEQ") == 0)
00883     return 1;
00884   return 0;
00885 }
00886 
00887 TAO_AV_Protocol_Object*
00888 TAO_AV_SCTP_SEQ_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
00889                                                TAO_Base_StreamEndPoint *endpoint,
00890                                                TAO_AV_Flow_Handler *handler,
00891                                                TAO_AV_Transport *transport)
00892 {
00893   TAO_AV_Callback *callback = 0;
00894   if( endpoint->get_callback (entry->flowname (), callback) ) {
00895     ACE_ERROR_RETURN ((LM_ERROR, "(%N,%l) Invalid callback\n"), 0);
00896   }
00897 
00898   TAO_AV_SCTP_SEQ_Object *object = 0;
00899   ACE_NEW_RETURN (object,
00900                   TAO_AV_SCTP_SEQ_Object (callback,
00901                                      transport),
00902                   0);
00903   callback->open (object,
00904                   handler);
00905   endpoint->set_protocol_object (entry->flowname (),
00906                                  object);
00907 
00908   endpoint->protocol_object_set ();
00909   return object;
00910 }
00911 
00912 TAO_END_VERSIONED_NAMESPACE_DECL
00913 
00914 ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_SCTP_SEQ_Flow_Factory)
00915 ACE_STATIC_SVC_DEFINE (TAO_AV_SCTP_SEQ_Flow_Factory,
00916                        ACE_TEXT ("SCTP_SEQ_Flow_Factory"),
00917                        ACE_SVC_OBJ_T,
00918                        &ACE_SVC_NAME (TAO_AV_SCTP_SEQ_Flow_Factory),
00919                        ACE_Service_Type::DELETE_THIS |
00920                        ACE_Service_Type::DELETE_OBJ,
00921                        0)
00922 
00923 ACE_FACTORY_DEFINE (TAO_AV, TAO_AV_SCTP_SEQ_Factory)
00924 ACE_STATIC_SVC_DEFINE (TAO_AV_SCTP_SEQ_Factory,
00925                        ACE_TEXT ("SCTP_SEQ_Factory"),
00926                        ACE_SVC_OBJ_T,
00927                        &ACE_SVC_NAME (TAO_AV_SCTP_SEQ_Factory),
00928                        ACE_Service_Type::DELETE_THIS |
00929                        ACE_Service_Type::DELETE_OBJ,
00930                        0)
00931 
00932 #endif // ACE_HAS_SCTP

Generated on Tue Feb 2 17:47:49 2010 for TAO_AV by  doxygen 1.4.7