diff options
author | razb <razb@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-04-01 21:40:59 +0000 |
---|---|---|
committer | razb <razb@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-04-01 21:40:59 +0000 |
commit | 0698cbcc0fcf8fc795da0d9aab3fd31619632f3f (patch) | |
tree | 0490bdcdf994614138e79d8574e05162206d0c72 | |
parent | d0d98b811337aa18f05c911f1017b305156009e4 (diff) | |
download | ATCD-0698cbcc0fcf8fc795da0d9aab3fd31619632f3f.tar.gz |
*** empty log message ***
-rw-r--r-- | ace/Makefile.am | 10 | ||||
-rw-r--r-- | ace/Netlink_Addr.cpp | 73 | ||||
-rw-r--r-- | ace/Netlink_Addr.h | 85 | ||||
-rw-r--r-- | ace/Netlink_Addr.inl | 58 | ||||
-rw-r--r-- | ace/SOCK_Netlink.cpp | 131 | ||||
-rw-r--r-- | ace/SOCK_Netlink.h | 85 | ||||
-rw-r--r-- | ace/SOCK_Netlink.inl | 36 | ||||
-rw-r--r-- | ace/os_include/sys/os_kernel_user.h | 5 |
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 |