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
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
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 * )
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
00064
00065
00066
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
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
00085
00086
00087
00088
00089
00090 if (iovcnt == ACE_IOV_MAX)
00091 {
00092 n = this->handler_->peer ().sendv_n ((const iovec *) iov,
00093 iovcnt);
00094
00095 if (n < 1)
00096 return n;
00097
00098 nbytes += n;
00099 iovcnt = 0;
00100 }
00101 }
00102 }
00103
00104
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
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
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
00300
00301
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
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
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
00433 if (this->endpoint_ != 0)
00434 {
00435
00436
00437 ACE_NEW_RETURN (sctp_handler,
00438
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
00448
00449
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;
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
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
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
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 * )
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 * )
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
00688 this->frame_.size (BUFSIZ);
00689 }
00690
00691 TAO_AV_SCTP_SEQ_Object::~TAO_AV_SCTP_SEQ_Object (void)
00692 {
00693
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
00705
00706
00707 TAO_AV_SCTP_SEQ_Flow_Handler::TAO_AV_SCTP_SEQ_Flow_Handler (TAO_AV_Callback * )
00708
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
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
00763
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
00773
00774
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 * )
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
00815
00816
00817
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
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 )
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
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 ,
00874 char * [])
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