From: Yu Watanabe Date: Tue, 24 Aug 2021 06:40:17 +0000 (+0900) Subject: sd-netlink: introduce basic_type_system X-Git-Tag: v250-rc1~763^2~15 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aee6309b975fac5b8ef08934b05e7d4e5afa966a;p=thirdparty%2Fsystemd.git sd-netlink: introduce basic_type_system Preparation for later commits. --- diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index 169e9cd9574..fe4c2950c10 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -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; diff --git a/src/libsystemd/sd-netlink/netlink-types-genl.c b/src/libsystemd/sd-netlink/netlink-types-genl.c index 10d073f3251..4af1c71c2f6 100644 --- a/src/libsystemd/sd-netlink/netlink-types-genl.c +++ b/src/libsystemd/sd-netlink/netlink-types-genl.c @@ -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) }, diff --git a/src/libsystemd/sd-netlink/netlink-types-internal.h b/src/libsystemd/sd-netlink/netlink-types-internal.h index 66a25a4dfb9..2bd42a12f87 100644 --- a/src/libsystemd/sd-netlink/netlink-types-internal.h +++ b/src/libsystemd/sd-netlink/netlink-types-internal.h @@ -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, diff --git a/src/libsystemd/sd-netlink/netlink-types-nfnl.c b/src/libsystemd/sd-netlink/netlink-types-nfnl.c index ba6c076e393..0c54f83d113 100644 --- a/src/libsystemd/sd-netlink/netlink-types-nfnl.c +++ b/src/libsystemd/sd-netlink/netlink-types-nfnl.c @@ -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) }, diff --git a/src/libsystemd/sd-netlink/netlink-types-rtnl.c b/src/libsystemd/sd-netlink/netlink-types-rtnl.c index 7f7f4150b6f..8f0b766440c 100644 --- a/src/libsystemd/sd-netlink/netlink-types-rtnl.c +++ b/src/libsystemd/sd-netlink/netlink-types-rtnl.c @@ -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) }, diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index 83ba725fd80..d5a4a017c4d 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -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: diff --git a/src/libsystemd/sd-netlink/test-netlink.c b/src/libsystemd/sd-netlink/test-netlink.c index 1076ec55a46..a87fe110691 100644 --- a/src/libsystemd/sd-netlink/test-netlink.c +++ b/src/libsystemd/sd-netlink/test-netlink.c @@ -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)); diff --git a/src/systemd/sd-netlink.h b/src/systemd/sd-netlink.h index f2f25412844..c513d26071f 100644 --- a/src/systemd/sd-netlink.h +++ b/src/systemd/sd-netlink.h @@ -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);