]>
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 | |
2fe1d557 YW |
13 | /* See struct rtvia in rtnetlink.h */ |
14 | typedef struct RouteVia { | |
15 | uint16_t family; | |
16 | union in_addr_union address; | |
17 | } _packed_ RouteVia; | |
18 | ||
19 | typedef 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 |
26 | MultipathRoute *multipath_route_free(MultipathRoute *m); |
27 | DEFINE_TRIVIAL_CLEANUP_FUNC(MultipathRoute*, multipath_route_free); | |
28 | ||
4867b9d7 YW |
29 | int multipath_route_dup(const MultipathRoute *m, MultipathRoute **ret); |
30 | ||
1c4baffc | 31 | int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name); |
face9fcc YW |
32 | int 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 | 43 | int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret); |
f4f81a6b ZJS |
44 | int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names); |
45 | int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char* const *alternative_names); | |
46 | int rtnl_delete_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names); | |
afdf6c3b | 47 | int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char **ret); |
f6e49154 YW |
48 | int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name); |
49 | int rtnl_resolve_interface(sd_netlink **rtnl, const char *name); | |
50 | int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name); | |
1de88f30 YW |
51 | int 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 |
60 | int rtnl_log_parse_error(int r); |
61 | int 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 | 93 | int netlink_message_append_hw_addr(sd_netlink_message *m, unsigned short type, const struct hw_addr_data *data); |
67b19a49 YW |
94 | int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data); |
95 | int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short type, const union sockaddr_union *data); | |
6497a8aa | 96 | |
ca2b7cd8 | 97 | int netlink_message_read_hw_addr(sd_netlink_message *m, unsigned short type, struct hw_addr_data *data); |
f29b6b37 YW |
98 | int netlink_message_read_in_addr_union(sd_netlink_message *m, unsigned short type, int family, union in_addr_union *data); |
99 | ||
6497a8aa YW |
100 | void rtattr_append_attribute_internal(struct rtattr *rta, unsigned short type, const void *data, size_t data_length); |
101 | int rtattr_append_attribute(struct rtattr **rta, unsigned short type, const void *data, size_t data_length); | |
2fe1d557 YW |
102 | |
103 | int rtattr_read_nexthop(const struct rtnexthop *rtnh, size_t size, int family, OrderedSet **ret); | |
84e10015 ZJS |
104 | |
105 | void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m); | |
106 | ||
107 | /* TODO: to be exported later */ | |
108 | int sd_netlink_sendv(sd_netlink *nl, sd_netlink_message **messages, size_t msgcnt, uint32_t **ret_serial); |