summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorajs3 <ajs3@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2007-07-28 16:30:45 +0000
committerajs3 <ajs3@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2007-07-28 16:30:45 +0000
commitcba7245f503fef6a671e75f1eba9f947b6366078 (patch)
treee243d25197789b051195b1dbb1850e25dc541161
parent2991e776f4a0666044ea3c30c31eb7b2cd3f9a7c (diff)
downloadATCD-cba7245f503fef6a671e75f1eba9f947b6366078.tar.gz
Updates.
-rw-r--r--ACE/ace/SOCK_SCTP_SEQPACK.cpp172
-rw-r--r--ACE/ace/SOCK_SCTP_SEQPACK.h22
-rw-r--r--ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.cpp76
-rw-r--r--ACE/ace/SOCK_SCTP_SEQPACK_Acceptor.h97
-rw-r--r--ACE/ace/ace.mpc1
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