]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
1c4baffc TG |
2 | #ifndef foosdnetlinkhfoo |
3 | #define foosdnetlinkhfoo | |
4 | ||
5 | /*** | |
1c4baffc TG |
6 | systemd is free software; you can redistribute it and/or modify it |
7 | under the terms of the GNU Lesser General Public License as published by | |
8 | the Free Software Foundation; either version 2.1 of the License, or | |
9 | (at your option) any later version. | |
10 | ||
11 | systemd is distributed in the hope that it will be useful, but | |
12 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | Lesser General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU Lesser General Public License | |
17 | along with systemd; If not, see <http://www.gnu.org/licenses/>. | |
18 | ***/ | |
19 | ||
20 | #include <inttypes.h> | |
30782b43 | 21 | #include <net/ethernet.h> |
71d35b6b | 22 | #include <netinet/in.h> |
fa672722 YW |
23 | #include <linux/neighbour.h> |
24 | #include <linux/rtnetlink.h> | |
1c4baffc TG |
25 | |
26 | #include "sd-event.h" | |
71d35b6b | 27 | |
1c4baffc TG |
28 | #include "_sd-common.h" |
29 | ||
30 | _SD_BEGIN_DECLARATIONS; | |
31 | ||
32 | typedef struct sd_netlink sd_netlink; | |
05d0c2e3 | 33 | typedef struct sd_genl_socket sd_genl_socket; |
1c4baffc | 34 | typedef struct sd_netlink_message sd_netlink_message; |
ee38400b | 35 | typedef struct sd_netlink_slot sd_netlink_slot; |
3a56e697 SS |
36 | |
37 | typedef enum sd_gen_family { | |
4e8f0ef9 | 38 | SD_GENL_ERROR, |
2be081ff | 39 | SD_GENL_DONE, |
3a56e697 SS |
40 | SD_GENL_ID_CTRL, |
41 | SD_GENL_WIREGUARD, | |
42 | SD_GENL_FOU, | |
43 | SD_GENL_L2TP, | |
81962db7 | 44 | SD_GENL_MACSEC, |
a1d736e2 | 45 | SD_GENL_NL80211, |
3a56e697 | 46 | } sd_genl_family; |
1c4baffc TG |
47 | |
48 | /* callback */ | |
49 | ||
50 | typedef int (*sd_netlink_message_handler_t)(sd_netlink *nl, sd_netlink_message *m, void *userdata); | |
deae09cc | 51 | typedef _sd_destroy_t sd_netlink_destroy_t; |
1c4baffc TG |
52 | |
53 | /* bus */ | |
54 | int sd_netlink_new_from_netlink(sd_netlink **nl, int fd); | |
55 | int sd_netlink_open(sd_netlink **nl); | |
56 | int sd_netlink_open_fd(sd_netlink **nl, int fd); | |
75f8a779 | 57 | int sd_netlink_inc_rcvbuf(sd_netlink *nl, const size_t size); |
1c4baffc TG |
58 | |
59 | sd_netlink *sd_netlink_ref(sd_netlink *nl); | |
60 | sd_netlink *sd_netlink_unref(sd_netlink *nl); | |
61 | ||
62 | int sd_netlink_send(sd_netlink *nl, sd_netlink_message *message, uint32_t *serial); | |
ee38400b YW |
63 | int sd_netlink_call_async(sd_netlink *nl, sd_netlink_slot **ret_slot, sd_netlink_message *message, |
64 | sd_netlink_message_handler_t callback, sd_netlink_destroy_t destoy_callback, | |
8190a388 | 65 | void *userdata, uint64_t usec, const char *description); |
1c4baffc | 66 | int sd_netlink_call(sd_netlink *nl, sd_netlink_message *message, uint64_t timeout, |
545bab1f | 67 | sd_netlink_message **reply); |
1c4baffc | 68 | |
de157fe2 ZJS |
69 | int sd_netlink_get_events(const sd_netlink *nl); |
70 | int sd_netlink_get_timeout(const sd_netlink *nl, uint64_t *timeout); | |
1c4baffc TG |
71 | int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret); |
72 | int sd_netlink_wait(sd_netlink *nl, uint64_t timeout); | |
1c4baffc | 73 | |
ee38400b YW |
74 | int sd_netlink_add_match(sd_netlink *nl, sd_netlink_slot **ret_slot, uint16_t match, |
75 | sd_netlink_message_handler_t callback, | |
8190a388 YW |
76 | sd_netlink_destroy_t destroy_callback, |
77 | void *userdata, const char *description); | |
1c4baffc | 78 | |
32d20645 | 79 | int sd_netlink_attach_event(sd_netlink *nl, sd_event *e, int64_t priority); |
1c4baffc TG |
80 | int sd_netlink_detach_event(sd_netlink *nl); |
81 | ||
82 | int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, const char *data); | |
6d725977 | 83 | int sd_netlink_message_append_strv(sd_netlink_message *m, unsigned short type, char * const *data); |
c06aead0 | 84 | int sd_netlink_message_append_flag(sd_netlink_message *m, unsigned short type); |
1c4baffc TG |
85 | int sd_netlink_message_append_u8(sd_netlink_message *m, unsigned short type, uint8_t data); |
86 | int sd_netlink_message_append_u16(sd_netlink_message *m, unsigned short type, uint16_t data); | |
87 | int sd_netlink_message_append_u32(sd_netlink_message *m, unsigned short type, uint32_t data); | |
81962db7 | 88 | int sd_netlink_message_append_u64(sd_netlink_message *m, unsigned short type, uint64_t data); |
aa550d2a SS |
89 | int sd_netlink_message_append_s8(sd_netlink_message *m, unsigned short type, int8_t data); |
90 | int sd_netlink_message_append_s16(sd_netlink_message *m, unsigned short type, int16_t data); | |
91 | int sd_netlink_message_append_s32(sd_netlink_message *m, unsigned short type, int32_t data); | |
92 | int sd_netlink_message_append_s64(sd_netlink_message *m, unsigned short type, int64_t data); | |
17af840b | 93 | int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, const void *data, size_t len); |
1c4baffc TG |
94 | int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data); |
95 | int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data); | |
abd48ec8 YW |
96 | int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data); |
97 | int sd_netlink_message_append_sockaddr_in6(sd_netlink_message *m, unsigned short type, const struct sockaddr_in6 *data); | |
1c4baffc TG |
98 | int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data); |
99 | int sd_netlink_message_append_cache_info(sd_netlink_message *m, unsigned short type, const struct ifa_cacheinfo *info); | |
100 | ||
101 | int sd_netlink_message_open_container(sd_netlink_message *m, unsigned short type); | |
102 | int sd_netlink_message_open_container_union(sd_netlink_message *m, unsigned short type, const char *key); | |
103 | int sd_netlink_message_close_container(sd_netlink_message *m); | |
104 | ||
926062f0 | 105 | int sd_netlink_message_read(sd_netlink_message *m, unsigned short type, size_t size, void *data); |
de52a83c | 106 | int sd_netlink_message_read_data(sd_netlink_message *m, unsigned short type, size_t *ret_size, void **ret_data); |
59d4103f | 107 | int sd_netlink_message_read_string_strdup(sd_netlink_message *m, unsigned short type, char **data); |
1c4baffc | 108 | int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, const char **data); |
8f3c1859 | 109 | int sd_netlink_message_read_strv(sd_netlink_message *m, unsigned short container_type, unsigned short type_id, char ***ret); |
1c4baffc TG |
110 | int sd_netlink_message_read_u8(sd_netlink_message *m, unsigned short type, uint8_t *data); |
111 | int sd_netlink_message_read_u16(sd_netlink_message *m, unsigned short type, uint16_t *data); | |
112 | int sd_netlink_message_read_u32(sd_netlink_message *m, unsigned short type, uint32_t *data); | |
113 | int sd_netlink_message_read_ether_addr(sd_netlink_message *m, unsigned short type, struct ether_addr *data); | |
114 | int sd_netlink_message_read_cache_info(sd_netlink_message *m, unsigned short type, struct ifa_cacheinfo *info); | |
115 | int sd_netlink_message_read_in_addr(sd_netlink_message *m, unsigned short type, struct in_addr *data); | |
116 | int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, struct in6_addr *data); | |
117 | int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short type); | |
5fc5e2f5 | 118 | int sd_netlink_message_enter_array(sd_netlink_message *m, unsigned short type); |
1c4baffc TG |
119 | int sd_netlink_message_exit_container(sd_netlink_message *m); |
120 | ||
05d0c2e3 JT |
121 | int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type); |
122 | int sd_netlink_message_cancel_array(sd_netlink_message *m); | |
123 | ||
4e8f0ef9 | 124 | int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl); |
1c4baffc TG |
125 | |
126 | sd_netlink_message *sd_netlink_message_next(sd_netlink_message *m); | |
127 | ||
128 | sd_netlink_message *sd_netlink_message_ref(sd_netlink_message *m); | |
129 | sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m); | |
130 | ||
131 | int sd_netlink_message_request_dump(sd_netlink_message *m, int dump); | |
de157fe2 ZJS |
132 | int sd_netlink_message_is_error(const sd_netlink_message *m); |
133 | int sd_netlink_message_get_errno(const sd_netlink_message *m); | |
134 | int sd_netlink_message_get_type(const sd_netlink_message *m, uint16_t *type); | |
c06cb593 | 135 | int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags); |
de157fe2 | 136 | int sd_netlink_message_is_broadcast(const sd_netlink_message *m); |
1c4baffc TG |
137 | |
138 | /* rtnl */ | |
139 | ||
140 | int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index); | |
141 | int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int index, int family); | |
142 | int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int family); | |
143 | int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol); | |
144 | int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int nda_family); | |
145 | ||
de157fe2 | 146 | int sd_rtnl_message_get_family(const sd_netlink_message *m, int *family); |
1c4baffc TG |
147 | |
148 | int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen); | |
149 | int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope); | |
150 | int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags); | |
de157fe2 ZJS |
151 | int sd_rtnl_message_addr_get_family(const sd_netlink_message *m, int *family); |
152 | int sd_rtnl_message_addr_get_prefixlen(const sd_netlink_message *m, unsigned char *prefixlen); | |
153 | int sd_rtnl_message_addr_get_scope(const sd_netlink_message *m, unsigned char *scope); | |
154 | int sd_rtnl_message_addr_get_flags(const sd_netlink_message *m, unsigned char *flags); | |
155 | int sd_rtnl_message_addr_get_ifindex(const sd_netlink_message *m, int *ifindex); | |
1c4baffc TG |
156 | |
157 | int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change); | |
158 | int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type); | |
159 | int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family); | |
de157fe2 ZJS |
160 | int sd_rtnl_message_link_get_ifindex(const sd_netlink_message *m, int *ifindex); |
161 | int sd_rtnl_message_link_get_flags(const sd_netlink_message *m, unsigned *flags); | |
162 | int sd_rtnl_message_link_get_type(const sd_netlink_message *m, unsigned short *type); | |
1c4baffc TG |
163 | |
164 | int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen); | |
165 | int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char prefixlen); | |
166 | int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope); | |
6b9e85a7 | 167 | int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags); |
ec1bb279 | 168 | int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table); |
983226f3 | 169 | int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type); |
de157fe2 ZJS |
170 | int sd_rtnl_message_route_get_flags(const sd_netlink_message *m, unsigned *flags); |
171 | int sd_rtnl_message_route_get_family(const sd_netlink_message *m, int *family); | |
ec1bb279 | 172 | int sd_rtnl_message_route_set_family(sd_netlink_message *m, int family); |
de157fe2 ZJS |
173 | int sd_rtnl_message_route_get_protocol(const sd_netlink_message *m, unsigned char *protocol); |
174 | int sd_rtnl_message_route_get_scope(const sd_netlink_message *m, unsigned char *scope); | |
175 | int sd_rtnl_message_route_get_tos(const sd_netlink_message *m, unsigned char *tos); | |
176 | int sd_rtnl_message_route_get_table(const sd_netlink_message *m, unsigned char *table); | |
177 | int sd_rtnl_message_route_get_dst_prefixlen(const sd_netlink_message *m, unsigned char *dst_len); | |
178 | int sd_rtnl_message_route_get_src_prefixlen(const sd_netlink_message *m, unsigned char *src_len); | |
179 | int sd_rtnl_message_route_get_type(const sd_netlink_message *m, unsigned char *type); | |
1c4baffc | 180 | |
c16c7808 SS |
181 | int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nhmsg_type, int nh_family, unsigned char nh_protocol); |
182 | ||
183 | int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags); | |
184 | int sd_rtnl_message_nexthop_set_family(sd_netlink_message *m, uint8_t family); | |
de157fe2 | 185 | int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *family); |
c16c7808 | 186 | |
1c4baffc TG |
187 | int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags); |
188 | int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state); | |
de157fe2 ZJS |
189 | int sd_rtnl_message_neigh_get_family(const sd_netlink_message *m, int *family); |
190 | int sd_rtnl_message_neigh_get_ifindex(const sd_netlink_message *m, int *family); | |
191 | int sd_rtnl_message_neigh_get_state(const sd_netlink_message *m, uint16_t *state); | |
192 | int sd_rtnl_message_neigh_get_flags(const sd_netlink_message *m, uint8_t *flags); | |
1c4baffc | 193 | |
30746d60 SS |
194 | int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family); |
195 | int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen); | |
de157fe2 | 196 | int sd_rtnl_message_addrlabel_get_prefixlen(const sd_netlink_message *m, unsigned char *prefixlen); |
30746d60 | 197 | |
bce67bbe SS |
198 | int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifal_family); |
199 | int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, unsigned char tos); | |
de157fe2 | 200 | int sd_rtnl_message_routing_policy_rule_get_tos(const sd_netlink_message *m, unsigned char *tos); |
bce67bbe | 201 | int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, unsigned char table); |
de157fe2 | 202 | int sd_rtnl_message_routing_policy_rule_get_table(const sd_netlink_message *m, unsigned char *table); |
bce67bbe | 203 | int sd_rtnl_message_routing_policy_rule_set_rtm_src_prefixlen(sd_netlink_message *m, unsigned char len); |
de157fe2 | 204 | int sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(const sd_netlink_message *m, unsigned char *len); |
bce67bbe | 205 | int sd_rtnl_message_routing_policy_rule_set_rtm_dst_prefixlen(sd_netlink_message *m, unsigned char len); |
de157fe2 | 206 | int sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(const sd_netlink_message *m, unsigned char *len); |
bce67bbe | 207 | int sd_rtnl_message_routing_policy_rule_set_rtm_type(sd_netlink_message *m, unsigned char type); |
de157fe2 | 208 | int sd_rtnl_message_routing_policy_rule_get_rtm_type(const sd_netlink_message *m, unsigned char *type); |
8b220643 | 209 | int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, unsigned flags); |
de157fe2 | 210 | int sd_rtnl_message_routing_policy_rule_get_flags(const sd_netlink_message *m, unsigned *flags); |
bce67bbe | 211 | |
0f5bd7fe SS |
212 | int sd_rtnl_message_new_qdisc(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex); |
213 | int sd_rtnl_message_set_qdisc_parent(sd_netlink_message *m, uint32_t parent); | |
214 | int sd_rtnl_message_set_qdisc_handle(sd_netlink_message *m, uint32_t handle); | |
215 | ||
0ebb76de YW |
216 | int sd_rtnl_message_new_tclass(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex); |
217 | int sd_rtnl_message_set_tclass_parent(sd_netlink_message *m, uint32_t parent); | |
218 | int sd_rtnl_message_set_tclass_handle(sd_netlink_message *m, uint32_t handle); | |
219 | ||
1903c9bb DM |
220 | int sd_rtnl_message_new_mdb(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int mdb_ifindex); |
221 | ||
05d0c2e3 JT |
222 | /* genl */ |
223 | int sd_genl_socket_open(sd_netlink **nl); | |
224 | int sd_genl_message_new(sd_netlink *nl, sd_genl_family family, uint8_t cmd, sd_netlink_message **m); | |
de157fe2 | 225 | int sd_genl_message_get_family(const sd_netlink *nl, const sd_netlink_message *m, sd_genl_family *family); |
05d0c2e3 | 226 | |
ee38400b YW |
227 | /* slot */ |
228 | sd_netlink_slot *sd_netlink_slot_ref(sd_netlink_slot *nl); | |
229 | sd_netlink_slot *sd_netlink_slot_unref(sd_netlink_slot *nl); | |
230 | ||
1a7baaa9 YW |
231 | sd_netlink *sd_netlink_slot_get_netlink(sd_netlink_slot *slot); |
232 | void *sd_netlink_slot_get_userdata(sd_netlink_slot *slot); | |
233 | void *sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata); | |
de157fe2 | 234 | int sd_netlink_slot_get_destroy_callback(const sd_netlink_slot *slot, sd_netlink_destroy_t *callback); |
1a7baaa9 | 235 | int sd_netlink_slot_set_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t callback); |
de157fe2 | 236 | int sd_netlink_slot_get_floating(const sd_netlink_slot *slot); |
1a7baaa9 | 237 | int sd_netlink_slot_set_floating(sd_netlink_slot *slot, int b); |
de157fe2 | 238 | int sd_netlink_slot_get_description(const sd_netlink_slot *slot, const char **description); |
8190a388 YW |
239 | int sd_netlink_slot_set_description(sd_netlink_slot *slot, const char *description); |
240 | ||
ee38400b YW |
241 | _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink, sd_netlink_unref); |
242 | _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink_message, sd_netlink_message_unref); | |
243 | _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink_slot, sd_netlink_slot_unref); | |
244 | ||
1c4baffc TG |
245 | _SD_END_DECLARATIONS; |
246 | ||
247 | #endif |