diff options
Diffstat (limited to 'meta/recipes-core/systemd/systemd/network-add-skeleton-of-request-queue.patch')
-rw-r--r-- | meta/recipes-core/systemd/systemd/network-add-skeleton-of-request-queue.patch | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/meta/recipes-core/systemd/systemd/network-add-skeleton-of-request-queue.patch b/meta/recipes-core/systemd/systemd/network-add-skeleton-of-request-queue.patch new file mode 100644 index 0000000000..06c523834d --- /dev/null +++ b/meta/recipes-core/systemd/systemd/network-add-skeleton-of-request-queue.patch | |||
@@ -0,0 +1,285 @@ | |||
1 | From 19d9a5adf0c1a6b5a243eea0390f6f6526d569de Mon Sep 17 00:00:00 2001 | ||
2 | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||
3 | Date: Fri, 7 May 2021 15:39:16 +0900 | ||
4 | Subject: [PATCH] network: add skeleton of request queue | ||
5 | |||
6 | This will be used in later commits. | ||
7 | |||
8 | Upstream-Status: Backport [https://github.com/systemd/systemd-stable/commit/19d9a5adf0c1a6b5a243eea0390f6f6526d569de] | ||
9 | Signed-off-by: Ranjitsinh Rathod <ranjitsinh.rathod@kpit.com> | ||
10 | |||
11 | --- | ||
12 | src/network/meson.build | 2 + | ||
13 | src/network/networkd-link.c | 20 +++++- | ||
14 | src/network/networkd-manager.c | 7 ++ | ||
15 | src/network/networkd-manager.h | 2 + | ||
16 | src/network/networkd-queue.c | 121 +++++++++++++++++++++++++++++++++ | ||
17 | src/network/networkd-queue.h | 42 ++++++++++++ | ||
18 | 6 files changed, 192 insertions(+), 2 deletions(-) | ||
19 | create mode 100644 src/network/networkd-queue.c | ||
20 | create mode 100644 src/network/networkd-queue.h | ||
21 | |||
22 | diff --git a/src/network/meson.build b/src/network/meson.build | ||
23 | index 4fca3106dc..a8b9232e64 100644 | ||
24 | --- a/src/network/meson.build | ||
25 | +++ b/src/network/meson.build | ||
26 | @@ -105,6 +105,8 @@ sources = files(''' | ||
27 | networkd-network.h | ||
28 | networkd-nexthop.c | ||
29 | networkd-nexthop.h | ||
30 | + networkd-queue.c | ||
31 | + networkd-queue.h | ||
32 | networkd-route.c | ||
33 | networkd-route.h | ||
34 | networkd-routing-policy-rule.c | ||
35 | diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c | ||
36 | index 34359b2541..2f33305a27 100644 | ||
37 | --- a/src/network/networkd-link.c | ||
38 | +++ b/src/network/networkd-link.c | ||
39 | @@ -30,6 +30,7 @@ | ||
40 | #include "networkd-manager.h" | ||
41 | #include "networkd-ndisc.h" | ||
42 | #include "networkd-neighbor.h" | ||
43 | +#include "networkd-queue.h" | ||
44 | #include "networkd-radv.h" | ||
45 | #include "networkd-routing-policy-rule.h" | ||
46 | #include "networkd-wifi.h" | ||
47 | |||
48 | @@ -2232,6 +2244,8 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for | ||
49 | if (r < 0) | ||
50 | return r; | ||
51 | |||
52 | + link_drop_requests(link); | ||
53 | + | ||
54 | r = link_drop_config(link); | ||
55 | if (r < 0) | ||
56 | return r; | ||
57 | @@ -2664,6 +2678,8 @@ static int link_carrier_lost(Link *link) { | ||
58 | return r; | ||
59 | } | ||
60 | |||
61 | + link_drop_requests(link); | ||
62 | + | ||
63 | r = link_drop_config(link); | ||
64 | if (r < 0) | ||
65 | return r; | ||
66 | diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c | ||
67 | index 562ce5ca54..fd576169a9 100644 | ||
68 | --- a/src/network/networkd-manager.c | ||
69 | +++ b/src/network/networkd-manager.c | ||
70 | @@ -34,6 +34,7 @@ | ||
71 | #include "networkd-manager-bus.h" | ||
72 | #include "networkd-manager.h" | ||
73 | #include "networkd-network-bus.h" | ||
74 | +#include "networkd-queue.h" | ||
75 | #include "networkd-speed-meter.h" | ||
76 | #include "ordered-set.h" | ||
77 | #include "path-util.h" | ||
78 | @@ -406,6 +407,10 @@ int manager_new(Manager **ret) { | ||
79 | if (r < 0) | ||
80 | return r; | ||
81 | |||
82 | + r = sd_event_add_post(m->event, NULL, manager_process_requests, m); | ||
83 | + if (r < 0) | ||
84 | + return r; | ||
85 | + | ||
86 | r = manager_connect_rtnl(m); | ||
87 | if (r < 0) | ||
88 | return r; | ||
89 | @@ -446,6 +451,8 @@ Manager* manager_free(Manager *m) { | ||
90 | |||
91 | free(m->state_file); | ||
92 | |||
93 | + m->request_queue = ordered_set_free_with_destructor(m->request_queue, request_free); | ||
94 | + | ||
95 | while ((a = hashmap_first_key(m->dhcp6_prefixes))) | ||
96 | (void) dhcp6_prefix_remove(m, a); | ||
97 | m->dhcp6_prefixes = hashmap_free(m->dhcp6_prefixes); | ||
98 | diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h | ||
99 | index 301b97c1a1..26e8802871 100644 | ||
100 | --- a/src/network/networkd-manager.h | ||
101 | +++ b/src/network/networkd-manager.h | ||
102 | @@ -91,6 +91,8 @@ struct Manager { | ||
103 | usec_t speed_meter_usec_old; | ||
104 | |||
105 | bool dhcp4_prefix_root_cannot_set_table; | ||
106 | + | ||
107 | + OrderedSet *request_queue; | ||
108 | }; | ||
109 | |||
110 | int manager_new(Manager **ret); | ||
111 | diff --git a/src/network/networkd-queue.c b/src/network/networkd-queue.c | ||
112 | new file mode 100644 | ||
113 | index 0000000000..24bb2c845d | ||
114 | --- /dev/null | ||
115 | +++ b/src/network/networkd-queue.c | ||
116 | @@ -0,0 +1,121 @@ | ||
117 | +/* SPDX-License-Identifier: LGPL-2.1-or-later */ | ||
118 | + | ||
119 | +#include "networkd-address.h" | ||
120 | +#include "networkd-manager.h" | ||
121 | +#include "networkd-neighbor.h" | ||
122 | +#include "networkd-nexthop.h" | ||
123 | +#include "networkd-route.h" | ||
124 | +#include "networkd-routing-policy-rule.h" | ||
125 | +#include "networkd-queue.h" | ||
126 | + | ||
127 | +static void request_free_object(RequestType type, void *object) { | ||
128 | + switch(type) { | ||
129 | + default: | ||
130 | + assert_not_reached("invalid request type."); | ||
131 | + } | ||
132 | +} | ||
133 | + | ||
134 | +Request *request_free(Request *req) { | ||
135 | + if (!req) | ||
136 | + return NULL; | ||
137 | + | ||
138 | + if (req->on_free) | ||
139 | + req->on_free(req); | ||
140 | + if (req->consume_object) | ||
141 | + request_free_object(req->type, req->object); | ||
142 | + if (req->link && req->link->manager) | ||
143 | + ordered_set_remove(req->link->manager->request_queue, req); | ||
144 | + link_unref(req->link); | ||
145 | + | ||
146 | + return mfree(req); | ||
147 | +} | ||
148 | + | ||
149 | +DEFINE_TRIVIAL_CLEANUP_FUNC(Request*, request_free); | ||
150 | + | ||
151 | +void request_drop(Request *req) { | ||
152 | + if (req->message_counter) | ||
153 | + (*req->message_counter)--; | ||
154 | + | ||
155 | + request_free(req); | ||
156 | +} | ||
157 | + | ||
158 | +int link_queue_request( | ||
159 | + Link *link, | ||
160 | + RequestType type, | ||
161 | + void *object, | ||
162 | + bool consume_object, | ||
163 | + unsigned *message_counter, | ||
164 | + link_netlink_message_handler_t netlink_handler, | ||
165 | + Request **ret) { | ||
166 | + | ||
167 | + _cleanup_(request_freep) Request *req = NULL; | ||
168 | + int r; | ||
169 | + | ||
170 | + assert(link); | ||
171 | + assert(link->manager); | ||
172 | + assert(type >= 0 && type < _REQUEST_TYPE_MAX); | ||
173 | + assert(object); | ||
174 | + assert(netlink_handler); | ||
175 | + | ||
176 | + req = new(Request, 1); | ||
177 | + if (!req) { | ||
178 | + if (consume_object) | ||
179 | + request_free_object(type, object); | ||
180 | + return -ENOMEM; | ||
181 | + } | ||
182 | + | ||
183 | + *req = (Request) { | ||
184 | + .link = link, | ||
185 | + .type = type, | ||
186 | + .object = object, | ||
187 | + .consume_object = consume_object, | ||
188 | + .message_counter = message_counter, | ||
189 | + .netlink_handler = netlink_handler, | ||
190 | + }; | ||
191 | + | ||
192 | + link_ref(link); | ||
193 | + | ||
194 | + r = ordered_set_ensure_put(&link->manager->request_queue, NULL, req); | ||
195 | + if (r < 0) | ||
196 | + return r; | ||
197 | + | ||
198 | + if (req->message_counter) | ||
199 | + (*req->message_counter)++; | ||
200 | + | ||
201 | + if (ret) | ||
202 | + *ret = req; | ||
203 | + | ||
204 | + TAKE_PTR(req); | ||
205 | + return 0; | ||
206 | +} | ||
207 | + | ||
208 | +int manager_process_requests(sd_event_source *s, void *userdata) { | ||
209 | + Manager *manager = userdata; | ||
210 | + int r; | ||
211 | + | ||
212 | + assert(manager); | ||
213 | + | ||
214 | + for (;;) { | ||
215 | + bool processed = false; | ||
216 | + Request *req; | ||
217 | + Iterator i; | ||
218 | + ORDERED_SET_FOREACH(req, manager->request_queue, i) { | ||
219 | + switch(req->type) { | ||
220 | + default: | ||
221 | + return -EINVAL; | ||
222 | + } | ||
223 | + if (r < 0) | ||
224 | + link_enter_failed(req->link); | ||
225 | + if (r > 0) { | ||
226 | + ordered_set_remove(manager->request_queue, req); | ||
227 | + request_free(req); | ||
228 | + processed = true; | ||
229 | + } | ||
230 | + } | ||
231 | + | ||
232 | + if (!processed) | ||
233 | + break; | ||
234 | + } | ||
235 | + | ||
236 | + return 0; | ||
237 | +} | ||
238 | diff --git a/src/network/networkd-queue.h b/src/network/networkd-queue.h | ||
239 | new file mode 100644 | ||
240 | index 0000000000..4558ae548f | ||
241 | --- /dev/null | ||
242 | +++ b/src/network/networkd-queue.h | ||
243 | @@ -0,0 +1,42 @@ | ||
244 | +/* SPDX-License-Identifier: LGPL-2.1-or-later */ | ||
245 | +#pragma once | ||
246 | + | ||
247 | +#include "sd-event.h" | ||
248 | + | ||
249 | +#include "networkd-link.h" | ||
250 | + | ||
251 | +typedef struct Request Request; | ||
252 | + | ||
253 | +typedef int (*request_after_configure_handler_t)(Request*, void*); | ||
254 | +typedef void (*request_on_free_handler_t)(Request*); | ||
255 | + | ||
256 | +typedef enum RequestType { | ||
257 | + _REQUEST_TYPE_MAX, | ||
258 | + _REQUEST_TYPE_INVALID = -EINVAL, | ||
259 | +} RequestType; | ||
260 | + | ||
261 | +typedef struct Request { | ||
262 | + Link *link; | ||
263 | + RequestType type; | ||
264 | + bool consume_object; | ||
265 | + void *object; | ||
266 | + void *userdata; | ||
267 | + unsigned *message_counter; | ||
268 | + link_netlink_message_handler_t netlink_handler; | ||
269 | + request_after_configure_handler_t after_configure; | ||
270 | + request_on_free_handler_t on_free; | ||
271 | +} Request; | ||
272 | + | ||
273 | +Request *request_free(Request *req); | ||
274 | +void request_drop(Request *req); | ||
275 | + | ||
276 | +int link_queue_request( | ||
277 | + Link *link, | ||
278 | + RequestType type, | ||
279 | + void *object, | ||
280 | + bool consume_object, | ||
281 | + unsigned *message_counter, | ||
282 | + link_netlink_message_handler_t netlink_handler, | ||
283 | + Request **ret); | ||
284 | + | ||
285 | +int manager_process_requests(sd_event_source *s, void *userdata); | ||