diff --git a/tmp/ynl_build-tmp.q1fYKQ/old-code/devlink-user.c b/tmp/ynl_build-tmp.q1fYKQ/new-code/devlink-user.c index f26c46338406..96dd72bca249 100644 --- a/tmp/ynl_build-tmp.q1fYKQ/old-code/devlink-user.c +++ b/tmp/ynl_build-tmp.q1fYKQ/new-code/devlink-user.c @@ -41,6 +41,7 @@ static const char * const devlink_op_strmap[] = { [76] = "rate-get", [80] = "linecard-get", [DEVLINK_CMD_SELFTESTS_GET] = "selftests-get", + [DEVLINK_CMD_PORT_RESOURCE_GET] = "port-resource-get", }; const char *devlink_op_str(int op) @@ -7284,6 +7285,174 @@ int devlink_notify_filter_set(struct ynl_sock *ys, return 0; } +/* ============== DEVLINK_CMD_PORT_RESOURCE_GET ============== */ +/* DEVLINK_CMD_PORT_RESOURCE_GET - do */ +void +devlink_port_resource_get_req_free(struct devlink_port_resource_get_req *req) +{ + free(req->bus_name); + free(req->dev_name); + free(req); +} + +void +devlink_port_resource_get_rsp_free(struct devlink_port_resource_get_rsp *rsp) +{ + free(rsp->bus_name); + free(rsp->dev_name); + devlink_dl_resource_list_free(&rsp->resource_list); + free(rsp); +} + +int devlink_port_resource_get_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct devlink_port_resource_get_rsp *dst; + const struct nlattr *attr; + struct ynl_parse_arg parg; + unsigned int len; + + dst = yarg->data; + parg.ys = yarg->ys; + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == DEVLINK_ATTR_BUS_NAME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.bus_name = len; + dst->bus_name = malloc(len + 1); + memcpy(dst->bus_name, ynl_attr_get_str(attr), len); + dst->bus_name[len] = 0; + } else if (type == DEVLINK_ATTR_DEV_NAME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.dev_name = len; + dst->dev_name = malloc(len + 1); + memcpy(dst->dev_name, ynl_attr_get_str(attr), len); + dst->dev_name[len] = 0; + } else if (type == DEVLINK_ATTR_PORT_INDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.port_index = 1; + dst->port_index = ynl_attr_get_u32(attr); + } else if (type == DEVLINK_ATTR_RESOURCE_LIST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.resource_list = 1; + + parg.rsp_policy = &devlink_dl_resource_list_nest; + parg.data = &dst->resource_list; + if (devlink_dl_resource_list_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } + } + + return YNL_PARSE_CB_OK; +} + +struct devlink_port_resource_get_rsp * +devlink_port_resource_get(struct ynl_sock *ys, + struct devlink_port_resource_get_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct devlink_port_resource_get_rsp *rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_RESOURCE_GET, 1); + ys->req_policy = &devlink_nest; + ys->req_hdr_len = ys->family->hdr_len; + yrs.yarg.rsp_policy = &devlink_nest; + + if (req->_len.bus_name) + ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); + if (req->_len.dev_name) + ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + if (req->_present.port_index) + ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = devlink_port_resource_get_rsp_parse; + yrs.rsp_cmd = DEVLINK_CMD_PORT_RESOURCE_GET; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + devlink_port_resource_get_rsp_free(rsp); + return NULL; +} + +/* DEVLINK_CMD_PORT_RESOURCE_GET - dump */ +void +devlink_port_resource_get_req_dump_free(struct devlink_port_resource_get_req_dump *req) +{ + free(req->bus_name); + free(req->dev_name); + free(req); +} + +void +devlink_port_resource_get_list_free(struct devlink_port_resource_get_list *rsp) +{ + struct devlink_port_resource_get_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.bus_name); + free(rsp->obj.dev_name); + devlink_dl_resource_list_free(&rsp->obj.resource_list); + free(rsp); + } +} + +struct devlink_port_resource_get_list * +devlink_port_resource_get_dump(struct ynl_sock *ys, + struct devlink_port_resource_get_req_dump *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &devlink_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct devlink_port_resource_get_list); + yds.cb = devlink_port_resource_get_rsp_parse; + yds.rsp_cmd = DEVLINK_CMD_PORT_RESOURCE_GET; + + nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PORT_RESOURCE_GET, 1); + ys->req_policy = &devlink_nest; + ys->req_hdr_len = ys->family->hdr_len; + + if (req->_len.bus_name) + ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); + if (req->_len.dev_name) + ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + devlink_port_resource_get_list_free(yds.first); + return NULL; +} + const struct ynl_family ynl_devlink_family = { .name = "devlink", .hdr_len = sizeof(struct genlmsghdr), diff --git a/tmp/ynl_build-tmp.q1fYKQ/old-code/devlink-user.h b/tmp/ynl_build-tmp.q1fYKQ/new-code/devlink-user.h index 9bd9f96d0113..01fe8d33ab22 100644 --- a/tmp/ynl_build-tmp.q1fYKQ/old-code/devlink-user.h +++ b/tmp/ynl_build-tmp.q1fYKQ/new-code/devlink-user.h @@ -5694,4 +5694,134 @@ devlink_notify_filter_set_req_set_port_index(struct devlink_notify_filter_set_re int devlink_notify_filter_set(struct ynl_sock *ys, struct devlink_notify_filter_set_req *req); +/* ============== DEVLINK_CMD_PORT_RESOURCE_GET ============== */ +/* DEVLINK_CMD_PORT_RESOURCE_GET - do */ +struct devlink_port_resource_get_req { + struct { + __u32 port_index:1; + } _present; + struct { + __u32 bus_name; + __u32 dev_name; + } _len; + + char *bus_name; + char *dev_name; + __u32 port_index; +}; + +static inline struct devlink_port_resource_get_req * +devlink_port_resource_get_req_alloc(void) +{ + return calloc(1, sizeof(struct devlink_port_resource_get_req)); +} +void +devlink_port_resource_get_req_free(struct devlink_port_resource_get_req *req); + +static inline void +devlink_port_resource_get_req_set_bus_name(struct devlink_port_resource_get_req *req, + const char *bus_name) +{ + free(req->bus_name); + req->_len.bus_name = strlen(bus_name); + req->bus_name = malloc(req->_len.bus_name + 1); + memcpy(req->bus_name, bus_name, req->_len.bus_name); + req->bus_name[req->_len.bus_name] = 0; +} +static inline void +devlink_port_resource_get_req_set_dev_name(struct devlink_port_resource_get_req *req, + const char *dev_name) +{ + free(req->dev_name); + req->_len.dev_name = strlen(dev_name); + req->dev_name = malloc(req->_len.dev_name + 1); + memcpy(req->dev_name, dev_name, req->_len.dev_name); + req->dev_name[req->_len.dev_name] = 0; +} +static inline void +devlink_port_resource_get_req_set_port_index(struct devlink_port_resource_get_req *req, + __u32 port_index) +{ + req->_present.port_index = 1; + req->port_index = port_index; +} + +struct devlink_port_resource_get_rsp { + struct { + __u32 port_index:1; + __u32 resource_list:1; + } _present; + struct { + __u32 bus_name; + __u32 dev_name; + } _len; + + char *bus_name; + char *dev_name; + __u32 port_index; + struct devlink_dl_resource_list resource_list; +}; + +void +devlink_port_resource_get_rsp_free(struct devlink_port_resource_get_rsp *rsp); + +/* + * Get port resources. + */ +struct devlink_port_resource_get_rsp * +devlink_port_resource_get(struct ynl_sock *ys, + struct devlink_port_resource_get_req *req); + +/* DEVLINK_CMD_PORT_RESOURCE_GET - dump */ +struct devlink_port_resource_get_req_dump { + struct { + __u32 bus_name; + __u32 dev_name; + } _len; + + char *bus_name; + char *dev_name; +}; + +static inline struct devlink_port_resource_get_req_dump * +devlink_port_resource_get_req_dump_alloc(void) +{ + return calloc(1, sizeof(struct devlink_port_resource_get_req_dump)); +} +void +devlink_port_resource_get_req_dump_free(struct devlink_port_resource_get_req_dump *req); + +static inline void +devlink_port_resource_get_req_dump_set_bus_name(struct devlink_port_resource_get_req_dump *req, + const char *bus_name) +{ + free(req->bus_name); + req->_len.bus_name = strlen(bus_name); + req->bus_name = malloc(req->_len.bus_name + 1); + memcpy(req->bus_name, bus_name, req->_len.bus_name); + req->bus_name[req->_len.bus_name] = 0; +} +static inline void +devlink_port_resource_get_req_dump_set_dev_name(struct devlink_port_resource_get_req_dump *req, + const char *dev_name) +{ + free(req->dev_name); + req->_len.dev_name = strlen(dev_name); + req->dev_name = malloc(req->_len.dev_name + 1); + memcpy(req->dev_name, dev_name, req->_len.dev_name); + req->dev_name[req->_len.dev_name] = 0; +} + +struct devlink_port_resource_get_list { + struct devlink_port_resource_get_list *next; + struct devlink_port_resource_get_rsp obj __attribute__((aligned(8))); +}; + +void +devlink_port_resource_get_list_free(struct devlink_port_resource_get_list *rsp); + +struct devlink_port_resource_get_list * +devlink_port_resource_get_dump(struct ynl_sock *ys, + struct devlink_port_resource_get_req_dump *req); + #endif /* _LINUX_DEVLINK_GEN_H */