1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "networkd-address.h"
4 #include "networkd-bridge-fdb.h"
5 #include "networkd-manager.h"
6 #include "networkd-neighbor.h"
7 #include "networkd-nexthop.h"
8 #include "networkd-route.h"
9 #include "networkd-routing-policy-rule.h"
10 #include "networkd-queue.h"
12 static void request_free_object(RequestType type
, void *object
) {
14 case REQUEST_TYPE_ADDRESS
:
17 case REQUEST_TYPE_BRIDGE_FDB
:
18 bridge_fdb_free(object
);
20 case REQUEST_TYPE_NEIGHBOR
:
21 neighbor_free(object
);
23 case REQUEST_TYPE_NEXTHOP
:
26 case REQUEST_TYPE_ROUTE
:
29 case REQUEST_TYPE_ROUTING_POLICY_RULE
:
30 routing_policy_rule_free(object
);
33 assert_not_reached("invalid request type.");
37 Request
*request_free(Request
*req
) {
43 if (req
->consume_object
)
44 request_free_object(req
->type
, req
->object
);
45 if (req
->link
&& req
->link
->manager
)
46 ordered_set_remove(req
->link
->manager
->request_queue
, req
);
47 link_unref(req
->link
);
52 DEFINE_TRIVIAL_CLEANUP_FUNC(Request
*, request_free
);
54 void request_drop(Request
*req
) {
55 if (req
->message_counter
)
56 (*req
->message_counter
)--;
61 int link_queue_request(
66 unsigned *message_counter
,
67 link_netlink_message_handler_t netlink_handler
,
70 _cleanup_(request_freep
) Request
*req
= NULL
;
74 assert(link
->manager
);
75 assert(type
>= 0 && type
< _REQUEST_TYPE_MAX
);
77 assert(netlink_handler
);
79 req
= new(Request
, 1);
82 request_free_object(type
, object
);
90 .consume_object
= consume_object
,
91 .message_counter
= message_counter
,
92 .netlink_handler
= netlink_handler
,
97 r
= ordered_set_ensure_put(&link
->manager
->request_queue
, NULL
, req
);
101 if (req
->message_counter
)
102 (*req
->message_counter
)++;
111 int manager_process_requests(sd_event_source
*s
, void *userdata
) {
112 Manager
*manager
= userdata
;
118 bool processed
= false;
121 ORDERED_SET_FOREACH(req
, manager
->request_queue
) {
123 case REQUEST_TYPE_ADDRESS
:
124 r
= request_process_address(req
);
126 case REQUEST_TYPE_BRIDGE_FDB
:
127 r
= request_process_bridge_fdb(req
);
129 case REQUEST_TYPE_NEIGHBOR
:
130 r
= request_process_neighbor(req
);
132 case REQUEST_TYPE_NEXTHOP
:
133 r
= request_process_nexthop(req
);
135 case REQUEST_TYPE_ROUTE
:
136 r
= request_process_route(req
);
138 case REQUEST_TYPE_ROUTING_POLICY_RULE
:
139 r
= request_process_routing_policy_rule(req
);
145 link_enter_failed(req
->link
);
147 ordered_set_remove(manager
->request_queue
, req
);