diff --git a/tmp/ynl_build-tmp.iZenzT/old-code/psp-user.c b/tmp/ynl_build-tmp.iZenzT/new-code/psp-user.c index 79b0ca9e122e..77cc02f369d7 100644 --- a/tmp/ynl_build-tmp.iZenzT/old-code/psp-user.c +++ b/tmp/ynl_build-tmp.iZenzT/new-code/psp-user.c @@ -24,6 +24,8 @@ static const char * const psp_op_strmap[] = { [PSP_CMD_RX_ASSOC] = "rx-assoc", [PSP_CMD_TX_ASSOC] = "tx-assoc", [PSP_CMD_GET_STATS] = "get-stats", + [PSP_CMD_DEV_ASSOC] = "dev-assoc", + [PSP_CMD_DEV_DISASSOC] = "dev-disassoc", }; const char *psp_op_str(int op) @@ -48,6 +50,16 @@ const char *psp_version_str(enum psp_version value) } /* Policies */ +const struct ynl_policy_attr psp_assoc_dev_info_policy[PSP_A_ASSOC_DEV_INFO_MAX + 1] = { + [PSP_A_ASSOC_DEV_INFO_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, }, + [PSP_A_ASSOC_DEV_INFO_NSID] = { .name = "nsid", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest psp_assoc_dev_info_nest = { + .max_attr = PSP_A_ASSOC_DEV_INFO_MAX, + .table = psp_assoc_dev_info_policy, +}; + const struct ynl_policy_attr psp_keys_policy[PSP_A_KEYS_MAX + 1] = { [PSP_A_KEYS_KEY] = { .name = "key", .type = YNL_PT_BINARY,}, [PSP_A_KEYS_SPI] = { .name = "spi", .type = YNL_PT_U32, }, @@ -63,6 +75,9 @@ const struct ynl_policy_attr psp_dev_policy[PSP_A_DEV_MAX + 1] = { [PSP_A_DEV_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, }, [PSP_A_DEV_PSP_VERSIONS_CAP] = { .name = "psp-versions-cap", .type = YNL_PT_U32, }, [PSP_A_DEV_PSP_VERSIONS_ENA] = { .name = "psp-versions-ena", .type = YNL_PT_U32, }, + [PSP_A_DEV_ASSOC_LIST] = { .name = "assoc-list", .type = YNL_PT_NEST, .nest = &psp_assoc_dev_info_nest, }, + [PSP_A_DEV_NSID] = { .name = "nsid", .type = YNL_PT_U32, }, + [PSP_A_DEV_BY_ASSOCIATION] = { .name = "by-association", .type = YNL_PT_FLAG, }, }; const struct ynl_policy_nest psp_dev_nest = { @@ -103,6 +118,35 @@ const struct ynl_policy_nest psp_stats_nest = { }; /* Common nested types */ +void psp_assoc_dev_info_free(struct psp_assoc_dev_info *obj) +{ +} + +int psp_assoc_dev_info_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct psp_assoc_dev_info *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == PSP_A_ASSOC_DEV_INFO_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ifindex = 1; + dst->ifindex = ynl_attr_get_u32(attr); + } else if (type == PSP_A_ASSOC_DEV_INFO_NSID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.nsid = 1; + dst->nsid = ynl_attr_get_s32(attr); + } + } + + return 0; +} + void psp_keys_free(struct psp_keys *obj) { free(obj->key); @@ -160,16 +204,28 @@ void psp_dev_get_req_free(struct psp_dev_get_req *req) void psp_dev_get_rsp_free(struct psp_dev_get_rsp *rsp) { + unsigned int i; + + for (i = 0; i < rsp->_count.assoc_list; i++) + psp_assoc_dev_info_free(&rsp->assoc_list[i]); + free(rsp->assoc_list); free(rsp); } int psp_dev_get_rsp_parse(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg) { + unsigned int n_assoc_list = 0; struct psp_dev_get_rsp *dst; const struct nlattr *attr; + struct ynl_parse_arg parg; + int i; dst = yarg->data; + parg.ys = yarg->ys; + + if (dst->assoc_list) + return ynl_error_parse(yarg, "attribute already present (dev.assoc-list)"); ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { unsigned int type = ynl_attr_type(attr); @@ -194,6 +250,27 @@ int psp_dev_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; dst->_present.psp_versions_ena = 1; dst->psp_versions_ena = ynl_attr_get_u32(attr); + } else if (type == PSP_A_DEV_ASSOC_LIST) { + n_assoc_list++; + } else if (type == PSP_A_DEV_BY_ASSOCIATION) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.by_association = 1; + } + } + + if (n_assoc_list) { + dst->assoc_list = calloc(n_assoc_list, sizeof(*dst->assoc_list)); + dst->_count.assoc_list = n_assoc_list; + i = 0; + parg.rsp_policy = &psp_assoc_dev_info_nest; + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + if (ynl_attr_type(attr) == PSP_A_DEV_ASSOC_LIST) { + parg.data = &dst->assoc_list[i]; + if (psp_assoc_dev_info_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + i++; + } } } @@ -238,9 +315,14 @@ void psp_dev_get_list_free(struct psp_dev_get_list *rsp) struct psp_dev_get_list *next = rsp; while ((void *)next != YNL_LIST_END) { + unsigned int i; + rsp = next; next = rsp->next; + for (i = 0; i < rsp->obj._count.assoc_list; i++) + psp_assoc_dev_info_free(&rsp->obj.assoc_list[i]); + free(rsp->obj.assoc_list); free(rsp); } } @@ -274,6 +356,11 @@ struct psp_dev_get_list *psp_dev_get_dump(struct ynl_sock *ys) /* PSP_CMD_DEV_GET - notify */ void psp_dev_get_ntf_free(struct psp_dev_get_ntf *rsp) { + unsigned int i; + + for (i = 0; i < rsp->obj._count.assoc_list; i++) + psp_assoc_dev_info_free(&rsp->obj.assoc_list[i]); + free(rsp->obj.assoc_list); free(rsp); } @@ -655,6 +742,114 @@ struct psp_get_stats_list *psp_get_stats_dump(struct ynl_sock *ys) return NULL; } +/* ============== PSP_CMD_DEV_ASSOC ============== */ +/* PSP_CMD_DEV_ASSOC - do */ +void psp_dev_assoc_req_free(struct psp_dev_assoc_req *req) +{ + free(req); +} + +void psp_dev_assoc_rsp_free(struct psp_dev_assoc_rsp *rsp) +{ + free(rsp); +} + +int psp_dev_assoc_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + return YNL_PARSE_CB_OK; +} + +struct psp_dev_assoc_rsp * +psp_dev_assoc(struct ynl_sock *ys, struct psp_dev_assoc_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct psp_dev_assoc_rsp *rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ys->family_id, PSP_CMD_DEV_ASSOC, 1); + ys->req_policy = &psp_dev_nest; + ys->req_hdr_len = ys->family->hdr_len; + yrs.yarg.rsp_policy = &psp_dev_nest; + + if (req->_present.id) + ynl_attr_put_u32(nlh, PSP_A_DEV_ID, req->id); + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, PSP_A_DEV_IFINDEX, req->ifindex); + if (req->_present.nsid) + ynl_attr_put_s32(nlh, PSP_A_DEV_NSID, req->nsid); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = psp_dev_assoc_rsp_parse; + yrs.rsp_cmd = PSP_CMD_DEV_ASSOC; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + psp_dev_assoc_rsp_free(rsp); + return NULL; +} + +/* ============== PSP_CMD_DEV_DISASSOC ============== */ +/* PSP_CMD_DEV_DISASSOC - do */ +void psp_dev_disassoc_req_free(struct psp_dev_disassoc_req *req) +{ + free(req); +} + +void psp_dev_disassoc_rsp_free(struct psp_dev_disassoc_rsp *rsp) +{ + free(rsp); +} + +int psp_dev_disassoc_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + return YNL_PARSE_CB_OK; +} + +struct psp_dev_disassoc_rsp * +psp_dev_disassoc(struct ynl_sock *ys, struct psp_dev_disassoc_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct psp_dev_disassoc_rsp *rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ys->family_id, PSP_CMD_DEV_DISASSOC, 1); + ys->req_policy = &psp_dev_nest; + ys->req_hdr_len = ys->family->hdr_len; + yrs.yarg.rsp_policy = &psp_dev_nest; + + if (req->_present.id) + ynl_attr_put_u32(nlh, PSP_A_DEV_ID, req->id); + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, PSP_A_DEV_IFINDEX, req->ifindex); + if (req->_present.nsid) + ynl_attr_put_s32(nlh, PSP_A_DEV_NSID, req->nsid); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = psp_dev_disassoc_rsp_parse; + yrs.rsp_cmd = PSP_CMD_DEV_DISASSOC; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + psp_dev_disassoc_rsp_free(rsp); + return NULL; +} + static const struct ynl_ntf_info psp_ntf_info[] = { [PSP_CMD_DEV_ADD_NTF] = { .alloc_sz = sizeof(struct psp_dev_get_ntf), diff --git a/tmp/ynl_build-tmp.iZenzT/old-code/psp-user.h b/tmp/ynl_build-tmp.iZenzT/new-code/psp-user.h index ccece9d2536e..dfea324b2eee 100644 --- a/tmp/ynl_build-tmp.iZenzT/old-code/psp-user.h +++ b/tmp/ynl_build-tmp.iZenzT/new-code/psp-user.h @@ -21,6 +21,16 @@ const char *psp_op_str(int op); const char *psp_version_str(enum psp_version value); /* Common nested types */ +struct psp_assoc_dev_info { + struct { + __u32 ifindex:1; + __u32 nsid:1; + } _present; + + __u32 ifindex; + __s32 nsid; +}; + struct psp_keys { struct { __u32 spi:1; @@ -62,12 +72,17 @@ struct psp_dev_get_rsp { __u32 ifindex:1; __u32 psp_versions_cap:1; __u32 psp_versions_ena:1; + __u32 by_association:1; } _present; + struct { + __u32 assoc_list; + } _count; __u32 id; __u32 ifindex; __u32 psp_versions_cap; __u32 psp_versions_ena; + struct psp_assoc_dev_info *assoc_list; }; void psp_dev_get_rsp_free(struct psp_dev_get_rsp *rsp); @@ -373,4 +388,105 @@ void psp_get_stats_list_free(struct psp_get_stats_list *rsp); struct psp_get_stats_list *psp_get_stats_dump(struct ynl_sock *ys); +/* ============== PSP_CMD_DEV_ASSOC ============== */ +/* PSP_CMD_DEV_ASSOC - do */ +struct psp_dev_assoc_req { + struct { + __u32 id:1; + __u32 ifindex:1; + __u32 nsid:1; + } _present; + + __u32 id; + __u32 ifindex; + __s32 nsid; +}; + +static inline struct psp_dev_assoc_req *psp_dev_assoc_req_alloc(void) +{ + return calloc(1, sizeof(struct psp_dev_assoc_req)); +} +void psp_dev_assoc_req_free(struct psp_dev_assoc_req *req); + +static inline void +psp_dev_assoc_req_set_id(struct psp_dev_assoc_req *req, __u32 id) +{ + req->_present.id = 1; + req->id = id; +} +static inline void +psp_dev_assoc_req_set_ifindex(struct psp_dev_assoc_req *req, __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} +static inline void +psp_dev_assoc_req_set_nsid(struct psp_dev_assoc_req *req, __s32 nsid) +{ + req->_present.nsid = 1; + req->nsid = nsid; +} + +struct psp_dev_assoc_rsp { +}; + +void psp_dev_assoc_rsp_free(struct psp_dev_assoc_rsp *rsp); + +/* + * Associate a network device with a PSP device. + */ +struct psp_dev_assoc_rsp * +psp_dev_assoc(struct ynl_sock *ys, struct psp_dev_assoc_req *req); + +/* ============== PSP_CMD_DEV_DISASSOC ============== */ +/* PSP_CMD_DEV_DISASSOC - do */ +struct psp_dev_disassoc_req { + struct { + __u32 id:1; + __u32 ifindex:1; + __u32 nsid:1; + } _present; + + __u32 id; + __u32 ifindex; + __s32 nsid; +}; + +static inline struct psp_dev_disassoc_req *psp_dev_disassoc_req_alloc(void) +{ + return calloc(1, sizeof(struct psp_dev_disassoc_req)); +} +void psp_dev_disassoc_req_free(struct psp_dev_disassoc_req *req); + +static inline void +psp_dev_disassoc_req_set_id(struct psp_dev_disassoc_req *req, __u32 id) +{ + req->_present.id = 1; + req->id = id; +} +static inline void +psp_dev_disassoc_req_set_ifindex(struct psp_dev_disassoc_req *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} +static inline void +psp_dev_disassoc_req_set_nsid(struct psp_dev_disassoc_req *req, __s32 nsid) +{ + req->_present.nsid = 1; + req->nsid = nsid; +} + +struct psp_dev_disassoc_rsp { +}; + +void psp_dev_disassoc_rsp_free(struct psp_dev_disassoc_rsp *rsp); + +/* + * Disassociate a network device from a PSP device. + */ +struct psp_dev_disassoc_rsp * +psp_dev_disassoc(struct ynl_sock *ys, struct psp_dev_disassoc_req *req); + #endif /* _LINUX_PSP_GEN_H */