diff options
author | ajs3 <ajs3@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2007-07-28 16:30:45 +0000 |
---|---|---|
committer | ajs3 <ajs3@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2007-07-28 16:30:45 +0000 |
commit | cba7245f503fef6a671e75f1eba9f947b6366078 (patch) | |
tree | e243d25197789b051195b1dbb1850e25dc541161 | |
parent | 2991e776f4a0666044ea3c30c31eb7b2cd3f9a7c (diff) | |
download | ATCD-cba7245f503fef6a671e75f1eba9f947b6366078.tar.gz |
Updates.
-rw-r--r-- | ACE/ace/SOCK_SCTP_SEQPACK.cpp | 172 | ||||
-rw-r--r-- | ACE/ace/SOCK_SCTP_SEQPACK.h | 22 | ||||
-rw-r--r-- | ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.cpp | 76 | ||||
-rw-r--r-- | ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.h | 97 | ||||
-rw-r--r-- | ACE/ace/ace.mpc | 1 |
5 files changed, 366 insertions, 2 deletions
diff --git a/ACE/ace/SOCK_SCTP_SEQPACK.cpp b/ACE/ace/SOCK_SCTP_SEQPACK.cpp index acea51eebab..d53037258c7 100644 --- a/ACE/ace/SOCK_SCTP_SEQPACK.cpp +++ b/ACE/ace/SOCK_SCTP_SEQPACK.cpp @@ -1,7 +1,8 @@ // $Id$ #include "ace/SOCK_SCTP_SEQPACK.h" - +#include <iostream> +#include <netinet/sctp.h> ACE_BEGIN_VERSIONED_NAMESPACE_DECL ACE_SOCK_SCTP_SEQPACK::ACE_SOCK_SCTP_SEQPACK (void) @@ -11,5 +12,172 @@ ACE_SOCK_SCTP_SEQPACK::ACE_SOCK_SCTP_SEQPACK (void) ACE_SOCK_SCTP_SEQPACK::~ACE_SOCK_SCTP_SEQPACK (void) { } - + +ssize_t ACE_SOCK_SCTP_SEQPACK::recvmsg(void* msg, + size_t msgsz, + ACE_INET_Addr& from_addr, + struct sctp_sndrcvinfo* sinfo, + int* msg_flags) +{ + struct sockaddr_in addr; + socklen_t len; + ssize_t rdsz = 0; + struct sctp_sndrcvinfo sri; + int flags; + + rdsz = sctp_recvmsg(this->get_handle(), + msg, + msgsz, + (sockaddr*)&addr, + &len, + &sri, + msg_flags); + + return rdsz; +} + +ssize_t ACE_SOCK_SCTP_SEQPACK::sendmsg(const void* msg, + size_t msgsz, + ACE_INET_Addr& to_addr, + uint32_t ppid, + uint32_t flags, + uint16_t stream, + uint32_t timetolive, + uint32_t context) +{ + ssize_t sndsize; + + sndsize = sctp_sendmsg(this->get_handle(), + msg, + msgsz, + (sockaddr*)to_addr.get_addr(), + to_addr.get_addr_size(), + ppid, + flags, + stream, + timetolive, + context); + + return sndsize; +} + +int +ACE_SOCK_SCTP_SEQPACK::open (const ACE_Multihomed_INET_Addr &local_sap, + int reuse_addr, + int protocol_family, + int backlog) +{ + ACE_TRACE ("ACE_SOCK_SCTP_SEQPACK::open"); + int error = 0; + + if (protocol_family == PF_UNSPEC) + protocol_family = local_sap.get_type (); + + if (ACE_SOCK::open (SOCK_SEQPACKET, + protocol_family, + IPPROTO_SCTP, + reuse_addr) == -1) + { + return -1; + } + + if (protocol_family == PF_INET) + { + sockaddr_in local_inet_addr; + ACE_OS::memset (reinterpret_cast<void *> (&local_inet_addr), + 0, + sizeof local_inet_addr); + + if (local_sap.ACE_Addr::operator== (ACE_Addr::sap_any)) + { + local_inet_addr.sin_port = 0; + } + else + local_inet_addr = *reinterpret_cast<sockaddr_in *> (local_sap.get_addr ()); + + { + // The total number of addresses is the number of secondary + // addresses plus one. + size_t num_addresses = local_sap.get_num_secondary_addresses() + 1; + + // Create an array of sockaddr_in to hold the underlying + // representations of the primary and secondary + // addresses. + sockaddr_in* local_inet_addrs = 0; + ACE_NEW_NORETURN (local_inet_addrs, + sockaddr_in[num_addresses]); + + if (!local_inet_addrs) + error = 1; + else + { + // Populate the array by invoking the get_addresses method + // on the Multihomed_INET_Addr + local_sap.get_addresses(local_inet_addrs, + num_addresses); + +#if defined (ACE_HAS_LKSCTP) + + sockaddr_in *local_sockaddr = 0; + + // bind the primary first + if (ACE_OS::bind (this->get_handle (), + reinterpret_cast<sockaddr *> (&(local_inet_addrs[0])), + sizeof(sockaddr)) == -1) + { + error = 1; + } + + // do we need to bind multiple addresses? + if (num_addresses > 1) + { + ACE_NEW_NORETURN(local_sockaddr, + sockaddr_in[num_addresses - 1]); + + // all of the secondary addresses need the local port set + for (size_t i = 1; i < num_addresses; i++) + { + local_inet_addrs[i].sin_port = local_inet_addrs[0].sin_port; + } + + // copy only the sockaddrs that we need to bindx + for (size_t i = 0; i < num_addresses - 1; i++) + { + ACE_OS::memcpy(&(local_sockaddr[i]), + &(local_inet_addrs[i + 1]), + sizeof(sockaddr_in)); + } + + // now call bindx + if (!error && sctp_bindx(this->get_handle (), + reinterpret_cast<sockaddr *> (local_sockaddr), + num_addresses - 1, + SCTP_BINDX_ADD_ADDR)) + { + error = 1; + } + + delete [] local_sockaddr; + } +#else + // Call bind + size_t name_len = (sizeof local_inet_addr) * num_addresses; + if (ACE_OS::bind (this->get_handle (), + reinterpret_cast<sockaddr *> (local_inet_addrs), + static_cast<int> (name_len)) == -1) + error = 1; +#endif /* ACE_HAS_LKSCTP */ + } + + delete [] local_inet_addrs; + } + } + else if (ACE_OS::bind (this->get_handle (), + (sockaddr *) local_sap.get_addr (), + local_sap.get_size ()) == -1) + error = 1; + + return error ? -1 : 0; +} + ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/ACE/ace/SOCK_SCTP_SEQPACK.h b/ACE/ace/SOCK_SCTP_SEQPACK.h index 65fc9f1a207..151273c4e08 100644 --- a/ACE/ace/SOCK_SCTP_SEQPACK.h +++ b/ACE/ace/SOCK_SCTP_SEQPACK.h @@ -16,6 +16,8 @@ #include /**/ "ace/pre.h" #include "ace/SOCK.h" +#include "ace/INET_Addr.h" +#include "ace/Multihomed_INET_Addr.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once @@ -41,6 +43,26 @@ public: /// Destructor. ~ACE_SOCK_SCTP_SEQPACK (void); + + int open (const ACE_Multihomed_INET_Addr &local_sap, + int reuse_addr = 0, + int protocol_family = PF_UNSPEC, + int backlog = ACE_DEFAULT_BACKLOG); + + ssize_t recvmsg(void* msg, + size_t msgsz, + ACE_INET_Addr& from_addr, + struct sctp_sndrcvinfo* sinfo, + int* msg_flags); + + ssize_t sendmsg(const void* msg, + size_t msgsz, + ACE_INET_Addr& to_addr, + uint32_t ppid, + uint32_t flags, + uint16_t stream, + uint32_t timetolive, + uint32_t context); }; ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.cpp b/ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.cpp new file mode 100644 index 00000000000..e65587e27e7 --- /dev/null +++ b/ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.cpp @@ -0,0 +1,76 @@ +// $Id:$ + +#include "ace/SOCK_SCTP_SEQPACK_Acceptor.h" +#include "ace/Auto_Ptr.h" +#include "ace/Log_Msg.h" +#include "ace/OS_Memory.h" +#include "ace/OS_NS_string.h" +#include "ace/OS_NS_sys_socket.h" +#include "ace/os_include/os_fcntl.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +ACE_ALLOC_HOOK_DEFINE(ACE_SOCK_SCTP_SEQPACK_Acceptor) + +ACE_SOCK_SCTP_SEQPACK_Acceptor::ACE_SOCK_SCTP_SEQPACK_Acceptor (void) +{ + ACE_TRACE ("ACE_SOCK_SCTP_SEQPACK_Acceptor::ACE_SOCK_SCTP_SEQPACK_Acceptor"); +} + +ACE_SOCK_SCTP_SEQPACK_Acceptor::~ACE_SOCK_SCTP_SEQPACK_Acceptor (void) +{ + ACE_TRACE ("ACE_SOCK_SCTP_SEQPACK_Acceptor::~ACE_SOCK_SCTP_SEQPACK_Acceptor"); +} + +int +ACE_SOCK_SCTP_SEQPACK_Acceptor::open (const ACE_Multihomed_INET_Addr &local_sap, + int reuse_addr, + int protocol_family, + int backlog) +{ + int error = 0; + + // Call the base class open() + if(ACE_SOCK_SCTP_SEQPACK::open(local_sap, + reuse_addr, + protocol_family, + backlog) == -1) + { + error = 1; + } + // If the base class open succeeded call listen to enable passive mode + // socket + else if(ACE_OS::listen (this->get_handle (), + backlog) == -1) + { + error = 1; + } + + // Return -1 on error + return error ? -1 : 0; +} + + +ACE_SOCK_SCTP_SEQPACK_Acceptor::ACE_SOCK_SCTP_SEQPACK_Acceptor (const ACE_Multihomed_INET_Addr &local_sap, + int reuse_addr, + int protocol_family, + int backlog) +{ + ACE_TRACE ("ACE_SOCK_SCTP_SEQPACK_Acceptor::ACE_SOCK_SCTP_SEQPACK_Acceptor"); + + if (this->open (local_sap, + reuse_addr, + protocol_family, + backlog) == -1) + ACE_ERROR ((LM_ERROR, + ACE_LIB_TEXT ("%p\n"), + ACE_LIB_TEXT ("ACE_SOCK_SCTP_SEQPACK_Acceptor"))); +} + +int +ACE_SOCK_SCTP_SEQPACK_Acceptor::close (void) +{ + return ACE_SOCK::close (); +} + +ACE_END_VERSIONED_NAMESPACE_DECL diff --git a/ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.h b/ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.h new file mode 100644 index 00000000000..1d3fea66e87 --- /dev/null +++ b/ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.h @@ -0,0 +1,97 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file SOCK_SCTP_SEQPACK_Acceptor.h + * + * $Id$ + * + * @author Andrew J. Stafford <ajstafford@gmail.com> + */ +//============================================================================= + +#ifndef ACE_SOCK_SCTP_SEQPACK_ACCEPTOR_H +#define ACE_SOCK_SCTP_SEQPACK_ACCEPTOR_H + +#include /**/ "ace/pre.h" +#include /**/ "ace/ACE_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ace/SOCK_SCTP_SEQPACK.h" +#include "ace/Multihomed_INET_Addr.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +class ACE_Time_Value; + +/** + * @class ACE_SOCK_SCTP_SEQPACK_Acceptor + * + * @brief Defines a passive mode one-to-many style SCTP endpoint. + * + * The <ACE_SOCK_SCTP_SEQPACK_Acceptor> has is its own "passive-mode" and + * "data mode" socket. That is, one-to-many style SCTP endpoints do not use + * "accept" to create a new data mode socket, rather the passive-mode socket is + * also used to read/write data to/from a client. + * + * Note: The current implementation has only been tested with the LKSCTP + * implementation of the Sockets API for SCTP. + */ +class ACE_Export ACE_SOCK_SCTP_SEQPACK_Acceptor : public ACE_SOCK_SCTP_SEQPACK +{ +public: + + /** + * Default constructor. If this constructer is used then the open + * method should be called to initialize the passive socket before calling + * accept. + */ + ACE_SOCK_SCTP_SEQPACK_Acceptor (void); + + /** + * Multi-homed constructor that calls the open method to initialize the + * passive-mode socket. The underlying protocol type is IPPROTO_SCTP. + */ + ACE_SOCK_SCTP_SEQPACK_Acceptor (const ACE_Multihomed_INET_Addr &local_sap, + int reuse_addr = 0, + int protocol_family = PF_UNSPEC, + int backlog = ACE_DEFAULT_BACKLOG); + + /** + * Initializes a passive-mode SCTP acceptor socket. + * <local_sap> is the set of addresses to listen for + * connections on. If <reuse_addr> is 1 then we'll use the + * <SO_REUSEADDR> to reuse this address. + */ + int open (const ACE_Multihomed_INET_Addr &local_sap, + int reuse_addr = 0, + int protocol_family = PF_UNSPEC, + int backlog = ACE_DEFAULT_BACKLOG); + + /// Close the socket. Returns 0 on success and -1 on failure. + int close (void); + + /// Default destructor. + ~ACE_SOCK_SCTP_SEQPACK_Acceptor (void); + + // = Meta-type info + typedef ACE_Multihomed_INET_Addr PEER_ADDR; + typedef ACE_SOCK_SCTP_SEQPACK PEER_STREAM; + + /// Declare the dynamic allocation hooks. + ACE_ALLOC_HOOK_DECLARE; + +private: + + /// Do not allow this function to percolate up to this interface... + int get_remote_addr (ACE_Addr &) const; +}; + +ACE_END_VERSIONED_NAMESPACE_DECL + +#include /**/ "ace/post.h" + +#endif /* ACE_SOCK_SEQ_ACCEPTOR_H */ diff --git a/ACE/ace/ace.mpc b/ACE/ace/ace.mpc index 44df356e115..15f755563e3 100644 --- a/ACE/ace/ace.mpc +++ b/ACE/ace/ace.mpc @@ -221,6 +221,7 @@ project(ACE) : acedefaults, install, other, codecs, token, svcconf, uuid, fileca SOCK_IO.cpp SOCK_Netlink.cpp SOCK_SCTP_SEQPACK.cpp + SOCK_SCTP_SEQPACK_Acceptor.cpp SOCK_SEQPACK_Acceptor.cpp SOCK_SEQPACK_Association.cpp SOCK_SEQPACK_Connector.cpp |