]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: introduce basic_type_system
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 24 Aug 2021 06:40:17 +0000 (15:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 29 Aug 2021 09:01:26 +0000 (18:01 +0900)
Preparation for later commits.

src/libsystemd/sd-netlink/netlink-message.c
src/libsystemd/sd-netlink/netlink-types-genl.c
src/libsystemd/sd-netlink/netlink-types-internal.h
src/libsystemd/sd-netlink/netlink-types-nfnl.c
src/libsystemd/sd-netlink/netlink-types-rtnl.c
src/libsystemd/sd-netlink/netlink-types.c
src/libsystemd/sd-netlink/test-netlink.c
src/systemd/sd-netlink.h

index 169e9cd9574919d09bc274000e46bb9695e91e42..fe4c2950c10c876f8a95d20d94f0083557dcd93b 100644 (file)
@@ -1302,14 +1302,14 @@ static int netlink_message_parse_error(sd_netlink_message *m) {
                                        NLMSG_PAYLOAD(m->hdr, hlen));
 }
 
-int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl) {
+int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl) {
         const NLType *nl_type;
         uint16_t type;
         size_t size;
         int r;
 
         assert_return(m, -EINVAL);
-        assert_return(genl || m->protocol != NETLINK_GENERIC, -EINVAL);
+        assert_return(nl, -EINVAL);
 
         /* don't allow appending to message once parsed */
         message_seal(m);
@@ -1325,7 +1325,7 @@ int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl) {
 
         assert(m->hdr);
 
-        r = type_system_root_get_type(genl, &nl_type, m->hdr->nlmsg_type);
+        r = type_system_root_get_type(nl, &nl_type, m->hdr->nlmsg_type);
         if (r < 0)
                 return r;
 
index 10d073f32513481812ed1fb0c96c6868dc828aed..4af1c71c2f6b544871b4f69dd12fc8c985aff47b 100644 (file)
@@ -251,8 +251,6 @@ static const NLTypeSystem genl_wireguard_type_system = {
 
 /***************** genl families *****************/
 static const NLType genl_types[] = {
-        [SD_GENL_DONE]      = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system },
-        [SD_GENL_ERROR]     = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
         [SD_GENL_ID_CTRL]   = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_ctrl_type_system, .size = sizeof(struct genlmsghdr) },
         [SD_GENL_WIREGUARD] = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_wireguard_type_system, .size = sizeof(struct genlmsghdr) },
         [SD_GENL_FOU]       = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_fou_type_system, .size = sizeof(struct genlmsghdr) },
index 66a25a4dfb9fb4018eb0dd9be6680a7075416b0c..2bd42a12f878d0d6dd0ea25726ec17cb8f331060 100644 (file)
@@ -24,9 +24,6 @@ struct NLTypeSystemUnion {
         const NLTypeSystem *type_systems;
 };
 
-extern const NLTypeSystem empty_type_system;
-extern const NLTypeSystem error_type_system;
-
 typedef enum NLUnionLinkInfoData {
         NL_UNION_LINK_INFO_DATA_BOND,
         NL_UNION_LINK_INFO_DATA_BRIDGE,
index ba6c076e3933168ce2f2aeaba394107579f29d25..0c54f83d11365e482804f323010d88fcb8a9ca0c 100644 (file)
@@ -234,8 +234,6 @@ static const NLTypeSystem nfnl_msg_batch_type_system = {
 };
 
 static const NLType nfnl_types[] = {
-        [NLMSG_DONE]           = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = 0 },
-        [NLMSG_ERROR]          = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
         [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) },
index 7f7f4150b6f0142d5e27378cf19dca0e3f85daa8..8f0b766440c4fe533d5287f3919afb4a71bb1260 100644 (file)
@@ -1008,8 +1008,6 @@ static const NLTypeSystem rtnl_mdb_type_system = {
 };
 
 static const NLType rtnl_types[] = {
-        [NLMSG_DONE]       = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = 0 },
-        [NLMSG_ERROR]      = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
         [RTM_NEWLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
         [RTM_DELLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
         [RTM_GETLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
index 83ba725fd80115234ac1b9c8a09039acc533566d..d5a4a017c4d6233fd465f3b8a62711b95da1dc9e 100644 (file)
@@ -9,7 +9,7 @@ static const NLType empty_types[1] = {
         /* fake array to avoid .types==NULL, which denotes invalid type-systems */
 };
 
-const NLTypeSystem empty_type_system = {
+static const NLTypeSystem empty_type_system = {
         .count = 0,
         .types = empty_types,
 };
@@ -19,11 +19,21 @@ static const NLType error_types[] = {
         [NLMSGERR_ATTR_OFFS] = { .type = NETLINK_TYPE_U32 },
 };
 
-const NLTypeSystem error_type_system = {
+static const NLTypeSystem error_type_system = {
         .count = ELEMENTSOF(error_types),
         .types = error_types,
 };
 
+static const NLType basic_types[] = {
+        [NLMSG_DONE]  = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system },
+        [NLMSG_ERROR] = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
+};
+
+const NLTypeSystem basic_type_system = {
+        .count = ELEMENTSOF(basic_types),
+        .types = basic_types,
+};
+
 uint16_t type_get_type(const NLType *type) {
         assert(type);
         return type->type;
@@ -54,8 +64,8 @@ uint16_t type_system_get_count(const NLTypeSystem *type_system) {
 }
 
 int type_system_root_get_type(sd_netlink *nl, const NLType **ret, uint16_t type) {
-        if (!nl)
-                return rtnl_get_type(type, ret);
+        if (!nl || IN_SET(type, NLMSG_DONE, NLMSG_ERROR))
+                return type_system_get_type(&basic_type_system, ret, type);
 
         switch(nl->protocol) {
         case NETLINK_ROUTE:
index 1076ec55a464260056bbbdce0899e55097f1d127..a87fe1106914c4deb635116968ef91b4b38cee1b 100644 (file)
@@ -29,7 +29,7 @@ static void test_message_link_bridge(sd_netlink *rtnl) {
         assert_se(sd_netlink_message_append_u32(message, IFLA_BRPORT_COST, 10) >= 0);
         assert_se(sd_netlink_message_close_container(message) >= 0);
 
-        assert_se(sd_netlink_message_rewind(message, NULL) >= 0);
+        assert_se(sd_netlink_message_rewind(message, rtnl) >= 0);
 
         assert_se(sd_netlink_message_enter_container(message, IFLA_PROTINFO) >= 0);
         assert_se(sd_netlink_message_read_u32(message, IFLA_BRPORT_COST, &cost) >= 0);
@@ -131,7 +131,7 @@ static void test_route(sd_netlink *rtnl) {
                 return;
         }
 
-        assert_se(sd_netlink_message_rewind(req, NULL) >= 0);
+        assert_se(sd_netlink_message_rewind(req, rtnl) >= 0);
 
         assert_se(sd_netlink_message_read_in_addr(req, RTA_GATEWAY, &addr_data) >= 0);
         assert_se(addr_data.s_addr == addr.s_addr);
@@ -431,7 +431,7 @@ static void test_container(sd_netlink *rtnl) {
         assert_se(sd_netlink_message_close_container(m) >= 0);
         assert_se(sd_netlink_message_close_container(m) == -EINVAL);
 
-        assert_se(sd_netlink_message_rewind(m, NULL) >= 0);
+        assert_se(sd_netlink_message_rewind(m, rtnl) >= 0);
 
         assert_se(sd_netlink_message_enter_container(m, IFLA_LINKINFO) >= 0);
         assert_se(sd_netlink_message_read_string(m, IFLA_INFO_KIND, &string_data) >= 0);
@@ -571,7 +571,7 @@ static void test_strv(sd_netlink *rtnl) {
         assert_se(sd_netlink_message_close_container(m) >= 0);
 
         message_seal(m);
-        assert_se(sd_netlink_message_rewind(m, NULL) >= 0);
+        assert_se(sd_netlink_message_rewind(m, rtnl) >= 0);
 
         assert_se(sd_netlink_message_read_strv(m, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &names_out) >= 0);
         assert_se(strv_equal(names_in, names_out));
index f2f254128446d7453526de92bbc9b41b65e4ec69..c513d26071ff866b420370813f38037bebf8d385 100644 (file)
@@ -128,7 +128,7 @@ int sd_netlink_message_exit_container(sd_netlink_message *m);
 int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type);
 int sd_netlink_message_cancel_array(sd_netlink_message *m);
 
-int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl);
+int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl);
 
 sd_netlink_message *sd_netlink_message_next(sd_netlink_message *m);