diff --git a/home/nipa/nipa_out/996578/ynl/old-code/netdev-user.c b/home/nipa/nipa_out/996578/ynl/new-code/netdev-user.c index ea026459bf7c..caa4dc0a1265 100644 --- a/home/nipa/nipa_out/996578/ynl/old-code/netdev-user.c +++ b/home/nipa/nipa_out/996578/ynl/new-code/netdev-user.c @@ -28,6 +28,9 @@ static const char * const netdev_op_strmap[] = { [NETDEV_CMD_BIND_RX] = "bind-rx", [NETDEV_CMD_NAPI_SET] = "napi-set", [NETDEV_CMD_BIND_TX] = "bind-tx", + [NETDEV_CMD_TX_CLK_GET] = "tx-clk-get", + [NETDEV_CMD_TX_CLK_SET] = "tx-clk-set", + [NETDEV_CMD_TX_CLK_CHANGE_NTF] = "tx-clk-change-ntf", }; const char *netdev_op_str(int op) @@ -119,6 +122,19 @@ const char *netdev_napi_threaded_str(enum netdev_napi_threaded value) return netdev_napi_threaded_strmap[value]; } +static const char * const netdev_tx_clk_type_strmap[] = { + [0] = "ocxo", + [1] = "ext-ref", + [2] = "synce", +}; + +const char *netdev_tx_clk_type_str(enum netdev_tx_clk_type value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(netdev_tx_clk_type_strmap)) + return NULL; + return netdev_tx_clk_type_strmap[value]; +} + /* Policies */ const struct ynl_policy_attr netdev_io_uring_provider_info_policy[NETDEV_A_IO_URING_PROVIDER_INFO_MAX + 1] = { }; @@ -288,6 +304,17 @@ const struct ynl_policy_nest netdev_dmabuf_nest = { .table = netdev_dmabuf_policy, }; +const struct ynl_policy_attr netdev_tx_clk_policy[NETDEV_A_TX_CLK_MAX + 1] = { + [NETDEV_A_TX_CLK_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, }, + [NETDEV_A_TX_CLK_TYPE] = { .name = "type", .type = YNL_PT_U32, }, + [NETDEV_A_TX_CLK_ACTIVE] = { .name = "active", .type = YNL_PT_FLAG, }, +}; + +const struct ynl_policy_nest netdev_tx_clk_nest = { + .max_attr = NETDEV_A_TX_CLK_MAX, + .table = netdev_tx_clk_policy, +}; + /* Common nested types */ void netdev_io_uring_provider_info_free(struct netdev_io_uring_provider_info *obj) @@ -1434,6 +1461,215 @@ netdev_bind_tx(struct ynl_sock *ys, struct netdev_bind_tx_req *req) return NULL; } +/* ============== NETDEV_CMD_TX_CLK_GET ============== */ +/* NETDEV_CMD_TX_CLK_GET - do */ +void netdev_tx_clk_get_req_free(struct netdev_tx_clk_get_req *req) +{ + free(req); +} + +void netdev_tx_clk_get_rsp_free(struct netdev_tx_clk_get_rsp *rsp) +{ + free(rsp); +} + +int netdev_tx_clk_get_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct netdev_tx_clk_get_rsp *dst; + const struct nlattr *attr; + + dst = yarg->data; + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == NETDEV_A_TX_CLK_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 == NETDEV_A_TX_CLK_TYPE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.type = 1; + dst->type = ynl_attr_get_u32(attr); + } else if (type == NETDEV_A_TX_CLK_ACTIVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.active = 1; + } + } + + return YNL_PARSE_CB_OK; +} + +struct netdev_tx_clk_get_rsp * +netdev_tx_clk_get(struct ynl_sock *ys, struct netdev_tx_clk_get_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct netdev_tx_clk_get_rsp *rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ys->family_id, NETDEV_CMD_TX_CLK_GET, 1); + ys->req_policy = &netdev_tx_clk_nest; + ys->req_hdr_len = ys->family->hdr_len; + yrs.yarg.rsp_policy = &netdev_tx_clk_nest; + + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, NETDEV_A_TX_CLK_IFINDEX, req->ifindex); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = netdev_tx_clk_get_rsp_parse; + yrs.rsp_cmd = NETDEV_CMD_TX_CLK_GET; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + netdev_tx_clk_get_rsp_free(rsp); + return NULL; +} + +/* NETDEV_CMD_TX_CLK_GET - dump */ +void netdev_tx_clk_get_req_dump_free(struct netdev_tx_clk_get_req_dump *req) +{ + free(req); +} + +void netdev_tx_clk_get_list_free(struct netdev_tx_clk_get_list *rsp) +{ + struct netdev_tx_clk_get_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp); + } +} + +struct netdev_tx_clk_get_list * +netdev_tx_clk_get_dump(struct ynl_sock *ys, + struct netdev_tx_clk_get_req_dump *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &netdev_tx_clk_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct netdev_tx_clk_get_list); + yds.cb = netdev_tx_clk_get_rsp_parse; + yds.rsp_cmd = NETDEV_CMD_TX_CLK_GET; + + nlh = ynl_gemsg_start_dump(ys, ys->family_id, NETDEV_CMD_TX_CLK_GET, 1); + ys->req_policy = &netdev_tx_clk_nest; + ys->req_hdr_len = ys->family->hdr_len; + + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, NETDEV_A_TX_CLK_IFINDEX, req->ifindex); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + netdev_tx_clk_get_list_free(yds.first); + return NULL; +} + +/* NETDEV_CMD_TX_CLK_GET - notify */ +void netdev_tx_clk_get_ntf_free(struct netdev_tx_clk_get_ntf *rsp) +{ + free(rsp); +} + +/* ============== NETDEV_CMD_TX_CLK_SET ============== */ +/* NETDEV_CMD_TX_CLK_SET - do */ +void netdev_tx_clk_set_req_free(struct netdev_tx_clk_set_req *req) +{ + free(req); +} + +void netdev_tx_clk_set_rsp_free(struct netdev_tx_clk_set_rsp *rsp) +{ + free(rsp); +} + +int netdev_tx_clk_set_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct netdev_tx_clk_set_rsp *dst; + const struct nlattr *attr; + + dst = yarg->data; + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == NETDEV_A_TX_CLK_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 == NETDEV_A_TX_CLK_TYPE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.type = 1; + dst->type = ynl_attr_get_u32(attr); + } else if (type == NETDEV_A_TX_CLK_ACTIVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.active = 1; + } + } + + return YNL_PARSE_CB_OK; +} + +struct netdev_tx_clk_set_rsp * +netdev_tx_clk_set(struct ynl_sock *ys, struct netdev_tx_clk_set_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct netdev_tx_clk_set_rsp *rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ys->family_id, NETDEV_CMD_TX_CLK_SET, 1); + ys->req_policy = &netdev_tx_clk_nest; + ys->req_hdr_len = ys->family->hdr_len; + yrs.yarg.rsp_policy = &netdev_tx_clk_nest; + + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, NETDEV_A_TX_CLK_IFINDEX, req->ifindex); + if (req->_present.type) + ynl_attr_put_u32(nlh, NETDEV_A_TX_CLK_TYPE, req->type); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = netdev_tx_clk_set_rsp_parse; + yrs.rsp_cmd = NETDEV_CMD_TX_CLK_SET; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + netdev_tx_clk_set_rsp_free(rsp); + return NULL; +} + static const struct ynl_ntf_info netdev_ntf_info[] = { [NETDEV_CMD_DEV_ADD_NTF] = { .alloc_sz = sizeof(struct netdev_dev_get_ntf), @@ -1471,6 +1707,12 @@ static const struct ynl_ntf_info netdev_ntf_info[] = { .policy = &netdev_page_pool_nest, .free = (void *)netdev_page_pool_get_ntf_free, }, + [NETDEV_CMD_TX_CLK_CHANGE_NTF] = { + .alloc_sz = sizeof(struct netdev_tx_clk_get_ntf), + .cb = netdev_tx_clk_get_rsp_parse, + .policy = &netdev_tx_clk_nest, + .free = (void *)netdev_tx_clk_get_ntf_free, + }, }; const struct ynl_family ynl_netdev_family = { diff --git a/home/nipa/nipa_out/996578/ynl/old-code/netdev-user.h b/home/nipa/nipa_out/996578/ynl/new-code/netdev-user.h index 98df3cc1d0a3..efea85ebcc0c 100644 --- a/home/nipa/nipa_out/996578/ynl/old-code/netdev-user.h +++ b/home/nipa/nipa_out/996578/ynl/new-code/netdev-user.h @@ -23,6 +23,7 @@ const char *netdev_xsk_flags_str(enum netdev_xsk_flags value); const char *netdev_queue_type_str(enum netdev_queue_type value); const char *netdev_qstats_scope_str(enum netdev_qstats_scope value); const char *netdev_napi_threaded_str(enum netdev_napi_threaded value); +const char *netdev_tx_clk_type_str(enum netdev_tx_clk_type value); /* Common nested types */ struct netdev_io_uring_provider_info { @@ -733,4 +734,145 @@ void netdev_bind_tx_rsp_free(struct netdev_bind_tx_rsp *rsp); struct netdev_bind_tx_rsp * netdev_bind_tx(struct ynl_sock *ys, struct netdev_bind_tx_req *req); +/* ============== NETDEV_CMD_TX_CLK_GET ============== */ +/* NETDEV_CMD_TX_CLK_GET - do */ +struct netdev_tx_clk_get_req { + struct { + __u32 ifindex:1; + } _present; + + __u32 ifindex; +}; + +static inline struct netdev_tx_clk_get_req *netdev_tx_clk_get_req_alloc(void) +{ + return calloc(1, sizeof(struct netdev_tx_clk_get_req)); +} +void netdev_tx_clk_get_req_free(struct netdev_tx_clk_get_req *req); + +static inline void +netdev_tx_clk_get_req_set_ifindex(struct netdev_tx_clk_get_req *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} + +struct netdev_tx_clk_get_rsp { + struct { + __u32 ifindex:1; + __u32 type:1; + __u32 active:1; + } _present; + + __u32 ifindex; + enum netdev_tx_clk_type type; +}; + +void netdev_tx_clk_get_rsp_free(struct netdev_tx_clk_get_rsp *rsp); + +/* + * get information about TX clock sources for a device. + */ +struct netdev_tx_clk_get_rsp * +netdev_tx_clk_get(struct ynl_sock *ys, struct netdev_tx_clk_get_req *req); + +/* NETDEV_CMD_TX_CLK_GET - dump */ +struct netdev_tx_clk_get_req_dump { + struct { + __u32 ifindex:1; + } _present; + + __u32 ifindex; +}; + +static inline struct netdev_tx_clk_get_req_dump * +netdev_tx_clk_get_req_dump_alloc(void) +{ + return calloc(1, sizeof(struct netdev_tx_clk_get_req_dump)); +} +void netdev_tx_clk_get_req_dump_free(struct netdev_tx_clk_get_req_dump *req); + +static inline void +netdev_tx_clk_get_req_dump_set_ifindex(struct netdev_tx_clk_get_req_dump *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} + +struct netdev_tx_clk_get_list { + struct netdev_tx_clk_get_list *next; + struct netdev_tx_clk_get_rsp obj __attribute__((aligned(8))); +}; + +void netdev_tx_clk_get_list_free(struct netdev_tx_clk_get_list *rsp); + +struct netdev_tx_clk_get_list * +netdev_tx_clk_get_dump(struct ynl_sock *ys, + struct netdev_tx_clk_get_req_dump *req); + +/* NETDEV_CMD_TX_CLK_GET - notify */ +struct netdev_tx_clk_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type *next; + void (*free)(struct netdev_tx_clk_get_ntf *ntf); + struct netdev_tx_clk_get_rsp obj __attribute__((aligned(8))); +}; + +void netdev_tx_clk_get_ntf_free(struct netdev_tx_clk_get_ntf *rsp); + +/* ============== NETDEV_CMD_TX_CLK_SET ============== */ +/* NETDEV_CMD_TX_CLK_SET - do */ +struct netdev_tx_clk_set_req { + struct { + __u32 ifindex:1; + __u32 type:1; + } _present; + + __u32 ifindex; + enum netdev_tx_clk_type type; +}; + +static inline struct netdev_tx_clk_set_req *netdev_tx_clk_set_req_alloc(void) +{ + return calloc(1, sizeof(struct netdev_tx_clk_set_req)); +} +void netdev_tx_clk_set_req_free(struct netdev_tx_clk_set_req *req); + +static inline void +netdev_tx_clk_set_req_set_ifindex(struct netdev_tx_clk_set_req *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} +static inline void +netdev_tx_clk_set_req_set_type(struct netdev_tx_clk_set_req *req, + enum netdev_tx_clk_type type) +{ + req->_present.type = 1; + req->type = type; +} + +struct netdev_tx_clk_set_rsp { + struct { + __u32 ifindex:1; + __u32 type:1; + __u32 active:1; + } _present; + + __u32 ifindex; + enum netdev_tx_clk_type type; +}; + +void netdev_tx_clk_set_rsp_free(struct netdev_tx_clk_set_rsp *rsp); + +/* + * set the active TX clock source for a device. + */ +struct netdev_tx_clk_set_rsp * +netdev_tx_clk_set(struct ynl_sock *ys, struct netdev_tx_clk_set_req *req); + #endif /* _LINUX_NETDEV_GEN_H */