diff --git a/home/nipa/nipa_out/1004408/ynl/old-code/netdev-user.c b/home/nipa/nipa_out/1004408/ynl/new-code/netdev-user.c index ea026459bf7c..fe1ecb2157c0 100644 --- a/home/nipa/nipa_out/1004408/ynl/old-code/netdev-user.c +++ b/home/nipa/nipa_out/1004408/ynl/new-code/netdev-user.c @@ -28,6 +28,7 @@ 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_BIND_QUEUE] = "bind-queue", }; const char *netdev_op_str(int op) @@ -146,6 +147,16 @@ const struct ynl_policy_nest netdev_xsk_info_nest = { .table = netdev_xsk_info_policy, }; +const struct ynl_policy_attr netdev_peer_info_policy[NETDEV_A_PEER_INFO_MAX + 1] = { + [NETDEV_A_PEER_INFO_ID] = { .name = "id", .type = YNL_PT_U32, }, + [NETDEV_A_PEER_INFO_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest netdev_peer_info_nest = { + .max_attr = NETDEV_A_PEER_INFO_MAX, + .table = netdev_peer_info_policy, +}; + const struct ynl_policy_attr netdev_queue_id_policy[NETDEV_A_QUEUE_MAX + 1] = { [NETDEV_A_QUEUE_ID] = { .name = "id", .type = YNL_PT_U32, }, [NETDEV_A_QUEUE_TYPE] = { .name = "type", .type = YNL_PT_U32, }, @@ -214,6 +225,7 @@ const struct ynl_policy_attr netdev_queue_policy[NETDEV_A_QUEUE_MAX + 1] = { [NETDEV_A_QUEUE_DMABUF] = { .name = "dmabuf", .type = YNL_PT_U32, }, [NETDEV_A_QUEUE_IO_URING] = { .name = "io-uring", .type = YNL_PT_NEST, .nest = &netdev_io_uring_provider_info_nest, }, [NETDEV_A_QUEUE_XSK] = { .name = "xsk", .type = YNL_PT_NEST, .nest = &netdev_xsk_info_nest, }, + [NETDEV_A_QUEUE_PEER] = { .name = "peer", .type = YNL_PT_NEST, .nest = &netdev_peer_info_nest, }, }; const struct ynl_policy_nest netdev_queue_nest = { @@ -288,6 +300,18 @@ const struct ynl_policy_nest netdev_dmabuf_nest = { .table = netdev_dmabuf_policy, }; +const struct ynl_policy_attr netdev_queue_pair_policy[NETDEV_A_QUEUE_PAIR_MAX + 1] = { + [NETDEV_A_QUEUE_PAIR_SRC_IFINDEX] = { .name = "src-ifindex", .type = YNL_PT_U32, }, + [NETDEV_A_QUEUE_PAIR_SRC_QUEUE_ID] = { .name = "src-queue-id", .type = YNL_PT_U32, }, + [NETDEV_A_QUEUE_PAIR_DST_IFINDEX] = { .name = "dst-ifindex", .type = YNL_PT_U32, }, + [NETDEV_A_QUEUE_PAIR_DST_QUEUE_ID] = { .name = "dst-queue-id", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest netdev_queue_pair_nest = { + .max_attr = NETDEV_A_QUEUE_PAIR_MAX, + .table = netdev_queue_pair_policy, +}; + /* Common nested types */ void netdev_io_uring_provider_info_free(struct netdev_io_uring_provider_info *obj) @@ -354,6 +378,35 @@ int netdev_xsk_info_parse(struct ynl_parse_arg *yarg, return 0; } +void netdev_peer_info_free(struct netdev_peer_info *obj) +{ +} + +int netdev_peer_info_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct netdev_peer_info *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == NETDEV_A_PEER_INFO_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.id = 1; + dst->id = ynl_attr_get_u32(attr); + } else if (type == NETDEV_A_PEER_INFO_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ifindex = 1; + dst->ifindex = ynl_attr_get_u32(attr); + } + } + + return 0; +} + void netdev_queue_id_free(struct netdev_queue_id *obj) { } @@ -845,6 +898,7 @@ void netdev_queue_get_rsp_free(struct netdev_queue_get_rsp *rsp) { netdev_io_uring_provider_info_free(&rsp->io_uring); netdev_xsk_info_free(&rsp->xsk); + netdev_peer_info_free(&rsp->peer); free(rsp); } @@ -904,6 +958,15 @@ int netdev_queue_get_rsp_parse(const struct nlmsghdr *nlh, parg.data = &dst->xsk; if (netdev_xsk_info_parse(&parg, attr)) return YNL_PARSE_CB_ERROR; + } else if (type == NETDEV_A_QUEUE_PEER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.peer = 1; + + parg.rsp_policy = &netdev_peer_info_nest; + parg.data = &dst->peer; + if (netdev_peer_info_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; } } @@ -962,6 +1025,7 @@ void netdev_queue_get_list_free(struct netdev_queue_get_list *rsp) netdev_io_uring_provider_info_free(&rsp->obj.io_uring); netdev_xsk_info_free(&rsp->obj.xsk); + netdev_peer_info_free(&rsp->obj.peer); free(rsp); } } @@ -1434,6 +1498,76 @@ netdev_bind_tx(struct ynl_sock *ys, struct netdev_bind_tx_req *req) return NULL; } +/* ============== NETDEV_CMD_BIND_QUEUE ============== */ +/* NETDEV_CMD_BIND_QUEUE - do */ +void netdev_bind_queue_req_free(struct netdev_bind_queue_req *req) +{ + free(req); +} + +void netdev_bind_queue_rsp_free(struct netdev_bind_queue_rsp *rsp) +{ + free(rsp); +} + +int netdev_bind_queue_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct netdev_bind_queue_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_QUEUE_PAIR_DST_QUEUE_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.dst_queue_id = 1; + dst->dst_queue_id = ynl_attr_get_u32(attr); + } + } + + return YNL_PARSE_CB_OK; +} + +struct netdev_bind_queue_rsp * +netdev_bind_queue(struct ynl_sock *ys, struct netdev_bind_queue_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct netdev_bind_queue_rsp *rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ys->family_id, NETDEV_CMD_BIND_QUEUE, 1); + ys->req_policy = &netdev_queue_pair_nest; + ys->req_hdr_len = ys->family->hdr_len; + yrs.yarg.rsp_policy = &netdev_queue_pair_nest; + + if (req->_present.src_ifindex) + ynl_attr_put_u32(nlh, NETDEV_A_QUEUE_PAIR_SRC_IFINDEX, req->src_ifindex); + if (req->_present.src_queue_id) + ynl_attr_put_u32(nlh, NETDEV_A_QUEUE_PAIR_SRC_QUEUE_ID, req->src_queue_id); + if (req->_present.dst_ifindex) + ynl_attr_put_u32(nlh, NETDEV_A_QUEUE_PAIR_DST_IFINDEX, req->dst_ifindex); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = netdev_bind_queue_rsp_parse; + yrs.rsp_cmd = NETDEV_CMD_BIND_QUEUE; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + netdev_bind_queue_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), diff --git a/home/nipa/nipa_out/1004408/ynl/old-code/netdev-user.h b/home/nipa/nipa_out/1004408/ynl/new-code/netdev-user.h index 98df3cc1d0a3..95847c74e3c2 100644 --- a/home/nipa/nipa_out/1004408/ynl/old-code/netdev-user.h +++ b/home/nipa/nipa_out/1004408/ynl/new-code/netdev-user.h @@ -41,6 +41,16 @@ struct netdev_page_pool_info { struct netdev_xsk_info { }; +struct netdev_peer_info { + struct { + __u32 id:1; + __u32 ifindex:1; + } _present; + + __u32 id; + __u32 ifindex; +}; + struct netdev_queue_id { struct { __u32 id:1; @@ -355,6 +365,7 @@ struct netdev_queue_get_rsp { __u32 dmabuf:1; __u32 io_uring:1; __u32 xsk:1; + __u32 peer:1; } _present; __u32 id; @@ -364,6 +375,7 @@ struct netdev_queue_get_rsp { __u32 dmabuf; struct netdev_io_uring_provider_info io_uring; struct netdev_xsk_info xsk; + struct netdev_peer_info peer; }; void netdev_queue_get_rsp_free(struct netdev_queue_get_rsp *rsp); @@ -733,4 +745,62 @@ 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_BIND_QUEUE ============== */ +/* NETDEV_CMD_BIND_QUEUE - do */ +struct netdev_bind_queue_req { + struct { + __u32 src_ifindex:1; + __u32 src_queue_id:1; + __u32 dst_ifindex:1; + } _present; + + __u32 src_ifindex; + __u32 src_queue_id; + __u32 dst_ifindex; +}; + +static inline struct netdev_bind_queue_req *netdev_bind_queue_req_alloc(void) +{ + return calloc(1, sizeof(struct netdev_bind_queue_req)); +} +void netdev_bind_queue_req_free(struct netdev_bind_queue_req *req); + +static inline void +netdev_bind_queue_req_set_src_ifindex(struct netdev_bind_queue_req *req, + __u32 src_ifindex) +{ + req->_present.src_ifindex = 1; + req->src_ifindex = src_ifindex; +} +static inline void +netdev_bind_queue_req_set_src_queue_id(struct netdev_bind_queue_req *req, + __u32 src_queue_id) +{ + req->_present.src_queue_id = 1; + req->src_queue_id = src_queue_id; +} +static inline void +netdev_bind_queue_req_set_dst_ifindex(struct netdev_bind_queue_req *req, + __u32 dst_ifindex) +{ + req->_present.dst_ifindex = 1; + req->dst_ifindex = dst_ifindex; +} + +struct netdev_bind_queue_rsp { + struct { + __u32 dst_queue_id:1; + } _present; + + __u32 dst_queue_id; +}; + +void netdev_bind_queue_rsp_free(struct netdev_bind_queue_rsp *rsp); + +/* + * Bind a physical netdev queue to a virtual one + */ +struct netdev_bind_queue_rsp * +netdev_bind_queue(struct ynl_sock *ys, struct netdev_bind_queue_req *req); + #endif /* _LINUX_NETDEV_GEN_H */