1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "networkd-address.h"
4 #include "networkd-bridge-fdb.h"
5 #include "networkd-bridge-mdb.h"
6 #include "networkd-dhcp-server.h"
7 #include "networkd-manager.h"
8 #include "networkd-neighbor.h"
9 #include "networkd-nexthop.h"
10 #include "networkd-route.h"
11 #include "networkd-routing-policy-rule.h"
12 #include "networkd-queue.h"
14 static void request_free_object(RequestType type
, void *object
) {
16 case REQUEST_TYPE_ADDRESS
:
19 case REQUEST_TYPE_BRIDGE_FDB
:
20 bridge_fdb_free(object
);
22 case REQUEST_TYPE_BRIDGE_MDB
:
23 bridge_mdb_free(object
);
25 case REQUEST_TYPE_DHCP_SERVER
:
27 case REQUEST_TYPE_NEIGHBOR
:
28 neighbor_free(object
);
30 case REQUEST_TYPE_NEXTHOP
:
33 case REQUEST_TYPE_ROUTE
:
36 case REQUEST_TYPE_ROUTING_POLICY_RULE
:
37 routing_policy_rule_free(object
);
40 assert_not_reached("invalid request type.");
44 Request
*request_free(Request
*req
) {
50 if (req
->consume_object
)
51 request_free_object(req
->type
, req
->object
);
52 if (req
->link
&& req
->link
->manager
)
53 ordered_set_remove(req
->link
->manager
->request_queue
, req
);
54 link_unref(req
->link
);
59 DEFINE_TRIVIAL_CLEANUP_FUNC(Request
*, request_free
);
61 void request_drop(Request
*req
) {
62 if (req
->message_counter
)
63 (*req
->message_counter
)--;
68 int link_queue_request(
73 unsigned *message_counter
,
74 link_netlink_message_handler_t netlink_handler
,
77 _cleanup_(request_freep
) Request
*req
= NULL
;
81 assert(link
->manager
);
82 assert(type
>= 0 && type
< _REQUEST_TYPE_MAX
);
83 if (type
!= REQUEST_TYPE_DHCP_SERVER
) {
85 assert(netlink_handler
);
88 req
= new(Request
, 1);
91 request_free_object(type
, object
);
99 .consume_object
= consume_object
,
100 .message_counter
= message_counter
,
101 .netlink_handler
= netlink_handler
,
106 r
= ordered_set_ensure_put(&link
->manager
->request_queue
, NULL
, req
);
110 if (req
->message_counter
)
111 (*req
->message_counter
)++;
120 int manager_process_requests(sd_event_source
*s
, void *userdata
) {
121 Manager
*manager
= userdata
;
127 bool processed
= false;
130 ORDERED_SET_FOREACH(req
, manager
->request_queue
) {
132 case REQUEST_TYPE_ADDRESS
:
133 r
= request_process_address(req
);
135 case REQUEST_TYPE_BRIDGE_FDB
:
136 r
= request_process_bridge_fdb(req
);
138 case REQUEST_TYPE_BRIDGE_MDB
:
139 r
= request_process_bridge_mdb(req
);
141 case REQUEST_TYPE_DHCP_SERVER
:
142 r
= request_process_dhcp_server(req
);
144 case REQUEST_TYPE_NEIGHBOR
:
145 r
= request_process_neighbor(req
);
147 case REQUEST_TYPE_NEXTHOP
:
148 r
= request_process_nexthop(req
);
150 case REQUEST_TYPE_ROUTE
:
151 r
= request_process_route(req
);
153 case REQUEST_TYPE_ROUTING_POLICY_RULE
:
154 r
= request_process_routing_policy_rule(req
);
160 link_enter_failed(req
->link
);
162 ordered_set_remove(manager
->request_queue
, req
);