net: ethtool: pass genl_info to the ethnl parse_request operation

The .parse_request() ethnl operation extracts the relevant attributes
from the netlink request to populate the private req_info.

By passing genl_info as a parameter to this callback, we can use
the GENL_REQ_ATTR_CHECK() macro to check for missing mandatory
parameters.

This macro has the advantage of returning a better error explanation
through the netlink_ext_ack struct.

Convert the eeprom ethnl code to this macro, as it's the only command
yet that has mandatory request parameters.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20260323095833.136266-1-maxime.chevallier@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Maxime Chevallier
2026-03-24 20:14:29 -07:00
committed by Jakub Kicinski
parent b1c803d5c8
commit 10171b9383
8 changed files with 19 additions and 8 deletions
+7 -5
View File
@@ -150,15 +150,17 @@ err_free:
return ret;
}
static int eeprom_parse_request(struct ethnl_req_info *req_info, struct nlattr **tb,
static int eeprom_parse_request(struct ethnl_req_info *req_info,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack)
{
struct eeprom_req_info *request = MODULE_EEPROM_REQINFO(req_info);
if (!tb[ETHTOOL_A_MODULE_EEPROM_OFFSET] ||
!tb[ETHTOOL_A_MODULE_EEPROM_LENGTH] ||
!tb[ETHTOOL_A_MODULE_EEPROM_PAGE] ||
!tb[ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS])
if (GENL_REQ_ATTR_CHECK(info, ETHTOOL_A_MODULE_EEPROM_OFFSET) ||
GENL_REQ_ATTR_CHECK(info, ETHTOOL_A_MODULE_EEPROM_LENGTH) ||
GENL_REQ_ATTR_CHECK(info, ETHTOOL_A_MODULE_EEPROM_PAGE) ||
GENL_REQ_ATTR_CHECK(info, ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS))
return -EINVAL;
request->i2c_address = nla_get_u8(tb[ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS]);
+2 -1
View File
@@ -462,7 +462,8 @@ static int ethnl_default_parse(struct ethnl_req_info *req_info,
return ret;
if (request_ops->parse_request) {
ret = request_ops->parse_request(req_info, tb, info->extack);
ret = request_ops->parse_request(req_info, info, tb,
info->extack);
if (ret < 0)
goto err_dev;
}
+1
View File
@@ -396,6 +396,7 @@ struct ethnl_request_ops {
u8 set_ntf_cmd;
int (*parse_request)(struct ethnl_req_info *req_info,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack);
int (*prepare_data)(const struct ethnl_req_info *req_info,
+1
View File
@@ -28,6 +28,7 @@ const struct nla_policy ethnl_pause_get_policy[] = {
};
static int pause_parse_request(struct ethnl_req_info *req_base,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack)
{
+3 -1
View File
@@ -66,7 +66,9 @@ const struct nla_policy ethnl_rss_get_policy[] = {
};
static int
rss_parse_request(struct ethnl_req_info *req_info, struct nlattr **tb,
rss_parse_request(struct ethnl_req_info *req_info,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack)
{
struct rss_req_info *request = RSS_REQINFO(req_info);
+1
View File
@@ -99,6 +99,7 @@ const struct nla_policy ethnl_stats_get_policy[ETHTOOL_A_STATS_SRC + 1] = {
};
static int stats_parse_request(struct ethnl_req_info *req_base,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack)
{
+1
View File
@@ -190,6 +190,7 @@ static const struct nla_policy strset_stringsets_policy[] = {
};
static int strset_parse_request(struct ethnl_req_info *req_base,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack)
{
+3 -1
View File
@@ -70,7 +70,9 @@ int ts_parse_hwtst_provider(const struct nlattr *nest,
}
static int
tsinfo_parse_request(struct ethnl_req_info *req_base, struct nlattr **tb,
tsinfo_parse_request(struct ethnl_req_info *req_base,
const struct genl_info *info,
struct nlattr **tb,
struct netlink_ext_ack *extack)
{
struct tsinfo_req_info *req = TSINFO_REQINFO(req_base);