Commit 10171b93 authored by Maxime Chevallier's avatar Maxime Chevallier Committed by Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarMaxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20260323095833.136266-1-maxime.chevallier@bootlin.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b1c803d5
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -150,15 +150,17 @@ static int eeprom_prepare_data(const struct ethnl_req_info *req_base,
	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
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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);
Loading