diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index 937e7e2759..cadaa750af 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -439,7 +439,7 @@ static const NLTypeSystemUnion rtnl_link_info_data_type_system_union = { static const NLType rtnl_link_info_types[] = { [IFLA_INFO_KIND] = { .type = NETLINK_TYPE_STRING }, - [IFLA_INFO_DATA] = { .type = NETLINK_TYPE_UNION, .type_system_union = &rtnl_link_info_data_type_system_union}, + [IFLA_INFO_DATA] = { .type = NETLINK_TYPE_UNION, .type_system_union = &rtnl_link_info_data_type_system_union }, /* [IFLA_INFO_XSTATS], [IFLA_INFO_SLAVE_KIND] = { .type = NETLINK_TYPE_STRING }, @@ -734,9 +734,53 @@ static const NLTypeSystem rtnl_nexthop_type_system = { .types = rtnl_nexthop_types, }; +static const NLType rtnl_tca_option_data_tbf_types[] = { + [TCA_TBF_PARMS] = { .size = sizeof(struct tc_tbf_qopt) }, + [TCA_TBF_RTAB] = { .size = TC_RTAB_SIZE }, + [TCA_TBF_PTAB] = { .size = TC_RTAB_SIZE }, + [TCA_TBF_RATE64] = { .type = NETLINK_TYPE_U64 }, + [TCA_TBF_PRATE64] = { .type = NETLINK_TYPE_U64 }, + [TCA_TBF_BURST] = { .type = NETLINK_TYPE_U32 }, + [TCA_TBF_PBURST] = { .type = NETLINK_TYPE_U32 }, +}; + +static const NLType rtnl_tca_option_data_fq_codel_types[] = { + [TCA_FQ_CODEL_TARGET] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_LIMIT] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_INTERVAL] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_ECN] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_FLOWS] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_QUANTUM] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_CE_THRESHOLD] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_DROP_BATCH_SIZE] = { .type = NETLINK_TYPE_U32 }, + [TCA_FQ_CODEL_MEMORY_LIMIT] = { .type = NETLINK_TYPE_U32 }, +}; + +static const char* const nl_union_tca_option_data_table[] = { + [NL_UNION_TCA_OPTION_DATA_TBF] = "tbf", + [NL_UNION_TCA_OPTION_DATA_FQ_CODEL] = "fq_codel", +}; + +DEFINE_STRING_TABLE_LOOKUP(nl_union_tca_option_data, NLUnionTCAOptionData); + +static const NLTypeSystem rtnl_tca_option_data_type_systems[] = { + [NL_UNION_TCA_OPTION_DATA_TBF] = { .count = ELEMENTSOF(rtnl_tca_option_data_tbf_types), + .types = rtnl_tca_option_data_tbf_types }, + [NL_UNION_TCA_OPTION_DATA_FQ_CODEL] = { .count = ELEMENTSOF(rtnl_tca_option_data_fq_codel_types), + .types = rtnl_tca_option_data_fq_codel_types }, +}; + +static const NLTypeSystemUnion rtnl_tca_option_data_type_system_union = { + .num = _NL_UNION_TCA_OPTION_DATA_MAX, + .lookup = nl_union_tca_option_data_from_string, + .type_systems = rtnl_tca_option_data_type_systems, + .match_type = NL_MATCH_SIBLING, + .match = TCA_KIND, +}; + static const NLType rtnl_qdisc_types[] = { [TCA_KIND] = { .type = NETLINK_TYPE_STRING }, - [TCA_OPTIONS] = { .size = sizeof(struct tc_netem_qopt) }, + [TCA_OPTIONS] = { .type = NETLINK_TYPE_UNION, .type_system_union = &rtnl_tca_option_data_type_system_union }, [TCA_INGRESS_BLOCK] = { .type = NETLINK_TYPE_U32 }, [TCA_EGRESS_BLOCK] = { .type = NETLINK_TYPE_U32 }, }; diff --git a/src/libsystemd/sd-netlink/netlink-types.h b/src/libsystemd/sd-netlink/netlink-types.h index c42a9c25d0..2702409147 100644 --- a/src/libsystemd/sd-netlink/netlink-types.h +++ b/src/libsystemd/sd-netlink/netlink-types.h @@ -90,3 +90,13 @@ typedef enum NLUnionLinkInfoData { const char *nl_union_link_info_data_to_string(NLUnionLinkInfoData p) _const_; NLUnionLinkInfoData nl_union_link_info_data_from_string(const char *p) _pure_; + +typedef enum NLUnionTCAOptionData { + NL_UNION_TCA_OPTION_DATA_TBF, + NL_UNION_TCA_OPTION_DATA_FQ_CODEL, + _NL_UNION_TCA_OPTION_DATA_MAX, + _NL_UNION_TCA_OPTION_DATA_INVALID = -1, +} NLUnionTCAOptionData; + +const char *nl_union_tca_option_data_to_string(NLUnionTCAOptionData p) _const_; +NLUnionTCAOptionData nl_union_tca_option_data_from_string(const char *p) _pure_; diff --git a/src/network/tc/fq-codel.c b/src/network/tc/fq-codel.c index 174d70e1f7..ae872c686f 100644 --- a/src/network/tc/fq-codel.c +++ b/src/network/tc/fq-codel.c @@ -29,11 +29,11 @@ int fair_queuing_controlled_delay_fill_message(Link *link, const FairQueuingCont assert(fqcd); assert(req); - r = sd_netlink_message_open_array(req, TCA_OPTIONS); + r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "fq_codel"); if (r < 0) return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m"); - r = sd_netlink_message_append_data(req, TCA_FQ_CODEL_LIMIT, &fqcd->limit, sizeof(fqcd->limit)); + r = sd_netlink_message_append_u32(req, TCA_FQ_CODEL_LIMIT, fqcd->limit); if (r < 0) return log_link_error_errno(link, r, "Could not append TCA_FQ_CODEL_LIMIT attribute: %m"); diff --git a/src/network/tc/tbf.c b/src/network/tc/tbf.c index 4c15d6b4fd..eff5c1db7c 100644 --- a/src/network/tc/tbf.c +++ b/src/network/tc/tbf.c @@ -74,7 +74,7 @@ int token_buffer_filter_fill_message(Link *link, const TokenBufferFilter *tbf, s return log_link_error_errno(link, r, "Failed to calculate mtu size: %m"); } - r = sd_netlink_message_open_array(req, TCA_OPTIONS); + r = sd_netlink_message_open_container_union(req, TCA_OPTIONS, "tbf"); if (r < 0) return log_link_error_errno(link, r, "Could not open container TCA_OPTIONS: %m"); @@ -87,7 +87,7 @@ int token_buffer_filter_fill_message(Link *link, const TokenBufferFilter *tbf, s return log_link_error_errno(link, r, "Could not append TCA_TBF_BURST attribute: %m"); if (tbf->rate >= (1ULL << 32)) { - r = sd_netlink_message_append_data(req, TCA_TBF_RATE64, &tbf->rate, sizeof(tbf->rate)); + r = sd_netlink_message_append_u64(req, TCA_TBF_RATE64, tbf->rate); if (r < 0) return log_link_error_errno(link, r, "Could not append TCA_TBF_RATE64 attribute: %m"); } @@ -98,12 +98,12 @@ int token_buffer_filter_fill_message(Link *link, const TokenBufferFilter *tbf, s if (opt.peakrate.rate > 0) { if (tbf->peak_rate >= (1ULL << 32)) { - r = sd_netlink_message_append_data(req, TCA_TBF_PRATE64, &tbf->peak_rate, sizeof(tbf->peak_rate)); + r = sd_netlink_message_append_u64(req, TCA_TBF_PRATE64, tbf->peak_rate); if (r < 0) return log_link_error_errno(link, r, "Could not append TCA_TBF_PRATE64 attribute: %m"); } - r = sd_netlink_message_append_data(req, TCA_TBF_PBURST, &tbf->mtu, sizeof(tbf->mtu)); + r = sd_netlink_message_append_u32(req, TCA_TBF_PBURST, tbf->mtu); if (r < 0) return log_link_error_errno(link, r, "Could not append TCA_TBF_PBURST attribute: %m");