]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-netlink/netlink-util.h
Merge pull request #30513 from rpigott/resolved-ede
[thirdparty/systemd.git] / src / libsystemd / sd-netlink / netlink-util.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
a2cdd907
LP
2#pragma once
3
c16c7808
SS
4#include <linux/rtnetlink.h>
5
07630cea 6#include "sd-netlink.h"
d8921c6d 7
4fc8a29a 8#include "ether-addr-util.h"
67b19a49 9#include "in-addr-util.h"
2fe1d557 10#include "ordered-set.h"
67b19a49 11#include "socket-util.h"
d8921c6d 12
8f8b39c8
YW
13#define RTA_FLAGS(rta) ((rta)->rta_type & ~NLA_TYPE_MASK)
14#define RTA_TYPE(rta) ((rta)->rta_type & NLA_TYPE_MASK)
15
2fe1d557
YW
16/* See struct rtvia in rtnetlink.h */
17typedef struct RouteVia {
18 uint16_t family;
19 union in_addr_union address;
20} _packed_ RouteVia;
21
22typedef struct MultipathRoute {
23 RouteVia gateway;
2fe1d557 24 uint32_t weight;
e8f52f3c
YW
25 int ifindex;
26 char *ifname;
2fe1d557
YW
27} MultipathRoute;
28
e8f52f3c
YW
29MultipathRoute *multipath_route_free(MultipathRoute *m);
30DEFINE_TRIVIAL_CLEANUP_FUNC(MultipathRoute*, multipath_route_free);
31
4867b9d7
YW
32int multipath_route_dup(const MultipathRoute *m, MultipathRoute **ret);
33
81824455
YW
34int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name, char* const* alternative_names);
35static inline int rtnl_append_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names) {
36 return rtnl_set_link_name(rtnl, ifindex, NULL, alternative_names);
37}
face9fcc
YW
38int rtnl_set_link_properties(
39 sd_netlink **rtnl,
40 int ifindex,
41 const char *alias,
9e2b7763 42 const struct hw_addr_data *hw_addr,
face9fcc
YW
43 uint32_t txqueues,
44 uint32_t rxqueues,
45 uint32_t txqueuelen,
46 uint32_t mtu,
47 uint32_t gso_max_size,
48 size_t gso_max_segments);
14982526 49int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret);
f4f81a6b
ZJS
50int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names);
51int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char* const *alternative_names);
52int rtnl_delete_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names);
afdf6c3b 53int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char **ret);
f6e49154
YW
54int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name);
55int rtnl_resolve_interface(sd_netlink **rtnl, const char *name);
56int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name);
1de88f30
YW
57int rtnl_get_link_info(
58 sd_netlink **rtnl,
59 int ifindex,
60 unsigned short *ret_iftype,
61 unsigned *ret_flags,
65022cd7 62 char **ret_kind,
1de88f30
YW
63 struct hw_addr_data *ret_hw_addr,
64 struct hw_addr_data *ret_permanent_hw_addr);
a33dece5 65
ee8c4568
LP
66int rtnl_log_parse_error(int r);
67int rtnl_log_create_error(int r);
33658413
YW
68
69#define netlink_call_async(nl, ret_slot, message, callback, destroy_callback, userdata) \
70 ({ \
71 int (*_callback_)(sd_netlink *, sd_netlink_message *, typeof(userdata)) = callback; \
72 void (*_destroy_)(typeof(userdata)) = destroy_callback; \
73 sd_netlink_call_async(nl, ret_slot, message, \
74 (sd_netlink_message_handler_t) _callback_, \
75 (sd_netlink_destroy_t) _destroy_, \
76 userdata, 0, __func__); \
77 })
78
3d65f7c8 79#define netlink_add_match(nl, ret_slot, match, callback, destroy_callback, userdata, description) \
33658413
YW
80 ({ \
81 int (*_callback_)(sd_netlink *, sd_netlink_message *, typeof(userdata)) = callback; \
82 void (*_destroy_)(typeof(userdata)) = destroy_callback; \
83 sd_netlink_add_match(nl, ret_slot, match, \
84 (sd_netlink_message_handler_t) _callback_, \
85 (sd_netlink_destroy_t) _destroy_, \
3d65f7c8 86 userdata, description); \
33658413 87 })
67b19a49 88
dbc35fe3
YW
89#define genl_add_match(nl, ret_slot, family, group, cmd, callback, destroy_callback, userdata, description) \
90 ({ \
91 int (*_callback_)(sd_netlink *, sd_netlink_message *, typeof(userdata)) = callback; \
92 void (*_destroy_)(typeof(userdata)) = destroy_callback; \
93 sd_genl_add_match(nl, ret_slot, family, group, cmd, \
94 (sd_netlink_message_handler_t) _callback_, \
95 (sd_netlink_destroy_t) _destroy_, \
96 userdata, description); \
97 })
98
ca2b7cd8 99int netlink_message_append_hw_addr(sd_netlink_message *m, unsigned short type, const struct hw_addr_data *data);
67b19a49
YW
100int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data);
101int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data);
6497a8aa 102
ca2b7cd8 103int netlink_message_read_hw_addr(sd_netlink_message *m, unsigned short type, struct hw_addr_data *data);
f29b6b37
YW
104int netlink_message_read_in_addr_union(sd_netlink_message *m, unsigned short type, int family, union in_addr_union *data);
105
6497a8aa
YW
106void rtattr_append_attribute_internal(struct rtattr *rta, unsigned short type, const void *data, size_t data_length);
107int rtattr_append_attribute(struct rtattr **rta, unsigned short type, const void *data, size_t data_length);
2fe1d557
YW
108
109int rtattr_read_nexthop(const struct rtnexthop *rtnh, size_t size, int family, OrderedSet **ret);
84e10015
ZJS
110
111void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m);
112
4256379d
YW
113size_t netlink_get_reply_callback_count(sd_netlink *nl);
114
84e10015
ZJS
115/* TODO: to be exported later */
116int sd_netlink_sendv(sd_netlink *nl, sd_netlink_message **messages, size_t msgcnt, uint32_t **ret_serial);