network/queue: introduce RemoveRequest and relevant functions

This is similar to Request, but will be used on removing configuration
(e.g. address, route, and so on).

By using another queue for removing configuration, then we can avoid to
fill the reply callback buffer in sd-netlink by remove message calls.

Follow-up for 4e6a35e2b2.
This commit is contained in:
Yu Watanabe
2024-01-12 09:36:00 +09:00
parent 64b74c86d0
commit 85a6f300c1
4 changed files with 163 additions and 0 deletions
+49
View File
@@ -139,3 +139,52 @@ int manager_process_requests(Manager *manager);
int request_call_netlink_async(sd_netlink *nl, sd_netlink_message *m, Request *req);
const char* request_type_to_string(RequestType t) _const_;
typedef struct RemoveRequest RemoveRequest;
typedef int (*remove_request_netlink_handler_t)(sd_netlink *nl, sd_netlink_message *m, RemoveRequest *req);
struct RemoveRequest {
Manager *manager;
Link *link;
void *userdata; /* e.g. Address */
mfree_func_t unref_func; /* e.g. address_unref() */
sd_netlink *netlink;
sd_netlink_message *message;
remove_request_netlink_handler_t netlink_handler;
};
int remove_request_add(
Manager *manager,
Link *link,
void *userdata, /* This is unref()ed when the call failed. */
mfree_func_t unref_func,
sd_netlink *netlink,
sd_netlink_message *message,
remove_request_netlink_handler_t netlink_handler);
#define _remove_request_add(manager, link, data, name, nl, m, handler) \
({ \
typeof(*data) *_data = (data); \
int _r; \
\
_r = remove_request_add(manager, link, _data, \
(mfree_func_t) name##_unref, \
nl, m, handler); \
if (_r >= 0) \
name##_ref(_data); \
_r; \
})
#define link_remove_request_add(link, data, name, nl, m, handler) \
({ \
Link *_link = (link); \
\
_remove_request_add(_link->manager, _link, data, name, \
nl, m, handler); \
})
#define manager_remove_request_add(manager, data, name, nl, m, handler) \
_remove_request_add(manager, NULL, data, name, nl, m, handler)
int manager_process_remove_requests(Manager *manager);