]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/systemd/sd-netlink.h
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / systemd / sd-netlink.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #ifndef foosdnetlinkhfoo
3 #define foosdnetlinkhfoo
4
5 /***
6 Copyright © 2013 Tom Gundersen <teg@jklm.no>
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <inttypes.h>
23 #include <netinet/ether.h>
24 #include <netinet/in.h>
25 #include <linux/rtnetlink.h>
26 #include <linux/neighbour.h>
27
28 #include "sd-event.h"
29
30 #include "_sd-common.h"
31
32 _SD_BEGIN_DECLARATIONS;
33
34 typedef struct sd_netlink sd_netlink;
35 typedef struct sd_genl_socket sd_genl_socket;
36 typedef struct sd_netlink_message sd_netlink_message;
37 typedef enum {SD_GENL_ID_CTRL, SD_GENL_WIREGUARD} sd_genl_family;
38
39 /* callback */
40
41 typedef int (*sd_netlink_message_handler_t)(sd_netlink *nl, sd_netlink_message *m, void *userdata);
42
43 /* bus */
44 int sd_netlink_new_from_netlink(sd_netlink **nl, int fd);
45 int sd_netlink_open(sd_netlink **nl);
46 int sd_netlink_open_fd(sd_netlink **nl, int fd);
47 int sd_netlink_inc_rcvbuf(sd_netlink *nl, const size_t size);
48
49 sd_netlink *sd_netlink_ref(sd_netlink *nl);
50 sd_netlink *sd_netlink_unref(sd_netlink *nl);
51
52 int sd_netlink_send(sd_netlink *nl, sd_netlink_message *message, uint32_t *serial);
53 int sd_netlink_call_async(sd_netlink *nl, sd_netlink_message *message,
54 sd_netlink_message_handler_t callback,
55 void *userdata, uint64_t usec, uint32_t *serial);
56 int sd_netlink_call_async_cancel(sd_netlink *nl, uint32_t serial);
57 int sd_netlink_call(sd_netlink *nl, sd_netlink_message *message, uint64_t timeout,
58 sd_netlink_message **reply);
59
60 int sd_netlink_get_events(sd_netlink *nl);
61 int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout);
62 int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret);
63 int sd_netlink_wait(sd_netlink *nl, uint64_t timeout);
64
65 int sd_netlink_add_match(sd_netlink *nl, uint16_t match, sd_netlink_message_handler_t c, void *userdata);
66 int sd_netlink_remove_match(sd_netlink *nl, uint16_t match, sd_netlink_message_handler_t c, void *userdata);
67
68 int sd_netlink_attach_event(sd_netlink *nl, sd_event *e, int64_t priority);
69 int sd_netlink_detach_event(sd_netlink *nl);
70
71 int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, const char *data);
72 int sd_netlink_message_append_flag(sd_netlink_message *m, unsigned short type);
73 int sd_netlink_message_append_u8(sd_netlink_message *m, unsigned short type, uint8_t data);
74 int sd_netlink_message_append_u16(sd_netlink_message *m, unsigned short type, uint16_t data);
75 int sd_netlink_message_append_u32(sd_netlink_message *m, unsigned short type, uint32_t data);
76 int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, const void *data, size_t len);
77 int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data);
78 int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data);
79 int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data);
80 int sd_netlink_message_append_cache_info(sd_netlink_message *m, unsigned short type, const struct ifa_cacheinfo *info);
81
82 int sd_netlink_message_open_container(sd_netlink_message *m, unsigned short type);
83 int sd_netlink_message_open_container_union(sd_netlink_message *m, unsigned short type, const char *key);
84 int sd_netlink_message_close_container(sd_netlink_message *m);
85
86 int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, const char **data);
87 int sd_netlink_message_read_u8(sd_netlink_message *m, unsigned short type, uint8_t *data);
88 int sd_netlink_message_read_u16(sd_netlink_message *m, unsigned short type, uint16_t *data);
89 int sd_netlink_message_read_u32(sd_netlink_message *m, unsigned short type, uint32_t *data);
90 int sd_netlink_message_read_ether_addr(sd_netlink_message *m, unsigned short type, struct ether_addr *data);
91 int sd_netlink_message_read_cache_info(sd_netlink_message *m, unsigned short type, struct ifa_cacheinfo *info);
92 int sd_netlink_message_read_in_addr(sd_netlink_message *m, unsigned short type, struct in_addr *data);
93 int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, struct in6_addr *data);
94 int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short type);
95 int sd_netlink_message_exit_container(sd_netlink_message *m);
96
97 int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type);
98 int sd_netlink_message_cancel_array(sd_netlink_message *m);
99
100 int sd_netlink_message_rewind(sd_netlink_message *m);
101
102 sd_netlink_message *sd_netlink_message_next(sd_netlink_message *m);
103
104 sd_netlink_message *sd_netlink_message_ref(sd_netlink_message *m);
105 sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m);
106
107 int sd_netlink_message_request_dump(sd_netlink_message *m, int dump);
108 int sd_netlink_message_is_error(sd_netlink_message *m);
109 int sd_netlink_message_get_errno(sd_netlink_message *m);
110 int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type);
111 int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags);
112 int sd_netlink_message_is_broadcast(sd_netlink_message *m);
113
114 /* rtnl */
115
116 int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index);
117 int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int index, int family);
118 int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int family);
119 int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol);
120 int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int nda_family);
121
122 int sd_rtnl_message_get_family(sd_netlink_message *m, int *family);
123
124 int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
125 int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope);
126 int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags);
127 int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family);
128 int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen);
129 int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *scope);
130 int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *flags);
131 int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ifindex);
132
133 int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change);
134 int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type);
135 int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family);
136 int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex);
137 int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags);
138 int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type);
139
140 int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
141 int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
142 int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope);
143 int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags);
144 int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table);
145 int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type);
146 int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags);
147 int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family);
148 int sd_rtnl_message_route_set_family(sd_netlink_message *m, int family);
149 int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol);
150 int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope);
151 int sd_rtnl_message_route_get_tos(sd_netlink_message *m, unsigned char *tos);
152 int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table);
153 int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len);
154 int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char *src_len);
155 int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type);
156
157 int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags);
158 int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state);
159 int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family);
160 int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *family);
161 int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state);
162 int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags);
163
164 int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family);
165 int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
166 int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen);
167
168 int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifal_family);
169 int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, unsigned char tos);
170 int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, unsigned char *tos);
171 int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, unsigned char table);
172 int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, unsigned char *table);
173 int sd_rtnl_message_routing_policy_rule_set_rtm_src_prefixlen(sd_netlink_message *m, unsigned char len);
174 int sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(sd_netlink_message *m, unsigned char *len);
175 int sd_rtnl_message_routing_policy_rule_set_rtm_dst_prefixlen(sd_netlink_message *m, unsigned char len);
176 int sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(sd_netlink_message *m, unsigned char *len);
177 int sd_rtnl_message_routing_policy_rule_set_rtm_type(sd_netlink_message *m, unsigned char type);
178 int sd_rtnl_message_routing_policy_rule_get_rtm_type(sd_netlink_message *m, unsigned char *type);
179
180 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink, sd_netlink_unref);
181 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink_message, sd_netlink_message_unref);
182
183 /* genl */
184 int sd_genl_socket_open(sd_netlink **nl);
185 int sd_genl_message_new(sd_netlink *nl, sd_genl_family family, uint8_t cmd, sd_netlink_message **m);
186
187 _SD_END_DECLARATIONS;
188
189 #endif