X-Git-Url: https://git.llucax.com/software/posixx.git/blobdiff_plain/cde5387898ba00194eeae4df0eb78707489f788a..318a4ab9d75153bba801a156ac4840d249cf5cb2:/src/linux/tipc.hpp diff --git a/src/linux/tipc.hpp b/src/linux/tipc.hpp index 01446a5..cb33335 100644 --- a/src/linux/tipc.hpp +++ b/src/linux/tipc.hpp @@ -96,6 +96,15 @@ struct portid: tipc_portid */ portid(__u32 ref, addr node) throw (); + /// Access to the node addr. + addr& node_addr() throw (); + + /// Access to the node addr. + const addr& node_addr() const throw (); + + /// Compares 2 port ids. + bool operator == (const portid& other) const throw (); + }; /** @@ -105,6 +114,7 @@ struct portid: tipc_portid */ struct name: tipc_name { + /** * Constructor. * @@ -112,6 +122,10 @@ struct name: tipc_name * @param instance Instance of the named port. */ name(__u32 type, __u32 instance) throw (); + + /// Compares 2 port names. + bool operator == (const name& other) const throw (); + }; /** @@ -121,6 +135,7 @@ struct name: tipc_name */ struct nameseq: tipc_name_seq { + /** * Constructor. * @@ -128,6 +143,7 @@ struct nameseq: tipc_name_seq * @param lower Lower bound. * @param upper Upper bound. */ + nameseq(__u32 type, __u32 lower, __u32 upper) throw (); /** * Constructor. @@ -137,6 +153,9 @@ struct nameseq: tipc_name_seq */ nameseq(__u32 type, __u32 instance) throw (); + /// Compares 2 port name sequences. + bool operator == (const nameseq& other) const throw (); + }; /** @@ -167,6 +186,7 @@ enum reason_t */ enum subscr_t { + /** * Causes the topology service to generate a PUBLISHED event * for each port name or port name sequence it finds that overlaps @@ -177,6 +197,7 @@ enum subscr_t * are @b any ports of interest. */ SUB_PORTS = TIPC_SUB_PORTS, + /** * Causes the topology service to generate a single publish event for * the first port it finds with an overlapping name and a single @@ -185,7 +206,20 @@ enum subscr_t * Allows the topology service to inform the application about * @b all ports of interest. */ - SUB_SERVICE = TIPC_SUB_SERVICE + SUB_SERVICE = TIPC_SUB_SERVICE, + + /** + * Instruct the topology service to cancel a previously requested + * subscription. + * + * The application simply resends the original subscription request + * with SUB_CANCEL logically OR'd into the event filter. + * + * @note This is implemented in TIPC 1.7+ only (according to TIPC + * documentation). + */ + SUB_CANCEL = TIPC_SUB_CANCEL + }; /** @@ -195,6 +229,7 @@ enum subscr_t */ struct subscr: tipc_subscr { + /** * Constructor. * @@ -203,21 +238,59 @@ struct subscr: tipc_subscr * (or WAIT_FOREVER). * @param filter An event filter specifying which events are of * interest to the application (see subscr_t). - * @param usr_handle An 8 byte user handle that is application-defined. + * @param usr_handle An 8 byte user handle that is application-defined, + * (treated as a string). */ subscr(nameseq seq, __u32 timeout, __u32 filter, const char* usr_handle = "") throw (); + + /** + * Constructor. + * + * @param seq The port name sequence of interest to the application. + * @param timeout A subscription timeout value, in ms + * (or WAIT_FOREVER). + * @param filter An event filter specifying which events are of + * interest to the application (see subscr_t). + * @param usr_handle An 8 byte user handle that is application-defined. + * (treated as binary data). + * @param handle_size Size of the usr_handle buffer (it should be at + * most 8) + */ + subscr(nameseq seq, __u32 timeout, __u32 filter, + const char* usr_handle, size_t handle_size) + throw (); + + /// Access to the subscribed name sequence. + nameseq& name_seq() throw (); + + /// Access to the subscribed name sequence. + const nameseq& name_seq() const throw (); + + /// Set the user handle as a string. + void handle(const char* usr_handle) throw (); + + /// Set the user handle as binary data. + void handle(const char* usr_handle, size_t handle_size) throw (); + + /// Compares 2 subscription request messages. + bool operator == (const subscr& other) const throw (); + }; /// Type of events. enum event_t { + /// The port has been published. PUBLISHED = TIPC_PUBLISHED, + /// The port has been withdrawn. WITHDRAWN = TIPC_WITHDRAWN, + /// The event has timed out. TIMEOUT = TIPC_SUBSCR_TIMEOUT + }; /** @@ -225,8 +298,21 @@ enum event_t * * @see TIPC documentation: 1.4.3 Name Subscriptions */ -struct event: tipc_event +struct subscr_event: tipc_event { + + /// Access to the subscribed name sequence. + portid& port_id() throw (); + + /// Access to the subscribed name sequence. + const portid& port_id() const throw (); + + /// Access to the subscribed name sequence. + subscr& subscription() throw (); + + /// Access to the subscribed name sequence. + const subscr& subscription() const throw (); + }; /** @@ -304,6 +390,30 @@ struct sockaddr: sockaddr_tipc /// Compare two TIPC socket addresses bool operator == (const sockaddr& other) const throw (); + /// Access to the port ID (only valid if addrtype == ID) + portid& port_id() throw (); + + /// Access to the port ID (only valid if addrtype == ID) + const portid& port_id() const throw (); + + /// Access to the port name (only valid if addrtype == NAME) + name& port_name() throw (); + + /// Access to the port name (only valid if addrtype == NAME) + const name& port_name() const throw (); + + /// Access to the port name domain (only valid if addrtype == NAME) + tipc::addr& name_domain() throw (); + + /// Access to the port name domain (only valid if addrtype == NAME) + const tipc::addr& name_domain() const throw (); + + /// Access to the port name sequence (only valid if addrtype == NAMESEQ) + nameseq& name_seq() throw (); + + /// Access to the port name sequence (only valid if addrtype == NAMESEQ) + const nameseq& name_seq() const throw (); + }; /// TIPC socket traits. @@ -390,6 +500,26 @@ posixx::linux::tipc::portid::portid(__u32 r, addr n) throw () node = n; } +inline +posixx::linux::tipc::addr& posixx::linux::tipc::portid::node_addr() throw () +{ + return *reinterpret_cast(&node); +} + +inline +const posixx::linux::tipc::addr& posixx::linux::tipc::portid::node_addr() const + throw () +{ + return *reinterpret_cast(&node); +} + +inline +bool posixx::linux::tipc::portid::operator == ( + const posixx::linux::tipc::portid& other) const throw () +{ + return memcmp(this, &other, sizeof(*this)) == 0; +} + inline posixx::linux::tipc::name::name(__u32 t, __u32 i) throw () { @@ -397,6 +527,13 @@ posixx::linux::tipc::name::name(__u32 t, __u32 i) throw () instance = i; } +inline +bool posixx::linux::tipc::name::operator == ( + const posixx::linux::tipc::name& other) const throw () +{ + return memcmp(this, &other, sizeof(*this)) == 0; +} + inline posixx::linux::tipc::nameseq::nameseq(__u32 t, __u32 low, __u32 up) throw () { @@ -413,6 +550,13 @@ posixx::linux::tipc::nameseq::nameseq(__u32 t, __u32 instance) throw () upper = instance; } +inline +bool posixx::linux::tipc::nameseq::operator == ( + const posixx::linux::tipc::nameseq& other) const throw () +{ + return memcmp(this, &other, sizeof(*this)) == 0; +} + inline posixx::linux::tipc::subscr::subscr(nameseq s, __u32 t, __u32 f, const char* uh) throw () @@ -420,12 +564,85 @@ posixx::linux::tipc::subscr::subscr(nameseq s, __u32 t, __u32 f, seq = s; timeout = t; filter = f; - std::memcpy(usr_handle, uh, sizeof(usr_handle)); + handle(uh); +} + +inline +posixx::linux::tipc::subscr::subscr(nameseq s, __u32 t, __u32 f, + const char* uh, size_t uh_size) throw () +{ + seq = s; + timeout = t; + filter = f; + handle(uh, uh_size); +} + +inline +posixx::linux::tipc::nameseq& posixx::linux::tipc::subscr::name_seq() throw () +{ + return *reinterpret_cast(&seq); +} + +inline +const posixx::linux::tipc::nameseq& +posixx::linux::tipc::subscr::name_seq() const throw () +{ + return *reinterpret_cast(&seq); +} + +inline +void posixx::linux::tipc::subscr::handle(const char* uh) throw () +{ + std::strncpy(usr_handle, uh, sizeof(usr_handle)); +} + +inline +void posixx::linux::tipc::subscr::handle(const char* uh, size_t uh_size) + throw () +{ + std::memcpy(usr_handle, uh, uh_size); +} + +inline +bool posixx::linux::tipc::subscr::operator == (const subscr& other) const + throw () +{ + return memcmp(this, &other, sizeof(*this)) == 0; +} + +inline +posixx::linux::tipc::portid& posixx::linux::tipc::subscr_event::port_id() + throw () +{ + return *reinterpret_cast(&port); +} + +inline +const posixx::linux::tipc::portid& posixx::linux::tipc::subscr_event::port_id() + const throw () +{ + return *reinterpret_cast(&port); +} + +inline +posixx::linux::tipc::subscr& posixx::linux::tipc::subscr_event::subscription() + throw () +{ + return *reinterpret_cast(&s); +} + +inline +const posixx::linux::tipc::subscr& +posixx::linux::tipc::subscr_event::subscription() const throw () +{ + return *reinterpret_cast(&s); } inline posixx::linux::tipc::sockaddr::sockaddr() throw () { + memset(this, 0, sizeof(*this)); + family = AF_TIPC; } inline @@ -474,7 +691,74 @@ inline bool posixx::linux::tipc::sockaddr::operator == (const sockaddr& other) const throw () { - return !memcmp(this, &other, sizeof(*this)); + if (family != other.family) + return false; + if (addrtype != other.addrtype) + return false; + if (scope != other.scope) + return false; + if (addrtype == ID) + return port_id() == other.port_id(); + if (addrtype == NAME) + return name_domain() == other.name_domain() + && port_name() == other.port_name(); + if (addrtype == NAMESEQ) + return name_seq() == other.name_seq(); + return memcmp(this, &other, sizeof(*this)) == 0; +} + +inline +posixx::linux::tipc::portid& posixx::linux::tipc::sockaddr::port_id() throw () +{ + return *reinterpret_cast(&addr.id); +} + +inline +const posixx::linux::tipc::portid& posixx::linux::tipc::sockaddr::port_id() + const throw () +{ + return *reinterpret_cast(&addr.id); +} + +inline +posixx::linux::tipc::name& posixx::linux::tipc::sockaddr::port_name() throw () +{ + return *reinterpret_cast(&addr.name.name); +} + +inline +const posixx::linux::tipc::name& posixx::linux::tipc::sockaddr::port_name() + const throw () +{ + return *reinterpret_cast(&addr.name.name); +} + +inline +posixx::linux::tipc::addr& posixx::linux::tipc::sockaddr::name_domain() + throw () +{ + return *reinterpret_cast(&addr.name.domain); +} + +inline +const posixx::linux::tipc::addr& posixx::linux::tipc::sockaddr::name_domain() + const throw () +{ + return *reinterpret_cast(&addr.name.domain); +} + +inline +posixx::linux::tipc::nameseq& posixx::linux::tipc::sockaddr::name_seq() + throw () +{ + return *reinterpret_cast(&addr.nameseq); +} + +inline +const posixx::linux::tipc::nameseq& posixx::linux::tipc::sockaddr::name_seq() + const throw () +{ + return *reinterpret_cast(&addr.nameseq); } #endif // POSIXX_LINUX_TIPC_HPP_