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