X Tutup
Skip to content

Commit 09d0920

Browse files
committed
network: re-design request queue
This makes Request object takes hash, compare, free, and process functions. With this change, the logic in networkd-queue.c can be mostly independent of the type of the request or the object (e.g. Address) assigned to the request, and it becomes simpler.
1 parent 4c8b81c commit 09d0920

38 files changed

+284
-553
lines changed

src/network/netdev/netdev.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ static int netdev_is_ready_to_create(NetDev *netdev, Link *link) {
629629
return true;
630630
}
631631

632-
int stacked_netdev_process_request(Request *req, Link *link, void *userdata) {
632+
static int stacked_netdev_process_request(Request *req, Link *link, void *userdata) {
633633
NetDev *netdev = ASSERT_PTR(userdata);
634634
int r;
635635

@@ -682,10 +682,12 @@ int link_request_stacked_netdev(Link *link, NetDev *netdev) {
682682
return 0; /* Already created. */
683683

684684
link->stacked_netdevs_created = false;
685-
r = link_queue_request(link, REQUEST_TYPE_NETDEV_STACKED, netdev_ref(netdev), true,
686-
&link->create_stacked_netdev_messages,
687-
create_stacked_netdev_handler,
688-
NULL);
685+
r = link_queue_request_full(link, REQUEST_TYPE_NETDEV_STACKED,
686+
netdev_ref(netdev), (mfree_func_t) netdev_unref,
687+
trivial_hash_func, trivial_compare_func,
688+
stacked_netdev_process_request,
689+
&link->create_stacked_netdev_messages,
690+
create_stacked_netdev_handler, NULL);
689691
if (r < 0)
690692
return log_link_error_errno(link, r, "Failed to request stacked netdev '%s': %m",
691693
netdev->ifname);
@@ -694,7 +696,7 @@ int link_request_stacked_netdev(Link *link, NetDev *netdev) {
694696
return 0;
695697
}
696698

697-
int independent_netdev_process_request(Request *req, Link *link, void *userdata) {
699+
static int independent_netdev_process_request(Request *req, Link *link, void *userdata) {
698700
NetDev *netdev = ASSERT_PTR(userdata);
699701
int r;
700702

@@ -730,9 +732,9 @@ static int netdev_request_to_create(NetDev *netdev) {
730732

731733
} else {
732734
/* Otherwise, wait for the dependencies being resolved. */
733-
r = netdev_queue_request(netdev, NULL);
735+
r = netdev_queue_request(netdev, independent_netdev_process_request, NULL);
734736
if (r < 0)
735-
return log_netdev_warning_errno(netdev, r, "Failed to request to create: %m");
737+
return log_netdev_warning_errno(netdev, r, "Failed to request to create netdev: %m");
736738
}
737739

738740
return 0;

src/network/netdev/netdev.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ typedef enum NetDevCreateType {
109109

110110
typedef struct Manager Manager;
111111
typedef struct Condition Condition;
112-
typedef struct Request Request;
113112

114113
typedef struct NetDev {
115114
Manager *manager;
@@ -209,8 +208,6 @@ int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
209208
int netdev_generate_hw_addr(NetDev *netdev, Link *link, const char *name,
210209
const struct hw_addr_data *hw_addr, struct hw_addr_data *ret);
211210

212-
int independent_netdev_process_request(Request *req, Link *link, void *userdata);
213-
int stacked_netdev_process_request(Request *req, Link *link, void *userdata);
214211
int link_request_stacked_netdev(Link *link, NetDev *netdev);
215212

216213
const char *netdev_kind_to_string(NetDevKind d) _const_;

src/network/networkd-address-label.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static int address_label_configure(AddressLabel *label, Link *link, Request *req
124124
return request_call_netlink_async(link->manager->rtnl, m, req);
125125
}
126126

127-
int address_label_process_request(Request *req, Link *link, void *userdata) {
127+
static int address_label_process_request(Request *req, Link *link, void *userdata) {
128128
AddressLabel *label = ASSERT_PTR(userdata);
129129
int r;
130130

@@ -151,8 +151,11 @@ int link_request_static_address_labels(Link *link) {
151151
link->static_address_labels_configured = false;
152152

153153
HASHMAP_FOREACH(label, link->network->address_labels_by_section) {
154-
r = link_queue_request(link, REQUEST_TYPE_ADDRESS_LABEL, label, false,
155-
&link->static_address_label_messages, address_label_configure_handler, NULL);
154+
r = link_queue_request_full(link, REQUEST_TYPE_ADDRESS_LABEL,
155+
label, NULL, trivial_hash_func, trivial_compare_func,
156+
address_label_process_request,
157+
&link->static_address_label_messages,
158+
address_label_configure_handler, NULL);
156159
if (r < 0)
157160
return log_link_warning_errno(link, r, "Failed to request address label: %m");
158161
}

src/network/networkd-address-label.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
typedef struct Link Link;
1111
typedef struct Network Network;
12-
typedef struct Request Request;
1312

1413
typedef struct AddressLabel {
1514
Network *network;
@@ -26,7 +25,6 @@ AddressLabel *address_label_free(AddressLabel *label);
2625
void network_drop_invalid_address_labels(Network *network);
2726

2827
int link_request_static_address_labels(Link *link);
29-
int address_label_process_request(Request *req, Link *link, void *userdata);
3028

3129
CONFIG_PARSER_PROTOTYPE(config_parse_address_label);
3230
CONFIG_PARSER_PROTOTYPE(config_parse_address_label_prefix);

src/network/networkd-address.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ DEFINE_PRIVATE_HASH_OPS(
316316
address_kernel_hash_func,
317317
address_kernel_compare_func);
318318

319-
void address_hash_func(const Address *a, struct siphash *state) {
319+
static void address_hash_func(const Address *a, struct siphash *state) {
320320
assert(a);
321321

322322
siphash24_compress(&a->family, sizeof(a->family), state);
@@ -1104,7 +1104,7 @@ static bool address_is_ready_to_configure(Link *link, const Address *address) {
11041104
return true;
11051105
}
11061106

1107-
int address_process_request(Request *req, Link *link, Address *address) {
1107+
static int address_process_request(Request *req, Link *link, Address *address) {
11081108
int r;
11091109

11101110
assert(req);
@@ -1196,8 +1196,12 @@ int link_request_address(
11961196
return r;
11971197

11981198
log_address_debug(existing, "Requesting", link);
1199-
r = link_queue_request(link, REQUEST_TYPE_ADDRESS, existing, false,
1200-
message_counter, (request_netlink_handler_t) netlink_handler, ret);
1199+
r = link_queue_request_safe(link, REQUEST_TYPE_ADDRESS,
1200+
existing, NULL,
1201+
address_hash_func,
1202+
address_compare_func,
1203+
address_process_request,
1204+
message_counter, netlink_handler, ret);
12011205
if (r < 0)
12021206
return log_link_warning_errno(link, r, "Failed to request address: %m");
12031207
if (r == 0)
@@ -1281,7 +1285,9 @@ void address_cancel_request(Address *address) {
12811285
req = (Request) {
12821286
.link = address->link,
12831287
.type = REQUEST_TYPE_ADDRESS,
1284-
.address = address,
1288+
.userdata = address,
1289+
.hash_func = (hash_func_t) address_hash_func,
1290+
.compare_func = (compare_func_t) address_compare_func,
12851291
};
12861292

12871293
request_detach(address->link->manager, &req);

src/network/networkd-address.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,11 @@ int link_request_address(
107107
Request **ret);
108108
int link_request_static_address(Link *link, Address *address, bool consume);
109109
int link_request_static_addresses(Link *link);
110-
int address_process_request(Request *req, Link *link, Address *address);
111110

112111
int manager_rtnl_process_address(sd_netlink *nl, sd_netlink_message *message, Manager *m);
113112

114113
int network_drop_invalid_addresses(Network *network);
115114

116-
void address_hash_func(const Address *a, struct siphash *state);
117115
int address_compare_func(const Address *a1, const Address *a2);
118116

119117
DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(Address, address);

src/network/networkd-bridge-fdb.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ static bool bridge_fdb_is_ready_to_configure(BridgeFDB *fdb, Link *link) {
208208
return true;
209209
}
210210

211-
int bridge_fdb_process_request(Request *req, Link *link, void *userdata) {
211+
static int bridge_fdb_process_request(Request *req, Link *link, void *userdata) {
212212
BridgeFDB *fdb = ASSERT_PTR(userdata);
213213
int r;
214214

@@ -235,8 +235,14 @@ int link_request_static_bridge_fdb(Link *link) {
235235
link->static_bridge_fdb_configured = false;
236236

237237
HASHMAP_FOREACH(fdb, link->network->bridge_fdb_entries_by_section) {
238-
r = link_queue_request(link, REQUEST_TYPE_BRIDGE_FDB, fdb, false,
239-
&link->static_bridge_fdb_messages, bridge_fdb_configure_handler, NULL);
238+
r = link_queue_request_full(link, REQUEST_TYPE_BRIDGE_FDB,
239+
fdb, NULL,
240+
trivial_hash_func,
241+
trivial_compare_func,
242+
bridge_fdb_process_request,
243+
&link->static_bridge_fdb_messages,
244+
bridge_fdb_configure_handler,
245+
NULL);
240246
if (r < 0)
241247
return log_link_error_errno(link, r, "Failed to request static bridge FDB entry: %m");
242248
}

src/network/networkd-bridge-fdb.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
typedef struct Link Link;
1616
typedef struct Network Network;
17-
typedef struct Request Request;
1817

1918
typedef enum NeighborCacheEntryFlags {
2019
NEIGHBOR_CACHE_ENTRY_FLAGS_USE = NTF_USE,
@@ -47,8 +46,6 @@ void network_drop_invalid_bridge_fdb_entries(Network *network);
4746

4847
int link_request_static_bridge_fdb(Link *link);
4948

50-
int bridge_fdb_process_request(Request *req, Link *link, void *userdata);
51-
5249
CONFIG_PARSER_PROTOTYPE(config_parse_fdb_hwaddr);
5350
CONFIG_PARSER_PROTOTYPE(config_parse_fdb_vlan_id);
5451
CONFIG_PARSER_PROTOTYPE(config_parse_fdb_destination);

src/network/networkd-bridge-mdb.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ static bool bridge_mdb_is_ready_to_configure(Link *link) {
194194
return true;
195195
}
196196

197-
int bridge_mdb_process_request(Request *req, Link *link, void *userdata) {
197+
static int bridge_mdb_process_request(Request *req, Link *link, void *userdata) {
198198
BridgeMDB *mdb = ASSERT_PTR(userdata);
199199
int r;
200200

@@ -227,8 +227,14 @@ int link_request_static_bridge_mdb(Link *link) {
227227
goto finish;
228228

229229
HASHMAP_FOREACH(mdb, link->network->bridge_mdb_entries_by_section) {
230-
r = link_queue_request(link, REQUEST_TYPE_BRIDGE_MDB, mdb, false,
231-
&link->static_bridge_mdb_messages, bridge_mdb_configure_handler, NULL);
230+
r = link_queue_request_full(link, REQUEST_TYPE_BRIDGE_MDB,
231+
mdb, NULL,
232+
trivial_hash_func,
233+
trivial_compare_func,
234+
bridge_mdb_process_request,
235+
&link->static_bridge_mdb_messages,
236+
bridge_mdb_configure_handler,
237+
NULL);
232238
if (r < 0)
233239
return log_link_error_errno(link, r, "Failed to request MDB entry to multicast group database: %m");
234240
}

src/network/networkd-bridge-mdb.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
typedef struct Link Link;
1111
typedef struct Network Network;
12-
typedef struct Request Request;
1312

1413
typedef struct BridgeMDB {
1514
Network *network;
@@ -25,7 +24,6 @@ BridgeMDB *bridge_mdb_free(BridgeMDB *mdb);
2524
void network_drop_invalid_bridge_mdb_entries(Network *network);
2625

2726
int link_request_static_bridge_mdb(Link *link);
28-
int bridge_mdb_process_request(Request *req, Link *link, void *userdata);
2927

3028
CONFIG_PARSER_PROTOTYPE(config_parse_mdb_group_address);
3129
CONFIG_PARSER_PROTOTYPE(config_parse_mdb_vlan_id);

0 commit comments

Comments
 (0)
X Tutup