summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrazb <razb@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-04-01 21:40:59 +0000
committerrazb <razb@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-04-01 21:40:59 +0000
commit0698cbcc0fcf8fc795da0d9aab3fd31619632f3f (patch)
tree0490bdcdf994614138e79d8574e05162206d0c72
parentd0d98b811337aa18f05c911f1017b305156009e4 (diff)
downloadATCD-0698cbcc0fcf8fc795da0d9aab3fd31619632f3f.tar.gz
*** empty log message ***
-rw-r--r--ace/Makefile.am10
-rw-r--r--ace/Netlink_Addr.cpp73
-rw-r--r--ace/Netlink_Addr.h85
-rw-r--r--ace/Netlink_Addr.inl58
-rw-r--r--ace/SOCK_Netlink.cpp131
-rw-r--r--ace/SOCK_Netlink.h85
-rw-r--r--ace/SOCK_Netlink.inl36
-rw-r--r--ace/os_include/sys/os_kernel_user.h5
8 files changed, 483 insertions, 0 deletions
diff --git a/ace/Makefile.am b/ace/Makefile.am
index 1511c664fc6..98987468cf2 100644
--- a/ace/Makefile.am
+++ b/ace/Makefile.am
@@ -1,6 +1,10 @@
## Process this file with automake to create Makefile.in
##
+<<<<<<< Makefile.am
+## Makefile.am,v 4.90 2005/01/25 01:02:02 jtc Exp
+=======
## $Id$
+>>>>>>> 4.90
##
## This file was generated by MPC. Any changes made directly to
## this file will be lost the next time it is generated.
@@ -163,6 +167,7 @@ libACE_la_SOURCES = \
Name_Request_Reply.cpp \
Name_Space.cpp \
Naming_Context.cpp \
+ Netlink_Addr.cpp \
Notification_Strategy.cpp \
OS_Errno.cpp \
OS_Log_Msg_Attributes.cpp \
@@ -242,6 +247,7 @@ libACE_la_SOURCES = \
SOCK_Dgram_Bcast.cpp \
SOCK_Dgram_Mcast.cpp \
SOCK_IO.cpp \
+ SOCK_Netlink.cpp \
SOCK_SEQPACK_Acceptor.cpp \
SOCK_SEQPACK_Association.cpp \
SOCK_SEQPACK_Connector.cpp \
@@ -671,6 +677,8 @@ nobase_include_HEADERS = \
Name_Request_Reply.h \
Name_Space.h \
Naming_Context.h \
+ Netlink_Addr.h \
+ Netlink_Addr.inl \
Node.cpp \
Node.h \
Notification_Strategy.h \
@@ -851,6 +859,8 @@ nobase_include_HEADERS = \
SOCK_Dgram_Mcast.inl \
SOCK_IO.h \
SOCK_IO.inl \
+ SOCK_Netlink.h \
+ SOCK_Netlink.inl \
SOCK_SEQPACK_Acceptor.h \
SOCK_SEQPACK_Acceptor.inl \
SOCK_SEQPACK_Association.h \
diff --git a/ace/Netlink_Addr.cpp b/ace/Netlink_Addr.cpp
new file mode 100644
index 00000000000..f4123de4c9d
--- /dev/null
+++ b/ace/Netlink_Addr.cpp
@@ -0,0 +1,73 @@
+// $Id$
+
+//=============================================================================
+/**
+ * @file Netlink_addr.cpp
+ *
+ * SOCK_Netlink.cpp,v 5.4.2 2004/10/10
+ *
+ * @author Raz Ben Yehuda <raziebe@013.net.il>
+ */
+//=============================================================================
+
+#include /* */ "ace/OS.h"
+
+#if defined (ACE_HAS_LINUX_NETLINK)
+
+#include /* */ "ace/Netlink_Addr.h"
+
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+ # pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if !defined (__ACE_INLINE__)
+#include "ace/Netlink_Addr.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_ALLOC_HOOK_DEFINE(ACE_Netlink_Addr)
+
+
+
+int ACE_Netlink_Addr::set (const ACE_Netlink_Addr &sa)
+{
+ ACE_OS::memset ((void *) &this->_nl,0,sizeof this->_nl);
+ this->_nl.nl_family = AF_NETLINK;
+ this->base_set (sa.get_type (), sa.get_size ());
+ return 0;
+}
+
+// Copy constructor.
+
+ACE_Netlink_Addr::ACE_Netlink_Addr (const ACE_Netlink_Addr &sa)
+ : ACE_Addr (AF_NETLINK, sa.get_size ())
+{
+ this->set (sa);
+}
+
+int ACE_Netlink_Addr::set (const sockaddr_nl *un, int len)
+{
+ (void) ACE_OS::memcpy ((void *) &this->_nl,un,len);
+ return 0;
+}
+
+ACE_Netlink_Addr::ACE_Netlink_Addr (const sockaddr_nl *un, int len)
+{
+ this->set (un, len);
+}
+
+int
+ACE_Netlink_Addr::get_pid (void) const
+{
+ return this->_nl.nl_pid;
+}
+
+int
+ACE_Netlink_Addr::get_gid (void) const
+{
+ return this->_nl.nl_groups;
+}
+
+#endif //if defined (ACE_HAS_LINUX_NETLINK)
+
+
diff --git a/ace/Netlink_Addr.h b/ace/Netlink_Addr.h
new file mode 100644
index 00000000000..3fa76d83b20
--- /dev/null
+++ b/ace/Netlink_Addr.h
@@ -0,0 +1,85 @@
+// $Id$
+
+//=============================================================================
+/**
+ * @file Netlink_Addr.h
+ *
+ * Netlink_Addr.h,v 5.4.2 2004/10/10
+ *
+ * @author Raz Ben Yehuda <raziebe@013.net.il>
+ */
+//=============================================================================
+
+#ifndef ACE_Netlink_ADDR_H
+#define ACE_Netlink_ADDR_H
+
+#include /**/ "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /* */ "ace/os_include/sys/os_kernel_user.h"
+#include /* */ "ace/Addr.h"
+
+
+/**
+ * @class ACE_Netlink_Addr
+ *
+ * @brief Defines a C++ wrapper facade for the netlink sockets
+ */
+class ACE_Export ACE_Netlink_Addr : public ACE_Addr
+{
+public:
+ // = Initialization methods.
+
+ // Default constructor.
+ ACE_Netlink_Addr (void);
+
+ /// Copy constructor.
+ ACE_Netlink_Addr (const ACE_Netlink_Addr &);
+
+ /// Creates an <ACE_INET_Addr> from a sockaddr_in structure.
+ ACE_Netlink_Addr (const sockaddr_nl *, int len);
+
+
+ ~ACE_Netlink_Addr (void);
+
+ int set (const ACE_Netlink_Addr &);
+
+ void set (int pid, int gid);
+
+ int set (const sockaddr_nl *, int len);
+
+ int get_pid (void) const;
+
+ int get_gid (void) const;
+
+ virtual void *get_addr (void) const;
+
+ int get_addr_size (void) const;
+
+ /// Set a pointer to the address.
+ virtual void set_addr (void *, int len= sizeof(sockaddr_nl) );
+
+ /// Declare the dynamic allocation hooks.
+ ACE_ALLOC_HOOK_DECLARE;
+
+private:
+
+ int determine_type (void) const;
+ /// Initialize underlying inet_addr_ to default values
+ void reset (void);
+
+ sockaddr_nl _nl;
+};
+
+#if defined (__ACE_INLINE__)
+#include "ace/Netlink_Addr.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_NETLINK_ADDR_H */
+
+
+
diff --git a/ace/Netlink_Addr.inl b/ace/Netlink_Addr.inl
new file mode 100644
index 00000000000..9977957b669
--- /dev/null
+++ b/ace/Netlink_Addr.inl
@@ -0,0 +1,58 @@
+// $Id$
+
+// -*- C++ -*-
+//
+// Netlink_Addr.inl,v 4.1 2004/10/10 jwillemsen Exp
+
+#include /* */ "ace/OS_NS_string.h"
+#include /* */ "ace/Global_Macros.h"
+#include /* */ "ace/OS_NS_unistd.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+ # pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+ACE_INLINE ACE_Netlink_Addr::~ACE_Netlink_Addr (void){}
+
+
+ACE_INLINE ACE_Netlink_Addr::ACE_Netlink_Addr (void):
+ ACE_Addr (this->determine_type(), sizeof (sockaddr_nl))
+{
+ //(void) ACE_OS::memset (&this->_nl,0x00,sizeof (sockaddr_nl));
+ this->_nl.nl_family = AF_NETLINK;
+}
+
+
+ACE_INLINE void ACE_Netlink_Addr::set(int pid,int gid)
+{
+ this->_nl.nl_pid=pid;
+ this->_nl.nl_groups = gid;
+}
+
+ACE_INLINE void ACE_Netlink_Addr::reset (void)
+{
+ ACE_OS::memset (&this->_nl, 0, sizeof (this->_nl));
+ this->_nl.nl_family = AF_NETLINK;
+}
+
+ACE_INLINE int ACE_Netlink_Addr::determine_type (void) const
+{
+ return AF_NETLINK;
+}
+
+ACE_INLINE void *ACE_Netlink_Addr::get_addr (void) const
+{
+ ACE_TRACE ("ACE_INET_Addr::get_addr");
+ return (void*)&(this->_nl);
+}
+
+ACE_INLINE int ACE_Netlink_Addr::get_addr_size (void) const
+{
+ ACE_TRACE ("ACE_INET_Addr::get_addr_size");
+ return sizeof(this->_nl);
+}
+
+
+ACE_INLINE void ACE_Netlink_Addr::set_addr (void *addr, int len){
+ ACE_OS::memcpy (&this->_nl,addr,len);
+}
+
diff --git a/ace/SOCK_Netlink.cpp b/ace/SOCK_Netlink.cpp
new file mode 100644
index 00000000000..825c1565832
--- /dev/null
+++ b/ace/SOCK_Netlink.cpp
@@ -0,0 +1,131 @@
+// $Id$
+
+//=============================================================================
+/**
+ * @file SOCK_Netlink.cpp
+ *
+ * SOCK_Netlink.cpp,v 5.4.2 2004/10/10
+ *
+ * @author Raz Ben Yehuda <raziebe@013.net.il>
+ */
+//=============================================================================
+
+
+#include /* */ "ace/OS.h"
+#if defined (ACE_HAS_LINUX_NETLINK)
+
+#include /* */ "ace/Log_Msg.h"
+#include /* */ "ace/ACE.h"
+#include /* */ "ace/OS_NS_string.h"
+#include /* */ "ace/OS_NS_unistd.h"
+#include /* */ "ace/SOCK_Netlink.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+ # pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if !defined (__ACE_INLINE__)
+# include "ace/SOCK_Netlink.inl"
+#endif /* __ACE_INLINE__ */
+
+ACE_ALLOC_HOOK_DEFINE (ACE_SOCK_Netlink)
+
+//
+// I use the netlink sockets as a conneted sockets ( very much the
+// same as udp connected sockets).
+// I believe that it is easier instead of sending the address every time i send a message.
+//
+int ACE_SOCK_Netlink::open (ACE_Netlink_Addr &local,
+ int protocol_family,
+ int protocol) //! protocol of your choosing
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::open");
+
+
+ if ( ACE_SOCK::open (SOCK_RAW,
+ protocol_family, //! RAW or DGRAM valid
+ protocol,0) < 0 ) {
+ ACE_TRACE ("ACE_SOCK_Netlink::open failed to open");
+ return -1;
+ }
+
+ if (ACE_OS::bind(this->get_handle(),
+ (sockaddr*)local.get_addr(),
+ local.get_addr_size()) == -1 ) {
+ ACE_TRACE ("ACE_SOCK_Netlink::open failed to bind socket");
+ return -1;
+ }
+ return 0;
+}
+
+// Here's the general-purpose constructor used by a connectionless
+// datagram ``server''...
+
+ACE_SOCK_Netlink::ACE_SOCK_Netlink (ACE_Netlink_Addr &local,
+ int protocol_family,
+ int protocol)
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::ACE_SOCK_Netlink");
+
+ if (this->open (local,
+ protocol_family,
+ protocol) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_LIB_TEXT ("%p\n"),
+ ACE_LIB_TEXT ("ACE_SOCK_Netlink")));
+}
+
+ssize_t
+ACE_SOCK_Netlink::send (const iovec iov[],
+ int n,
+ const ACE_Addr &addr,
+ int flags) const
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::send");
+ msghdr send_msg;
+
+ send_msg.msg_iov = (iovec *) iov;
+ send_msg.msg_iovlen = n;
+ send_msg.msg_name = (char *) addr.get_addr ();
+ send_msg.msg_namelen = addr.get_size ();
+ send_msg.msg_control = 0;
+ send_msg.msg_controllen = 0;
+ send_msg.msg_flags = 0;
+
+ return ACE_OS::sendmsg (this->get_handle (),
+ &send_msg,
+ flags);
+}
+
+ssize_t
+ACE_SOCK_Netlink::recv (iovec iov[],
+ int n,
+ ACE_Addr &addr,
+ int flags) const
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::recv");
+ msghdr recv_msg;
+
+ recv_msg.msg_iov = (iovec *) iov;
+ recv_msg.msg_iovlen = n;
+ recv_msg.msg_name = (char *) addr.get_addr ();
+ recv_msg.msg_namelen = addr.get_size ();
+ recv_msg.msg_control = 0;
+ recv_msg.msg_controllen = 0;
+ recv_msg.msg_flags = 0;
+
+ ssize_t status = ACE_OS::recvmsg (this->get_handle (),
+ &recv_msg,
+ flags);
+
+ if (recv_msg.msg_flags & MSG_TRUNC)
+ return -1;
+
+ addr.set_size (recv_msg.msg_namelen);
+ addr.set_type (((sockaddr_in *) addr.get_addr())->sin_family);
+
+ return status;
+}
+
+#endif // #if defined (ACE_HAS_LINUX_NETLINK)
+
diff --git a/ace/SOCK_Netlink.h b/ace/SOCK_Netlink.h
new file mode 100644
index 00000000000..54b0cc12b4f
--- /dev/null
+++ b/ace/SOCK_Netlink.h
@@ -0,0 +1,85 @@
+// $Id$
+//=============================================================================
+/**
+ * @file SOCK_Netlink.h
+ *
+ * SOCK_Netlink.cpp,v 5.4.2 2004/10/10 Exp
+ *
+ * @author Raz Ben Yehuda <raziebe@013.net.il>
+ */
+//=============================================================================
+
+#ifndef ACE_SOCK_Netlink_H
+#define ACE_SOCK_Netlink_H
+#include /* */ "ace/pre.h"
+
+#include /* */ "ace/SOCK.h"
+#include /* */ "ace/Netlink_Addr.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Addr.h"
+
+/**
+ * @class ACE_SOCK_Netlink
+ *
+ * @brief Defines the member functions for the ACE_SOCK Netlink
+ * abstraction.
+
+ * Netlink sockets are used in Linux to communicate kernel to user
+ * and user to kernel It was created so one could use ACE reactor
+ * as a gateway to a linux driver.
+ *
+ */
+class ACE_Export ACE_SOCK_Netlink : public ACE_SOCK
+{
+public:
+ // = Initialization and termination methods.
+ /// Default constructor.
+ ACE_SOCK_Netlink(void);
+ ~ACE_SOCK_Netlink(void);
+ ACE_SOCK_Netlink (ACE_Netlink_Addr &local,
+ int protocol_family,
+ int protocol);
+
+ int open (ACE_Netlink_Addr &local,
+ int protocol_family,
+ int protocol);
+
+ ssize_t recv (void *buf,
+ size_t n,
+ int flags) const;
+
+ ssize_t send (void *buf,
+ size_t n,
+ int flags) const;
+
+ /// Recv an <iovec> of size <n> to the datagram socket (uses
+ /// <recvmsg(3)>).
+ ssize_t recv (iovec iov[],
+ int n,
+ ACE_Addr &addr,
+ int flags = 0) const;
+
+ /// Send an <iovec> of size <n> to the datagram socket (uses
+ /// <sendmsg(3)>).
+ ssize_t send (const iovec iov[],
+ int n,
+ const ACE_Addr &addr,
+ int flags = 0) const;
+
+ /// Declare the dynamic allocation hooks.
+ ACE_ALLOC_HOOK_DECLARE;
+};
+
+#if defined (__ACE_INLINE__)
+#include "ace/SOCK_Netlink.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_SOCK_Netlink_H */
+
+
+
diff --git a/ace/SOCK_Netlink.inl b/ace/SOCK_Netlink.inl
new file mode 100644
index 00000000000..00aa3835250
--- /dev/null
+++ b/ace/SOCK_Netlink.inl
@@ -0,0 +1,36 @@
+// $Id$
+// SOCK_Netlink.inl,v 5.4.2 2004/10/10 raz
+
+#include "ace/OS_NS_sys_socket.h"
+#include "ace/SOCK_Netlink.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+ # pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+ACE_INLINE
+ACE_SOCK_Netlink::ACE_SOCK_Netlink (void)
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::ACE_SOCK_Netlink");
+}
+
+ACE_INLINE
+ACE_SOCK_Netlink::~ACE_SOCK_Netlink (void)
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::~ACE_SOCK_Netlink");
+}
+// <recvfrom> an n byte datagram (connectionless version).
+ACE_INLINE ssize_t ACE_SOCK_Netlink::recv ( void *buf,
+ size_t n,
+ int flags) const
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::recv");
+ return ACE_OS::recv (this->get_handle (),(char *) buf,n,flags);
+}
+
+ACE_INLINE ssize_t ACE_SOCK_Netlink::send (void *buf,
+ size_t n,
+ int flags) const
+{
+ ACE_TRACE ("ACE_SOCK_Netlink::recv");
+ return ACE_OS::send (this->get_handle (),(char *) buf,n,flags);
+}
diff --git a/ace/os_include/sys/os_kernel_user.h b/ace/os_include/sys/os_kernel_user.h
new file mode 100644
index 00000000000..b74e651811f
--- /dev/null
+++ b/ace/os_include/sys/os_kernel_user.h
@@ -0,0 +1,5 @@
+// $Id$
+#ifdef __linux__
+ #include <asm/types.h>
+ #include <linux/netlink.h>
+#endif