]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link-bus.c
Merge pull request #12574 from yuwata/network-mtu-issue-12552
[thirdparty/systemd.git] / src / network / networkd-link-bus.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
e331e246 2
b5efdb8a 3#include "alloc-util.h"
cf0fbc49 4#include "bus-util.h"
e331e246 5#include "networkd-link.h"
23f53b99 6#include "networkd-manager.h"
6bedfcbb 7#include "parse-util.h"
cf0fbc49 8#include "strv.h"
e331e246
TG
9
10static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
11static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);
12
13const sd_bus_vtable link_vtable[] = {
14 SD_BUS_VTABLE_START(0),
15
16 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
17 SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state, offsetof(Link, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
18
19 SD_BUS_VTABLE_END
20};
21
22static char *link_bus_path(Link *link) {
c8f5edea 23 _cleanup_free_ char *ifindex = NULL;
e331e246 24 char *p;
c8f5edea 25 int r;
e331e246
TG
26
27 assert(link);
28 assert(link->ifindex > 0);
29
c8f5edea
TG
30 if (asprintf(&ifindex, "%d", link->ifindex) < 0)
31 return NULL;
32
33 r = sd_bus_path_encode("/org/freedesktop/network1/link", ifindex, &p);
34 if (r < 0)
02f50053 35 return NULL;
e331e246
TG
36
37 return p;
38}
39
40int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
41 _cleanup_strv_free_ char **l = NULL;
42 Manager *m = userdata;
fdb90ac6 43 unsigned c = 0;
e331e246
TG
44 Link *link;
45 Iterator i;
e331e246
TG
46
47 assert(bus);
48 assert(path);
49 assert(m);
50 assert(nodes);
51
fdb90ac6
LP
52 l = new0(char*, hashmap_size(m->links) + 1);
53 if (!l)
54 return -ENOMEM;
55
e331e246
TG
56 HASHMAP_FOREACH(link, m->links, i) {
57 char *p;
58
59 p = link_bus_path(link);
60 if (!p)
61 return -ENOMEM;
62
fdb90ac6 63 l[c++] = p;
e331e246
TG
64 }
65
fdb90ac6 66 l[c] = NULL;
ae2a15bc 67 *nodes = TAKE_PTR(l);
e331e246
TG
68
69 return 1;
70}
71
72int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
c8f5edea 73 _cleanup_free_ char *identifier = NULL;
e331e246
TG
74 Manager *m = userdata;
75 Link *link;
76 int ifindex, r;
77
78 assert(bus);
79 assert(path);
80 assert(interface);
81 assert(m);
82 assert(found);
83
c8f5edea 84 r = sd_bus_path_decode(path, "/org/freedesktop/network1/link", &identifier);
a7f6e7e8 85 if (r <= 0)
c8f5edea
TG
86 return 0;
87
6ad623a3 88 r = parse_ifindex(identifier, &ifindex);
1c111814 89 if (r < 0)
e331e246
TG
90 return 0;
91
92 r = link_get(m, ifindex, &link);
93 if (r < 0)
94 return 0;
95
96 *found = link;
97
98 return 1;
99}
100
101int link_send_changed(Link *link, const char *property, ...) {
102 _cleanup_free_ char *p = NULL;
103 char **l;
104
105 assert(link);
106 assert(link->manager);
107
4852e159
TG
108 if (!link->manager->bus)
109 return 0; /* replace with assert when we have kdbus */
110
e331e246
TG
111 l = strv_from_stdarg_alloca(property);
112
113 p = link_bus_path(link);
114 if (!p)
115 return -ENOMEM;
116
117 return sd_bus_emit_properties_changed_strv(
118 link->manager->bus,
119 p,
120 "org.freedesktop.network1.Link",
121 l);
122}