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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user