diff options
Diffstat (limited to 'tools/net/ynl/generated/devlink-user.c')
| -rw-r--r-- | tools/net/ynl/generated/devlink-user.c | 2261 | 
1 files changed, 2261 insertions, 0 deletions
diff --git a/tools/net/ynl/generated/devlink-user.c b/tools/net/ynl/generated/devlink-user.c index 939bd45feaca..3a8d8499fab6 100644 --- a/tools/net/ynl/generated/devlink-user.c +++ b/tools/net/ynl/generated/devlink-user.c @@ -15,7 +15,21 @@  /* Enums */  static const char * const devlink_op_strmap[] = {  	[3] = "get", +	[7] = "port-get", +	[DEVLINK_CMD_SB_GET] = "sb-get", +	[DEVLINK_CMD_SB_POOL_GET] = "sb-pool-get", +	[DEVLINK_CMD_SB_PORT_POOL_GET] = "sb-port-pool-get", +	[DEVLINK_CMD_SB_TC_POOL_BIND_GET] = "sb-tc-pool-bind-get", +	[DEVLINK_CMD_PARAM_GET] = "param-get", +	[DEVLINK_CMD_REGION_GET] = "region-get",  	[DEVLINK_CMD_INFO_GET] = "info-get", +	[DEVLINK_CMD_HEALTH_REPORTER_GET] = "health-reporter-get", +	[DEVLINK_CMD_TRAP_GET] = "trap-get", +	[DEVLINK_CMD_TRAP_GROUP_GET] = "trap-group-get", +	[DEVLINK_CMD_TRAP_POLICER_GET] = "trap-policer-get", +	[DEVLINK_CMD_RATE_GET] = "rate-get", +	[DEVLINK_CMD_LINECARD_GET] = "linecard-get", +	[DEVLINK_CMD_SELFTESTS_GET] = "selftests-get",  };  const char *devlink_op_str(int op) @@ -25,6 +39,18 @@ const char *devlink_op_str(int op)  	return devlink_op_strmap[op];  } +static const char * const devlink_sb_pool_type_strmap[] = { +	[0] = "ingress", +	[1] = "egress", +}; + +const char *devlink_sb_pool_type_str(enum devlink_sb_pool_type value) +{ +	if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_sb_pool_type_strmap)) +		return NULL; +	return devlink_sb_pool_type_strmap[value]; +} +  /* Policies */  struct ynl_policy_attr devlink_dl_info_version_policy[DEVLINK_ATTR_MAX + 1] = {  	[DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, }, @@ -88,6 +114,12 @@ struct ynl_policy_attr devlink_policy[DEVLINK_ATTR_MAX + 1] = {  	[DEVLINK_ATTR_BUS_NAME] = { .name = "bus-name", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_DEV_NAME] = { .name = "dev-name", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_PORT_INDEX] = { .name = "port-index", .type = YNL_PT_U32, }, +	[DEVLINK_ATTR_SB_INDEX] = { .name = "sb-index", .type = YNL_PT_U32, }, +	[DEVLINK_ATTR_SB_POOL_INDEX] = { .name = "sb-pool-index", .type = YNL_PT_U16, }, +	[DEVLINK_ATTR_SB_POOL_TYPE] = { .name = "sb-pool-type", .type = YNL_PT_U8, }, +	[DEVLINK_ATTR_SB_TC_INDEX] = { .name = "sb-tc-index", .type = YNL_PT_U16, }, +	[DEVLINK_ATTR_PARAM_NAME] = { .name = "param-name", .type = YNL_PT_NUL_STR, }, +	[DEVLINK_ATTR_REGION_NAME] = { .name = "region-name", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_INFO_DRIVER_NAME] = { .name = "info-driver-name", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_INFO_SERIAL_NUMBER] = { .name = "info-serial-number", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_INFO_VERSION_FIXED] = { .name = "info-version-fixed", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }, @@ -95,7 +127,11 @@ struct ynl_policy_attr devlink_policy[DEVLINK_ATTR_MAX + 1] = {  	[DEVLINK_ATTR_INFO_VERSION_STORED] = { .name = "info-version-stored", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, },  	[DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, }, +	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .name = "health-reporter-name", .type = YNL_PT_NUL_STR, }, +	[DEVLINK_ATTR_TRAP_NAME] = { .name = "trap-name", .type = YNL_PT_NUL_STR, }, +	[DEVLINK_ATTR_TRAP_GROUP_NAME] = { .name = "trap-group-name", .type = YNL_PT_NUL_STR, },  	[DEVLINK_ATTR_RELOAD_FAILED] = { .name = "reload-failed", .type = YNL_PT_U8, }, +	[DEVLINK_ATTR_TRAP_POLICER_ID] = { .name = "trap-policer-id", .type = YNL_PT_U32, },  	[DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, },  	[DEVLINK_ATTR_DEV_STATS] = { .name = "dev-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_dev_stats_nest, },  	[DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }, @@ -105,6 +141,8 @@ struct ynl_policy_attr devlink_policy[DEVLINK_ATTR_MAX + 1] = {  	[DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, },  	[DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, },  	[DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, }, +	[DEVLINK_ATTR_RATE_NODE_NAME] = { .name = "rate-node-name", .type = YNL_PT_NUL_STR, }, +	[DEVLINK_ATTR_LINECARD_INDEX] = { .name = "linecard-index", .type = YNL_PT_U32, },  };  struct ynl_policy_nest devlink_nest = { @@ -531,6 +569,1126 @@ free_list:  	return NULL;  } +/* ============== DEVLINK_CMD_PORT_GET ============== */ +/* DEVLINK_CMD_PORT_GET - do */ +void devlink_port_get_req_free(struct devlink_port_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void devlink_port_get_rsp_free(struct devlink_port_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_port_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct ynl_parse_arg *yarg = data; +	struct devlink_port_get_rsp *dst; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_port_get_rsp * +devlink_port_get(struct ynl_sock *ys, struct devlink_port_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_port_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_port_get_rsp_parse; +	yrs.rsp_cmd = 7; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_port_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_PORT_GET - dump */ +int devlink_port_get_rsp_dump_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_port_get_rsp_dump *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} +	} + +	return MNL_CB_OK; +} + +void devlink_port_get_rsp_list_free(struct devlink_port_get_rsp_list *rsp) +{ +	struct devlink_port_get_rsp_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_port_get_rsp_list * +devlink_port_get_dump(struct ynl_sock *ys, +		      struct devlink_port_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_port_get_rsp_list); +	yds.cb = devlink_port_get_rsp_dump_parse; +	yds.rsp_cmd = 7; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PORT_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_port_get_rsp_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_SB_GET ============== */ +/* DEVLINK_CMD_SB_GET - do */ +void devlink_sb_get_req_free(struct devlink_sb_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void devlink_sb_get_rsp_free(struct devlink_sb_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_sb_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct ynl_parse_arg *yarg = data; +	struct devlink_sb_get_rsp *dst; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_SB_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_index = 1; +			dst->sb_index = mnl_attr_get_u32(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_sb_get_rsp * +devlink_sb_get(struct ynl_sock *ys, struct devlink_sb_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_sb_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.sb_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_sb_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_SB_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_sb_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_SB_GET - dump */ +void devlink_sb_get_list_free(struct devlink_sb_get_list *rsp) +{ +	struct devlink_sb_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_sb_get_list * +devlink_sb_get_dump(struct ynl_sock *ys, struct devlink_sb_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_sb_get_list); +	yds.cb = devlink_sb_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_SB_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_sb_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_SB_POOL_GET ============== */ +/* DEVLINK_CMD_SB_POOL_GET - do */ +void devlink_sb_pool_get_req_free(struct devlink_sb_pool_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void devlink_sb_pool_get_rsp_free(struct devlink_sb_pool_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_sb_pool_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_sb_pool_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_SB_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_index = 1; +			dst->sb_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_SB_POOL_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_pool_index = 1; +			dst->sb_pool_index = mnl_attr_get_u16(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_sb_pool_get_rsp * +devlink_sb_pool_get(struct ynl_sock *ys, struct devlink_sb_pool_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_sb_pool_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_POOL_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.sb_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); +	if (req->_present.sb_pool_index) +		mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_sb_pool_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_SB_POOL_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_sb_pool_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_SB_POOL_GET - dump */ +void devlink_sb_pool_get_list_free(struct devlink_sb_pool_get_list *rsp) +{ +	struct devlink_sb_pool_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_sb_pool_get_list * +devlink_sb_pool_get_dump(struct ynl_sock *ys, +			 struct devlink_sb_pool_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_sb_pool_get_list); +	yds.cb = devlink_sb_pool_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_SB_POOL_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_POOL_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_sb_pool_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_SB_PORT_POOL_GET ============== */ +/* DEVLINK_CMD_SB_PORT_POOL_GET - do */ +void +devlink_sb_port_pool_get_req_free(struct devlink_sb_port_pool_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void +devlink_sb_port_pool_get_rsp_free(struct devlink_sb_port_pool_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_sb_port_pool_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_sb_port_pool_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_SB_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_index = 1; +			dst->sb_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_SB_POOL_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_pool_index = 1; +			dst->sb_pool_index = mnl_attr_get_u16(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_sb_port_pool_get_rsp * +devlink_sb_port_pool_get(struct ynl_sock *ys, +			 struct devlink_sb_port_pool_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_sb_port_pool_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); +	if (req->_present.sb_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); +	if (req->_present.sb_pool_index) +		mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_sb_port_pool_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_SB_PORT_POOL_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_sb_port_pool_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_SB_PORT_POOL_GET - dump */ +void +devlink_sb_port_pool_get_list_free(struct devlink_sb_port_pool_get_list *rsp) +{ +	struct devlink_sb_port_pool_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_sb_port_pool_get_list * +devlink_sb_port_pool_get_dump(struct ynl_sock *ys, +			      struct devlink_sb_port_pool_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_sb_port_pool_get_list); +	yds.cb = devlink_sb_port_pool_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_SB_PORT_POOL_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_sb_port_pool_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_SB_TC_POOL_BIND_GET ============== */ +/* DEVLINK_CMD_SB_TC_POOL_BIND_GET - do */ +void +devlink_sb_tc_pool_bind_get_req_free(struct devlink_sb_tc_pool_bind_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void +devlink_sb_tc_pool_bind_get_rsp_free(struct devlink_sb_tc_pool_bind_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_sb_tc_pool_bind_get_rsp_parse(const struct nlmsghdr *nlh, +					  void *data) +{ +	struct devlink_sb_tc_pool_bind_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_SB_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_index = 1; +			dst->sb_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_SB_POOL_TYPE) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_pool_type = 1; +			dst->sb_pool_type = mnl_attr_get_u8(attr); +		} else if (type == DEVLINK_ATTR_SB_TC_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.sb_tc_index = 1; +			dst->sb_tc_index = mnl_attr_get_u16(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_sb_tc_pool_bind_get_rsp * +devlink_sb_tc_pool_bind_get(struct ynl_sock *ys, +			    struct devlink_sb_tc_pool_bind_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_sb_tc_pool_bind_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); +	if (req->_present.sb_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); +	if (req->_present.sb_pool_type) +		mnl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_TYPE, req->sb_pool_type); +	if (req->_present.sb_tc_index) +		mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_TC_INDEX, req->sb_tc_index); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_sb_tc_pool_bind_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_sb_tc_pool_bind_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_SB_TC_POOL_BIND_GET - dump */ +void +devlink_sb_tc_pool_bind_get_list_free(struct devlink_sb_tc_pool_bind_get_list *rsp) +{ +	struct devlink_sb_tc_pool_bind_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_sb_tc_pool_bind_get_list * +devlink_sb_tc_pool_bind_get_dump(struct ynl_sock *ys, +				 struct devlink_sb_tc_pool_bind_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_sb_tc_pool_bind_get_list); +	yds.cb = devlink_sb_tc_pool_bind_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_sb_tc_pool_bind_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_PARAM_GET ============== */ +/* DEVLINK_CMD_PARAM_GET - do */ +void devlink_param_get_req_free(struct devlink_param_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req->param_name); +	free(req); +} + +void devlink_param_get_rsp_free(struct devlink_param_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp->param_name); +	free(rsp); +} + +int devlink_param_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_param_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PARAM_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.param_name_len = len; +			dst->param_name = malloc(len + 1); +			memcpy(dst->param_name, mnl_attr_get_str(attr), len); +			dst->param_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_param_get_rsp * +devlink_param_get(struct ynl_sock *ys, struct devlink_param_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_param_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PARAM_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.param_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_NAME, req->param_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_param_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_PARAM_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_param_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_PARAM_GET - dump */ +void devlink_param_get_list_free(struct devlink_param_get_list *rsp) +{ +	struct devlink_param_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.param_name); +		free(rsp); +	} +} + +struct devlink_param_get_list * +devlink_param_get_dump(struct ynl_sock *ys, +		       struct devlink_param_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_param_get_list); +	yds.cb = devlink_param_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_PARAM_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PARAM_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_param_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_REGION_GET ============== */ +/* DEVLINK_CMD_REGION_GET - do */ +void devlink_region_get_req_free(struct devlink_region_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req->region_name); +	free(req); +} + +void devlink_region_get_rsp_free(struct devlink_region_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp->region_name); +	free(rsp); +} + +int devlink_region_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_region_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_REGION_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.region_name_len = len; +			dst->region_name = malloc(len + 1); +			memcpy(dst->region_name, mnl_attr_get_str(attr), len); +			dst->region_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_region_get_rsp * +devlink_region_get(struct ynl_sock *ys, struct devlink_region_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_region_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_REGION_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); +	if (req->_present.region_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_REGION_NAME, req->region_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_region_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_REGION_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_region_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_REGION_GET - dump */ +void devlink_region_get_list_free(struct devlink_region_get_list *rsp) +{ +	struct devlink_region_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.region_name); +		free(rsp); +	} +} + +struct devlink_region_get_list * +devlink_region_get_dump(struct ynl_sock *ys, +			struct devlink_region_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_region_get_list); +	yds.cb = devlink_region_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_REGION_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_REGION_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_region_get_list_free(yds.first); +	return NULL; +} +  /* ============== DEVLINK_CMD_INFO_GET ============== */  /* DEVLINK_CMD_INFO_GET - do */  void devlink_info_get_req_free(struct devlink_info_get_req *req) @@ -716,6 +1874,1109 @@ err_free:  	return NULL;  } +/* DEVLINK_CMD_INFO_GET - dump */ +void devlink_info_get_list_free(struct devlink_info_get_list *rsp) +{ +	struct devlink_info_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		unsigned int i; + +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.info_driver_name); +		free(rsp->obj.info_serial_number); +		for (i = 0; i < rsp->obj.n_info_version_fixed; i++) +			devlink_dl_info_version_free(&rsp->obj.info_version_fixed[i]); +		free(rsp->obj.info_version_fixed); +		for (i = 0; i < rsp->obj.n_info_version_running; i++) +			devlink_dl_info_version_free(&rsp->obj.info_version_running[i]); +		free(rsp->obj.info_version_running); +		for (i = 0; i < rsp->obj.n_info_version_stored; i++) +			devlink_dl_info_version_free(&rsp->obj.info_version_stored[i]); +		free(rsp->obj.info_version_stored); +		free(rsp); +	} +} + +struct devlink_info_get_list *devlink_info_get_dump(struct ynl_sock *ys) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_info_get_list); +	yds.cb = devlink_info_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_INFO_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_INFO_GET, 1); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_info_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_HEALTH_REPORTER_GET ============== */ +/* DEVLINK_CMD_HEALTH_REPORTER_GET - do */ +void +devlink_health_reporter_get_req_free(struct devlink_health_reporter_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req->health_reporter_name); +	free(req); +} + +void +devlink_health_reporter_get_rsp_free(struct devlink_health_reporter_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp->health_reporter_name); +	free(rsp); +} + +int devlink_health_reporter_get_rsp_parse(const struct nlmsghdr *nlh, +					  void *data) +{ +	struct devlink_health_reporter_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_HEALTH_REPORTER_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.health_reporter_name_len = len; +			dst->health_reporter_name = malloc(len + 1); +			memcpy(dst->health_reporter_name, mnl_attr_get_str(attr), len); +			dst->health_reporter_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_health_reporter_get_rsp * +devlink_health_reporter_get(struct ynl_sock *ys, +			    struct devlink_health_reporter_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_health_reporter_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); +	if (req->_present.health_reporter_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_health_reporter_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_health_reporter_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */ +void +devlink_health_reporter_get_list_free(struct devlink_health_reporter_get_list *rsp) +{ +	struct devlink_health_reporter_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.health_reporter_name); +		free(rsp); +	} +} + +struct devlink_health_reporter_get_list * +devlink_health_reporter_get_dump(struct ynl_sock *ys, +				 struct devlink_health_reporter_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_health_reporter_get_list); +	yds.cb = devlink_health_reporter_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_health_reporter_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_TRAP_GET ============== */ +/* DEVLINK_CMD_TRAP_GET - do */ +void devlink_trap_get_req_free(struct devlink_trap_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req->trap_name); +	free(req); +} + +void devlink_trap_get_rsp_free(struct devlink_trap_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp->trap_name); +	free(rsp); +} + +int devlink_trap_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct ynl_parse_arg *yarg = data; +	struct devlink_trap_get_rsp *dst; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_TRAP_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.trap_name_len = len; +			dst->trap_name = malloc(len + 1); +			memcpy(dst->trap_name, mnl_attr_get_str(attr), len); +			dst->trap_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_trap_get_rsp * +devlink_trap_get(struct ynl_sock *ys, struct devlink_trap_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_trap_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.trap_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_NAME, req->trap_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_trap_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_TRAP_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_trap_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_TRAP_GET - dump */ +void devlink_trap_get_list_free(struct devlink_trap_get_list *rsp) +{ +	struct devlink_trap_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.trap_name); +		free(rsp); +	} +} + +struct devlink_trap_get_list * +devlink_trap_get_dump(struct ynl_sock *ys, +		      struct devlink_trap_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_trap_get_list); +	yds.cb = devlink_trap_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_TRAP_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_trap_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_TRAP_GROUP_GET ============== */ +/* DEVLINK_CMD_TRAP_GROUP_GET - do */ +void devlink_trap_group_get_req_free(struct devlink_trap_group_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req->trap_group_name); +	free(req); +} + +void devlink_trap_group_get_rsp_free(struct devlink_trap_group_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp->trap_group_name); +	free(rsp); +} + +int devlink_trap_group_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_trap_group_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_TRAP_GROUP_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.trap_group_name_len = len; +			dst->trap_group_name = malloc(len + 1); +			memcpy(dst->trap_group_name, mnl_attr_get_str(attr), len); +			dst->trap_group_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_trap_group_get_rsp * +devlink_trap_group_get(struct ynl_sock *ys, +		       struct devlink_trap_group_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_trap_group_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.trap_group_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req->trap_group_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_trap_group_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_TRAP_GROUP_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_trap_group_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_TRAP_GROUP_GET - dump */ +void devlink_trap_group_get_list_free(struct devlink_trap_group_get_list *rsp) +{ +	struct devlink_trap_group_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.trap_group_name); +		free(rsp); +	} +} + +struct devlink_trap_group_get_list * +devlink_trap_group_get_dump(struct ynl_sock *ys, +			    struct devlink_trap_group_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_trap_group_get_list); +	yds.cb = devlink_trap_group_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_TRAP_GROUP_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_trap_group_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_TRAP_POLICER_GET ============== */ +/* DEVLINK_CMD_TRAP_POLICER_GET - do */ +void +devlink_trap_policer_get_req_free(struct devlink_trap_policer_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void +devlink_trap_policer_get_rsp_free(struct devlink_trap_policer_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_trap_policer_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_trap_policer_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_TRAP_POLICER_ID) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.trap_policer_id = 1; +			dst->trap_policer_id = mnl_attr_get_u32(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_trap_policer_get_rsp * +devlink_trap_policer_get(struct ynl_sock *ys, +			 struct devlink_trap_policer_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_trap_policer_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.trap_policer_id) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req->trap_policer_id); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_trap_policer_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_TRAP_POLICER_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_trap_policer_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_TRAP_POLICER_GET - dump */ +void +devlink_trap_policer_get_list_free(struct devlink_trap_policer_get_list *rsp) +{ +	struct devlink_trap_policer_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_trap_policer_get_list * +devlink_trap_policer_get_dump(struct ynl_sock *ys, +			      struct devlink_trap_policer_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_trap_policer_get_list); +	yds.cb = devlink_trap_policer_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_TRAP_POLICER_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_trap_policer_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_RATE_GET ============== */ +/* DEVLINK_CMD_RATE_GET - do */ +void devlink_rate_get_req_free(struct devlink_rate_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req->rate_node_name); +	free(req); +} + +void devlink_rate_get_rsp_free(struct devlink_rate_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp->rate_node_name); +	free(rsp); +} + +int devlink_rate_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct ynl_parse_arg *yarg = data; +	struct devlink_rate_get_rsp *dst; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_PORT_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.port_index = 1; +			dst->port_index = mnl_attr_get_u32(attr); +		} else if (type == DEVLINK_ATTR_RATE_NODE_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.rate_node_name_len = len; +			dst->rate_node_name = malloc(len + 1); +			memcpy(dst->rate_node_name, mnl_attr_get_str(attr), len); +			dst->rate_node_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_rate_get_rsp * +devlink_rate_get(struct ynl_sock *ys, struct devlink_rate_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_rate_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RATE_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.port_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); +	if (req->_present.rate_node_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_rate_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_RATE_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_rate_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_RATE_GET - dump */ +void devlink_rate_get_list_free(struct devlink_rate_get_list *rsp) +{ +	struct devlink_rate_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp->obj.rate_node_name); +		free(rsp); +	} +} + +struct devlink_rate_get_list * +devlink_rate_get_dump(struct ynl_sock *ys, +		      struct devlink_rate_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_rate_get_list); +	yds.cb = devlink_rate_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_RATE_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_RATE_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_rate_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_LINECARD_GET ============== */ +/* DEVLINK_CMD_LINECARD_GET - do */ +void devlink_linecard_get_req_free(struct devlink_linecard_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void devlink_linecard_get_rsp_free(struct devlink_linecard_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_linecard_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_linecard_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} else if (type == DEVLINK_ATTR_LINECARD_INDEX) { +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; +			dst->_present.linecard_index = 1; +			dst->linecard_index = mnl_attr_get_u32(attr); +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_linecard_get_rsp * +devlink_linecard_get(struct ynl_sock *ys, struct devlink_linecard_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_linecard_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_LINECARD_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); +	if (req->_present.linecard_index) +		mnl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req->linecard_index); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_linecard_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_LINECARD_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_linecard_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_LINECARD_GET - dump */ +void devlink_linecard_get_list_free(struct devlink_linecard_get_list *rsp) +{ +	struct devlink_linecard_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_linecard_get_list * +devlink_linecard_get_dump(struct ynl_sock *ys, +			  struct devlink_linecard_get_req_dump *req) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_linecard_get_list); +	yds.cb = devlink_linecard_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_LINECARD_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_LINECARD_GET, 1); +	ys->req_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_linecard_get_list_free(yds.first); +	return NULL; +} + +/* ============== DEVLINK_CMD_SELFTESTS_GET ============== */ +/* DEVLINK_CMD_SELFTESTS_GET - do */ +void devlink_selftests_get_req_free(struct devlink_selftests_get_req *req) +{ +	free(req->bus_name); +	free(req->dev_name); +	free(req); +} + +void devlink_selftests_get_rsp_free(struct devlink_selftests_get_rsp *rsp) +{ +	free(rsp->bus_name); +	free(rsp->dev_name); +	free(rsp); +} + +int devlink_selftests_get_rsp_parse(const struct nlmsghdr *nlh, void *data) +{ +	struct devlink_selftests_get_rsp *dst; +	struct ynl_parse_arg *yarg = data; +	const struct nlattr *attr; + +	dst = yarg->data; + +	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { +		unsigned int type = mnl_attr_get_type(attr); + +		if (type == DEVLINK_ATTR_BUS_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.bus_name_len = len; +			dst->bus_name = malloc(len + 1); +			memcpy(dst->bus_name, mnl_attr_get_str(attr), len); +			dst->bus_name[len] = 0; +		} else if (type == DEVLINK_ATTR_DEV_NAME) { +			unsigned int len; + +			if (ynl_attr_validate(yarg, attr)) +				return MNL_CB_ERROR; + +			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); +			dst->_present.dev_name_len = len; +			dst->dev_name = malloc(len + 1); +			memcpy(dst->dev_name, mnl_attr_get_str(attr), len); +			dst->dev_name[len] = 0; +		} +	} + +	return MNL_CB_OK; +} + +struct devlink_selftests_get_rsp * +devlink_selftests_get(struct ynl_sock *ys, +		      struct devlink_selftests_get_req *req) +{ +	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; +	struct devlink_selftests_get_rsp *rsp; +	struct nlmsghdr *nlh; +	int err; + +	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_GET, 1); +	ys->req_policy = &devlink_nest; +	yrs.yarg.rsp_policy = &devlink_nest; + +	if (req->_present.bus_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); +	if (req->_present.dev_name_len) +		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + +	rsp = calloc(1, sizeof(*rsp)); +	yrs.yarg.data = rsp; +	yrs.cb = devlink_selftests_get_rsp_parse; +	yrs.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET; + +	err = ynl_exec(ys, nlh, &yrs); +	if (err < 0) +		goto err_free; + +	return rsp; + +err_free: +	devlink_selftests_get_rsp_free(rsp); +	return NULL; +} + +/* DEVLINK_CMD_SELFTESTS_GET - dump */ +void devlink_selftests_get_list_free(struct devlink_selftests_get_list *rsp) +{ +	struct devlink_selftests_get_list *next = rsp; + +	while ((void *)next != YNL_LIST_END) { +		rsp = next; +		next = rsp->next; + +		free(rsp->obj.bus_name); +		free(rsp->obj.dev_name); +		free(rsp); +	} +} + +struct devlink_selftests_get_list * +devlink_selftests_get_dump(struct ynl_sock *ys) +{ +	struct ynl_dump_state yds = {}; +	struct nlmsghdr *nlh; +	int err; + +	yds.ys = ys; +	yds.alloc_sz = sizeof(struct devlink_selftests_get_list); +	yds.cb = devlink_selftests_get_rsp_parse; +	yds.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET; +	yds.rsp_policy = &devlink_nest; + +	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_GET, 1); + +	err = ynl_exec_dump(ys, nlh, &yds); +	if (err < 0) +		goto free_list; + +	return yds.first; + +free_list: +	devlink_selftests_get_list_free(yds.first); +	return NULL; +} +  const struct ynl_family ynl_devlink_family =  {  	.name		= "devlink",  };  | 
