1 // SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2 /* Do not edit directly, auto-generated from: */
3 /*	Documentation/netlink/specs/devlink.yaml */
4 /* YNL-GEN user source */
5 
6 #include <stdlib.h>
7 #include <string.h>
8 #include "devlink-user.h"
9 #include "ynl.h"
10 #include <linux/devlink.h>
11 
12 #include <libmnl/libmnl.h>
13 #include <linux/genetlink.h>
14 
15 /* Enums */
16 static const char * const devlink_op_strmap[] = {
17 	[3] = "get",
18 	[7] = "port-get",
19 	[DEVLINK_CMD_SB_GET] = "sb-get",
20 	[DEVLINK_CMD_SB_POOL_GET] = "sb-pool-get",
21 	[DEVLINK_CMD_SB_PORT_POOL_GET] = "sb-port-pool-get",
22 	[DEVLINK_CMD_SB_TC_POOL_BIND_GET] = "sb-tc-pool-bind-get",
23 	[DEVLINK_CMD_PARAM_GET] = "param-get",
24 	[DEVLINK_CMD_REGION_GET] = "region-get",
25 	[DEVLINK_CMD_INFO_GET] = "info-get",
26 	[DEVLINK_CMD_HEALTH_REPORTER_GET] = "health-reporter-get",
27 	[DEVLINK_CMD_TRAP_GET] = "trap-get",
28 	[DEVLINK_CMD_TRAP_GROUP_GET] = "trap-group-get",
29 	[DEVLINK_CMD_TRAP_POLICER_GET] = "trap-policer-get",
30 	[DEVLINK_CMD_RATE_GET] = "rate-get",
31 	[DEVLINK_CMD_LINECARD_GET] = "linecard-get",
32 	[DEVLINK_CMD_SELFTESTS_GET] = "selftests-get",
33 };
34 
35 const char *devlink_op_str(int op)
36 {
37 	if (op < 0 || op >= (int)MNL_ARRAY_SIZE(devlink_op_strmap))
38 		return NULL;
39 	return devlink_op_strmap[op];
40 }
41 
42 static const char * const devlink_sb_pool_type_strmap[] = {
43 	[0] = "ingress",
44 	[1] = "egress",
45 };
46 
47 const char *devlink_sb_pool_type_str(enum devlink_sb_pool_type value)
48 {
49 	if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_sb_pool_type_strmap))
50 		return NULL;
51 	return devlink_sb_pool_type_strmap[value];
52 }
53 
54 /* Policies */
55 struct ynl_policy_attr devlink_dl_info_version_policy[DEVLINK_ATTR_MAX + 1] = {
56 	[DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, },
57 	[DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, },
58 };
59 
60 struct ynl_policy_nest devlink_dl_info_version_nest = {
61 	.max_attr = DEVLINK_ATTR_MAX,
62 	.table = devlink_dl_info_version_policy,
63 };
64 
65 struct ynl_policy_attr devlink_dl_reload_stats_entry_policy[DEVLINK_ATTR_MAX + 1] = {
66 	[DEVLINK_ATTR_RELOAD_STATS_LIMIT] = { .name = "reload-stats-limit", .type = YNL_PT_U8, },
67 	[DEVLINK_ATTR_RELOAD_STATS_VALUE] = { .name = "reload-stats-value", .type = YNL_PT_U32, },
68 };
69 
70 struct ynl_policy_nest devlink_dl_reload_stats_entry_nest = {
71 	.max_attr = DEVLINK_ATTR_MAX,
72 	.table = devlink_dl_reload_stats_entry_policy,
73 };
74 
75 struct ynl_policy_attr devlink_dl_reload_act_stats_policy[DEVLINK_ATTR_MAX + 1] = {
76 	[DEVLINK_ATTR_RELOAD_STATS_ENTRY] = { .name = "reload-stats-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_entry_nest, },
77 };
78 
79 struct ynl_policy_nest devlink_dl_reload_act_stats_nest = {
80 	.max_attr = DEVLINK_ATTR_MAX,
81 	.table = devlink_dl_reload_act_stats_policy,
82 };
83 
84 struct ynl_policy_attr devlink_dl_reload_act_info_policy[DEVLINK_ATTR_MAX + 1] = {
85 	[DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, },
86 	[DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, },
87 };
88 
89 struct ynl_policy_nest devlink_dl_reload_act_info_nest = {
90 	.max_attr = DEVLINK_ATTR_MAX,
91 	.table = devlink_dl_reload_act_info_policy,
92 };
93 
94 struct ynl_policy_attr devlink_dl_reload_stats_policy[DEVLINK_ATTR_MAX + 1] = {
95 	[DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, },
96 };
97 
98 struct ynl_policy_nest devlink_dl_reload_stats_nest = {
99 	.max_attr = DEVLINK_ATTR_MAX,
100 	.table = devlink_dl_reload_stats_policy,
101 };
102 
103 struct ynl_policy_attr devlink_dl_dev_stats_policy[DEVLINK_ATTR_MAX + 1] = {
104 	[DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, },
105 	[DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, },
106 };
107 
108 struct ynl_policy_nest devlink_dl_dev_stats_nest = {
109 	.max_attr = DEVLINK_ATTR_MAX,
110 	.table = devlink_dl_dev_stats_policy,
111 };
112 
113 struct ynl_policy_attr devlink_policy[DEVLINK_ATTR_MAX + 1] = {
114 	[DEVLINK_ATTR_BUS_NAME] = { .name = "bus-name", .type = YNL_PT_NUL_STR, },
115 	[DEVLINK_ATTR_DEV_NAME] = { .name = "dev-name", .type = YNL_PT_NUL_STR, },
116 	[DEVLINK_ATTR_PORT_INDEX] = { .name = "port-index", .type = YNL_PT_U32, },
117 	[DEVLINK_ATTR_SB_INDEX] = { .name = "sb-index", .type = YNL_PT_U32, },
118 	[DEVLINK_ATTR_SB_POOL_INDEX] = { .name = "sb-pool-index", .type = YNL_PT_U16, },
119 	[DEVLINK_ATTR_SB_POOL_TYPE] = { .name = "sb-pool-type", .type = YNL_PT_U8, },
120 	[DEVLINK_ATTR_SB_TC_INDEX] = { .name = "sb-tc-index", .type = YNL_PT_U16, },
121 	[DEVLINK_ATTR_PARAM_NAME] = { .name = "param-name", .type = YNL_PT_NUL_STR, },
122 	[DEVLINK_ATTR_REGION_NAME] = { .name = "region-name", .type = YNL_PT_NUL_STR, },
123 	[DEVLINK_ATTR_INFO_DRIVER_NAME] = { .name = "info-driver-name", .type = YNL_PT_NUL_STR, },
124 	[DEVLINK_ATTR_INFO_SERIAL_NUMBER] = { .name = "info-serial-number", .type = YNL_PT_NUL_STR, },
125 	[DEVLINK_ATTR_INFO_VERSION_FIXED] = { .name = "info-version-fixed", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, },
126 	[DEVLINK_ATTR_INFO_VERSION_RUNNING] = { .name = "info-version-running", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, },
127 	[DEVLINK_ATTR_INFO_VERSION_STORED] = { .name = "info-version-stored", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, },
128 	[DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, },
129 	[DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, },
130 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .name = "health-reporter-name", .type = YNL_PT_NUL_STR, },
131 	[DEVLINK_ATTR_TRAP_NAME] = { .name = "trap-name", .type = YNL_PT_NUL_STR, },
132 	[DEVLINK_ATTR_TRAP_GROUP_NAME] = { .name = "trap-group-name", .type = YNL_PT_NUL_STR, },
133 	[DEVLINK_ATTR_RELOAD_FAILED] = { .name = "reload-failed", .type = YNL_PT_U8, },
134 	[DEVLINK_ATTR_TRAP_POLICER_ID] = { .name = "trap-policer-id", .type = YNL_PT_U32, },
135 	[DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, },
136 	[DEVLINK_ATTR_DEV_STATS] = { .name = "dev-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_dev_stats_nest, },
137 	[DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, },
138 	[DEVLINK_ATTR_RELOAD_STATS_ENTRY] = { .name = "reload-stats-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_entry_nest, },
139 	[DEVLINK_ATTR_RELOAD_STATS_LIMIT] = { .name = "reload-stats-limit", .type = YNL_PT_U8, },
140 	[DEVLINK_ATTR_RELOAD_STATS_VALUE] = { .name = "reload-stats-value", .type = YNL_PT_U32, },
141 	[DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, },
142 	[DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, },
143 	[DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, },
144 	[DEVLINK_ATTR_RATE_NODE_NAME] = { .name = "rate-node-name", .type = YNL_PT_NUL_STR, },
145 	[DEVLINK_ATTR_LINECARD_INDEX] = { .name = "linecard-index", .type = YNL_PT_U32, },
146 };
147 
148 struct ynl_policy_nest devlink_nest = {
149 	.max_attr = DEVLINK_ATTR_MAX,
150 	.table = devlink_policy,
151 };
152 
153 /* Common nested types */
154 void devlink_dl_info_version_free(struct devlink_dl_info_version *obj)
155 {
156 	free(obj->info_version_name);
157 	free(obj->info_version_value);
158 }
159 
160 int devlink_dl_info_version_parse(struct ynl_parse_arg *yarg,
161 				  const struct nlattr *nested)
162 {
163 	struct devlink_dl_info_version *dst = yarg->data;
164 	const struct nlattr *attr;
165 
166 	mnl_attr_for_each_nested(attr, nested) {
167 		unsigned int type = mnl_attr_get_type(attr);
168 
169 		if (type == DEVLINK_ATTR_INFO_VERSION_NAME) {
170 			unsigned int len;
171 
172 			if (ynl_attr_validate(yarg, attr))
173 				return MNL_CB_ERROR;
174 
175 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
176 			dst->_present.info_version_name_len = len;
177 			dst->info_version_name = malloc(len + 1);
178 			memcpy(dst->info_version_name, mnl_attr_get_str(attr), len);
179 			dst->info_version_name[len] = 0;
180 		} else if (type == DEVLINK_ATTR_INFO_VERSION_VALUE) {
181 			unsigned int len;
182 
183 			if (ynl_attr_validate(yarg, attr))
184 				return MNL_CB_ERROR;
185 
186 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
187 			dst->_present.info_version_value_len = len;
188 			dst->info_version_value = malloc(len + 1);
189 			memcpy(dst->info_version_value, mnl_attr_get_str(attr), len);
190 			dst->info_version_value[len] = 0;
191 		}
192 	}
193 
194 	return 0;
195 }
196 
197 void
198 devlink_dl_reload_stats_entry_free(struct devlink_dl_reload_stats_entry *obj)
199 {
200 }
201 
202 int devlink_dl_reload_stats_entry_parse(struct ynl_parse_arg *yarg,
203 					const struct nlattr *nested)
204 {
205 	struct devlink_dl_reload_stats_entry *dst = yarg->data;
206 	const struct nlattr *attr;
207 
208 	mnl_attr_for_each_nested(attr, nested) {
209 		unsigned int type = mnl_attr_get_type(attr);
210 
211 		if (type == DEVLINK_ATTR_RELOAD_STATS_LIMIT) {
212 			if (ynl_attr_validate(yarg, attr))
213 				return MNL_CB_ERROR;
214 			dst->_present.reload_stats_limit = 1;
215 			dst->reload_stats_limit = mnl_attr_get_u8(attr);
216 		} else if (type == DEVLINK_ATTR_RELOAD_STATS_VALUE) {
217 			if (ynl_attr_validate(yarg, attr))
218 				return MNL_CB_ERROR;
219 			dst->_present.reload_stats_value = 1;
220 			dst->reload_stats_value = mnl_attr_get_u32(attr);
221 		}
222 	}
223 
224 	return 0;
225 }
226 
227 void devlink_dl_reload_act_stats_free(struct devlink_dl_reload_act_stats *obj)
228 {
229 	unsigned int i;
230 
231 	for (i = 0; i < obj->n_reload_stats_entry; i++)
232 		devlink_dl_reload_stats_entry_free(&obj->reload_stats_entry[i]);
233 	free(obj->reload_stats_entry);
234 }
235 
236 int devlink_dl_reload_act_stats_parse(struct ynl_parse_arg *yarg,
237 				      const struct nlattr *nested)
238 {
239 	struct devlink_dl_reload_act_stats *dst = yarg->data;
240 	unsigned int n_reload_stats_entry = 0;
241 	const struct nlattr *attr;
242 	struct ynl_parse_arg parg;
243 	int i;
244 
245 	parg.ys = yarg->ys;
246 
247 	if (dst->reload_stats_entry)
248 		return ynl_error_parse(yarg, "attribute already present (dl-reload-act-stats.reload-stats-entry)");
249 
250 	mnl_attr_for_each_nested(attr, nested) {
251 		unsigned int type = mnl_attr_get_type(attr);
252 
253 		if (type == DEVLINK_ATTR_RELOAD_STATS_ENTRY) {
254 			n_reload_stats_entry++;
255 		}
256 	}
257 
258 	if (n_reload_stats_entry) {
259 		dst->reload_stats_entry = calloc(n_reload_stats_entry, sizeof(*dst->reload_stats_entry));
260 		dst->n_reload_stats_entry = n_reload_stats_entry;
261 		i = 0;
262 		parg.rsp_policy = &devlink_dl_reload_stats_entry_nest;
263 		mnl_attr_for_each_nested(attr, nested) {
264 			if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RELOAD_STATS_ENTRY) {
265 				parg.data = &dst->reload_stats_entry[i];
266 				if (devlink_dl_reload_stats_entry_parse(&parg, attr))
267 					return MNL_CB_ERROR;
268 				i++;
269 			}
270 		}
271 	}
272 
273 	return 0;
274 }
275 
276 void devlink_dl_reload_act_info_free(struct devlink_dl_reload_act_info *obj)
277 {
278 	unsigned int i;
279 
280 	for (i = 0; i < obj->n_reload_action_stats; i++)
281 		devlink_dl_reload_act_stats_free(&obj->reload_action_stats[i]);
282 	free(obj->reload_action_stats);
283 }
284 
285 int devlink_dl_reload_act_info_parse(struct ynl_parse_arg *yarg,
286 				     const struct nlattr *nested)
287 {
288 	struct devlink_dl_reload_act_info *dst = yarg->data;
289 	unsigned int n_reload_action_stats = 0;
290 	const struct nlattr *attr;
291 	struct ynl_parse_arg parg;
292 	int i;
293 
294 	parg.ys = yarg->ys;
295 
296 	if (dst->reload_action_stats)
297 		return ynl_error_parse(yarg, "attribute already present (dl-reload-act-info.reload-action-stats)");
298 
299 	mnl_attr_for_each_nested(attr, nested) {
300 		unsigned int type = mnl_attr_get_type(attr);
301 
302 		if (type == DEVLINK_ATTR_RELOAD_ACTION) {
303 			if (ynl_attr_validate(yarg, attr))
304 				return MNL_CB_ERROR;
305 			dst->_present.reload_action = 1;
306 			dst->reload_action = mnl_attr_get_u8(attr);
307 		} else if (type == DEVLINK_ATTR_RELOAD_ACTION_STATS) {
308 			n_reload_action_stats++;
309 		}
310 	}
311 
312 	if (n_reload_action_stats) {
313 		dst->reload_action_stats = calloc(n_reload_action_stats, sizeof(*dst->reload_action_stats));
314 		dst->n_reload_action_stats = n_reload_action_stats;
315 		i = 0;
316 		parg.rsp_policy = &devlink_dl_reload_act_stats_nest;
317 		mnl_attr_for_each_nested(attr, nested) {
318 			if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RELOAD_ACTION_STATS) {
319 				parg.data = &dst->reload_action_stats[i];
320 				if (devlink_dl_reload_act_stats_parse(&parg, attr))
321 					return MNL_CB_ERROR;
322 				i++;
323 			}
324 		}
325 	}
326 
327 	return 0;
328 }
329 
330 void devlink_dl_reload_stats_free(struct devlink_dl_reload_stats *obj)
331 {
332 	unsigned int i;
333 
334 	for (i = 0; i < obj->n_reload_action_info; i++)
335 		devlink_dl_reload_act_info_free(&obj->reload_action_info[i]);
336 	free(obj->reload_action_info);
337 }
338 
339 int devlink_dl_reload_stats_parse(struct ynl_parse_arg *yarg,
340 				  const struct nlattr *nested)
341 {
342 	struct devlink_dl_reload_stats *dst = yarg->data;
343 	unsigned int n_reload_action_info = 0;
344 	const struct nlattr *attr;
345 	struct ynl_parse_arg parg;
346 	int i;
347 
348 	parg.ys = yarg->ys;
349 
350 	if (dst->reload_action_info)
351 		return ynl_error_parse(yarg, "attribute already present (dl-reload-stats.reload-action-info)");
352 
353 	mnl_attr_for_each_nested(attr, nested) {
354 		unsigned int type = mnl_attr_get_type(attr);
355 
356 		if (type == DEVLINK_ATTR_RELOAD_ACTION_INFO) {
357 			n_reload_action_info++;
358 		}
359 	}
360 
361 	if (n_reload_action_info) {
362 		dst->reload_action_info = calloc(n_reload_action_info, sizeof(*dst->reload_action_info));
363 		dst->n_reload_action_info = n_reload_action_info;
364 		i = 0;
365 		parg.rsp_policy = &devlink_dl_reload_act_info_nest;
366 		mnl_attr_for_each_nested(attr, nested) {
367 			if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RELOAD_ACTION_INFO) {
368 				parg.data = &dst->reload_action_info[i];
369 				if (devlink_dl_reload_act_info_parse(&parg, attr))
370 					return MNL_CB_ERROR;
371 				i++;
372 			}
373 		}
374 	}
375 
376 	return 0;
377 }
378 
379 void devlink_dl_dev_stats_free(struct devlink_dl_dev_stats *obj)
380 {
381 	devlink_dl_reload_stats_free(&obj->reload_stats);
382 	devlink_dl_reload_stats_free(&obj->remote_reload_stats);
383 }
384 
385 int devlink_dl_dev_stats_parse(struct ynl_parse_arg *yarg,
386 			       const struct nlattr *nested)
387 {
388 	struct devlink_dl_dev_stats *dst = yarg->data;
389 	const struct nlattr *attr;
390 	struct ynl_parse_arg parg;
391 
392 	parg.ys = yarg->ys;
393 
394 	mnl_attr_for_each_nested(attr, nested) {
395 		unsigned int type = mnl_attr_get_type(attr);
396 
397 		if (type == DEVLINK_ATTR_RELOAD_STATS) {
398 			if (ynl_attr_validate(yarg, attr))
399 				return MNL_CB_ERROR;
400 			dst->_present.reload_stats = 1;
401 
402 			parg.rsp_policy = &devlink_dl_reload_stats_nest;
403 			parg.data = &dst->reload_stats;
404 			if (devlink_dl_reload_stats_parse(&parg, attr))
405 				return MNL_CB_ERROR;
406 		} else if (type == DEVLINK_ATTR_REMOTE_RELOAD_STATS) {
407 			if (ynl_attr_validate(yarg, attr))
408 				return MNL_CB_ERROR;
409 			dst->_present.remote_reload_stats = 1;
410 
411 			parg.rsp_policy = &devlink_dl_reload_stats_nest;
412 			parg.data = &dst->remote_reload_stats;
413 			if (devlink_dl_reload_stats_parse(&parg, attr))
414 				return MNL_CB_ERROR;
415 		}
416 	}
417 
418 	return 0;
419 }
420 
421 /* ============== DEVLINK_CMD_GET ============== */
422 /* DEVLINK_CMD_GET - do */
423 void devlink_get_req_free(struct devlink_get_req *req)
424 {
425 	free(req->bus_name);
426 	free(req->dev_name);
427 	free(req);
428 }
429 
430 void devlink_get_rsp_free(struct devlink_get_rsp *rsp)
431 {
432 	free(rsp->bus_name);
433 	free(rsp->dev_name);
434 	devlink_dl_dev_stats_free(&rsp->dev_stats);
435 	free(rsp);
436 }
437 
438 int devlink_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
439 {
440 	struct ynl_parse_arg *yarg = data;
441 	struct devlink_get_rsp *dst;
442 	const struct nlattr *attr;
443 	struct ynl_parse_arg parg;
444 
445 	dst = yarg->data;
446 	parg.ys = yarg->ys;
447 
448 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
449 		unsigned int type = mnl_attr_get_type(attr);
450 
451 		if (type == DEVLINK_ATTR_BUS_NAME) {
452 			unsigned int len;
453 
454 			if (ynl_attr_validate(yarg, attr))
455 				return MNL_CB_ERROR;
456 
457 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
458 			dst->_present.bus_name_len = len;
459 			dst->bus_name = malloc(len + 1);
460 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
461 			dst->bus_name[len] = 0;
462 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
463 			unsigned int len;
464 
465 			if (ynl_attr_validate(yarg, attr))
466 				return MNL_CB_ERROR;
467 
468 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
469 			dst->_present.dev_name_len = len;
470 			dst->dev_name = malloc(len + 1);
471 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
472 			dst->dev_name[len] = 0;
473 		} else if (type == DEVLINK_ATTR_RELOAD_FAILED) {
474 			if (ynl_attr_validate(yarg, attr))
475 				return MNL_CB_ERROR;
476 			dst->_present.reload_failed = 1;
477 			dst->reload_failed = mnl_attr_get_u8(attr);
478 		} else if (type == DEVLINK_ATTR_RELOAD_ACTION) {
479 			if (ynl_attr_validate(yarg, attr))
480 				return MNL_CB_ERROR;
481 			dst->_present.reload_action = 1;
482 			dst->reload_action = mnl_attr_get_u8(attr);
483 		} else if (type == DEVLINK_ATTR_DEV_STATS) {
484 			if (ynl_attr_validate(yarg, attr))
485 				return MNL_CB_ERROR;
486 			dst->_present.dev_stats = 1;
487 
488 			parg.rsp_policy = &devlink_dl_dev_stats_nest;
489 			parg.data = &dst->dev_stats;
490 			if (devlink_dl_dev_stats_parse(&parg, attr))
491 				return MNL_CB_ERROR;
492 		}
493 	}
494 
495 	return MNL_CB_OK;
496 }
497 
498 struct devlink_get_rsp *
499 devlink_get(struct ynl_sock *ys, struct devlink_get_req *req)
500 {
501 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
502 	struct devlink_get_rsp *rsp;
503 	struct nlmsghdr *nlh;
504 	int err;
505 
506 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_GET, 1);
507 	ys->req_policy = &devlink_nest;
508 	yrs.yarg.rsp_policy = &devlink_nest;
509 
510 	if (req->_present.bus_name_len)
511 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
512 	if (req->_present.dev_name_len)
513 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
514 
515 	rsp = calloc(1, sizeof(*rsp));
516 	yrs.yarg.data = rsp;
517 	yrs.cb = devlink_get_rsp_parse;
518 	yrs.rsp_cmd = 3;
519 
520 	err = ynl_exec(ys, nlh, &yrs);
521 	if (err < 0)
522 		goto err_free;
523 
524 	return rsp;
525 
526 err_free:
527 	devlink_get_rsp_free(rsp);
528 	return NULL;
529 }
530 
531 /* DEVLINK_CMD_GET - dump */
532 void devlink_get_list_free(struct devlink_get_list *rsp)
533 {
534 	struct devlink_get_list *next = rsp;
535 
536 	while ((void *)next != YNL_LIST_END) {
537 		rsp = next;
538 		next = rsp->next;
539 
540 		free(rsp->obj.bus_name);
541 		free(rsp->obj.dev_name);
542 		devlink_dl_dev_stats_free(&rsp->obj.dev_stats);
543 		free(rsp);
544 	}
545 }
546 
547 struct devlink_get_list *devlink_get_dump(struct ynl_sock *ys)
548 {
549 	struct ynl_dump_state yds = {};
550 	struct nlmsghdr *nlh;
551 	int err;
552 
553 	yds.ys = ys;
554 	yds.alloc_sz = sizeof(struct devlink_get_list);
555 	yds.cb = devlink_get_rsp_parse;
556 	yds.rsp_cmd = 3;
557 	yds.rsp_policy = &devlink_nest;
558 
559 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_GET, 1);
560 
561 	err = ynl_exec_dump(ys, nlh, &yds);
562 	if (err < 0)
563 		goto free_list;
564 
565 	return yds.first;
566 
567 free_list:
568 	devlink_get_list_free(yds.first);
569 	return NULL;
570 }
571 
572 /* ============== DEVLINK_CMD_PORT_GET ============== */
573 /* DEVLINK_CMD_PORT_GET - do */
574 void devlink_port_get_req_free(struct devlink_port_get_req *req)
575 {
576 	free(req->bus_name);
577 	free(req->dev_name);
578 	free(req);
579 }
580 
581 void devlink_port_get_rsp_free(struct devlink_port_get_rsp *rsp)
582 {
583 	free(rsp->bus_name);
584 	free(rsp->dev_name);
585 	free(rsp);
586 }
587 
588 int devlink_port_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
589 {
590 	struct ynl_parse_arg *yarg = data;
591 	struct devlink_port_get_rsp *dst;
592 	const struct nlattr *attr;
593 
594 	dst = yarg->data;
595 
596 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
597 		unsigned int type = mnl_attr_get_type(attr);
598 
599 		if (type == DEVLINK_ATTR_BUS_NAME) {
600 			unsigned int len;
601 
602 			if (ynl_attr_validate(yarg, attr))
603 				return MNL_CB_ERROR;
604 
605 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
606 			dst->_present.bus_name_len = len;
607 			dst->bus_name = malloc(len + 1);
608 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
609 			dst->bus_name[len] = 0;
610 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
611 			unsigned int len;
612 
613 			if (ynl_attr_validate(yarg, attr))
614 				return MNL_CB_ERROR;
615 
616 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
617 			dst->_present.dev_name_len = len;
618 			dst->dev_name = malloc(len + 1);
619 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
620 			dst->dev_name[len] = 0;
621 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
622 			if (ynl_attr_validate(yarg, attr))
623 				return MNL_CB_ERROR;
624 			dst->_present.port_index = 1;
625 			dst->port_index = mnl_attr_get_u32(attr);
626 		}
627 	}
628 
629 	return MNL_CB_OK;
630 }
631 
632 struct devlink_port_get_rsp *
633 devlink_port_get(struct ynl_sock *ys, struct devlink_port_get_req *req)
634 {
635 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
636 	struct devlink_port_get_rsp *rsp;
637 	struct nlmsghdr *nlh;
638 	int err;
639 
640 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_GET, 1);
641 	ys->req_policy = &devlink_nest;
642 	yrs.yarg.rsp_policy = &devlink_nest;
643 
644 	if (req->_present.bus_name_len)
645 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
646 	if (req->_present.dev_name_len)
647 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
648 	if (req->_present.port_index)
649 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
650 
651 	rsp = calloc(1, sizeof(*rsp));
652 	yrs.yarg.data = rsp;
653 	yrs.cb = devlink_port_get_rsp_parse;
654 	yrs.rsp_cmd = 7;
655 
656 	err = ynl_exec(ys, nlh, &yrs);
657 	if (err < 0)
658 		goto err_free;
659 
660 	return rsp;
661 
662 err_free:
663 	devlink_port_get_rsp_free(rsp);
664 	return NULL;
665 }
666 
667 /* DEVLINK_CMD_PORT_GET - dump */
668 int devlink_port_get_rsp_dump_parse(const struct nlmsghdr *nlh, void *data)
669 {
670 	struct devlink_port_get_rsp_dump *dst;
671 	struct ynl_parse_arg *yarg = data;
672 	const struct nlattr *attr;
673 
674 	dst = yarg->data;
675 
676 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
677 		unsigned int type = mnl_attr_get_type(attr);
678 
679 		if (type == DEVLINK_ATTR_BUS_NAME) {
680 			unsigned int len;
681 
682 			if (ynl_attr_validate(yarg, attr))
683 				return MNL_CB_ERROR;
684 
685 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
686 			dst->_present.bus_name_len = len;
687 			dst->bus_name = malloc(len + 1);
688 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
689 			dst->bus_name[len] = 0;
690 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
691 			unsigned int len;
692 
693 			if (ynl_attr_validate(yarg, attr))
694 				return MNL_CB_ERROR;
695 
696 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
697 			dst->_present.dev_name_len = len;
698 			dst->dev_name = malloc(len + 1);
699 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
700 			dst->dev_name[len] = 0;
701 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
702 			if (ynl_attr_validate(yarg, attr))
703 				return MNL_CB_ERROR;
704 			dst->_present.port_index = 1;
705 			dst->port_index = mnl_attr_get_u32(attr);
706 		}
707 	}
708 
709 	return MNL_CB_OK;
710 }
711 
712 void devlink_port_get_rsp_list_free(struct devlink_port_get_rsp_list *rsp)
713 {
714 	struct devlink_port_get_rsp_list *next = rsp;
715 
716 	while ((void *)next != YNL_LIST_END) {
717 		rsp = next;
718 		next = rsp->next;
719 
720 		free(rsp->obj.bus_name);
721 		free(rsp->obj.dev_name);
722 		free(rsp);
723 	}
724 }
725 
726 struct devlink_port_get_rsp_list *
727 devlink_port_get_dump(struct ynl_sock *ys,
728 		      struct devlink_port_get_req_dump *req)
729 {
730 	struct ynl_dump_state yds = {};
731 	struct nlmsghdr *nlh;
732 	int err;
733 
734 	yds.ys = ys;
735 	yds.alloc_sz = sizeof(struct devlink_port_get_rsp_list);
736 	yds.cb = devlink_port_get_rsp_dump_parse;
737 	yds.rsp_cmd = 7;
738 	yds.rsp_policy = &devlink_nest;
739 
740 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PORT_GET, 1);
741 	ys->req_policy = &devlink_nest;
742 
743 	if (req->_present.bus_name_len)
744 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
745 	if (req->_present.dev_name_len)
746 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
747 
748 	err = ynl_exec_dump(ys, nlh, &yds);
749 	if (err < 0)
750 		goto free_list;
751 
752 	return yds.first;
753 
754 free_list:
755 	devlink_port_get_rsp_list_free(yds.first);
756 	return NULL;
757 }
758 
759 /* ============== DEVLINK_CMD_SB_GET ============== */
760 /* DEVLINK_CMD_SB_GET - do */
761 void devlink_sb_get_req_free(struct devlink_sb_get_req *req)
762 {
763 	free(req->bus_name);
764 	free(req->dev_name);
765 	free(req);
766 }
767 
768 void devlink_sb_get_rsp_free(struct devlink_sb_get_rsp *rsp)
769 {
770 	free(rsp->bus_name);
771 	free(rsp->dev_name);
772 	free(rsp);
773 }
774 
775 int devlink_sb_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
776 {
777 	struct ynl_parse_arg *yarg = data;
778 	struct devlink_sb_get_rsp *dst;
779 	const struct nlattr *attr;
780 
781 	dst = yarg->data;
782 
783 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
784 		unsigned int type = mnl_attr_get_type(attr);
785 
786 		if (type == DEVLINK_ATTR_BUS_NAME) {
787 			unsigned int len;
788 
789 			if (ynl_attr_validate(yarg, attr))
790 				return MNL_CB_ERROR;
791 
792 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
793 			dst->_present.bus_name_len = len;
794 			dst->bus_name = malloc(len + 1);
795 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
796 			dst->bus_name[len] = 0;
797 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
798 			unsigned int len;
799 
800 			if (ynl_attr_validate(yarg, attr))
801 				return MNL_CB_ERROR;
802 
803 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
804 			dst->_present.dev_name_len = len;
805 			dst->dev_name = malloc(len + 1);
806 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
807 			dst->dev_name[len] = 0;
808 		} else if (type == DEVLINK_ATTR_SB_INDEX) {
809 			if (ynl_attr_validate(yarg, attr))
810 				return MNL_CB_ERROR;
811 			dst->_present.sb_index = 1;
812 			dst->sb_index = mnl_attr_get_u32(attr);
813 		}
814 	}
815 
816 	return MNL_CB_OK;
817 }
818 
819 struct devlink_sb_get_rsp *
820 devlink_sb_get(struct ynl_sock *ys, struct devlink_sb_get_req *req)
821 {
822 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
823 	struct devlink_sb_get_rsp *rsp;
824 	struct nlmsghdr *nlh;
825 	int err;
826 
827 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_GET, 1);
828 	ys->req_policy = &devlink_nest;
829 	yrs.yarg.rsp_policy = &devlink_nest;
830 
831 	if (req->_present.bus_name_len)
832 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
833 	if (req->_present.dev_name_len)
834 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
835 	if (req->_present.sb_index)
836 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index);
837 
838 	rsp = calloc(1, sizeof(*rsp));
839 	yrs.yarg.data = rsp;
840 	yrs.cb = devlink_sb_get_rsp_parse;
841 	yrs.rsp_cmd = DEVLINK_CMD_SB_GET;
842 
843 	err = ynl_exec(ys, nlh, &yrs);
844 	if (err < 0)
845 		goto err_free;
846 
847 	return rsp;
848 
849 err_free:
850 	devlink_sb_get_rsp_free(rsp);
851 	return NULL;
852 }
853 
854 /* DEVLINK_CMD_SB_GET - dump */
855 void devlink_sb_get_list_free(struct devlink_sb_get_list *rsp)
856 {
857 	struct devlink_sb_get_list *next = rsp;
858 
859 	while ((void *)next != YNL_LIST_END) {
860 		rsp = next;
861 		next = rsp->next;
862 
863 		free(rsp->obj.bus_name);
864 		free(rsp->obj.dev_name);
865 		free(rsp);
866 	}
867 }
868 
869 struct devlink_sb_get_list *
870 devlink_sb_get_dump(struct ynl_sock *ys, struct devlink_sb_get_req_dump *req)
871 {
872 	struct ynl_dump_state yds = {};
873 	struct nlmsghdr *nlh;
874 	int err;
875 
876 	yds.ys = ys;
877 	yds.alloc_sz = sizeof(struct devlink_sb_get_list);
878 	yds.cb = devlink_sb_get_rsp_parse;
879 	yds.rsp_cmd = DEVLINK_CMD_SB_GET;
880 	yds.rsp_policy = &devlink_nest;
881 
882 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_GET, 1);
883 	ys->req_policy = &devlink_nest;
884 
885 	if (req->_present.bus_name_len)
886 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
887 	if (req->_present.dev_name_len)
888 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
889 
890 	err = ynl_exec_dump(ys, nlh, &yds);
891 	if (err < 0)
892 		goto free_list;
893 
894 	return yds.first;
895 
896 free_list:
897 	devlink_sb_get_list_free(yds.first);
898 	return NULL;
899 }
900 
901 /* ============== DEVLINK_CMD_SB_POOL_GET ============== */
902 /* DEVLINK_CMD_SB_POOL_GET - do */
903 void devlink_sb_pool_get_req_free(struct devlink_sb_pool_get_req *req)
904 {
905 	free(req->bus_name);
906 	free(req->dev_name);
907 	free(req);
908 }
909 
910 void devlink_sb_pool_get_rsp_free(struct devlink_sb_pool_get_rsp *rsp)
911 {
912 	free(rsp->bus_name);
913 	free(rsp->dev_name);
914 	free(rsp);
915 }
916 
917 int devlink_sb_pool_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
918 {
919 	struct devlink_sb_pool_get_rsp *dst;
920 	struct ynl_parse_arg *yarg = data;
921 	const struct nlattr *attr;
922 
923 	dst = yarg->data;
924 
925 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
926 		unsigned int type = mnl_attr_get_type(attr);
927 
928 		if (type == DEVLINK_ATTR_BUS_NAME) {
929 			unsigned int len;
930 
931 			if (ynl_attr_validate(yarg, attr))
932 				return MNL_CB_ERROR;
933 
934 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
935 			dst->_present.bus_name_len = len;
936 			dst->bus_name = malloc(len + 1);
937 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
938 			dst->bus_name[len] = 0;
939 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
940 			unsigned int len;
941 
942 			if (ynl_attr_validate(yarg, attr))
943 				return MNL_CB_ERROR;
944 
945 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
946 			dst->_present.dev_name_len = len;
947 			dst->dev_name = malloc(len + 1);
948 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
949 			dst->dev_name[len] = 0;
950 		} else if (type == DEVLINK_ATTR_SB_INDEX) {
951 			if (ynl_attr_validate(yarg, attr))
952 				return MNL_CB_ERROR;
953 			dst->_present.sb_index = 1;
954 			dst->sb_index = mnl_attr_get_u32(attr);
955 		} else if (type == DEVLINK_ATTR_SB_POOL_INDEX) {
956 			if (ynl_attr_validate(yarg, attr))
957 				return MNL_CB_ERROR;
958 			dst->_present.sb_pool_index = 1;
959 			dst->sb_pool_index = mnl_attr_get_u16(attr);
960 		}
961 	}
962 
963 	return MNL_CB_OK;
964 }
965 
966 struct devlink_sb_pool_get_rsp *
967 devlink_sb_pool_get(struct ynl_sock *ys, struct devlink_sb_pool_get_req *req)
968 {
969 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
970 	struct devlink_sb_pool_get_rsp *rsp;
971 	struct nlmsghdr *nlh;
972 	int err;
973 
974 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_POOL_GET, 1);
975 	ys->req_policy = &devlink_nest;
976 	yrs.yarg.rsp_policy = &devlink_nest;
977 
978 	if (req->_present.bus_name_len)
979 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
980 	if (req->_present.dev_name_len)
981 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
982 	if (req->_present.sb_index)
983 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index);
984 	if (req->_present.sb_pool_index)
985 		mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index);
986 
987 	rsp = calloc(1, sizeof(*rsp));
988 	yrs.yarg.data = rsp;
989 	yrs.cb = devlink_sb_pool_get_rsp_parse;
990 	yrs.rsp_cmd = DEVLINK_CMD_SB_POOL_GET;
991 
992 	err = ynl_exec(ys, nlh, &yrs);
993 	if (err < 0)
994 		goto err_free;
995 
996 	return rsp;
997 
998 err_free:
999 	devlink_sb_pool_get_rsp_free(rsp);
1000 	return NULL;
1001 }
1002 
1003 /* DEVLINK_CMD_SB_POOL_GET - dump */
1004 void devlink_sb_pool_get_list_free(struct devlink_sb_pool_get_list *rsp)
1005 {
1006 	struct devlink_sb_pool_get_list *next = rsp;
1007 
1008 	while ((void *)next != YNL_LIST_END) {
1009 		rsp = next;
1010 		next = rsp->next;
1011 
1012 		free(rsp->obj.bus_name);
1013 		free(rsp->obj.dev_name);
1014 		free(rsp);
1015 	}
1016 }
1017 
1018 struct devlink_sb_pool_get_list *
1019 devlink_sb_pool_get_dump(struct ynl_sock *ys,
1020 			 struct devlink_sb_pool_get_req_dump *req)
1021 {
1022 	struct ynl_dump_state yds = {};
1023 	struct nlmsghdr *nlh;
1024 	int err;
1025 
1026 	yds.ys = ys;
1027 	yds.alloc_sz = sizeof(struct devlink_sb_pool_get_list);
1028 	yds.cb = devlink_sb_pool_get_rsp_parse;
1029 	yds.rsp_cmd = DEVLINK_CMD_SB_POOL_GET;
1030 	yds.rsp_policy = &devlink_nest;
1031 
1032 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_POOL_GET, 1);
1033 	ys->req_policy = &devlink_nest;
1034 
1035 	if (req->_present.bus_name_len)
1036 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1037 	if (req->_present.dev_name_len)
1038 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1039 
1040 	err = ynl_exec_dump(ys, nlh, &yds);
1041 	if (err < 0)
1042 		goto free_list;
1043 
1044 	return yds.first;
1045 
1046 free_list:
1047 	devlink_sb_pool_get_list_free(yds.first);
1048 	return NULL;
1049 }
1050 
1051 /* ============== DEVLINK_CMD_SB_PORT_POOL_GET ============== */
1052 /* DEVLINK_CMD_SB_PORT_POOL_GET - do */
1053 void
1054 devlink_sb_port_pool_get_req_free(struct devlink_sb_port_pool_get_req *req)
1055 {
1056 	free(req->bus_name);
1057 	free(req->dev_name);
1058 	free(req);
1059 }
1060 
1061 void
1062 devlink_sb_port_pool_get_rsp_free(struct devlink_sb_port_pool_get_rsp *rsp)
1063 {
1064 	free(rsp->bus_name);
1065 	free(rsp->dev_name);
1066 	free(rsp);
1067 }
1068 
1069 int devlink_sb_port_pool_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
1070 {
1071 	struct devlink_sb_port_pool_get_rsp *dst;
1072 	struct ynl_parse_arg *yarg = data;
1073 	const struct nlattr *attr;
1074 
1075 	dst = yarg->data;
1076 
1077 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1078 		unsigned int type = mnl_attr_get_type(attr);
1079 
1080 		if (type == DEVLINK_ATTR_BUS_NAME) {
1081 			unsigned int len;
1082 
1083 			if (ynl_attr_validate(yarg, attr))
1084 				return MNL_CB_ERROR;
1085 
1086 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1087 			dst->_present.bus_name_len = len;
1088 			dst->bus_name = malloc(len + 1);
1089 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
1090 			dst->bus_name[len] = 0;
1091 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
1092 			unsigned int len;
1093 
1094 			if (ynl_attr_validate(yarg, attr))
1095 				return MNL_CB_ERROR;
1096 
1097 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1098 			dst->_present.dev_name_len = len;
1099 			dst->dev_name = malloc(len + 1);
1100 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
1101 			dst->dev_name[len] = 0;
1102 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
1103 			if (ynl_attr_validate(yarg, attr))
1104 				return MNL_CB_ERROR;
1105 			dst->_present.port_index = 1;
1106 			dst->port_index = mnl_attr_get_u32(attr);
1107 		} else if (type == DEVLINK_ATTR_SB_INDEX) {
1108 			if (ynl_attr_validate(yarg, attr))
1109 				return MNL_CB_ERROR;
1110 			dst->_present.sb_index = 1;
1111 			dst->sb_index = mnl_attr_get_u32(attr);
1112 		} else if (type == DEVLINK_ATTR_SB_POOL_INDEX) {
1113 			if (ynl_attr_validate(yarg, attr))
1114 				return MNL_CB_ERROR;
1115 			dst->_present.sb_pool_index = 1;
1116 			dst->sb_pool_index = mnl_attr_get_u16(attr);
1117 		}
1118 	}
1119 
1120 	return MNL_CB_OK;
1121 }
1122 
1123 struct devlink_sb_port_pool_get_rsp *
1124 devlink_sb_port_pool_get(struct ynl_sock *ys,
1125 			 struct devlink_sb_port_pool_get_req *req)
1126 {
1127 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
1128 	struct devlink_sb_port_pool_get_rsp *rsp;
1129 	struct nlmsghdr *nlh;
1130 	int err;
1131 
1132 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1);
1133 	ys->req_policy = &devlink_nest;
1134 	yrs.yarg.rsp_policy = &devlink_nest;
1135 
1136 	if (req->_present.bus_name_len)
1137 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1138 	if (req->_present.dev_name_len)
1139 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1140 	if (req->_present.port_index)
1141 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
1142 	if (req->_present.sb_index)
1143 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index);
1144 	if (req->_present.sb_pool_index)
1145 		mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index);
1146 
1147 	rsp = calloc(1, sizeof(*rsp));
1148 	yrs.yarg.data = rsp;
1149 	yrs.cb = devlink_sb_port_pool_get_rsp_parse;
1150 	yrs.rsp_cmd = DEVLINK_CMD_SB_PORT_POOL_GET;
1151 
1152 	err = ynl_exec(ys, nlh, &yrs);
1153 	if (err < 0)
1154 		goto err_free;
1155 
1156 	return rsp;
1157 
1158 err_free:
1159 	devlink_sb_port_pool_get_rsp_free(rsp);
1160 	return NULL;
1161 }
1162 
1163 /* DEVLINK_CMD_SB_PORT_POOL_GET - dump */
1164 void
1165 devlink_sb_port_pool_get_list_free(struct devlink_sb_port_pool_get_list *rsp)
1166 {
1167 	struct devlink_sb_port_pool_get_list *next = rsp;
1168 
1169 	while ((void *)next != YNL_LIST_END) {
1170 		rsp = next;
1171 		next = rsp->next;
1172 
1173 		free(rsp->obj.bus_name);
1174 		free(rsp->obj.dev_name);
1175 		free(rsp);
1176 	}
1177 }
1178 
1179 struct devlink_sb_port_pool_get_list *
1180 devlink_sb_port_pool_get_dump(struct ynl_sock *ys,
1181 			      struct devlink_sb_port_pool_get_req_dump *req)
1182 {
1183 	struct ynl_dump_state yds = {};
1184 	struct nlmsghdr *nlh;
1185 	int err;
1186 
1187 	yds.ys = ys;
1188 	yds.alloc_sz = sizeof(struct devlink_sb_port_pool_get_list);
1189 	yds.cb = devlink_sb_port_pool_get_rsp_parse;
1190 	yds.rsp_cmd = DEVLINK_CMD_SB_PORT_POOL_GET;
1191 	yds.rsp_policy = &devlink_nest;
1192 
1193 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1);
1194 	ys->req_policy = &devlink_nest;
1195 
1196 	if (req->_present.bus_name_len)
1197 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1198 	if (req->_present.dev_name_len)
1199 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1200 
1201 	err = ynl_exec_dump(ys, nlh, &yds);
1202 	if (err < 0)
1203 		goto free_list;
1204 
1205 	return yds.first;
1206 
1207 free_list:
1208 	devlink_sb_port_pool_get_list_free(yds.first);
1209 	return NULL;
1210 }
1211 
1212 /* ============== DEVLINK_CMD_SB_TC_POOL_BIND_GET ============== */
1213 /* DEVLINK_CMD_SB_TC_POOL_BIND_GET - do */
1214 void
1215 devlink_sb_tc_pool_bind_get_req_free(struct devlink_sb_tc_pool_bind_get_req *req)
1216 {
1217 	free(req->bus_name);
1218 	free(req->dev_name);
1219 	free(req);
1220 }
1221 
1222 void
1223 devlink_sb_tc_pool_bind_get_rsp_free(struct devlink_sb_tc_pool_bind_get_rsp *rsp)
1224 {
1225 	free(rsp->bus_name);
1226 	free(rsp->dev_name);
1227 	free(rsp);
1228 }
1229 
1230 int devlink_sb_tc_pool_bind_get_rsp_parse(const struct nlmsghdr *nlh,
1231 					  void *data)
1232 {
1233 	struct devlink_sb_tc_pool_bind_get_rsp *dst;
1234 	struct ynl_parse_arg *yarg = data;
1235 	const struct nlattr *attr;
1236 
1237 	dst = yarg->data;
1238 
1239 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1240 		unsigned int type = mnl_attr_get_type(attr);
1241 
1242 		if (type == DEVLINK_ATTR_BUS_NAME) {
1243 			unsigned int len;
1244 
1245 			if (ynl_attr_validate(yarg, attr))
1246 				return MNL_CB_ERROR;
1247 
1248 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1249 			dst->_present.bus_name_len = len;
1250 			dst->bus_name = malloc(len + 1);
1251 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
1252 			dst->bus_name[len] = 0;
1253 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
1254 			unsigned int len;
1255 
1256 			if (ynl_attr_validate(yarg, attr))
1257 				return MNL_CB_ERROR;
1258 
1259 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1260 			dst->_present.dev_name_len = len;
1261 			dst->dev_name = malloc(len + 1);
1262 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
1263 			dst->dev_name[len] = 0;
1264 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
1265 			if (ynl_attr_validate(yarg, attr))
1266 				return MNL_CB_ERROR;
1267 			dst->_present.port_index = 1;
1268 			dst->port_index = mnl_attr_get_u32(attr);
1269 		} else if (type == DEVLINK_ATTR_SB_INDEX) {
1270 			if (ynl_attr_validate(yarg, attr))
1271 				return MNL_CB_ERROR;
1272 			dst->_present.sb_index = 1;
1273 			dst->sb_index = mnl_attr_get_u32(attr);
1274 		} else if (type == DEVLINK_ATTR_SB_POOL_TYPE) {
1275 			if (ynl_attr_validate(yarg, attr))
1276 				return MNL_CB_ERROR;
1277 			dst->_present.sb_pool_type = 1;
1278 			dst->sb_pool_type = mnl_attr_get_u8(attr);
1279 		} else if (type == DEVLINK_ATTR_SB_TC_INDEX) {
1280 			if (ynl_attr_validate(yarg, attr))
1281 				return MNL_CB_ERROR;
1282 			dst->_present.sb_tc_index = 1;
1283 			dst->sb_tc_index = mnl_attr_get_u16(attr);
1284 		}
1285 	}
1286 
1287 	return MNL_CB_OK;
1288 }
1289 
1290 struct devlink_sb_tc_pool_bind_get_rsp *
1291 devlink_sb_tc_pool_bind_get(struct ynl_sock *ys,
1292 			    struct devlink_sb_tc_pool_bind_get_req *req)
1293 {
1294 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
1295 	struct devlink_sb_tc_pool_bind_get_rsp *rsp;
1296 	struct nlmsghdr *nlh;
1297 	int err;
1298 
1299 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1);
1300 	ys->req_policy = &devlink_nest;
1301 	yrs.yarg.rsp_policy = &devlink_nest;
1302 
1303 	if (req->_present.bus_name_len)
1304 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1305 	if (req->_present.dev_name_len)
1306 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1307 	if (req->_present.port_index)
1308 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
1309 	if (req->_present.sb_index)
1310 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index);
1311 	if (req->_present.sb_pool_type)
1312 		mnl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_TYPE, req->sb_pool_type);
1313 	if (req->_present.sb_tc_index)
1314 		mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_TC_INDEX, req->sb_tc_index);
1315 
1316 	rsp = calloc(1, sizeof(*rsp));
1317 	yrs.yarg.data = rsp;
1318 	yrs.cb = devlink_sb_tc_pool_bind_get_rsp_parse;
1319 	yrs.rsp_cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET;
1320 
1321 	err = ynl_exec(ys, nlh, &yrs);
1322 	if (err < 0)
1323 		goto err_free;
1324 
1325 	return rsp;
1326 
1327 err_free:
1328 	devlink_sb_tc_pool_bind_get_rsp_free(rsp);
1329 	return NULL;
1330 }
1331 
1332 /* DEVLINK_CMD_SB_TC_POOL_BIND_GET - dump */
1333 void
1334 devlink_sb_tc_pool_bind_get_list_free(struct devlink_sb_tc_pool_bind_get_list *rsp)
1335 {
1336 	struct devlink_sb_tc_pool_bind_get_list *next = rsp;
1337 
1338 	while ((void *)next != YNL_LIST_END) {
1339 		rsp = next;
1340 		next = rsp->next;
1341 
1342 		free(rsp->obj.bus_name);
1343 		free(rsp->obj.dev_name);
1344 		free(rsp);
1345 	}
1346 }
1347 
1348 struct devlink_sb_tc_pool_bind_get_list *
1349 devlink_sb_tc_pool_bind_get_dump(struct ynl_sock *ys,
1350 				 struct devlink_sb_tc_pool_bind_get_req_dump *req)
1351 {
1352 	struct ynl_dump_state yds = {};
1353 	struct nlmsghdr *nlh;
1354 	int err;
1355 
1356 	yds.ys = ys;
1357 	yds.alloc_sz = sizeof(struct devlink_sb_tc_pool_bind_get_list);
1358 	yds.cb = devlink_sb_tc_pool_bind_get_rsp_parse;
1359 	yds.rsp_cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET;
1360 	yds.rsp_policy = &devlink_nest;
1361 
1362 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1);
1363 	ys->req_policy = &devlink_nest;
1364 
1365 	if (req->_present.bus_name_len)
1366 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1367 	if (req->_present.dev_name_len)
1368 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1369 
1370 	err = ynl_exec_dump(ys, nlh, &yds);
1371 	if (err < 0)
1372 		goto free_list;
1373 
1374 	return yds.first;
1375 
1376 free_list:
1377 	devlink_sb_tc_pool_bind_get_list_free(yds.first);
1378 	return NULL;
1379 }
1380 
1381 /* ============== DEVLINK_CMD_PARAM_GET ============== */
1382 /* DEVLINK_CMD_PARAM_GET - do */
1383 void devlink_param_get_req_free(struct devlink_param_get_req *req)
1384 {
1385 	free(req->bus_name);
1386 	free(req->dev_name);
1387 	free(req->param_name);
1388 	free(req);
1389 }
1390 
1391 void devlink_param_get_rsp_free(struct devlink_param_get_rsp *rsp)
1392 {
1393 	free(rsp->bus_name);
1394 	free(rsp->dev_name);
1395 	free(rsp->param_name);
1396 	free(rsp);
1397 }
1398 
1399 int devlink_param_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
1400 {
1401 	struct devlink_param_get_rsp *dst;
1402 	struct ynl_parse_arg *yarg = data;
1403 	const struct nlattr *attr;
1404 
1405 	dst = yarg->data;
1406 
1407 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1408 		unsigned int type = mnl_attr_get_type(attr);
1409 
1410 		if (type == DEVLINK_ATTR_BUS_NAME) {
1411 			unsigned int len;
1412 
1413 			if (ynl_attr_validate(yarg, attr))
1414 				return MNL_CB_ERROR;
1415 
1416 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1417 			dst->_present.bus_name_len = len;
1418 			dst->bus_name = malloc(len + 1);
1419 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
1420 			dst->bus_name[len] = 0;
1421 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
1422 			unsigned int len;
1423 
1424 			if (ynl_attr_validate(yarg, attr))
1425 				return MNL_CB_ERROR;
1426 
1427 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1428 			dst->_present.dev_name_len = len;
1429 			dst->dev_name = malloc(len + 1);
1430 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
1431 			dst->dev_name[len] = 0;
1432 		} else if (type == DEVLINK_ATTR_PARAM_NAME) {
1433 			unsigned int len;
1434 
1435 			if (ynl_attr_validate(yarg, attr))
1436 				return MNL_CB_ERROR;
1437 
1438 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1439 			dst->_present.param_name_len = len;
1440 			dst->param_name = malloc(len + 1);
1441 			memcpy(dst->param_name, mnl_attr_get_str(attr), len);
1442 			dst->param_name[len] = 0;
1443 		}
1444 	}
1445 
1446 	return MNL_CB_OK;
1447 }
1448 
1449 struct devlink_param_get_rsp *
1450 devlink_param_get(struct ynl_sock *ys, struct devlink_param_get_req *req)
1451 {
1452 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
1453 	struct devlink_param_get_rsp *rsp;
1454 	struct nlmsghdr *nlh;
1455 	int err;
1456 
1457 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PARAM_GET, 1);
1458 	ys->req_policy = &devlink_nest;
1459 	yrs.yarg.rsp_policy = &devlink_nest;
1460 
1461 	if (req->_present.bus_name_len)
1462 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1463 	if (req->_present.dev_name_len)
1464 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1465 	if (req->_present.param_name_len)
1466 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_NAME, req->param_name);
1467 
1468 	rsp = calloc(1, sizeof(*rsp));
1469 	yrs.yarg.data = rsp;
1470 	yrs.cb = devlink_param_get_rsp_parse;
1471 	yrs.rsp_cmd = DEVLINK_CMD_PARAM_GET;
1472 
1473 	err = ynl_exec(ys, nlh, &yrs);
1474 	if (err < 0)
1475 		goto err_free;
1476 
1477 	return rsp;
1478 
1479 err_free:
1480 	devlink_param_get_rsp_free(rsp);
1481 	return NULL;
1482 }
1483 
1484 /* DEVLINK_CMD_PARAM_GET - dump */
1485 void devlink_param_get_list_free(struct devlink_param_get_list *rsp)
1486 {
1487 	struct devlink_param_get_list *next = rsp;
1488 
1489 	while ((void *)next != YNL_LIST_END) {
1490 		rsp = next;
1491 		next = rsp->next;
1492 
1493 		free(rsp->obj.bus_name);
1494 		free(rsp->obj.dev_name);
1495 		free(rsp->obj.param_name);
1496 		free(rsp);
1497 	}
1498 }
1499 
1500 struct devlink_param_get_list *
1501 devlink_param_get_dump(struct ynl_sock *ys,
1502 		       struct devlink_param_get_req_dump *req)
1503 {
1504 	struct ynl_dump_state yds = {};
1505 	struct nlmsghdr *nlh;
1506 	int err;
1507 
1508 	yds.ys = ys;
1509 	yds.alloc_sz = sizeof(struct devlink_param_get_list);
1510 	yds.cb = devlink_param_get_rsp_parse;
1511 	yds.rsp_cmd = DEVLINK_CMD_PARAM_GET;
1512 	yds.rsp_policy = &devlink_nest;
1513 
1514 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PARAM_GET, 1);
1515 	ys->req_policy = &devlink_nest;
1516 
1517 	if (req->_present.bus_name_len)
1518 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1519 	if (req->_present.dev_name_len)
1520 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1521 
1522 	err = ynl_exec_dump(ys, nlh, &yds);
1523 	if (err < 0)
1524 		goto free_list;
1525 
1526 	return yds.first;
1527 
1528 free_list:
1529 	devlink_param_get_list_free(yds.first);
1530 	return NULL;
1531 }
1532 
1533 /* ============== DEVLINK_CMD_REGION_GET ============== */
1534 /* DEVLINK_CMD_REGION_GET - do */
1535 void devlink_region_get_req_free(struct devlink_region_get_req *req)
1536 {
1537 	free(req->bus_name);
1538 	free(req->dev_name);
1539 	free(req->region_name);
1540 	free(req);
1541 }
1542 
1543 void devlink_region_get_rsp_free(struct devlink_region_get_rsp *rsp)
1544 {
1545 	free(rsp->bus_name);
1546 	free(rsp->dev_name);
1547 	free(rsp->region_name);
1548 	free(rsp);
1549 }
1550 
1551 int devlink_region_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
1552 {
1553 	struct devlink_region_get_rsp *dst;
1554 	struct ynl_parse_arg *yarg = data;
1555 	const struct nlattr *attr;
1556 
1557 	dst = yarg->data;
1558 
1559 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1560 		unsigned int type = mnl_attr_get_type(attr);
1561 
1562 		if (type == DEVLINK_ATTR_BUS_NAME) {
1563 			unsigned int len;
1564 
1565 			if (ynl_attr_validate(yarg, attr))
1566 				return MNL_CB_ERROR;
1567 
1568 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1569 			dst->_present.bus_name_len = len;
1570 			dst->bus_name = malloc(len + 1);
1571 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
1572 			dst->bus_name[len] = 0;
1573 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
1574 			unsigned int len;
1575 
1576 			if (ynl_attr_validate(yarg, attr))
1577 				return MNL_CB_ERROR;
1578 
1579 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1580 			dst->_present.dev_name_len = len;
1581 			dst->dev_name = malloc(len + 1);
1582 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
1583 			dst->dev_name[len] = 0;
1584 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
1585 			if (ynl_attr_validate(yarg, attr))
1586 				return MNL_CB_ERROR;
1587 			dst->_present.port_index = 1;
1588 			dst->port_index = mnl_attr_get_u32(attr);
1589 		} else if (type == DEVLINK_ATTR_REGION_NAME) {
1590 			unsigned int len;
1591 
1592 			if (ynl_attr_validate(yarg, attr))
1593 				return MNL_CB_ERROR;
1594 
1595 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1596 			dst->_present.region_name_len = len;
1597 			dst->region_name = malloc(len + 1);
1598 			memcpy(dst->region_name, mnl_attr_get_str(attr), len);
1599 			dst->region_name[len] = 0;
1600 		}
1601 	}
1602 
1603 	return MNL_CB_OK;
1604 }
1605 
1606 struct devlink_region_get_rsp *
1607 devlink_region_get(struct ynl_sock *ys, struct devlink_region_get_req *req)
1608 {
1609 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
1610 	struct devlink_region_get_rsp *rsp;
1611 	struct nlmsghdr *nlh;
1612 	int err;
1613 
1614 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_REGION_GET, 1);
1615 	ys->req_policy = &devlink_nest;
1616 	yrs.yarg.rsp_policy = &devlink_nest;
1617 
1618 	if (req->_present.bus_name_len)
1619 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1620 	if (req->_present.dev_name_len)
1621 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1622 	if (req->_present.port_index)
1623 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
1624 	if (req->_present.region_name_len)
1625 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_REGION_NAME, req->region_name);
1626 
1627 	rsp = calloc(1, sizeof(*rsp));
1628 	yrs.yarg.data = rsp;
1629 	yrs.cb = devlink_region_get_rsp_parse;
1630 	yrs.rsp_cmd = DEVLINK_CMD_REGION_GET;
1631 
1632 	err = ynl_exec(ys, nlh, &yrs);
1633 	if (err < 0)
1634 		goto err_free;
1635 
1636 	return rsp;
1637 
1638 err_free:
1639 	devlink_region_get_rsp_free(rsp);
1640 	return NULL;
1641 }
1642 
1643 /* DEVLINK_CMD_REGION_GET - dump */
1644 void devlink_region_get_list_free(struct devlink_region_get_list *rsp)
1645 {
1646 	struct devlink_region_get_list *next = rsp;
1647 
1648 	while ((void *)next != YNL_LIST_END) {
1649 		rsp = next;
1650 		next = rsp->next;
1651 
1652 		free(rsp->obj.bus_name);
1653 		free(rsp->obj.dev_name);
1654 		free(rsp->obj.region_name);
1655 		free(rsp);
1656 	}
1657 }
1658 
1659 struct devlink_region_get_list *
1660 devlink_region_get_dump(struct ynl_sock *ys,
1661 			struct devlink_region_get_req_dump *req)
1662 {
1663 	struct ynl_dump_state yds = {};
1664 	struct nlmsghdr *nlh;
1665 	int err;
1666 
1667 	yds.ys = ys;
1668 	yds.alloc_sz = sizeof(struct devlink_region_get_list);
1669 	yds.cb = devlink_region_get_rsp_parse;
1670 	yds.rsp_cmd = DEVLINK_CMD_REGION_GET;
1671 	yds.rsp_policy = &devlink_nest;
1672 
1673 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_REGION_GET, 1);
1674 	ys->req_policy = &devlink_nest;
1675 
1676 	if (req->_present.bus_name_len)
1677 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1678 	if (req->_present.dev_name_len)
1679 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1680 
1681 	err = ynl_exec_dump(ys, nlh, &yds);
1682 	if (err < 0)
1683 		goto free_list;
1684 
1685 	return yds.first;
1686 
1687 free_list:
1688 	devlink_region_get_list_free(yds.first);
1689 	return NULL;
1690 }
1691 
1692 /* ============== DEVLINK_CMD_INFO_GET ============== */
1693 /* DEVLINK_CMD_INFO_GET - do */
1694 void devlink_info_get_req_free(struct devlink_info_get_req *req)
1695 {
1696 	free(req->bus_name);
1697 	free(req->dev_name);
1698 	free(req);
1699 }
1700 
1701 void devlink_info_get_rsp_free(struct devlink_info_get_rsp *rsp)
1702 {
1703 	unsigned int i;
1704 
1705 	free(rsp->bus_name);
1706 	free(rsp->dev_name);
1707 	free(rsp->info_driver_name);
1708 	free(rsp->info_serial_number);
1709 	for (i = 0; i < rsp->n_info_version_fixed; i++)
1710 		devlink_dl_info_version_free(&rsp->info_version_fixed[i]);
1711 	free(rsp->info_version_fixed);
1712 	for (i = 0; i < rsp->n_info_version_running; i++)
1713 		devlink_dl_info_version_free(&rsp->info_version_running[i]);
1714 	free(rsp->info_version_running);
1715 	for (i = 0; i < rsp->n_info_version_stored; i++)
1716 		devlink_dl_info_version_free(&rsp->info_version_stored[i]);
1717 	free(rsp->info_version_stored);
1718 	free(rsp);
1719 }
1720 
1721 int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
1722 {
1723 	unsigned int n_info_version_running = 0;
1724 	unsigned int n_info_version_stored = 0;
1725 	unsigned int n_info_version_fixed = 0;
1726 	struct ynl_parse_arg *yarg = data;
1727 	struct devlink_info_get_rsp *dst;
1728 	const struct nlattr *attr;
1729 	struct ynl_parse_arg parg;
1730 	int i;
1731 
1732 	dst = yarg->data;
1733 	parg.ys = yarg->ys;
1734 
1735 	if (dst->info_version_fixed)
1736 		return ynl_error_parse(yarg, "attribute already present (devlink.info-version-fixed)");
1737 	if (dst->info_version_running)
1738 		return ynl_error_parse(yarg, "attribute already present (devlink.info-version-running)");
1739 	if (dst->info_version_stored)
1740 		return ynl_error_parse(yarg, "attribute already present (devlink.info-version-stored)");
1741 
1742 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1743 		unsigned int type = mnl_attr_get_type(attr);
1744 
1745 		if (type == DEVLINK_ATTR_BUS_NAME) {
1746 			unsigned int len;
1747 
1748 			if (ynl_attr_validate(yarg, attr))
1749 				return MNL_CB_ERROR;
1750 
1751 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1752 			dst->_present.bus_name_len = len;
1753 			dst->bus_name = malloc(len + 1);
1754 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
1755 			dst->bus_name[len] = 0;
1756 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
1757 			unsigned int len;
1758 
1759 			if (ynl_attr_validate(yarg, attr))
1760 				return MNL_CB_ERROR;
1761 
1762 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1763 			dst->_present.dev_name_len = len;
1764 			dst->dev_name = malloc(len + 1);
1765 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
1766 			dst->dev_name[len] = 0;
1767 		} else if (type == DEVLINK_ATTR_INFO_DRIVER_NAME) {
1768 			unsigned int len;
1769 
1770 			if (ynl_attr_validate(yarg, attr))
1771 				return MNL_CB_ERROR;
1772 
1773 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1774 			dst->_present.info_driver_name_len = len;
1775 			dst->info_driver_name = malloc(len + 1);
1776 			memcpy(dst->info_driver_name, mnl_attr_get_str(attr), len);
1777 			dst->info_driver_name[len] = 0;
1778 		} else if (type == DEVLINK_ATTR_INFO_SERIAL_NUMBER) {
1779 			unsigned int len;
1780 
1781 			if (ynl_attr_validate(yarg, attr))
1782 				return MNL_CB_ERROR;
1783 
1784 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1785 			dst->_present.info_serial_number_len = len;
1786 			dst->info_serial_number = malloc(len + 1);
1787 			memcpy(dst->info_serial_number, mnl_attr_get_str(attr), len);
1788 			dst->info_serial_number[len] = 0;
1789 		} else if (type == DEVLINK_ATTR_INFO_VERSION_FIXED) {
1790 			n_info_version_fixed++;
1791 		} else if (type == DEVLINK_ATTR_INFO_VERSION_RUNNING) {
1792 			n_info_version_running++;
1793 		} else if (type == DEVLINK_ATTR_INFO_VERSION_STORED) {
1794 			n_info_version_stored++;
1795 		}
1796 	}
1797 
1798 	if (n_info_version_fixed) {
1799 		dst->info_version_fixed = calloc(n_info_version_fixed, sizeof(*dst->info_version_fixed));
1800 		dst->n_info_version_fixed = n_info_version_fixed;
1801 		i = 0;
1802 		parg.rsp_policy = &devlink_dl_info_version_nest;
1803 		mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1804 			if (mnl_attr_get_type(attr) == DEVLINK_ATTR_INFO_VERSION_FIXED) {
1805 				parg.data = &dst->info_version_fixed[i];
1806 				if (devlink_dl_info_version_parse(&parg, attr))
1807 					return MNL_CB_ERROR;
1808 				i++;
1809 			}
1810 		}
1811 	}
1812 	if (n_info_version_running) {
1813 		dst->info_version_running = calloc(n_info_version_running, sizeof(*dst->info_version_running));
1814 		dst->n_info_version_running = n_info_version_running;
1815 		i = 0;
1816 		parg.rsp_policy = &devlink_dl_info_version_nest;
1817 		mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1818 			if (mnl_attr_get_type(attr) == DEVLINK_ATTR_INFO_VERSION_RUNNING) {
1819 				parg.data = &dst->info_version_running[i];
1820 				if (devlink_dl_info_version_parse(&parg, attr))
1821 					return MNL_CB_ERROR;
1822 				i++;
1823 			}
1824 		}
1825 	}
1826 	if (n_info_version_stored) {
1827 		dst->info_version_stored = calloc(n_info_version_stored, sizeof(*dst->info_version_stored));
1828 		dst->n_info_version_stored = n_info_version_stored;
1829 		i = 0;
1830 		parg.rsp_policy = &devlink_dl_info_version_nest;
1831 		mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1832 			if (mnl_attr_get_type(attr) == DEVLINK_ATTR_INFO_VERSION_STORED) {
1833 				parg.data = &dst->info_version_stored[i];
1834 				if (devlink_dl_info_version_parse(&parg, attr))
1835 					return MNL_CB_ERROR;
1836 				i++;
1837 			}
1838 		}
1839 	}
1840 
1841 	return MNL_CB_OK;
1842 }
1843 
1844 struct devlink_info_get_rsp *
1845 devlink_info_get(struct ynl_sock *ys, struct devlink_info_get_req *req)
1846 {
1847 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
1848 	struct devlink_info_get_rsp *rsp;
1849 	struct nlmsghdr *nlh;
1850 	int err;
1851 
1852 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_INFO_GET, 1);
1853 	ys->req_policy = &devlink_nest;
1854 	yrs.yarg.rsp_policy = &devlink_nest;
1855 
1856 	if (req->_present.bus_name_len)
1857 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
1858 	if (req->_present.dev_name_len)
1859 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
1860 
1861 	rsp = calloc(1, sizeof(*rsp));
1862 	yrs.yarg.data = rsp;
1863 	yrs.cb = devlink_info_get_rsp_parse;
1864 	yrs.rsp_cmd = DEVLINK_CMD_INFO_GET;
1865 
1866 	err = ynl_exec(ys, nlh, &yrs);
1867 	if (err < 0)
1868 		goto err_free;
1869 
1870 	return rsp;
1871 
1872 err_free:
1873 	devlink_info_get_rsp_free(rsp);
1874 	return NULL;
1875 }
1876 
1877 /* DEVLINK_CMD_INFO_GET - dump */
1878 void devlink_info_get_list_free(struct devlink_info_get_list *rsp)
1879 {
1880 	struct devlink_info_get_list *next = rsp;
1881 
1882 	while ((void *)next != YNL_LIST_END) {
1883 		unsigned int i;
1884 
1885 		rsp = next;
1886 		next = rsp->next;
1887 
1888 		free(rsp->obj.bus_name);
1889 		free(rsp->obj.dev_name);
1890 		free(rsp->obj.info_driver_name);
1891 		free(rsp->obj.info_serial_number);
1892 		for (i = 0; i < rsp->obj.n_info_version_fixed; i++)
1893 			devlink_dl_info_version_free(&rsp->obj.info_version_fixed[i]);
1894 		free(rsp->obj.info_version_fixed);
1895 		for (i = 0; i < rsp->obj.n_info_version_running; i++)
1896 			devlink_dl_info_version_free(&rsp->obj.info_version_running[i]);
1897 		free(rsp->obj.info_version_running);
1898 		for (i = 0; i < rsp->obj.n_info_version_stored; i++)
1899 			devlink_dl_info_version_free(&rsp->obj.info_version_stored[i]);
1900 		free(rsp->obj.info_version_stored);
1901 		free(rsp);
1902 	}
1903 }
1904 
1905 struct devlink_info_get_list *devlink_info_get_dump(struct ynl_sock *ys)
1906 {
1907 	struct ynl_dump_state yds = {};
1908 	struct nlmsghdr *nlh;
1909 	int err;
1910 
1911 	yds.ys = ys;
1912 	yds.alloc_sz = sizeof(struct devlink_info_get_list);
1913 	yds.cb = devlink_info_get_rsp_parse;
1914 	yds.rsp_cmd = DEVLINK_CMD_INFO_GET;
1915 	yds.rsp_policy = &devlink_nest;
1916 
1917 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_INFO_GET, 1);
1918 
1919 	err = ynl_exec_dump(ys, nlh, &yds);
1920 	if (err < 0)
1921 		goto free_list;
1922 
1923 	return yds.first;
1924 
1925 free_list:
1926 	devlink_info_get_list_free(yds.first);
1927 	return NULL;
1928 }
1929 
1930 /* ============== DEVLINK_CMD_HEALTH_REPORTER_GET ============== */
1931 /* DEVLINK_CMD_HEALTH_REPORTER_GET - do */
1932 void
1933 devlink_health_reporter_get_req_free(struct devlink_health_reporter_get_req *req)
1934 {
1935 	free(req->bus_name);
1936 	free(req->dev_name);
1937 	free(req->health_reporter_name);
1938 	free(req);
1939 }
1940 
1941 void
1942 devlink_health_reporter_get_rsp_free(struct devlink_health_reporter_get_rsp *rsp)
1943 {
1944 	free(rsp->bus_name);
1945 	free(rsp->dev_name);
1946 	free(rsp->health_reporter_name);
1947 	free(rsp);
1948 }
1949 
1950 int devlink_health_reporter_get_rsp_parse(const struct nlmsghdr *nlh,
1951 					  void *data)
1952 {
1953 	struct devlink_health_reporter_get_rsp *dst;
1954 	struct ynl_parse_arg *yarg = data;
1955 	const struct nlattr *attr;
1956 
1957 	dst = yarg->data;
1958 
1959 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
1960 		unsigned int type = mnl_attr_get_type(attr);
1961 
1962 		if (type == DEVLINK_ATTR_BUS_NAME) {
1963 			unsigned int len;
1964 
1965 			if (ynl_attr_validate(yarg, attr))
1966 				return MNL_CB_ERROR;
1967 
1968 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1969 			dst->_present.bus_name_len = len;
1970 			dst->bus_name = malloc(len + 1);
1971 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
1972 			dst->bus_name[len] = 0;
1973 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
1974 			unsigned int len;
1975 
1976 			if (ynl_attr_validate(yarg, attr))
1977 				return MNL_CB_ERROR;
1978 
1979 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1980 			dst->_present.dev_name_len = len;
1981 			dst->dev_name = malloc(len + 1);
1982 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
1983 			dst->dev_name[len] = 0;
1984 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
1985 			if (ynl_attr_validate(yarg, attr))
1986 				return MNL_CB_ERROR;
1987 			dst->_present.port_index = 1;
1988 			dst->port_index = mnl_attr_get_u32(attr);
1989 		} else if (type == DEVLINK_ATTR_HEALTH_REPORTER_NAME) {
1990 			unsigned int len;
1991 
1992 			if (ynl_attr_validate(yarg, attr))
1993 				return MNL_CB_ERROR;
1994 
1995 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
1996 			dst->_present.health_reporter_name_len = len;
1997 			dst->health_reporter_name = malloc(len + 1);
1998 			memcpy(dst->health_reporter_name, mnl_attr_get_str(attr), len);
1999 			dst->health_reporter_name[len] = 0;
2000 		}
2001 	}
2002 
2003 	return MNL_CB_OK;
2004 }
2005 
2006 struct devlink_health_reporter_get_rsp *
2007 devlink_health_reporter_get(struct ynl_sock *ys,
2008 			    struct devlink_health_reporter_get_req *req)
2009 {
2010 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2011 	struct devlink_health_reporter_get_rsp *rsp;
2012 	struct nlmsghdr *nlh;
2013 	int err;
2014 
2015 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1);
2016 	ys->req_policy = &devlink_nest;
2017 	yrs.yarg.rsp_policy = &devlink_nest;
2018 
2019 	if (req->_present.bus_name_len)
2020 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2021 	if (req->_present.dev_name_len)
2022 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2023 	if (req->_present.port_index)
2024 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
2025 	if (req->_present.health_reporter_name_len)
2026 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name);
2027 
2028 	rsp = calloc(1, sizeof(*rsp));
2029 	yrs.yarg.data = rsp;
2030 	yrs.cb = devlink_health_reporter_get_rsp_parse;
2031 	yrs.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET;
2032 
2033 	err = ynl_exec(ys, nlh, &yrs);
2034 	if (err < 0)
2035 		goto err_free;
2036 
2037 	return rsp;
2038 
2039 err_free:
2040 	devlink_health_reporter_get_rsp_free(rsp);
2041 	return NULL;
2042 }
2043 
2044 /* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */
2045 void
2046 devlink_health_reporter_get_list_free(struct devlink_health_reporter_get_list *rsp)
2047 {
2048 	struct devlink_health_reporter_get_list *next = rsp;
2049 
2050 	while ((void *)next != YNL_LIST_END) {
2051 		rsp = next;
2052 		next = rsp->next;
2053 
2054 		free(rsp->obj.bus_name);
2055 		free(rsp->obj.dev_name);
2056 		free(rsp->obj.health_reporter_name);
2057 		free(rsp);
2058 	}
2059 }
2060 
2061 struct devlink_health_reporter_get_list *
2062 devlink_health_reporter_get_dump(struct ynl_sock *ys,
2063 				 struct devlink_health_reporter_get_req_dump *req)
2064 {
2065 	struct ynl_dump_state yds = {};
2066 	struct nlmsghdr *nlh;
2067 	int err;
2068 
2069 	yds.ys = ys;
2070 	yds.alloc_sz = sizeof(struct devlink_health_reporter_get_list);
2071 	yds.cb = devlink_health_reporter_get_rsp_parse;
2072 	yds.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET;
2073 	yds.rsp_policy = &devlink_nest;
2074 
2075 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1);
2076 	ys->req_policy = &devlink_nest;
2077 
2078 	if (req->_present.bus_name_len)
2079 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2080 	if (req->_present.dev_name_len)
2081 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2082 	if (req->_present.port_index)
2083 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
2084 
2085 	err = ynl_exec_dump(ys, nlh, &yds);
2086 	if (err < 0)
2087 		goto free_list;
2088 
2089 	return yds.first;
2090 
2091 free_list:
2092 	devlink_health_reporter_get_list_free(yds.first);
2093 	return NULL;
2094 }
2095 
2096 /* ============== DEVLINK_CMD_TRAP_GET ============== */
2097 /* DEVLINK_CMD_TRAP_GET - do */
2098 void devlink_trap_get_req_free(struct devlink_trap_get_req *req)
2099 {
2100 	free(req->bus_name);
2101 	free(req->dev_name);
2102 	free(req->trap_name);
2103 	free(req);
2104 }
2105 
2106 void devlink_trap_get_rsp_free(struct devlink_trap_get_rsp *rsp)
2107 {
2108 	free(rsp->bus_name);
2109 	free(rsp->dev_name);
2110 	free(rsp->trap_name);
2111 	free(rsp);
2112 }
2113 
2114 int devlink_trap_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
2115 {
2116 	struct ynl_parse_arg *yarg = data;
2117 	struct devlink_trap_get_rsp *dst;
2118 	const struct nlattr *attr;
2119 
2120 	dst = yarg->data;
2121 
2122 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
2123 		unsigned int type = mnl_attr_get_type(attr);
2124 
2125 		if (type == DEVLINK_ATTR_BUS_NAME) {
2126 			unsigned int len;
2127 
2128 			if (ynl_attr_validate(yarg, attr))
2129 				return MNL_CB_ERROR;
2130 
2131 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2132 			dst->_present.bus_name_len = len;
2133 			dst->bus_name = malloc(len + 1);
2134 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
2135 			dst->bus_name[len] = 0;
2136 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
2137 			unsigned int len;
2138 
2139 			if (ynl_attr_validate(yarg, attr))
2140 				return MNL_CB_ERROR;
2141 
2142 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2143 			dst->_present.dev_name_len = len;
2144 			dst->dev_name = malloc(len + 1);
2145 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
2146 			dst->dev_name[len] = 0;
2147 		} else if (type == DEVLINK_ATTR_TRAP_NAME) {
2148 			unsigned int len;
2149 
2150 			if (ynl_attr_validate(yarg, attr))
2151 				return MNL_CB_ERROR;
2152 
2153 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2154 			dst->_present.trap_name_len = len;
2155 			dst->trap_name = malloc(len + 1);
2156 			memcpy(dst->trap_name, mnl_attr_get_str(attr), len);
2157 			dst->trap_name[len] = 0;
2158 		}
2159 	}
2160 
2161 	return MNL_CB_OK;
2162 }
2163 
2164 struct devlink_trap_get_rsp *
2165 devlink_trap_get(struct ynl_sock *ys, struct devlink_trap_get_req *req)
2166 {
2167 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2168 	struct devlink_trap_get_rsp *rsp;
2169 	struct nlmsghdr *nlh;
2170 	int err;
2171 
2172 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GET, 1);
2173 	ys->req_policy = &devlink_nest;
2174 	yrs.yarg.rsp_policy = &devlink_nest;
2175 
2176 	if (req->_present.bus_name_len)
2177 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2178 	if (req->_present.dev_name_len)
2179 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2180 	if (req->_present.trap_name_len)
2181 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_NAME, req->trap_name);
2182 
2183 	rsp = calloc(1, sizeof(*rsp));
2184 	yrs.yarg.data = rsp;
2185 	yrs.cb = devlink_trap_get_rsp_parse;
2186 	yrs.rsp_cmd = DEVLINK_CMD_TRAP_GET;
2187 
2188 	err = ynl_exec(ys, nlh, &yrs);
2189 	if (err < 0)
2190 		goto err_free;
2191 
2192 	return rsp;
2193 
2194 err_free:
2195 	devlink_trap_get_rsp_free(rsp);
2196 	return NULL;
2197 }
2198 
2199 /* DEVLINK_CMD_TRAP_GET - dump */
2200 void devlink_trap_get_list_free(struct devlink_trap_get_list *rsp)
2201 {
2202 	struct devlink_trap_get_list *next = rsp;
2203 
2204 	while ((void *)next != YNL_LIST_END) {
2205 		rsp = next;
2206 		next = rsp->next;
2207 
2208 		free(rsp->obj.bus_name);
2209 		free(rsp->obj.dev_name);
2210 		free(rsp->obj.trap_name);
2211 		free(rsp);
2212 	}
2213 }
2214 
2215 struct devlink_trap_get_list *
2216 devlink_trap_get_dump(struct ynl_sock *ys,
2217 		      struct devlink_trap_get_req_dump *req)
2218 {
2219 	struct ynl_dump_state yds = {};
2220 	struct nlmsghdr *nlh;
2221 	int err;
2222 
2223 	yds.ys = ys;
2224 	yds.alloc_sz = sizeof(struct devlink_trap_get_list);
2225 	yds.cb = devlink_trap_get_rsp_parse;
2226 	yds.rsp_cmd = DEVLINK_CMD_TRAP_GET;
2227 	yds.rsp_policy = &devlink_nest;
2228 
2229 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_GET, 1);
2230 	ys->req_policy = &devlink_nest;
2231 
2232 	if (req->_present.bus_name_len)
2233 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2234 	if (req->_present.dev_name_len)
2235 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2236 
2237 	err = ynl_exec_dump(ys, nlh, &yds);
2238 	if (err < 0)
2239 		goto free_list;
2240 
2241 	return yds.first;
2242 
2243 free_list:
2244 	devlink_trap_get_list_free(yds.first);
2245 	return NULL;
2246 }
2247 
2248 /* ============== DEVLINK_CMD_TRAP_GROUP_GET ============== */
2249 /* DEVLINK_CMD_TRAP_GROUP_GET - do */
2250 void devlink_trap_group_get_req_free(struct devlink_trap_group_get_req *req)
2251 {
2252 	free(req->bus_name);
2253 	free(req->dev_name);
2254 	free(req->trap_group_name);
2255 	free(req);
2256 }
2257 
2258 void devlink_trap_group_get_rsp_free(struct devlink_trap_group_get_rsp *rsp)
2259 {
2260 	free(rsp->bus_name);
2261 	free(rsp->dev_name);
2262 	free(rsp->trap_group_name);
2263 	free(rsp);
2264 }
2265 
2266 int devlink_trap_group_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
2267 {
2268 	struct devlink_trap_group_get_rsp *dst;
2269 	struct ynl_parse_arg *yarg = data;
2270 	const struct nlattr *attr;
2271 
2272 	dst = yarg->data;
2273 
2274 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
2275 		unsigned int type = mnl_attr_get_type(attr);
2276 
2277 		if (type == DEVLINK_ATTR_BUS_NAME) {
2278 			unsigned int len;
2279 
2280 			if (ynl_attr_validate(yarg, attr))
2281 				return MNL_CB_ERROR;
2282 
2283 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2284 			dst->_present.bus_name_len = len;
2285 			dst->bus_name = malloc(len + 1);
2286 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
2287 			dst->bus_name[len] = 0;
2288 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
2289 			unsigned int len;
2290 
2291 			if (ynl_attr_validate(yarg, attr))
2292 				return MNL_CB_ERROR;
2293 
2294 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2295 			dst->_present.dev_name_len = len;
2296 			dst->dev_name = malloc(len + 1);
2297 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
2298 			dst->dev_name[len] = 0;
2299 		} else if (type == DEVLINK_ATTR_TRAP_GROUP_NAME) {
2300 			unsigned int len;
2301 
2302 			if (ynl_attr_validate(yarg, attr))
2303 				return MNL_CB_ERROR;
2304 
2305 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2306 			dst->_present.trap_group_name_len = len;
2307 			dst->trap_group_name = malloc(len + 1);
2308 			memcpy(dst->trap_group_name, mnl_attr_get_str(attr), len);
2309 			dst->trap_group_name[len] = 0;
2310 		}
2311 	}
2312 
2313 	return MNL_CB_OK;
2314 }
2315 
2316 struct devlink_trap_group_get_rsp *
2317 devlink_trap_group_get(struct ynl_sock *ys,
2318 		       struct devlink_trap_group_get_req *req)
2319 {
2320 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2321 	struct devlink_trap_group_get_rsp *rsp;
2322 	struct nlmsghdr *nlh;
2323 	int err;
2324 
2325 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1);
2326 	ys->req_policy = &devlink_nest;
2327 	yrs.yarg.rsp_policy = &devlink_nest;
2328 
2329 	if (req->_present.bus_name_len)
2330 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2331 	if (req->_present.dev_name_len)
2332 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2333 	if (req->_present.trap_group_name_len)
2334 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req->trap_group_name);
2335 
2336 	rsp = calloc(1, sizeof(*rsp));
2337 	yrs.yarg.data = rsp;
2338 	yrs.cb = devlink_trap_group_get_rsp_parse;
2339 	yrs.rsp_cmd = DEVLINK_CMD_TRAP_GROUP_GET;
2340 
2341 	err = ynl_exec(ys, nlh, &yrs);
2342 	if (err < 0)
2343 		goto err_free;
2344 
2345 	return rsp;
2346 
2347 err_free:
2348 	devlink_trap_group_get_rsp_free(rsp);
2349 	return NULL;
2350 }
2351 
2352 /* DEVLINK_CMD_TRAP_GROUP_GET - dump */
2353 void devlink_trap_group_get_list_free(struct devlink_trap_group_get_list *rsp)
2354 {
2355 	struct devlink_trap_group_get_list *next = rsp;
2356 
2357 	while ((void *)next != YNL_LIST_END) {
2358 		rsp = next;
2359 		next = rsp->next;
2360 
2361 		free(rsp->obj.bus_name);
2362 		free(rsp->obj.dev_name);
2363 		free(rsp->obj.trap_group_name);
2364 		free(rsp);
2365 	}
2366 }
2367 
2368 struct devlink_trap_group_get_list *
2369 devlink_trap_group_get_dump(struct ynl_sock *ys,
2370 			    struct devlink_trap_group_get_req_dump *req)
2371 {
2372 	struct ynl_dump_state yds = {};
2373 	struct nlmsghdr *nlh;
2374 	int err;
2375 
2376 	yds.ys = ys;
2377 	yds.alloc_sz = sizeof(struct devlink_trap_group_get_list);
2378 	yds.cb = devlink_trap_group_get_rsp_parse;
2379 	yds.rsp_cmd = DEVLINK_CMD_TRAP_GROUP_GET;
2380 	yds.rsp_policy = &devlink_nest;
2381 
2382 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1);
2383 	ys->req_policy = &devlink_nest;
2384 
2385 	if (req->_present.bus_name_len)
2386 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2387 	if (req->_present.dev_name_len)
2388 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2389 
2390 	err = ynl_exec_dump(ys, nlh, &yds);
2391 	if (err < 0)
2392 		goto free_list;
2393 
2394 	return yds.first;
2395 
2396 free_list:
2397 	devlink_trap_group_get_list_free(yds.first);
2398 	return NULL;
2399 }
2400 
2401 /* ============== DEVLINK_CMD_TRAP_POLICER_GET ============== */
2402 /* DEVLINK_CMD_TRAP_POLICER_GET - do */
2403 void
2404 devlink_trap_policer_get_req_free(struct devlink_trap_policer_get_req *req)
2405 {
2406 	free(req->bus_name);
2407 	free(req->dev_name);
2408 	free(req);
2409 }
2410 
2411 void
2412 devlink_trap_policer_get_rsp_free(struct devlink_trap_policer_get_rsp *rsp)
2413 {
2414 	free(rsp->bus_name);
2415 	free(rsp->dev_name);
2416 	free(rsp);
2417 }
2418 
2419 int devlink_trap_policer_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
2420 {
2421 	struct devlink_trap_policer_get_rsp *dst;
2422 	struct ynl_parse_arg *yarg = data;
2423 	const struct nlattr *attr;
2424 
2425 	dst = yarg->data;
2426 
2427 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
2428 		unsigned int type = mnl_attr_get_type(attr);
2429 
2430 		if (type == DEVLINK_ATTR_BUS_NAME) {
2431 			unsigned int len;
2432 
2433 			if (ynl_attr_validate(yarg, attr))
2434 				return MNL_CB_ERROR;
2435 
2436 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2437 			dst->_present.bus_name_len = len;
2438 			dst->bus_name = malloc(len + 1);
2439 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
2440 			dst->bus_name[len] = 0;
2441 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
2442 			unsigned int len;
2443 
2444 			if (ynl_attr_validate(yarg, attr))
2445 				return MNL_CB_ERROR;
2446 
2447 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2448 			dst->_present.dev_name_len = len;
2449 			dst->dev_name = malloc(len + 1);
2450 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
2451 			dst->dev_name[len] = 0;
2452 		} else if (type == DEVLINK_ATTR_TRAP_POLICER_ID) {
2453 			if (ynl_attr_validate(yarg, attr))
2454 				return MNL_CB_ERROR;
2455 			dst->_present.trap_policer_id = 1;
2456 			dst->trap_policer_id = mnl_attr_get_u32(attr);
2457 		}
2458 	}
2459 
2460 	return MNL_CB_OK;
2461 }
2462 
2463 struct devlink_trap_policer_get_rsp *
2464 devlink_trap_policer_get(struct ynl_sock *ys,
2465 			 struct devlink_trap_policer_get_req *req)
2466 {
2467 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2468 	struct devlink_trap_policer_get_rsp *rsp;
2469 	struct nlmsghdr *nlh;
2470 	int err;
2471 
2472 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1);
2473 	ys->req_policy = &devlink_nest;
2474 	yrs.yarg.rsp_policy = &devlink_nest;
2475 
2476 	if (req->_present.bus_name_len)
2477 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2478 	if (req->_present.dev_name_len)
2479 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2480 	if (req->_present.trap_policer_id)
2481 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req->trap_policer_id);
2482 
2483 	rsp = calloc(1, sizeof(*rsp));
2484 	yrs.yarg.data = rsp;
2485 	yrs.cb = devlink_trap_policer_get_rsp_parse;
2486 	yrs.rsp_cmd = DEVLINK_CMD_TRAP_POLICER_GET;
2487 
2488 	err = ynl_exec(ys, nlh, &yrs);
2489 	if (err < 0)
2490 		goto err_free;
2491 
2492 	return rsp;
2493 
2494 err_free:
2495 	devlink_trap_policer_get_rsp_free(rsp);
2496 	return NULL;
2497 }
2498 
2499 /* DEVLINK_CMD_TRAP_POLICER_GET - dump */
2500 void
2501 devlink_trap_policer_get_list_free(struct devlink_trap_policer_get_list *rsp)
2502 {
2503 	struct devlink_trap_policer_get_list *next = rsp;
2504 
2505 	while ((void *)next != YNL_LIST_END) {
2506 		rsp = next;
2507 		next = rsp->next;
2508 
2509 		free(rsp->obj.bus_name);
2510 		free(rsp->obj.dev_name);
2511 		free(rsp);
2512 	}
2513 }
2514 
2515 struct devlink_trap_policer_get_list *
2516 devlink_trap_policer_get_dump(struct ynl_sock *ys,
2517 			      struct devlink_trap_policer_get_req_dump *req)
2518 {
2519 	struct ynl_dump_state yds = {};
2520 	struct nlmsghdr *nlh;
2521 	int err;
2522 
2523 	yds.ys = ys;
2524 	yds.alloc_sz = sizeof(struct devlink_trap_policer_get_list);
2525 	yds.cb = devlink_trap_policer_get_rsp_parse;
2526 	yds.rsp_cmd = DEVLINK_CMD_TRAP_POLICER_GET;
2527 	yds.rsp_policy = &devlink_nest;
2528 
2529 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1);
2530 	ys->req_policy = &devlink_nest;
2531 
2532 	if (req->_present.bus_name_len)
2533 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2534 	if (req->_present.dev_name_len)
2535 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2536 
2537 	err = ynl_exec_dump(ys, nlh, &yds);
2538 	if (err < 0)
2539 		goto free_list;
2540 
2541 	return yds.first;
2542 
2543 free_list:
2544 	devlink_trap_policer_get_list_free(yds.first);
2545 	return NULL;
2546 }
2547 
2548 /* ============== DEVLINK_CMD_RATE_GET ============== */
2549 /* DEVLINK_CMD_RATE_GET - do */
2550 void devlink_rate_get_req_free(struct devlink_rate_get_req *req)
2551 {
2552 	free(req->bus_name);
2553 	free(req->dev_name);
2554 	free(req->rate_node_name);
2555 	free(req);
2556 }
2557 
2558 void devlink_rate_get_rsp_free(struct devlink_rate_get_rsp *rsp)
2559 {
2560 	free(rsp->bus_name);
2561 	free(rsp->dev_name);
2562 	free(rsp->rate_node_name);
2563 	free(rsp);
2564 }
2565 
2566 int devlink_rate_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
2567 {
2568 	struct ynl_parse_arg *yarg = data;
2569 	struct devlink_rate_get_rsp *dst;
2570 	const struct nlattr *attr;
2571 
2572 	dst = yarg->data;
2573 
2574 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
2575 		unsigned int type = mnl_attr_get_type(attr);
2576 
2577 		if (type == DEVLINK_ATTR_BUS_NAME) {
2578 			unsigned int len;
2579 
2580 			if (ynl_attr_validate(yarg, attr))
2581 				return MNL_CB_ERROR;
2582 
2583 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2584 			dst->_present.bus_name_len = len;
2585 			dst->bus_name = malloc(len + 1);
2586 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
2587 			dst->bus_name[len] = 0;
2588 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
2589 			unsigned int len;
2590 
2591 			if (ynl_attr_validate(yarg, attr))
2592 				return MNL_CB_ERROR;
2593 
2594 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2595 			dst->_present.dev_name_len = len;
2596 			dst->dev_name = malloc(len + 1);
2597 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
2598 			dst->dev_name[len] = 0;
2599 		} else if (type == DEVLINK_ATTR_PORT_INDEX) {
2600 			if (ynl_attr_validate(yarg, attr))
2601 				return MNL_CB_ERROR;
2602 			dst->_present.port_index = 1;
2603 			dst->port_index = mnl_attr_get_u32(attr);
2604 		} else if (type == DEVLINK_ATTR_RATE_NODE_NAME) {
2605 			unsigned int len;
2606 
2607 			if (ynl_attr_validate(yarg, attr))
2608 				return MNL_CB_ERROR;
2609 
2610 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2611 			dst->_present.rate_node_name_len = len;
2612 			dst->rate_node_name = malloc(len + 1);
2613 			memcpy(dst->rate_node_name, mnl_attr_get_str(attr), len);
2614 			dst->rate_node_name[len] = 0;
2615 		}
2616 	}
2617 
2618 	return MNL_CB_OK;
2619 }
2620 
2621 struct devlink_rate_get_rsp *
2622 devlink_rate_get(struct ynl_sock *ys, struct devlink_rate_get_req *req)
2623 {
2624 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2625 	struct devlink_rate_get_rsp *rsp;
2626 	struct nlmsghdr *nlh;
2627 	int err;
2628 
2629 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RATE_GET, 1);
2630 	ys->req_policy = &devlink_nest;
2631 	yrs.yarg.rsp_policy = &devlink_nest;
2632 
2633 	if (req->_present.bus_name_len)
2634 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2635 	if (req->_present.dev_name_len)
2636 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2637 	if (req->_present.port_index)
2638 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index);
2639 	if (req->_present.rate_node_name_len)
2640 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name);
2641 
2642 	rsp = calloc(1, sizeof(*rsp));
2643 	yrs.yarg.data = rsp;
2644 	yrs.cb = devlink_rate_get_rsp_parse;
2645 	yrs.rsp_cmd = DEVLINK_CMD_RATE_GET;
2646 
2647 	err = ynl_exec(ys, nlh, &yrs);
2648 	if (err < 0)
2649 		goto err_free;
2650 
2651 	return rsp;
2652 
2653 err_free:
2654 	devlink_rate_get_rsp_free(rsp);
2655 	return NULL;
2656 }
2657 
2658 /* DEVLINK_CMD_RATE_GET - dump */
2659 void devlink_rate_get_list_free(struct devlink_rate_get_list *rsp)
2660 {
2661 	struct devlink_rate_get_list *next = rsp;
2662 
2663 	while ((void *)next != YNL_LIST_END) {
2664 		rsp = next;
2665 		next = rsp->next;
2666 
2667 		free(rsp->obj.bus_name);
2668 		free(rsp->obj.dev_name);
2669 		free(rsp->obj.rate_node_name);
2670 		free(rsp);
2671 	}
2672 }
2673 
2674 struct devlink_rate_get_list *
2675 devlink_rate_get_dump(struct ynl_sock *ys,
2676 		      struct devlink_rate_get_req_dump *req)
2677 {
2678 	struct ynl_dump_state yds = {};
2679 	struct nlmsghdr *nlh;
2680 	int err;
2681 
2682 	yds.ys = ys;
2683 	yds.alloc_sz = sizeof(struct devlink_rate_get_list);
2684 	yds.cb = devlink_rate_get_rsp_parse;
2685 	yds.rsp_cmd = DEVLINK_CMD_RATE_GET;
2686 	yds.rsp_policy = &devlink_nest;
2687 
2688 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_RATE_GET, 1);
2689 	ys->req_policy = &devlink_nest;
2690 
2691 	if (req->_present.bus_name_len)
2692 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2693 	if (req->_present.dev_name_len)
2694 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2695 
2696 	err = ynl_exec_dump(ys, nlh, &yds);
2697 	if (err < 0)
2698 		goto free_list;
2699 
2700 	return yds.first;
2701 
2702 free_list:
2703 	devlink_rate_get_list_free(yds.first);
2704 	return NULL;
2705 }
2706 
2707 /* ============== DEVLINK_CMD_LINECARD_GET ============== */
2708 /* DEVLINK_CMD_LINECARD_GET - do */
2709 void devlink_linecard_get_req_free(struct devlink_linecard_get_req *req)
2710 {
2711 	free(req->bus_name);
2712 	free(req->dev_name);
2713 	free(req);
2714 }
2715 
2716 void devlink_linecard_get_rsp_free(struct devlink_linecard_get_rsp *rsp)
2717 {
2718 	free(rsp->bus_name);
2719 	free(rsp->dev_name);
2720 	free(rsp);
2721 }
2722 
2723 int devlink_linecard_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
2724 {
2725 	struct devlink_linecard_get_rsp *dst;
2726 	struct ynl_parse_arg *yarg = data;
2727 	const struct nlattr *attr;
2728 
2729 	dst = yarg->data;
2730 
2731 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
2732 		unsigned int type = mnl_attr_get_type(attr);
2733 
2734 		if (type == DEVLINK_ATTR_BUS_NAME) {
2735 			unsigned int len;
2736 
2737 			if (ynl_attr_validate(yarg, attr))
2738 				return MNL_CB_ERROR;
2739 
2740 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2741 			dst->_present.bus_name_len = len;
2742 			dst->bus_name = malloc(len + 1);
2743 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
2744 			dst->bus_name[len] = 0;
2745 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
2746 			unsigned int len;
2747 
2748 			if (ynl_attr_validate(yarg, attr))
2749 				return MNL_CB_ERROR;
2750 
2751 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2752 			dst->_present.dev_name_len = len;
2753 			dst->dev_name = malloc(len + 1);
2754 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
2755 			dst->dev_name[len] = 0;
2756 		} else if (type == DEVLINK_ATTR_LINECARD_INDEX) {
2757 			if (ynl_attr_validate(yarg, attr))
2758 				return MNL_CB_ERROR;
2759 			dst->_present.linecard_index = 1;
2760 			dst->linecard_index = mnl_attr_get_u32(attr);
2761 		}
2762 	}
2763 
2764 	return MNL_CB_OK;
2765 }
2766 
2767 struct devlink_linecard_get_rsp *
2768 devlink_linecard_get(struct ynl_sock *ys, struct devlink_linecard_get_req *req)
2769 {
2770 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2771 	struct devlink_linecard_get_rsp *rsp;
2772 	struct nlmsghdr *nlh;
2773 	int err;
2774 
2775 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_LINECARD_GET, 1);
2776 	ys->req_policy = &devlink_nest;
2777 	yrs.yarg.rsp_policy = &devlink_nest;
2778 
2779 	if (req->_present.bus_name_len)
2780 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2781 	if (req->_present.dev_name_len)
2782 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2783 	if (req->_present.linecard_index)
2784 		mnl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req->linecard_index);
2785 
2786 	rsp = calloc(1, sizeof(*rsp));
2787 	yrs.yarg.data = rsp;
2788 	yrs.cb = devlink_linecard_get_rsp_parse;
2789 	yrs.rsp_cmd = DEVLINK_CMD_LINECARD_GET;
2790 
2791 	err = ynl_exec(ys, nlh, &yrs);
2792 	if (err < 0)
2793 		goto err_free;
2794 
2795 	return rsp;
2796 
2797 err_free:
2798 	devlink_linecard_get_rsp_free(rsp);
2799 	return NULL;
2800 }
2801 
2802 /* DEVLINK_CMD_LINECARD_GET - dump */
2803 void devlink_linecard_get_list_free(struct devlink_linecard_get_list *rsp)
2804 {
2805 	struct devlink_linecard_get_list *next = rsp;
2806 
2807 	while ((void *)next != YNL_LIST_END) {
2808 		rsp = next;
2809 		next = rsp->next;
2810 
2811 		free(rsp->obj.bus_name);
2812 		free(rsp->obj.dev_name);
2813 		free(rsp);
2814 	}
2815 }
2816 
2817 struct devlink_linecard_get_list *
2818 devlink_linecard_get_dump(struct ynl_sock *ys,
2819 			  struct devlink_linecard_get_req_dump *req)
2820 {
2821 	struct ynl_dump_state yds = {};
2822 	struct nlmsghdr *nlh;
2823 	int err;
2824 
2825 	yds.ys = ys;
2826 	yds.alloc_sz = sizeof(struct devlink_linecard_get_list);
2827 	yds.cb = devlink_linecard_get_rsp_parse;
2828 	yds.rsp_cmd = DEVLINK_CMD_LINECARD_GET;
2829 	yds.rsp_policy = &devlink_nest;
2830 
2831 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_LINECARD_GET, 1);
2832 	ys->req_policy = &devlink_nest;
2833 
2834 	if (req->_present.bus_name_len)
2835 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2836 	if (req->_present.dev_name_len)
2837 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2838 
2839 	err = ynl_exec_dump(ys, nlh, &yds);
2840 	if (err < 0)
2841 		goto free_list;
2842 
2843 	return yds.first;
2844 
2845 free_list:
2846 	devlink_linecard_get_list_free(yds.first);
2847 	return NULL;
2848 }
2849 
2850 /* ============== DEVLINK_CMD_SELFTESTS_GET ============== */
2851 /* DEVLINK_CMD_SELFTESTS_GET - do */
2852 void devlink_selftests_get_req_free(struct devlink_selftests_get_req *req)
2853 {
2854 	free(req->bus_name);
2855 	free(req->dev_name);
2856 	free(req);
2857 }
2858 
2859 void devlink_selftests_get_rsp_free(struct devlink_selftests_get_rsp *rsp)
2860 {
2861 	free(rsp->bus_name);
2862 	free(rsp->dev_name);
2863 	free(rsp);
2864 }
2865 
2866 int devlink_selftests_get_rsp_parse(const struct nlmsghdr *nlh, void *data)
2867 {
2868 	struct devlink_selftests_get_rsp *dst;
2869 	struct ynl_parse_arg *yarg = data;
2870 	const struct nlattr *attr;
2871 
2872 	dst = yarg->data;
2873 
2874 	mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
2875 		unsigned int type = mnl_attr_get_type(attr);
2876 
2877 		if (type == DEVLINK_ATTR_BUS_NAME) {
2878 			unsigned int len;
2879 
2880 			if (ynl_attr_validate(yarg, attr))
2881 				return MNL_CB_ERROR;
2882 
2883 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2884 			dst->_present.bus_name_len = len;
2885 			dst->bus_name = malloc(len + 1);
2886 			memcpy(dst->bus_name, mnl_attr_get_str(attr), len);
2887 			dst->bus_name[len] = 0;
2888 		} else if (type == DEVLINK_ATTR_DEV_NAME) {
2889 			unsigned int len;
2890 
2891 			if (ynl_attr_validate(yarg, attr))
2892 				return MNL_CB_ERROR;
2893 
2894 			len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr));
2895 			dst->_present.dev_name_len = len;
2896 			dst->dev_name = malloc(len + 1);
2897 			memcpy(dst->dev_name, mnl_attr_get_str(attr), len);
2898 			dst->dev_name[len] = 0;
2899 		}
2900 	}
2901 
2902 	return MNL_CB_OK;
2903 }
2904 
2905 struct devlink_selftests_get_rsp *
2906 devlink_selftests_get(struct ynl_sock *ys,
2907 		      struct devlink_selftests_get_req *req)
2908 {
2909 	struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
2910 	struct devlink_selftests_get_rsp *rsp;
2911 	struct nlmsghdr *nlh;
2912 	int err;
2913 
2914 	nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_GET, 1);
2915 	ys->req_policy = &devlink_nest;
2916 	yrs.yarg.rsp_policy = &devlink_nest;
2917 
2918 	if (req->_present.bus_name_len)
2919 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name);
2920 	if (req->_present.dev_name_len)
2921 		mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name);
2922 
2923 	rsp = calloc(1, sizeof(*rsp));
2924 	yrs.yarg.data = rsp;
2925 	yrs.cb = devlink_selftests_get_rsp_parse;
2926 	yrs.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET;
2927 
2928 	err = ynl_exec(ys, nlh, &yrs);
2929 	if (err < 0)
2930 		goto err_free;
2931 
2932 	return rsp;
2933 
2934 err_free:
2935 	devlink_selftests_get_rsp_free(rsp);
2936 	return NULL;
2937 }
2938 
2939 /* DEVLINK_CMD_SELFTESTS_GET - dump */
2940 void devlink_selftests_get_list_free(struct devlink_selftests_get_list *rsp)
2941 {
2942 	struct devlink_selftests_get_list *next = rsp;
2943 
2944 	while ((void *)next != YNL_LIST_END) {
2945 		rsp = next;
2946 		next = rsp->next;
2947 
2948 		free(rsp->obj.bus_name);
2949 		free(rsp->obj.dev_name);
2950 		free(rsp);
2951 	}
2952 }
2953 
2954 struct devlink_selftests_get_list *
2955 devlink_selftests_get_dump(struct ynl_sock *ys)
2956 {
2957 	struct ynl_dump_state yds = {};
2958 	struct nlmsghdr *nlh;
2959 	int err;
2960 
2961 	yds.ys = ys;
2962 	yds.alloc_sz = sizeof(struct devlink_selftests_get_list);
2963 	yds.cb = devlink_selftests_get_rsp_parse;
2964 	yds.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET;
2965 	yds.rsp_policy = &devlink_nest;
2966 
2967 	nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_GET, 1);
2968 
2969 	err = ynl_exec_dump(ys, nlh, &yds);
2970 	if (err < 0)
2971 		goto free_list;
2972 
2973 	return yds.first;
2974 
2975 free_list:
2976 	devlink_selftests_get_list_free(yds.first);
2977 	return NULL;
2978 }
2979 
2980 const struct ynl_family ynl_devlink_family =  {
2981 	.name		= "devlink",
2982 };
2983