diff options
Diffstat (limited to 'src/libsystemd/sd-netlink/netlink-internal.h')
-rw-r--r-- | src/libsystemd/sd-netlink/netlink-internal.h | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/src/libsystemd/sd-netlink/netlink-internal.h b/src/libsystemd/sd-netlink/netlink-internal.h index 49c7dd773d..050edaec78 100644 --- a/src/libsystemd/sd-netlink/netlink-internal.h +++ b/src/libsystemd/sd-netlink/netlink-internal.h @@ -10,11 +10,11 @@ #include "prioq.h" #include "time-util.h" -#define RTNL_DEFAULT_TIMEOUT ((usec_t) (25 * USEC_PER_SEC)) +#define NETLINK_DEFAULT_TIMEOUT_USEC ((usec_t) (25 * USEC_PER_SEC)) -#define RTNL_RQUEUE_MAX 64*1024 +#define NETLINK_RQUEUE_MAX 64*1024 -#define RTNL_CONTAINER_DEPTH 32 +#define NETLINK_CONTAINER_DEPTH 32 struct reply_callback { sd_netlink_message_handler_t callback; @@ -25,7 +25,10 @@ struct reply_callback { struct match_callback { sd_netlink_message_handler_t callback; + uint32_t *groups; + size_t n_groups; uint16_t type; + uint8_t cmd; /* used by genl */ LIST_FIELDS(struct match_callback, match_callbacks); }; @@ -95,8 +98,8 @@ struct sd_netlink { sd_event_source *exit_event_source; sd_event *event; - Hashmap *genl_family_to_nlmsg_type; - Hashmap *nlmsg_type_to_genl_family; + Hashmap *genl_family_by_name; + Hashmap *genl_family_by_id; }; struct netlink_attribute { @@ -118,7 +121,7 @@ struct sd_netlink_message { int protocol; struct nlmsghdr *hdr; - struct netlink_container containers[RTNL_CONTAINER_DEPTH]; + struct netlink_container containers[NETLINK_CONTAINER_DEPTH]; unsigned n_containers; /* number of containers */ bool sealed:1; bool broadcast:1; @@ -126,10 +129,22 @@ struct sd_netlink_message { sd_netlink_message *next; /* next in a chain of multi-part messages */ }; -int message_new(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t type); -int message_new_empty(sd_netlink *rtnl, sd_netlink_message **ret); +int message_new_empty(sd_netlink *nl, sd_netlink_message **ret); +int message_new_full( + sd_netlink *nl, + uint16_t nlmsg_type, + const NLTypeSystem *type_system, + size_t header_size, + sd_netlink_message **ret); +int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type); +int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret); +uint32_t message_get_serial(sd_netlink_message *m); +void message_seal(sd_netlink_message *m); int netlink_open_family(sd_netlink **ret, int family); +bool netlink_pid_changed(sd_netlink *nl); +int netlink_rqueue_make_room(sd_netlink *nl); +int netlink_rqueue_partial_make_room(sd_netlink *nl); int socket_open(int family); int socket_bind(sd_netlink *nl); @@ -139,9 +154,18 @@ int socket_write_message(sd_netlink *nl, sd_netlink_message *m); int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcount); int socket_read_message(sd_netlink *nl); -int rtnl_rqueue_make_room(sd_netlink *rtnl); -int rtnl_rqueue_partial_make_room(sd_netlink *rtnl); - -/* Make sure callbacks don't destroy the rtnl connection */ -#define NETLINK_DONT_DESTROY(rtnl) \ - _cleanup_(sd_netlink_unrefp) _unused_ sd_netlink *_dont_destroy_##rtnl = sd_netlink_ref(rtnl) +int netlink_add_match_internal( + sd_netlink *nl, + sd_netlink_slot **ret_slot, + const uint32_t *groups, + size_t n_groups, + uint16_t type, + uint8_t cmd, + sd_netlink_message_handler_t callback, + sd_netlink_destroy_t destroy_callback, + void *userdata, + const char *description); + +/* Make sure callbacks don't destroy the netlink connection */ +#define NETLINK_DONT_DESTROY(nl) \ + _cleanup_(sd_netlink_unrefp) _unused_ sd_netlink *_dont_destroy_##nl = sd_netlink_ref(nl) |