]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-netlink/netlink-util.h
basic: rename util.h to logarithm.h
[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
2fe1d557
YW
13/* See struct rtvia in rtnetlink.h */
14typedef struct RouteVia {
15 uint16_t family;
16 union in_addr_union address;
17} _packed_ RouteVia;
18
19typedef struct MultipathRoute {
20 RouteVia gateway;
2fe1d557 21 uint32_t weight;
e8f52f3c
YW
22 int ifindex;
23 char *ifname;
2fe1d557
YW
24} MultipathRoute;
25
e8f52f3c
YW
26MultipathRoute *multipath_route_free(MultipathRoute *m);
27DEFINE_TRIVIAL_CLEANUP_FUNC(MultipathRoute*, multipath_route_free);
28
4867b9d7
YW
29int multipath_route_dup(const MultipathRoute *m, MultipathRoute **ret);
30
1c4baffc 31int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name);
face9fcc
YW
32int rtnl_set_link_properties(
33 sd_netlink **rtnl,
34 int ifindex,
35 const char *alias,
9e2b7763 36 const struct hw_addr_data *hw_addr,
face9fcc
YW
37 uint32_t txqueues,
38 uint32_t rxqueues,
39 uint32_t txqueuelen,
40 uint32_t mtu,
41 uint32_t gso_max_size,
42 size_t gso_max_segments);
14982526 43int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret);
f4f81a6b
ZJS
44int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names);
45int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char* const *alternative_names);
46int rtnl_delete_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names);
afdf6c3b 47int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char **ret);
f6e49154
YW
48int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name);
49int rtnl_resolve_interface(sd_netlink **rtnl, const char *name);
50int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name);
1de88f30
YW
51int rtnl_get_link_info(
52 sd_netlink **rtnl,
53 int ifindex,
54 unsigned short *ret_iftype,
55 unsigned *ret_flags,
65022cd7 56 char **ret_kind,
1de88f30
YW
57 struct hw_addr_data *ret_hw_addr,
58 struct hw_addr_data *ret_permanent_hw_addr);
a33dece5 59
ee8c4568
LP
60int rtnl_log_parse_error(int r);
61int rtnl_log_create_error(int r);
33658413
YW
62
63#define netlink_call_async(nl, ret_slot, message, callback, destroy_callback, userdata) \
64 ({ \
65 int (*_callback_)(sd_netlink *, sd_netlink_message *, typeof(userdata)) = callback; \
66 void (*_destroy_)(typeof(userdata)) = destroy_callback; \
67 sd_netlink_call_async(nl, ret_slot, message, \
68 (sd_netlink_message_handler_t) _callback_, \
69 (sd_netlink_destroy_t) _destroy_, \
70 userdata, 0, __func__); \
71 })
72
3d65f7c8 73#define netlink_add_match(nl, ret_slot, match, callback, destroy_callback, userdata, description) \
33658413
YW
74 ({ \
75 int (*_callback_)(sd_netlink *, sd_netlink_message *, typeof(userdata)) = callback; \
76 void (*_destroy_)(typeof(userdata)) = destroy_callback; \
77 sd_netlink_add_match(nl, ret_slot, match, \
78 (sd_netlink_message_handler_t) _callback_, \
79 (sd_netlink_destroy_t) _destroy_, \
3d65f7c8 80 userdata, description); \
33658413 81 })
67b19a49 82
dbc35fe3
YW
83#define genl_add_match(nl, ret_slot, family, group, cmd, callback, destroy_callback, userdata, description) \
84 ({ \
85 int (*_callback_)(sd_netlink *, sd_netlink_message *, typeof(userdata)) = callback; \
86 void (*_destroy_)(typeof(userdata)) = destroy_callback; \
87 sd_genl_add_match(nl, ret_slot, family, group, cmd, \
88 (sd_netlink_message_handler_t) _callback_, \
89 (sd_netlink_destroy_t) _destroy_, \
90 userdata, description); \
91 })
92
ca2b7cd8 93int netlink_message_append_hw_addr(sd_netlink_message *m, unsigned short type, const struct hw_addr_data *data);
67b19a49
YW
94int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data);
95int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data);
6497a8aa 96
ca2b7cd8 97int netlink_message_read_hw_addr(sd_netlink_message *m, unsigned short type, struct hw_addr_data *data);
f29b6b37
YW
98int netlink_message_read_in_addr_union(sd_netlink_message *m, unsigned short type, int family, union in_addr_union *data);
99
6497a8aa
YW
100void rtattr_append_attribute_internal(struct rtattr *rta, unsigned short type, const void *data, size_t data_length);
101int rtattr_append_attribute(struct rtattr **rta, unsigned short type, const void *data, size_t data_length);
2fe1d557
YW
102
103int rtattr_read_nexthop(const struct rtnexthop *rtnh, size_t size, int family, OrderedSet **ret);
84e10015
ZJS
104
105void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m);
106
107/* TODO: to be exported later */
108int sd_netlink_sendv(sd_netlink *nl, sd_netlink_message **messages, size_t msgcnt, uint32_t **ret_serial);