summaryrefslogtreecommitdiff
path: root/src/network/networkd-queue.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-05-21 04:51:07 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-06-08 06:33:27 +0900
commit0fa8ee6c778020902119d5a3f03f51a43d6f5be5 (patch)
tree37caa3a72bd2675daee54ab90410ecc5b93b4f88 /src/network/networkd-queue.c
parentfa28381202246f41f14484949f7fecb8067888a6 (diff)
downloadsystemd-0fa8ee6c778020902119d5a3f03f51a43d6f5be5.tar.gz
network: use request queue to set MTU
Diffstat (limited to 'src/network/networkd-queue.c')
-rw-r--r--src/network/networkd-queue.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/network/networkd-queue.c b/src/network/networkd-queue.c
index 01636468c6..f05fb2221e 100644
--- a/src/network/networkd-queue.c
+++ b/src/network/networkd-queue.c
@@ -44,6 +44,8 @@ static void request_free_object(RequestType type, void *object) {
case REQUEST_TYPE_ROUTING_POLICY_RULE:
routing_policy_rule_free(object);
break;
+ case REQUEST_TYPE_SET_LINK:
+ break;
default:
assert_not_reached("invalid request type.");
}
@@ -113,6 +115,9 @@ static void request_hash_func(const Request *req, struct siphash *state) {
case REQUEST_TYPE_ROUTING_POLICY_RULE:
routing_policy_rule_hash_func(req->rule, state);
break;
+ case REQUEST_TYPE_SET_LINK:
+ siphash24_compress(&req->set_link_operation, sizeof(req->set_link_operation), state);
+ break;
default:
assert_not_reached("invalid request type.");
}
@@ -153,6 +158,8 @@ static int request_compare_func(const struct Request *a, const struct Request *b
return route_compare_func(a->route, b->route);
case REQUEST_TYPE_ROUTING_POLICY_RULE:
return routing_policy_rule_compare_func(a->rule, b->rule);
+ case REQUEST_TYPE_SET_LINK:
+ return CMP(a->set_link_operation, b->set_link_operation);
default:
assert_not_reached("invalid request type.");
}
@@ -175,15 +182,14 @@ int link_queue_request(
Request **ret) {
_cleanup_(request_freep) Request *req = NULL;
+ Request *existing;
int r;
assert(link);
assert(link->manager);
assert(type >= 0 && type < _REQUEST_TYPE_MAX);
- if (type != REQUEST_TYPE_DHCP_SERVER) {
- assert(object);
- assert(netlink_handler);
- }
+ assert(IN_SET(type, REQUEST_TYPE_DHCP_SERVER, REQUEST_TYPE_SET_LINK) || object);
+ assert(type == REQUEST_TYPE_DHCP_SERVER || netlink_handler);
req = new(Request, 1);
if (!req) {
@@ -201,19 +207,20 @@ int link_queue_request(
.netlink_handler = netlink_handler,
};
- r = ordered_set_ensure_put(&link->manager->request_queue, &request_hash_ops, req);
- if (r < 0) {
- /* To prevent from removing duplicated request. */
+ existing = ordered_set_get(link->manager->request_queue, req);
+ if (existing) {
+ /* To prevent from removing the existing request. */
req->link = link_unref(req->link);
- if (r == -EEXIST) {
- if (ret)
- *ret = NULL;
- return 0;
- }
- return r;
+ if (ret)
+ *ret = existing;
+ return 0;
}
+ r = ordered_set_ensure_put(&link->manager->request_queue, &request_hash_ops, req);
+ if (r < 0)
+ return r;
+
if (req->message_counter)
(*req->message_counter)++;
@@ -266,6 +273,9 @@ int manager_process_requests(sd_event_source *s, void *userdata) {
case REQUEST_TYPE_ROUTING_POLICY_RULE:
r = request_process_routing_policy_rule(req);
break;
+ case REQUEST_TYPE_SET_LINK:
+ r = request_process_set_link(req);
+ break;
default:
return -EINVAL;
}