llmx-rtaco 0.0.1
RTNL-only netlink control-plane library for Linux (C++23).
Loading...
Searching...
No Matches
nl_neighbor_task.hxx
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <cstring>
6#include <span>
7
8#include <linux/rtnetlink.h>
9
11
12namespace llmx {
13namespace rtaco {
14
16 nlmsghdr header;
17 ndmsg message;
18 rtattr dst_attr;
19 std::array<uint8_t, 16> dst;
20};
21
28template<typename Derived, typename Result>
29class NeighborTask : public RequestTask<Derived, Result> {
30protected:
32
33public:
34 using RequestTask<Derived, Result>::RequestTask;
35
37 auto request_payload() const -> std::span<const uint8_t> {
38 return {reinterpret_cast<const uint8_t*>(&request_), request_.header.nlmsg_len};
39 }
40
41protected:
42 void build_request(uint16_t msg_type, uint16_t msg_flags, uint16_t ndm_state,
43 uint8_t ndm_flags, std::span<uint8_t, 16> address) {
44 request_.header.nlmsg_len = NLMSG_LENGTH(sizeof(ndmsg));
45 request_.header.nlmsg_type = msg_type;
46 request_.header.nlmsg_flags = msg_flags;
47 request_.header.nlmsg_seq = this->sequence();
48 request_.header.nlmsg_pid = 0;
49
50 request_.message.ndm_family = RTN_UNSPEC;
51 request_.message.ndm_ifindex = this->ifindex();
52 request_.message.ndm_state = ndm_state;
53 request_.message.ndm_flags = ndm_flags;
54 request_.message.ndm_type = RTN_UNSPEC;
55
56 if (!this->ifindex()) { // TODO: make prettier
57 return;
58 }
59
60 request_.dst_attr.rta_type = NDA_DST;
61 request_.dst_attr.rta_len = RTA_LENGTH(request_.dst.size());
62
63 std::memcpy(request_.dst.data(), address.data(), address.size());
64
65 const auto payload = NLMSG_ALIGN(request_.header.nlmsg_len);
66 request_.header.nlmsg_len = payload + RTA_ALIGN(request_.dst_attr.rta_len);
67 }
68};
69
70} // namespace rtaco
71} // namespace llmx
Base task type for neighbor-related netlink operations.
Definition nl_neighbor_task.hxx:29
void build_request(uint16_t msg_type, uint16_t msg_flags, uint16_t ndm_state, uint8_t ndm_flags, std::span< uint8_t, 16 > address)
Definition nl_neighbor_task.hxx:42
NeighborRequest request_
Definition nl_neighbor_task.hxx:31
auto request_payload() const -> std::span< const uint8_t >
Get the serialized request payload for the neighbor request.
Definition nl_neighbor_task.hxx:37
Base template for single-request netlink tasks.
Definition nl_request_task.hxx:46
RequestTask(SocketGuard &socket_guard, uint16_t ifindex, uint32_t sequence) noexcept
Construct a RequestTask.
Definition nl_request_task.hxx:61
auto ifindex() const noexcept -> uint16_t
Definition nl_request_task.hxx:93
auto sequence() const noexcept -> uint32_t
Definition nl_request_task.hxx:89
Definition nl_common.hxx:21
Definition nl_common.hxx:20
Definition nl_neighbor_task.hxx:15
rtattr dst_attr
Definition nl_neighbor_task.hxx:18
std::array< uint8_t, 16 > dst
Definition nl_neighbor_task.hxx:19
ndmsg message
Definition nl_neighbor_task.hxx:17
nlmsghdr header
Definition nl_neighbor_task.hxx:16