From 0a054d11626413adc327e60971edacc732ed5803 Mon Sep 17 00:00:00 2001 From: Algernon Date: Wed, 15 Nov 2023 17:09:17 +0800 Subject: [PATCH 280/283] Fallback ethtool about nla_ Modification of kabi changes caused by the addition of new associations in the policy structure driver inclusion category: bugfix bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN49 -------------------------------- Signed-off-by: Xiaodong Li --- Documentation/networking/ethtool-netlink.rst | 2 - include/linux/ethtool.h | 4 +- include/net/netlink.h | 65 -------------------- include/uapi/linux/ethtool_netlink.h | 2 +- net/ethtool/bitset.c | 2 - net/ethtool/fec.c | 6 -- net/ethtool/netlink.c | 14 +---- net/ethtool/netlink.h | 25 -------- net/ethtool/rings.c | 14 ++--- 9 files changed, 11 insertions(+), 123 deletions(-) diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst index c0c33704aa96..5855c92c68c3 100644 --- a/Documentation/networking/ethtool-netlink.rst +++ b/Documentation/networking/ethtool-netlink.rst @@ -247,7 +247,6 @@ Kernel response contents: ``ETHTOOL_A_RINGS_RX_MINI`` u32 size of RX mini ring ``ETHTOOL_A_RINGS_RX_JUMBO`` u32 size of RX jumbo ring ``ETHTOOL_A_RINGS_TX`` u32 size of TX ring - ``ETHTOOL_A_RINGS_RX_BUF_LEN`` u32 size of buffers on the ring ==================================== ====== =========================== @@ -264,7 +263,6 @@ Request contents: ``ETHTOOL_A_RINGS_RX_MINI`` u32 size of RX mini ring ``ETHTOOL_A_RINGS_RX_JUMBO`` u32 size of RX jumbo ring ``ETHTOOL_A_RINGS_TX`` u32 size of TX ring - ``ETHTOOL_A_RINGS_RX_BUF_LEN`` u32 size of buffers on the ring ==================================== ====== =========================== Kernel checks that requested ring sizes do not exceed limits reported by diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index bf14a439afc2..5b028a126d9a 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -76,7 +76,7 @@ enum { * @rx_buf_len: Current length of buffers on the rx ring. */ struct kernel_ethtool_ringparam { - u32 rx_buf_len; + u32 rx_buf_len; }; /** @@ -438,7 +438,7 @@ struct ethtool_fec_stats { struct ethtool_ops { #ifndef __GENKSYMS__ u32 supported_coalesce_params; - u32 supported_ring_params; + u32 supported_ring_params; #endif int (*get_settings)(struct net_device *, struct ethtool_cmd *); int (*set_settings)(struct net_device *, struct ethtool_cmd *); diff --git a/include/net/netlink.h b/include/net/netlink.h index d9c642558255..a87f11b9cf8d 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h @@ -191,17 +191,6 @@ enum { #define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1) -enum nla_policy_validation { - NLA_VALIDATE_NONE, - NLA_VALIDATE_RANGE, - NLA_VALIDATE_RANGE_WARN_TOO_LONG, - NLA_VALIDATE_MIN, - NLA_VALIDATE_MAX, - NLA_VALIDATE_MASK, - NLA_VALIDATE_RANGE_PTR, - NLA_VALIDATE_FUNCTION, -}; - /** * struct nla_policy - attribute validation policy * @type: Type of attribute or NLA_UNSPEC @@ -240,62 +229,8 @@ struct nla_policy { u16 type; u16 len; void *validation_data; -#ifndef __GENKSYMS__ - u8 validation_type; - union { - const u32 bitfield32_valid; - const u32 mask; - const char *reject_message; - const struct nla_policy *nested_policy; - struct netlink_range_validation *range; - struct netlink_range_validation_signed *range_signed; - struct { - s16 min, max; - }; - int (*validate)(const struct nlattr *attr, - struct netlink_ext_ack *extack); - u16 strict_start_type; - }; -#endif }; -#define _NLA_POLICY_NESTED(maxattr, policy) \ - { .type = NLA_NESTED, .nested_policy = policy, .len = maxattr } -#define NLA_POLICY_NESTED(policy) \ - _NLA_POLICY_NESTED(ARRAY_SIZE(policy) - 1, policy) - -#define __NLA_IS_UINT_TYPE(tp) \ - (tp == NLA_U8 || tp == NLA_U16 || tp == NLA_U32 || tp == NLA_U64) -#define __NLA_IS_SINT_TYPE(tp) \ - (tp == NLA_S8 || tp == NLA_S16 || tp == NLA_S32 || tp == NLA_S64) - -#define __NLA_ENSURE(condition) BUILD_BUG_ON_ZERO(!(condition)) -#define NLA_ENSURE_UINT_TYPE(tp) \ - (__NLA_ENSURE(__NLA_IS_UINT_TYPE(tp)) + tp) -#define NLA_ENSURE_INT_OR_BINARY_TYPE(tp) \ - (__NLA_ENSURE(__NLA_IS_UINT_TYPE(tp) || \ - __NLA_IS_SINT_TYPE(tp) || \ - tp == NLA_MSECS || \ - tp == NLA_BINARY) + tp) - -#define NLA_POLICY_MIN(tp, _min) { \ - .type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp), \ - .validation_type = NLA_VALIDATE_MIN, \ - .min = _min, \ -} - -#define NLA_POLICY_MAX(tp, _max) { \ - .type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp), \ - .validation_type = NLA_VALIDATE_MAX, \ - .max = _max, \ -} - -#define NLA_POLICY_MASK(tp, _mask) { \ - .type = NLA_ENSURE_UINT_TYPE(tp), \ - .validation_type = NLA_VALIDATE_MASK, \ - .mask = _mask, \ -} - /** * struct nl_info - netlink source information * @nlh: Netlink message header of original request diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h index a616a033c5be..088ca2aaa76c 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -286,7 +286,7 @@ enum { ETHTOOL_A_RINGS_RX_MINI, /* u32 */ ETHTOOL_A_RINGS_RX_JUMBO, /* u32 */ ETHTOOL_A_RINGS_TX, /* u32 */ - ETHTOOL_A_RINGS_RX_BUF_LEN, /* u32 */ + ETHTOOL_A_RINGS_RX_BUF_LEN, /* u32 */ /* add new constants above here */ __ETHTOOL_A_RINGS_CNT, diff --git a/net/ethtool/bitset.c b/net/ethtool/bitset.c index 674cbe6f421e..21426d080ada 100644 --- a/net/ethtool/bitset.c +++ b/net/ethtool/bitset.c @@ -306,8 +306,6 @@ int ethnl_put_bitset32(struct sk_buff *skb, int attrtype, const u32 *val, static const struct nla_policy bitset_policy[ETHTOOL_A_BITSET_MAX + 1] = { [ETHTOOL_A_BITSET_UNSPEC] = { .type = NLA_REJECT }, [ETHTOOL_A_BITSET_NOMASK] = { .type = NLA_FLAG }, - [ETHTOOL_A_BITSET_SIZE] = NLA_POLICY_MAX(NLA_U32, - ETHNL_MAX_BITSET_SIZE), [ETHTOOL_A_BITSET_BITS] = { .type = NLA_NESTED }, [ETHTOOL_A_BITSET_VALUE] = { .type = NLA_BINARY }, [ETHTOOL_A_BITSET_MASK] = { .type = NLA_BINARY }, diff --git a/net/ethtool/fec.c b/net/ethtool/fec.c index 8738dafd5417..61ee00ef7093 100644 --- a/net/ethtool/fec.c +++ b/net/ethtool/fec.c @@ -24,10 +24,6 @@ struct fec_reply_data { #define ETHTOOL_FEC_MASK ((ETHTOOL_FEC_LLRS << 1) - 1) -const struct nla_policy ethnl_fec_get_policy[ETHTOOL_A_FEC_HEADER + 1] = { - [ETHTOOL_A_FEC_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy_stats), -}; - static void ethtool_fec_to_link_modes(u32 fec, unsigned long *link_modes, u8 *fec_auto) { @@ -232,9 +228,7 @@ const struct ethnl_request_ops ethnl_fec_request_ops = { /* FEC_SET */ const struct nla_policy ethnl_fec_set_policy[ETHTOOL_A_FEC_AUTO + 1] = { - [ETHTOOL_A_FEC_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy), [ETHTOOL_A_FEC_MODES] = { .type = NLA_NESTED }, - [ETHTOOL_A_FEC_AUTO] = NLA_POLICY_MAX(NLA_U8, 1), }; int ethnl_set_fec(struct sk_buff *skb, struct genl_info *info) diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index f710cea37a96..8b0257ae21a1 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -13,7 +13,7 @@ static u32 ethnl_bcast_seq; ETHTOOL_FLAG_OMIT_REPLY) #define ETHTOOL_FLAGS_STATS (ETHTOOL_FLAGS_BASIC | ETHTOOL_FLAG_STATS) -const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_MAX + 1] = { +static const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_MAX + 1] = { [ETHTOOL_A_HEADER_UNSPEC] = { .type = NLA_REJECT }, [ETHTOOL_A_HEADER_DEV_INDEX] = { .type = NLA_U32 }, [ETHTOOL_A_HEADER_DEV_NAME] = { .type = NLA_NUL_STRING, @@ -21,14 +21,6 @@ const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_MAX + 1] = { [ETHTOOL_A_HEADER_FLAGS] = { .type = NLA_U32 }, }; -const struct nla_policy ethnl_header_policy_stats[] = { - [ETHTOOL_A_HEADER_DEV_INDEX] = { .type = NLA_U32 }, - [ETHTOOL_A_HEADER_DEV_NAME] = { .type = NLA_NUL_STRING, - .len = ALTIFNAMSIZ - 1 }, - [ETHTOOL_A_HEADER_FLAGS] = NLA_POLICY_MASK(NLA_U32, - ETHTOOL_FLAGS_STATS), -}; - /** * ethnl_parse_header_dev_get() - parse request header * @req_info: structure to put results into @@ -795,15 +787,11 @@ static const struct genl_ops ethtool_genl_ops[] = { .start = ethnl_default_start, .dumpit = ethnl_default_dumpit, .done = ethnl_default_done, - .policy = ethnl_fec_get_policy, - .maxattr = ARRAY_SIZE(ethnl_fec_get_policy) - 1, }, { .cmd = ETHTOOL_MSG_FEC_SET, .flags = GENL_UNS_ADMIN_PERM, .doit = ethnl_set_fec, - .policy = ethnl_fec_set_policy, - .maxattr = ARRAY_SIZE(ethnl_fec_set_policy) - 1, }, }; diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index ebecf06a5a6e..a8be78e21218 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -326,33 +326,8 @@ extern const struct ethnl_request_ops ethnl_wol_request_ops; extern const struct ethnl_request_ops ethnl_features_request_ops; extern const struct ethnl_request_ops ethnl_privflags_request_ops; extern const struct ethnl_request_ops ethnl_rings_request_ops; -extern const struct ethnl_request_ops ethnl_channels_request_ops; -extern const struct ethnl_request_ops ethnl_coalesce_request_ops; -extern const struct ethnl_request_ops ethnl_pause_request_ops; -extern const struct ethnl_request_ops ethnl_eee_request_ops; -extern const struct ethnl_request_ops ethnl_tsinfo_request_ops; extern const struct ethnl_request_ops ethnl_fec_request_ops; -extern const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_FLAGS + 1]; -extern const struct nla_policy ethnl_header_policy_stats[ETHTOOL_A_HEADER_FLAGS + 1]; -extern const struct nla_policy ethnl_strset_get_policy[ETHTOOL_A_STRSET_COUNTS_ONLY + 1]; -extern const struct nla_policy ethnl_linkinfo_get_policy[ETHTOOL_A_LINKINFO_HEADER + 1]; -extern const struct nla_policy ethnl_linkinfo_set_policy[ETHTOOL_A_LINKINFO_TP_MDIX_CTRL + 1]; -extern const struct nla_policy ethnl_linkmodes_get_policy[ETHTOOL_A_LINKMODES_HEADER + 1]; -extern const struct nla_policy ethnl_linkstate_get_policy[ETHTOOL_A_LINKSTATE_HEADER + 1]; -extern const struct nla_policy ethnl_debug_get_policy[ETHTOOL_A_DEBUG_HEADER + 1]; -extern const struct nla_policy ethnl_debug_set_policy[ETHTOOL_A_DEBUG_MSGMASK + 1]; -extern const struct nla_policy ethnl_wol_get_policy[ETHTOOL_A_WOL_HEADER + 1]; -extern const struct nla_policy ethnl_wol_set_policy[ETHTOOL_A_WOL_SOPASS + 1]; -extern const struct nla_policy ethnl_features_get_policy[ETHTOOL_A_FEATURES_HEADER + 1]; -extern const struct nla_policy ethnl_features_set_policy[ETHTOOL_A_FEATURES_WANTED + 1]; -extern const struct nla_policy ethnl_privflags_get_policy[ETHTOOL_A_PRIVFLAGS_HEADER + 1]; -extern const struct nla_policy ethnl_privflags_set_policy[ETHTOOL_A_PRIVFLAGS_FLAGS + 1]; -extern const struct nla_policy ethnl_rings_get_policy[ETHTOOL_A_RINGS_HEADER + 1]; -extern const struct nla_policy ethnl_rings_set_policy[ETHTOOL_A_RINGS_RX_BUF_LEN + 1]; -extern const struct nla_policy ethnl_fec_get_policy[ETHTOOL_A_FEC_HEADER + 1]; -extern const struct nla_policy ethnl_fec_set_policy[ETHTOOL_A_FEC_AUTO + 1]; - int ethnl_set_linkinfo(struct sk_buff *skb, struct genl_info *info); int ethnl_set_linkmodes(struct sk_buff *skb, struct genl_info *info); int ethnl_set_debug(struct sk_buff *skb, struct genl_info *info); diff --git a/net/ethtool/rings.c b/net/ethtool/rings.c index 128e15b10883..8c9b39ce53f9 100644 --- a/net/ethtool/rings.c +++ b/net/ethtool/rings.c @@ -10,7 +10,7 @@ struct rings_req_info { struct rings_reply_data { struct ethnl_reply_data base; struct ethtool_ringparam ringparam; - struct kernel_ethtool_ringparam kernel_ringparam; + struct kernel_ethtool_ringparam kernel_ringparam; }; #define RINGS_REPDATA(__reply_base) \ @@ -69,7 +69,7 @@ static int rings_fill_reply(struct sk_buff *skb, { const struct rings_reply_data *data = RINGS_REPDATA(reply_base); const struct kernel_ethtool_ringparam *kernel_ringparam = - &data->kernel_ringparam; + &data->kernel_ringparam; const struct ethtool_ringparam *ringparam = &data->ringparam; if ((ringparam->rx_max_pending && @@ -91,10 +91,10 @@ static int rings_fill_reply(struct sk_buff *skb, (nla_put_u32(skb, ETHTOOL_A_RINGS_TX_MAX, ringparam->tx_max_pending) || nla_put_u32(skb, ETHTOOL_A_RINGS_TX, - ringparam->tx_pending))) || - (kernel_ringparam->rx_buf_len && - (nla_put_u32(skb, ETHTOOL_A_RINGS_RX_BUF_LEN, - kernel_ringparam->rx_buf_len)))) + ringparam->tx_pending))) || + (kernel_ringparam->rx_buf_len && + (nla_put_u32(skb, ETHTOOL_A_RINGS_RX_BUF_LEN, + kernel_ringparam->rx_buf_len)))) return -EMSGSIZE; return 0; @@ -128,7 +128,6 @@ rings_set_policy[ETHTOOL_A_RINGS_MAX + 1] = { [ETHTOOL_A_RINGS_RX_MINI] = { .type = NLA_U32 }, [ETHTOOL_A_RINGS_RX_JUMBO] = { .type = NLA_U32 }, [ETHTOOL_A_RINGS_TX] = { .type = NLA_U32 }, - [ETHTOOL_A_RINGS_RX_BUF_LEN] = NLA_POLICY_MIN(NLA_U32, 1), }; int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) @@ -174,6 +173,7 @@ int ethnl_set_rings(struct sk_buff *skb, struct genl_info *info) ethnl_update_u32(&ringparam.tx_pending, tb[ETHTOOL_A_RINGS_TX], &mod); ethnl_update_u32(&kernel_ringparam.rx_buf_len, tb[ETHTOOL_A_RINGS_RX_BUF_LEN], &mod); + ret = 0; if (!mod) goto out_ops; -- 2.34.1