]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: split type system for nfnl
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 24 Aug 2021 07:10:49 +0000 (16:10 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 29 Aug 2021 09:01:26 +0000 (18:01 +0900)
This makes the root type system for nfnl indexed by subsystem, and
itroduces a next level type system for each subsystem. The second
level type systems are indexed by message types correspond to each
subsystem.

src/libsystemd/sd-netlink/netlink-message-nfnl.c
src/libsystemd/sd-netlink/netlink-types-nfnl.c

index ffcffb82f880c837a29d6da05492c5491b2a9899..9b24f7404244f6b41ab58049da33119bc5913b01 100644 (file)
 #include "netlink-types.h"
 #include "socket-util.h"
 
-static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int family, uint16_t type, uint16_t flags) {
+static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int family, uint16_t msg_type, uint16_t flags) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
-        const NLType *nl_type;
-        size_t size;
         int r;
 
         assert_return(nfnl, -EINVAL);
+        assert_return(ret, -EINVAL);
 
-        r = type_system_root_get_type(nfnl, &nl_type, NFNL_SUBSYS_NFTABLES);
+        r = message_new(nfnl, &m, NFNL_SUBSYS_NFTABLES << 8 | msg_type);
         if (r < 0)
                 return r;
 
-        if (type_get_type(nl_type) != NETLINK_TYPE_NESTED)
-                return -EINVAL;
-
-        r = message_new_empty(nfnl, &m);
-        if (r < 0)
-                return r;
-
-        size = NLMSG_SPACE(type_get_size(nl_type));
-
-        assert(size >= sizeof(struct nlmsghdr));
-        m->hdr = malloc0(size);
-        if (!m->hdr)
-                return -ENOMEM;
-
-        m->hdr->nlmsg_flags = NLM_F_REQUEST | flags;
-
-        m->containers[0].type_system = type_get_type_system(nl_type);
-
-        r = type_system_get_type_system(m->containers[0].type_system,
-                                        &m->containers[0].type_system,
-                                        type);
-        if (r < 0)
-                return r;
-
-        m->hdr->nlmsg_len = size;
-        m->hdr->nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | type;
+        m->hdr->nlmsg_flags |= flags;
 
         *(struct nfgenmsg*) NLMSG_DATA(m->hdr) = (struct nfgenmsg) {
                 .nfgen_family = family,
@@ -64,11 +38,11 @@ static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int famil
         return 0;
 }
 
-static int nfnl_message_batch(sd_netlink *nfnl, sd_netlink_message **ret, int v) {
+static int nfnl_message_batch(sd_netlink *nfnl, sd_netlink_message **ret, uint16_t msg_type) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = message_new(nfnl, &m, v);
+        r = message_new(nfnl, &m, NFNL_SUBSYS_NONE << 8 | msg_type);
         if (r < 0)
                 return r;
 
@@ -79,7 +53,7 @@ static int nfnl_message_batch(sd_netlink *nfnl, sd_netlink_message **ret, int v)
         };
 
         *ret = TAKE_PTR(m);
-        return r;
+        return 0;
 }
 
 int sd_nfnl_message_batch_begin(sd_netlink *nfnl, sd_netlink_message **ret) {
@@ -103,7 +77,7 @@ int sd_nfnl_nft_message_new_basechain(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWCHAIN, NLM_F_CREATE | NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWCHAIN, NLM_F_CREATE);
         if (r < 0)
                 return r;
 
@@ -148,7 +122,7 @@ int sd_nfnl_nft_message_del_table(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_DELTABLE, NLM_F_CREATE | NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_DELTABLE, NLM_F_CREATE);
         if (r < 0)
                 return r;
 
@@ -169,7 +143,7 @@ int sd_nfnl_nft_message_new_table(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWTABLE, NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWTABLE, NLM_F_CREATE | NLM_F_EXCL);
         if (r < 0)
                 return r;
 
@@ -191,7 +165,7 @@ int sd_nfnl_nft_message_new_rule(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWRULE, NLM_F_CREATE | NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWRULE, NLM_F_CREATE);
         if (r < 0)
                 return r;
 
@@ -219,7 +193,7 @@ int sd_nfnl_nft_message_new_set(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWSET, NLM_F_CREATE | NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWSET, NLM_F_CREATE);
         if (r < 0)
                 return r;
 
@@ -253,7 +227,7 @@ int sd_nfnl_nft_message_new_setelems_begin(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWSETELEM, NLM_F_CREATE | NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_NEWSETELEM, NLM_F_CREATE);
         if (r < 0)
                 return r;
 
@@ -283,7 +257,7 @@ int sd_nfnl_nft_message_del_setelems_begin(
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
         int r;
 
-        r = nft_message_new(nfnl, &m, family, NFT_MSG_DELSETELEM, NLM_F_ACK);
+        r = nft_message_new(nfnl, &m, family, NFT_MSG_DELSETELEM, 0);
         if (r < 0)
                 return r;
 
index 0c54f83d11365e482804f323010d88fcb8a9ca0c..dbc55c4782d4b4f6fce130abdcd9fdb45efddba6 100644 (file)
@@ -209,7 +209,7 @@ static const NLTypeSystem nfnl_nft_setelem_list_type_system = {
         .types = nfnl_nft_setelem_list_types,
 };
 
-static const NLType nfnl_nft_msg_types [] = {
+static const NLType nfnl_subsys_nft_types [] = {
         [NFT_MSG_DELTABLE]   = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_nft_table_type_system, .size = sizeof(struct nfgenmsg) },
         [NFT_MSG_NEWTABLE]   = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_nft_table_type_system, .size = sizeof(struct nfgenmsg) },
         [NFT_MSG_NEWCHAIN]   = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_nft_chain_type_system, .size = sizeof(struct nfgenmsg) },
@@ -219,9 +219,9 @@ static const NLType nfnl_nft_msg_types [] = {
         [NFT_MSG_DELSETELEM] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_nft_setelem_list_type_system, .size = sizeof(struct nfgenmsg) },
 };
 
-static const NLTypeSystem nfnl_nft_msg_type_system = {
-        .count = ELEMENTSOF(nfnl_nft_msg_types),
-        .types = nfnl_nft_msg_types,
+static const NLTypeSystem nfnl_subsys_nft_type_system = {
+        .count = ELEMENTSOF(nfnl_subsys_nft_types),
+        .types = nfnl_subsys_nft_types,
 };
 
 static const NLType nfnl_msg_batch_types [] = {
@@ -233,10 +233,19 @@ static const NLTypeSystem nfnl_msg_batch_type_system = {
         .types = nfnl_msg_batch_types,
 };
 
-static const NLType nfnl_types[] = {
+static const NLType nfnl_subsys_none_types[] = {
         [NFNL_MSG_BATCH_BEGIN] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_msg_batch_type_system, .size = sizeof(struct nfgenmsg) },
         [NFNL_MSG_BATCH_END]   = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_msg_batch_type_system, .size = sizeof(struct nfgenmsg) },
-        [NFNL_SUBSYS_NFTABLES] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_nft_msg_type_system, .size = sizeof(struct nfgenmsg) },
+};
+
+static const NLTypeSystem nfnl_subsys_none_type_system = {
+        .count = ELEMENTSOF(nfnl_subsys_none_types),
+        .types = nfnl_subsys_none_types,
+};
+
+static const NLType nfnl_types[] = {
+        [NFNL_SUBSYS_NONE]     = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_subsys_none_type_system },
+        [NFNL_SUBSYS_NFTABLES] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_subsys_nft_type_system },
 };
 
 static const NLTypeSystem nfnl_type_system = {
@@ -245,5 +254,12 @@ static const NLTypeSystem nfnl_type_system = {
 };
 
 int nfnl_get_type(uint16_t nlmsg_type, const NLType **ret) {
-        return type_system_get_type(&nfnl_type_system, ret, nlmsg_type);
+        const NLTypeSystem *subsys;
+        int r;
+
+        r = type_system_get_type_system(&nfnl_type_system, &subsys, nlmsg_type >> 8);
+        if (r < 0)
+                return r;
+
+        return type_system_get_type(subsys, ret, nlmsg_type & ((1U << 8) - 1));
 }