join 1.0
lightweight network framework library
Loading...
Searching...
No Matches
netlink_endpoint.hpp
Go to the documentation of this file.
1
25#ifndef JOIN_FABRIC_NETLINK_ENDPOINT_HPP
26#define JOIN_FABRIC_NETLINK_ENDPOINT_HPP
27
28// libjoin.
29#include <join/endpoint.hpp>
30
31// C.
32#include <linux/netfilter/nfnetlink.h>
33#include <linux/rtnetlink.h>
34#include <linux/netlink.h>
35
36namespace join
37{
41 template <class Protocol>
42 class BasicNetlinkEndpoint : public BasicEndpoint<Protocol>
43 {
44 public:
48 constexpr BasicNetlinkEndpoint () noexcept
49 : BasicEndpoint<Protocol> ()
50 , _protocol (Protocol ().protocol ())
51 {
52 }
53
59 BasicNetlinkEndpoint (const struct sockaddr* addr, socklen_t len) noexcept
61 , _protocol (Protocol ().protocol ())
62 {
63 }
64
71 BasicNetlinkEndpoint (const Protocol& protocol, uint32_t pid, uint32_t groups) noexcept
73 , _protocol (protocol.protocol ())
74 {
75 struct sockaddr_nl* nl = reinterpret_cast<struct sockaddr_nl*> (&this->_addr);
76 nl->nl_pid = pid;
77 nl->nl_groups = groups;
78 }
79
85 BasicNetlinkEndpoint (uint32_t pid, uint32_t groups) noexcept
86 : BasicNetlinkEndpoint (Protocol (), pid, groups)
87 {
88 }
89
95 BasicNetlinkEndpoint (const Protocol& protocol, uint32_t groups) noexcept
97 {
98 }
99
104 BasicNetlinkEndpoint (uint32_t groups) noexcept
105 : BasicNetlinkEndpoint (Protocol (), 0, groups)
106 {
107 }
108
113 Protocol protocol () const noexcept
114 {
115 if (_protocol == NETLINK_NETFILTER)
116 {
117 return Protocol::nf ();
118 }
119 return Protocol::rt ();
120 }
121
126 constexpr socklen_t length () const noexcept
127 {
128 return sizeof (struct sockaddr_nl);
129 }
130
135 void pid (uint32_t pid) noexcept
136 {
137 reinterpret_cast<struct sockaddr_nl*> (&this->_addr)->nl_pid = pid;
138 }
139
144 uint32_t pid () const noexcept
145 {
146 return reinterpret_cast<const struct sockaddr_nl*> (&this->_addr)->nl_pid;
147 }
148
153 void groups (uint32_t groups) noexcept
154 {
155 reinterpret_cast<struct sockaddr_nl*> (&this->_addr)->nl_groups = groups;
156 }
157
162 uint32_t groups () const noexcept
163 {
164 return reinterpret_cast<const struct sockaddr_nl*> (&this->_addr)->nl_groups;
165 }
166
171 std::string device () const
172 {
173 return std::string ();
174 }
175
176 protected:
179 };
180
187 template <class Protocol>
189 {
190 return a.pid () == b.pid () && a.groups () == b.groups ();
191 }
192
199 template <class Protocol>
200 std::strong_ordering operator<=> (const BasicNetlinkEndpoint<Protocol>& a,
201 const BasicNetlinkEndpoint<Protocol>& b) noexcept
202 {
203 if (auto cmp = a.pid () <=> b.pid (); cmp != 0)
204 {
205 return cmp;
206 }
207 return a.groups () <=> b.groups ();
208 }
209
216 template <class Protocol>
217 std::ostream& operator<< (std::ostream& os, const BasicNetlinkEndpoint<Protocol>& endpoint)
218 {
219 os << "pid=" << endpoint.pid () << ",groups=" << endpoint.groups ();
220 return os;
221 }
222}
223
224#endif
basic endpoint class.
Definition endpoint.hpp:50
constexpr BasicEndpoint() noexcept
default constructor.
Definition endpoint.hpp:55
struct sockaddr * addr() noexcept
get socket address.
Definition endpoint.hpp:74
struct sockaddr_storage _addr
socket address storage.
Definition endpoint.hpp:90
basic netlink endpoint class.
Definition netlink_endpoint.hpp:43
uint32_t groups() const noexcept
get netlink groups.
Definition netlink_endpoint.hpp:162
uint32_t pid() const noexcept
get port id.
Definition netlink_endpoint.hpp:144
int _protocol
netlink protocol type.
Definition netlink_endpoint.hpp:178
void groups(uint32_t groups) noexcept
set netlink groups.
Definition netlink_endpoint.hpp:153
std::string device() const
get device name (not applicable for netlink).
Definition netlink_endpoint.hpp:171
constexpr BasicNetlinkEndpoint() noexcept
default constructor.
Definition netlink_endpoint.hpp:48
BasicNetlinkEndpoint(const struct sockaddr *addr, socklen_t len) noexcept
create instance using socket address.
Definition netlink_endpoint.hpp:59
BasicNetlinkEndpoint(uint32_t pid, uint32_t groups) noexcept
create instance using netlink groups.
Definition netlink_endpoint.hpp:85
BasicNetlinkEndpoint(const Protocol &protocol, uint32_t groups) noexcept
create instance using netlink groups.
Definition netlink_endpoint.hpp:95
Protocol protocol() const noexcept
get endpoint protocol.
Definition netlink_endpoint.hpp:113
constexpr socklen_t length() const noexcept
get socket address length.
Definition netlink_endpoint.hpp:126
BasicNetlinkEndpoint(const Protocol &protocol, uint32_t pid, uint32_t groups) noexcept
create instance using netlink groups.
Definition netlink_endpoint.hpp:71
void pid(uint32_t pid) noexcept
set port id.
Definition netlink_endpoint.hpp:135
BasicNetlinkEndpoint(uint32_t groups) noexcept
create instance using netlink groups.
Definition netlink_endpoint.hpp:104
Definition acceptor.hpp:32
bool operator==(const BasicLinkLayerEndpoint< Protocol > &a, const BasicLinkLayerEndpoint< Protocol > &b) noexcept
compare if endpoints are equal.
Definition endpoint.hpp:196
std::ostream & operator<<(std::ostream &os, const BasicLinkLayerEndpoint< Protocol > &endpoint)
push endpoint representation into a stream.
Definition endpoint.hpp:221
std::strong_ordering operator<=>(const BasicLinkLayerEndpoint< Protocol > &a, const BasicLinkLayerEndpoint< Protocol > &b) noexcept
three-way compare endpoints.
Definition endpoint.hpp:208