1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
4 #include <netinet/in.h>
5 #include <sys/capability.h>
7 #include "alloc-util.h"
8 #include "bus-common-errors.h"
9 #include "bus-message-util.h"
10 #include "bus-polkit.h"
11 #include "networkd-link-bus.h"
12 #include "networkd-link.h"
13 #include "networkd-manager-bus.h"
14 #include "networkd-manager.h"
15 #include "path-util.h"
16 #include "socket-netlink.h"
18 #include "user-util.h"
20 static int method_list_links(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
21 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
22 Manager
*manager
= userdata
;
26 r
= sd_bus_message_new_method_return(message
, &reply
);
30 r
= sd_bus_message_open_container(reply
, 'a', "(iso)");
34 HASHMAP_FOREACH(link
, manager
->links
) {
35 _cleanup_free_
char *path
= NULL
;
37 path
= link_bus_path(link
);
41 r
= sd_bus_message_append(
50 r
= sd_bus_message_close_container(reply
);
54 return sd_bus_send(NULL
, reply
, NULL
);
57 static int method_get_link_by_name(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
58 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
59 _cleanup_free_
char *path
= NULL
;
60 Manager
*manager
= userdata
;
65 r
= sd_bus_message_read(message
, "s", &name
);
69 index
= resolve_ifname(&manager
->rtnl
, name
);
71 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %s cannot be resolved", name
);
73 link
= hashmap_get(manager
->links
, INT_TO_PTR(index
));
75 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %s not known", name
);
77 r
= sd_bus_message_new_method_return(message
, &reply
);
81 path
= link_bus_path(link
);
85 r
= sd_bus_message_append(reply
, "io", link
->ifindex
, empty_to_root(path
));
89 return sd_bus_send(NULL
, reply
, NULL
);
92 static int method_get_link_by_index(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
93 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
94 _cleanup_free_
char *path
= NULL
;
95 Manager
*manager
= userdata
;
99 r
= bus_message_read_ifindex(message
, error
, &ifindex
);
103 link
= hashmap_get(manager
->links
, INT_TO_PTR(ifindex
));
105 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %i not known", ifindex
);
107 r
= sd_bus_message_new_method_return(message
, &reply
);
111 path
= link_bus_path(link
);
115 r
= sd_bus_message_append(reply
, "so", link
->ifname
, empty_to_root(path
));
119 return sd_bus_send(NULL
, reply
, NULL
);
122 static int call_link_method(Manager
*m
, sd_bus_message
*message
, sd_bus_message_handler_t handler
, sd_bus_error
*error
) {
130 r
= bus_message_read_ifindex(message
, error
, &ifindex
);
134 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
136 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %i not known", ifindex
);
138 return handler(message
, l
, error
);
141 static int bus_method_set_link_ntp_servers(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
142 return call_link_method(userdata
, message
, bus_link_method_set_ntp_servers
, error
);
145 static int bus_method_set_link_dns_servers(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
146 return call_link_method(userdata
, message
, bus_link_method_set_dns_servers
, error
);
149 static int bus_method_set_link_dns_servers_ex(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
150 return call_link_method(userdata
, message
, bus_link_method_set_dns_servers_ex
, error
);
153 static int bus_method_set_link_domains(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
154 return call_link_method(userdata
, message
, bus_link_method_set_domains
, error
);
157 static int bus_method_set_link_default_route(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
158 return call_link_method(userdata
, message
, bus_link_method_set_default_route
, error
);
161 static int bus_method_set_link_llmnr(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
162 return call_link_method(userdata
, message
, bus_link_method_set_llmnr
, error
);
165 static int bus_method_set_link_mdns(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
166 return call_link_method(userdata
, message
, bus_link_method_set_mdns
, error
);
169 static int bus_method_set_link_dns_over_tls(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
170 return call_link_method(userdata
, message
, bus_link_method_set_dns_over_tls
, error
);
173 static int bus_method_set_link_dnssec(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
174 return call_link_method(userdata
, message
, bus_link_method_set_dnssec
, error
);
177 static int bus_method_set_link_dnssec_negative_trust_anchors(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
178 return call_link_method(userdata
, message
, bus_link_method_set_dnssec_negative_trust_anchors
, error
);
181 static int bus_method_revert_link_ntp(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
182 return call_link_method(userdata
, message
, bus_link_method_revert_ntp
, error
);
185 static int bus_method_revert_link_dns(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
186 return call_link_method(userdata
, message
, bus_link_method_revert_dns
, error
);
189 static int bus_method_renew_link(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
190 return call_link_method(userdata
, message
, bus_link_method_renew
, error
);
193 static int bus_method_force_renew_link(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
194 return call_link_method(userdata
, message
, bus_link_method_force_renew
, error
);
197 static int bus_method_reconfigure_link(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
198 return call_link_method(userdata
, message
, bus_link_method_reconfigure
, error
);
201 static int bus_method_reload(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
202 Manager
*manager
= userdata
;
206 r
= bus_verify_polkit_async(message
, CAP_NET_ADMIN
,
207 "org.freedesktop.network1.reload",
208 NULL
, true, UID_INVALID
,
209 &manager
->polkit_registry
, error
);
213 return 1; /* Polkit will call us back */
215 r
= netdev_load(manager
, true);
219 r
= network_reload(manager
);
223 HASHMAP_FOREACH(link
, manager
->links
) {
224 r
= link_reconfigure(link
, false);
229 return sd_bus_reply_method_return(message
, NULL
);
232 const sd_bus_vtable manager_vtable
[] = {
233 SD_BUS_VTABLE_START(0),
235 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state
, offsetof(Manager
, operational_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
236 SD_BUS_PROPERTY("CarrierState", "s", property_get_carrier_state
, offsetof(Manager
, carrier_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
237 SD_BUS_PROPERTY("AddressState", "s", property_get_address_state
, offsetof(Manager
, address_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
239 SD_BUS_METHOD("ListLinks", NULL
, "a(iso)", method_list_links
, SD_BUS_VTABLE_UNPRIVILEGED
),
240 SD_BUS_METHOD("GetLinkByName", "s", "io", method_get_link_by_name
, SD_BUS_VTABLE_UNPRIVILEGED
),
241 SD_BUS_METHOD("GetLinkByIndex", "i", "so", method_get_link_by_index
, SD_BUS_VTABLE_UNPRIVILEGED
),
242 SD_BUS_METHOD("SetLinkNTP", "ias", NULL
, bus_method_set_link_ntp_servers
, SD_BUS_VTABLE_UNPRIVILEGED
),
243 SD_BUS_METHOD("SetLinkDNS", "ia(iay)", NULL
, bus_method_set_link_dns_servers
, SD_BUS_VTABLE_UNPRIVILEGED
),
244 SD_BUS_METHOD("SetLinkDNSEx", "ia(iayqs)", NULL
, bus_method_set_link_dns_servers_ex
, SD_BUS_VTABLE_UNPRIVILEGED
),
245 SD_BUS_METHOD("SetLinkDomains", "ia(sb)", NULL
, bus_method_set_link_domains
, SD_BUS_VTABLE_UNPRIVILEGED
),
246 SD_BUS_METHOD("SetLinkDefaultRoute", "ib", NULL
, bus_method_set_link_default_route
, SD_BUS_VTABLE_UNPRIVILEGED
),
247 SD_BUS_METHOD("SetLinkLLMNR", "is", NULL
, bus_method_set_link_llmnr
, SD_BUS_VTABLE_UNPRIVILEGED
),
248 SD_BUS_METHOD("SetLinkMulticastDNS", "is", NULL
, bus_method_set_link_mdns
, SD_BUS_VTABLE_UNPRIVILEGED
),
249 SD_BUS_METHOD("SetLinkDNSOverTLS", "is", NULL
, bus_method_set_link_dns_over_tls
, SD_BUS_VTABLE_UNPRIVILEGED
),
250 SD_BUS_METHOD("SetLinkDNSSEC", "is", NULL
, bus_method_set_link_dnssec
, SD_BUS_VTABLE_UNPRIVILEGED
),
251 SD_BUS_METHOD("SetLinkDNSSECNegativeTrustAnchors", "ias", NULL
, bus_method_set_link_dnssec_negative_trust_anchors
, SD_BUS_VTABLE_UNPRIVILEGED
),
252 SD_BUS_METHOD("RevertLinkNTP", "i", NULL
, bus_method_revert_link_ntp
, SD_BUS_VTABLE_UNPRIVILEGED
),
253 SD_BUS_METHOD("RevertLinkDNS", "i", NULL
, bus_method_revert_link_dns
, SD_BUS_VTABLE_UNPRIVILEGED
),
254 SD_BUS_METHOD("RenewLink", "i", NULL
, bus_method_renew_link
, SD_BUS_VTABLE_UNPRIVILEGED
),
255 SD_BUS_METHOD("ForceRenewLink", "i", NULL
, bus_method_force_renew_link
, SD_BUS_VTABLE_UNPRIVILEGED
),
256 SD_BUS_METHOD("ReconfigureLink", "i", NULL
, bus_method_reconfigure_link
, SD_BUS_VTABLE_UNPRIVILEGED
),
257 SD_BUS_METHOD("Reload", NULL
, NULL
, bus_method_reload
, SD_BUS_VTABLE_UNPRIVILEGED
),
262 int manager_send_changed_strv(Manager
*manager
, char **properties
) {
269 return sd_bus_emit_properties_changed_strv(
271 "/org/freedesktop/network1",
272 "org.freedesktop.network1.Manager",