diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-21 04:51:07 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-06-08 06:33:27 +0900 |
commit | 0fa8ee6c778020902119d5a3f03f51a43d6f5be5 (patch) | |
tree | 37caa3a72bd2675daee54ab90410ecc5b93b4f88 /src/network/networkd-queue.c | |
parent | fa28381202246f41f14484949f7fecb8067888a6 (diff) | |
download | systemd-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.c | 36 |
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; } |