]>
Commit | Line | Data |
---|---|---|
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 */ |
17 | typedef struct RouteVia { | |
18 | uint16_t family; | |
19 | union in_addr_union address; | |
20 | } _packed_ RouteVia; | |
21 | ||
22 | typedef 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 |
29 | MultipathRoute *multipath_route_free(MultipathRoute *m); |
30 | DEFINE_TRIVIAL_CLEANUP_FUNC(MultipathRoute*, multipath_route_free); | |
31 | ||
4867b9d7 YW |
32 | int multipath_route_dup(const MultipathRoute *m, MultipathRoute **ret); |
33 | ||
81824455 YW |
34 | int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name, char* const* alternative_names); |
35 | static 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 |
38 | int 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 | 49 | int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret); |
f4f81a6b ZJS |
50 | int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names); |
51 | int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char* const *alternative_names); | |
52 | int rtnl_delete_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names); | |
afdf6c3b | 53 | int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char **ret); |
f6e49154 YW |
54 | int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name); |
55 | int rtnl_resolve_interface(sd_netlink **rtnl, const char *name); | |
56 | int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name); | |
1de88f30 YW |
57 | int 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 |
66 | int rtnl_log_parse_error(int r); |
67 | int 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 | 99 | int netlink_message_append_hw_addr(sd_netlink_message *m, unsigned short type, const struct hw_addr_data *data); |
67b19a49 YW |
100 | int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data); |
101 | int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data); | |
6497a8aa | 102 | |
ca2b7cd8 | 103 | int netlink_message_read_hw_addr(sd_netlink_message *m, unsigned short type, struct hw_addr_data *data); |
f29b6b37 YW |
104 | int netlink_message_read_in_addr_union(sd_netlink_message *m, unsigned short type, int family, union in_addr_union *data); |
105 | ||
6497a8aa YW |
106 | void rtattr_append_attribute_internal(struct rtattr *rta, unsigned short type, const void *data, size_t data_length); |
107 | int rtattr_append_attribute(struct rtattr **rta, unsigned short type, const void *data, size_t data_length); | |
2fe1d557 YW |
108 | |
109 | int rtattr_read_nexthop(const struct rtnexthop *rtnh, size_t size, int family, OrderedSet **ret); | |
84e10015 ZJS |
110 | |
111 | void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m); | |
112 | ||
4256379d YW |
113 | size_t netlink_get_reply_callback_count(sd_netlink *nl); |
114 | ||
84e10015 ZJS |
115 | /* TODO: to be exported later */ |
116 | int sd_netlink_sendv(sd_netlink *nl, sd_netlink_message **messages, size_t msgcnt, uint32_t **ret_serial); |