1 /* SPDX-License-Identifier: LGPL-2.1+ */
4 #include <netinet/in.h>
5 #include <sys/capability.h>
7 #include "alloc-util.h"
8 #include "bus-common-errors.h"
9 #include "bus-polkit.h"
10 #include "networkd-link-bus.h"
11 #include "networkd-link.h"
12 #include "networkd-manager-bus.h"
13 #include "networkd-manager.h"
14 #include "path-util.h"
15 #include "socket-netlink.h"
17 #include "user-util.h"
19 static int method_list_links(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
20 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
21 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
, i
) {
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
;
100 r
= sd_bus_message_read(message
, "i", &index
);
104 link
= hashmap_get(manager
->links
, INT_TO_PTR((int) index
));
106 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %" PRIi32
" not known", index
);
108 r
= sd_bus_message_new_method_return(message
, &reply
);
112 path
= link_bus_path(link
);
116 r
= sd_bus_message_append(reply
, "so", link
->ifname
, empty_to_root(path
));
120 return sd_bus_send(NULL
, reply
, NULL
);
123 static int call_link_method(Manager
*m
, sd_bus_message
*message
, sd_bus_message_handler_t handler
, sd_bus_error
*error
) {
131 assert_cc(sizeof(int) == sizeof(int32_t));
132 r
= sd_bus_message_read(message
, "i", &ifindex
);
137 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid interface index");
139 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
141 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %i not known", ifindex
);
143 return handler(message
, l
, error
);
146 static int bus_method_set_link_ntp_servers(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
147 return call_link_method(userdata
, message
, bus_link_method_set_ntp_servers
, error
);
150 static int bus_method_set_link_dns_servers(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
151 return call_link_method(userdata
, message
, bus_link_method_set_dns_servers
, error
);
154 static int bus_method_set_link_domains(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
155 return call_link_method(userdata
, message
, bus_link_method_set_domains
, error
);
158 static int bus_method_set_link_default_route(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
159 return call_link_method(userdata
, message
, bus_link_method_set_default_route
, error
);
162 static int bus_method_set_link_llmnr(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
163 return call_link_method(userdata
, message
, bus_link_method_set_llmnr
, error
);
166 static int bus_method_set_link_mdns(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
167 return call_link_method(userdata
, message
, bus_link_method_set_mdns
, error
);
170 static int bus_method_set_link_dns_over_tls(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
171 return call_link_method(userdata
, message
, bus_link_method_set_dns_over_tls
, error
);
174 static int bus_method_set_link_dnssec(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
175 return call_link_method(userdata
, message
, bus_link_method_set_dnssec
, error
);
178 static int bus_method_set_link_dnssec_negative_trust_anchors(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
179 return call_link_method(userdata
, message
, bus_link_method_set_dnssec_negative_trust_anchors
, error
);
182 static int bus_method_revert_link_ntp(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
183 return call_link_method(userdata
, message
, bus_link_method_revert_ntp
, error
);
186 static int bus_method_revert_link_dns(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
187 return call_link_method(userdata
, message
, bus_link_method_revert_dns
, error
);
190 static int bus_method_renew_link(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
191 return call_link_method(userdata
, message
, bus_link_method_renew
, error
);
194 static int bus_method_force_renew_link(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
195 return call_link_method(userdata
, message
, bus_link_method_force_renew
, error
);
198 static int bus_method_reconfigure_link(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
199 return call_link_method(userdata
, message
, bus_link_method_reconfigure
, error
);
202 static int bus_method_reload(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
203 Manager
*manager
= userdata
;
208 r
= bus_verify_polkit_async(message
, CAP_NET_ADMIN
,
209 "org.freedesktop.network1.reload",
210 NULL
, true, UID_INVALID
,
211 &manager
->polkit_registry
, error
);
215 return 1; /* Polkit will call us back */
217 r
= netdev_load(manager
, true);
221 r
= network_reload(manager
);
225 HASHMAP_FOREACH(link
, manager
->links
, i
) {
226 r
= link_reconfigure(link
, false);
231 return sd_bus_reply_method_return(message
, NULL
);
234 const sd_bus_vtable manager_vtable
[] = {
235 SD_BUS_VTABLE_START(0),
237 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state
, offsetof(Manager
, operational_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
238 SD_BUS_PROPERTY("CarrierState", "s", property_get_carrier_state
, offsetof(Manager
, carrier_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
239 SD_BUS_PROPERTY("AddressState", "s", property_get_address_state
, offsetof(Manager
, address_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
241 SD_BUS_METHOD("ListLinks", NULL
, "a(iso)", method_list_links
, SD_BUS_VTABLE_UNPRIVILEGED
),
242 SD_BUS_METHOD("GetLinkByName", "s", "io", method_get_link_by_name
, SD_BUS_VTABLE_UNPRIVILEGED
),
243 SD_BUS_METHOD("GetLinkByIndex", "i", "so", method_get_link_by_index
, SD_BUS_VTABLE_UNPRIVILEGED
),
244 SD_BUS_METHOD("SetLinkNTP", "ias", NULL
, bus_method_set_link_ntp_servers
, SD_BUS_VTABLE_UNPRIVILEGED
),
245 SD_BUS_METHOD("SetLinkDNS", "ia(iay)", NULL
, bus_method_set_link_dns_servers
, SD_BUS_VTABLE_UNPRIVILEGED
),
246 SD_BUS_METHOD("SetLinkDomains", "ia(sb)", NULL
, bus_method_set_link_domains
, SD_BUS_VTABLE_UNPRIVILEGED
),
247 SD_BUS_METHOD("SetLinkDefaultRoute", "ib", NULL
, bus_method_set_link_default_route
, SD_BUS_VTABLE_UNPRIVILEGED
),
248 SD_BUS_METHOD("SetLinkLLMNR", "is", NULL
, bus_method_set_link_llmnr
, SD_BUS_VTABLE_UNPRIVILEGED
),
249 SD_BUS_METHOD("SetLinkMulticastDNS", "is", NULL
, bus_method_set_link_mdns
, SD_BUS_VTABLE_UNPRIVILEGED
),
250 SD_BUS_METHOD("SetLinkDNSOverTLS", "is", NULL
, bus_method_set_link_dns_over_tls
, SD_BUS_VTABLE_UNPRIVILEGED
),
251 SD_BUS_METHOD("SetLinkDNSSEC", "is", NULL
, bus_method_set_link_dnssec
, SD_BUS_VTABLE_UNPRIVILEGED
),
252 SD_BUS_METHOD("SetLinkDNSSECNegativeTrustAnchors", "ias", NULL
, bus_method_set_link_dnssec_negative_trust_anchors
, SD_BUS_VTABLE_UNPRIVILEGED
),
253 SD_BUS_METHOD("RevertLinkNTP", "i", NULL
, bus_method_revert_link_ntp
, SD_BUS_VTABLE_UNPRIVILEGED
),
254 SD_BUS_METHOD("RevertLinkDNS", "i", NULL
, bus_method_revert_link_dns
, SD_BUS_VTABLE_UNPRIVILEGED
),
255 SD_BUS_METHOD("RenewLink", "i", NULL
, bus_method_renew_link
, SD_BUS_VTABLE_UNPRIVILEGED
),
256 SD_BUS_METHOD("ForceRenewLink", "i", NULL
, bus_method_force_renew_link
, SD_BUS_VTABLE_UNPRIVILEGED
),
257 SD_BUS_METHOD("ReconfigureLink", "i", NULL
, bus_method_reconfigure_link
, SD_BUS_VTABLE_UNPRIVILEGED
),
258 SD_BUS_METHOD("Reload", NULL
, NULL
, bus_method_reload
, SD_BUS_VTABLE_UNPRIVILEGED
),
263 int manager_send_changed_strv(Manager
*manager
, char **properties
) {
270 return sd_bus_emit_properties_changed_strv(
272 "/org/freedesktop/network1",
273 "org.freedesktop.network1.Manager",