summaryrefslogtreecommitdiff
path: root/src/libsystemd/sd-netlink/generic-netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd/sd-netlink/generic-netlink.c')
-rw-r--r--src/libsystemd/sd-netlink/generic-netlink.c179
1 files changed, 0 insertions, 179 deletions
diff --git a/src/libsystemd/sd-netlink/generic-netlink.c b/src/libsystemd/sd-netlink/generic-netlink.c
deleted file mode 100644
index 69f1a0cef5..0000000000
--- a/src/libsystemd/sd-netlink/generic-netlink.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <linux/genetlink.h>
-
-#include "sd-netlink.h"
-
-#include "alloc-util.h"
-#include "generic-netlink.h"
-#include "netlink-internal.h"
-
-typedef struct {
- const char* name;
- uint8_t version;
-} genl_family;
-
-static const genl_family genl_families[] = {
- [SD_GENL_ID_CTRL] = { .name = "", .version = 1 },
- [SD_GENL_WIREGUARD] = { .name = "wireguard", .version = 1 },
- [SD_GENL_FOU] = { .name = "fou", .version = 1 },
- [SD_GENL_L2TP] = { .name = "l2tp", .version = 1 },
- [SD_GENL_MACSEC] = { .name = "macsec", .version = 1 },
- [SD_GENL_NL80211] = { .name = "nl80211", .version = 1 },
- [SD_GENL_BATADV] = { .name = "batadv", .version = 1 },
-};
-
-int sd_genl_socket_open(sd_netlink **ret) {
- return netlink_open_family(ret, NETLINK_GENERIC);
-}
-
-static int genl_message_new(sd_netlink *nl, sd_genl_family_t family, uint16_t nlmsg_type, uint8_t cmd, sd_netlink_message **ret) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
- const NLType *genl_cmd_type, *nl_type;
- const NLTypeSystem *type_system;
- size_t size;
- int r;
-
- assert(nl);
- assert(nl->protocol == NETLINK_GENERIC);
- assert(ret);
-
- r = type_system_get_type(&genl_family_type_system_root, &genl_cmd_type, family);
- if (r < 0)
- return r;
-
- r = message_new_empty(nl, &m);
- if (r < 0)
- return r;
-
- size = NLMSG_SPACE(sizeof(struct genlmsghdr));
- m->hdr = malloc0(size);
- if (!m->hdr)
- return -ENOMEM;
-
- m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
-
- type_get_type_system(genl_cmd_type, &type_system);
-
- r = type_system_get_type(type_system, &nl_type, cmd);
- if (r < 0)
- return r;
-
- m->hdr->nlmsg_len = size;
- m->hdr->nlmsg_type = nlmsg_type;
-
- type_get_type_system(nl_type, &m->containers[0].type_system);
-
- *(struct genlmsghdr *) NLMSG_DATA(m->hdr) = (struct genlmsghdr) {
- .cmd = cmd,
- .version = genl_families[family].version,
- };
-
- *ret = TAKE_PTR(m);
-
- return 0;
-}
-
-static int lookup_nlmsg_type(sd_netlink *nl, sd_genl_family_t family, uint16_t *ret) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
- uint16_t u;
- void *v;
- int r;
-
- assert(nl);
- assert(nl->protocol == NETLINK_GENERIC);
- assert(ret);
-
- if (family == SD_GENL_ID_CTRL) {
- *ret = GENL_ID_CTRL;
- return 0;
- }
-
- v = hashmap_get(nl->genl_family_to_nlmsg_type, INT_TO_PTR(family));
- if (v) {
- *ret = PTR_TO_UINT(v);
- return 0;
- }
-
- r = genl_message_new(nl, SD_GENL_ID_CTRL, GENL_ID_CTRL, CTRL_CMD_GETFAMILY, &req);
- if (r < 0)
- return r;
-
- r = sd_netlink_message_append_string(req, CTRL_ATTR_FAMILY_NAME, genl_families[family].name);
- if (r < 0)
- return r;
-
- r = sd_netlink_call(nl, req, 0, &reply);
- if (r < 0)
- return r;
-
- r = sd_netlink_message_read_u16(reply, CTRL_ATTR_FAMILY_ID, &u);
- if (r < 0)
- return r;
-
- r = hashmap_ensure_put(&nl->genl_family_to_nlmsg_type, NULL, INT_TO_PTR(family), UINT_TO_PTR(u));
- if (r < 0)
- return r;
-
- r = hashmap_ensure_put(&nl->nlmsg_type_to_genl_family, NULL, UINT_TO_PTR(u), INT_TO_PTR(family));
- if (r < 0)
- return r;
-
- *ret = u;
- return 0;
-}
-
-int sd_genl_message_new(sd_netlink *nl, sd_genl_family_t family, uint8_t cmd, sd_netlink_message **ret) {
- uint16_t nlmsg_type = 0; /* Unnecessary initialization to appease gcc */
- int r;
-
- assert_return(nl, -EINVAL);
- assert_return(nl->protocol == NETLINK_GENERIC, -EINVAL);
- assert_return(ret, -EINVAL);
-
- r = lookup_nlmsg_type(nl, family, &nlmsg_type);
- if (r < 0)
- return r;
-
- return genl_message_new(nl, family, nlmsg_type, cmd, ret);
-}
-
-int nlmsg_type_to_genl_family(const sd_netlink *nl, uint16_t nlmsg_type, sd_genl_family_t *ret) {
- void *p;
-
- assert(nl);
- assert(nl->protocol == NETLINK_GENERIC);
- assert(ret);
-
- if (nlmsg_type == NLMSG_ERROR)
- *ret = SD_GENL_ERROR;
- else if (nlmsg_type == NLMSG_DONE)
- *ret = SD_GENL_DONE;
- else if (nlmsg_type == GENL_ID_CTRL)
- *ret = SD_GENL_ID_CTRL;
- else {
- p = hashmap_get(nl->nlmsg_type_to_genl_family, UINT_TO_PTR(nlmsg_type));
- if (!p)
- return -EOPNOTSUPP;
-
- *ret = PTR_TO_INT(p);
- }
-
- return 0;
-}
-
-int sd_genl_message_get_family(sd_netlink *nl, sd_netlink_message *m, sd_genl_family_t *ret) {
- uint16_t nlmsg_type;
- int r;
-
- assert_return(nl, -EINVAL);
- assert_return(nl->protocol == NETLINK_GENERIC, -EINVAL);
- assert_return(m, -EINVAL);
- assert_return(ret, -EINVAL);
-
- r = sd_netlink_message_get_type(m, &nlmsg_type);
- if (r < 0)
- return r;
-
- return nlmsg_type_to_genl_family(nl, nlmsg_type, ret);
-}