1414namespace ynl_cpp {
1515
1616/* Enums */
17- static constexpr std::array<std::string_view, NETDEV_CMD_QSTATS_GET + 1 > netdev_op_strmap = []() {
18- std::array<std::string_view, NETDEV_CMD_QSTATS_GET + 1 > arr{};
17+ static constexpr std::array<std::string_view, NETDEV_CMD_BIND_RX + 1 > netdev_op_strmap = []() {
18+ std::array<std::string_view, NETDEV_CMD_BIND_RX + 1 > arr{};
1919 arr[NETDEV_CMD_DEV_GET] = " dev-get" ;
2020 arr[NETDEV_CMD_DEV_ADD_NTF] = " dev-add-ntf" ;
2121 arr[NETDEV_CMD_DEV_DEL_NTF] = " dev-del-ntf" ;
@@ -28,6 +28,7 @@ static constexpr std::array<std::string_view, NETDEV_CMD_QSTATS_GET + 1> netdev_
2828 arr[NETDEV_CMD_QUEUE_GET] = " queue-get" ;
2929 arr[NETDEV_CMD_NAPI_GET] = " napi-get" ;
3030 arr[NETDEV_CMD_QSTATS_GET] = " qstats-get" ;
31+ arr[NETDEV_CMD_BIND_RX] = " bind-rx" ;
3132 return arr;
3233} ();
3334
@@ -130,6 +131,18 @@ struct ynl_policy_nest netdev_page_pool_info_nest = {
130131 .table = netdev_page_pool_info_policy.data (),
131132};
132133
134+ static std::array<ynl_policy_attr,NETDEV_A_QUEUE_MAX + 1 > netdev_queue_id_policy = []() {
135+ std::array<ynl_policy_attr,NETDEV_A_QUEUE_MAX + 1 > arr{};
136+ arr[NETDEV_A_QUEUE_ID] = { .name = " id" , .type = YNL_PT_U32, };
137+ arr[NETDEV_A_QUEUE_TYPE] = { .name = " type" , .type = YNL_PT_U32, };
138+ return arr;
139+ } ();
140+
141+ struct ynl_policy_nest netdev_queue_id_nest = {
142+ .max_attr = NETDEV_A_QUEUE_MAX,
143+ .table = netdev_queue_id_policy.data (),
144+ };
145+
133146static std::array<ynl_policy_attr,NETDEV_A_DEV_MAX + 1 > netdev_dev_policy = []() {
134147 std::array<ynl_policy_attr,NETDEV_A_DEV_MAX + 1 > arr{};
135148 arr[NETDEV_A_DEV_IFINDEX] = { .name = " ifindex" , .type = YNL_PT_U32, };
@@ -154,6 +167,7 @@ static std::array<ynl_policy_attr,NETDEV_A_PAGE_POOL_MAX + 1> netdev_page_pool_p
154167 arr[NETDEV_A_PAGE_POOL_INFLIGHT] = { .name = " inflight" , .type = YNL_PT_UINT, };
155168 arr[NETDEV_A_PAGE_POOL_INFLIGHT_MEM] = { .name = " inflight-mem" , .type = YNL_PT_UINT, };
156169 arr[NETDEV_A_PAGE_POOL_DETACH_TIME] = { .name = " detach-time" , .type = YNL_PT_UINT, };
170+ arr[NETDEV_A_PAGE_POOL_DMABUF] = { .name = " dmabuf" , .type = YNL_PT_U32, };
157171 return arr;
158172} ();
159173
@@ -190,6 +204,7 @@ static std::array<ynl_policy_attr,NETDEV_A_QUEUE_MAX + 1> netdev_queue_policy =
190204 arr[NETDEV_A_QUEUE_IFINDEX] = { .name = " ifindex" , .type = YNL_PT_U32, };
191205 arr[NETDEV_A_QUEUE_TYPE] = { .name = " type" , .type = YNL_PT_U32, };
192206 arr[NETDEV_A_QUEUE_NAPI_ID] = { .name = " napi-id" , .type = YNL_PT_U32, };
207+ arr[NETDEV_A_QUEUE_DMABUF] = { .name = " dmabuf" , .type = YNL_PT_U32, };
193208 return arr;
194209} ();
195210
@@ -253,6 +268,20 @@ struct ynl_policy_nest netdev_qstats_nest = {
253268 .table = netdev_qstats_policy.data (),
254269};
255270
271+ static std::array<ynl_policy_attr,NETDEV_A_DMABUF_MAX + 1 > netdev_dmabuf_policy = []() {
272+ std::array<ynl_policy_attr,NETDEV_A_DMABUF_MAX + 1 > arr{};
273+ arr[NETDEV_A_DMABUF_IFINDEX] = { .name = " ifindex" , .type = YNL_PT_U32, };
274+ arr[NETDEV_A_DMABUF_QUEUES] = { .name = " queues" , .type = YNL_PT_NEST, .nest = &netdev_queue_id_nest, };
275+ arr[NETDEV_A_DMABUF_FD] = { .name = " fd" , .type = YNL_PT_U32, };
276+ arr[NETDEV_A_DMABUF_ID] = { .name = " id" , .type = YNL_PT_U32, };
277+ return arr;
278+ } ();
279+
280+ struct ynl_policy_nest netdev_dmabuf_nest = {
281+ .max_attr = NETDEV_A_DMABUF_MAX,
282+ .table = netdev_dmabuf_policy.data (),
283+ };
284+
256285/* Common nested types */
257286int netdev_page_pool_info_put (struct nlmsghdr *nlh, unsigned int attr_type,
258287 const netdev_page_pool_info& obj)
@@ -292,6 +321,21 @@ int netdev_page_pool_info_parse(struct ynl_parse_arg *yarg,
292321 return 0 ;
293322}
294323
324+ int netdev_queue_id_put (struct nlmsghdr *nlh, unsigned int attr_type,
325+ const netdev_queue_id& obj)
326+ {
327+ struct nlattr *nest;
328+
329+ nest = ynl_attr_nest_start (nlh, attr_type);
330+ if (obj.id .has_value ())
331+ ynl_attr_put_u32 (nlh, NETDEV_A_QUEUE_ID, obj.id .value ());
332+ if (obj.type .has_value ())
333+ ynl_attr_put_u32 (nlh, NETDEV_A_QUEUE_TYPE, obj.type .value ());
334+ ynl_attr_nest_end (nlh, nest);
335+
336+ return 0 ;
337+ }
338+
295339/* ============== NETDEV_CMD_DEV_GET ============== */
296340/* NETDEV_CMD_DEV_GET - do */
297341int netdev_dev_get_rsp_parse (const struct nlmsghdr *nlh,
@@ -421,6 +465,10 @@ int netdev_page_pool_get_rsp_parse(const struct nlmsghdr *nlh,
421465 if (ynl_attr_validate (yarg, attr))
422466 return YNL_PARSE_CB_ERROR;
423467 dst->detach_time = (__u64)ynl_attr_get_uint (attr);
468+ } else if (type == NETDEV_A_PAGE_POOL_DMABUF) {
469+ if (ynl_attr_validate (yarg, attr))
470+ return YNL_PARSE_CB_ERROR;
471+ dst->dmabuf = (__u32)ynl_attr_get_u32 (attr);
424472 }
425473 }
426474
@@ -635,6 +683,10 @@ int netdev_queue_get_rsp_parse(const struct nlmsghdr *nlh,
635683 if (ynl_attr_validate (yarg, attr))
636684 return YNL_PARSE_CB_ERROR;
637685 dst->ifindex = (__u32)ynl_attr_get_u32 (attr);
686+ } else if (type == NETDEV_A_QUEUE_DMABUF) {
687+ if (ynl_attr_validate (yarg, attr))
688+ return YNL_PARSE_CB_ERROR;
689+ dst->dmabuf = (__u32)ynl_attr_get_u32 (attr);
638690 }
639691 }
640692
@@ -870,6 +922,60 @@ netdev_qstats_get_dump(ynl_cpp::ynl_socket& ys,
870922 return ret;
871923}
872924
925+ /* ============== NETDEV_CMD_BIND_RX ============== */
926+ /* NETDEV_CMD_BIND_RX - do */
927+ int netdev_bind_rx_rsp_parse (const struct nlmsghdr *nlh,
928+ struct ynl_parse_arg *yarg)
929+ {
930+ const struct nlattr *attr;
931+ netdev_bind_rx_rsp *dst;
932+
933+ dst = (netdev_bind_rx_rsp*)yarg->data ;
934+
935+ ynl_attr_for_each (attr, nlh, yarg->ys ->family ->hdr_len ) {
936+ unsigned int type = ynl_attr_type (attr);
937+
938+ if (type == NETDEV_A_DMABUF_ID) {
939+ if (ynl_attr_validate (yarg, attr))
940+ return YNL_PARSE_CB_ERROR;
941+ dst->id = (__u32)ynl_attr_get_u32 (attr);
942+ }
943+ }
944+
945+ return YNL_PARSE_CB_OK;
946+ }
947+
948+ std::unique_ptr<netdev_bind_rx_rsp>
949+ netdev_bind_rx (ynl_cpp::ynl_socket& ys, netdev_bind_rx_req& req)
950+ {
951+ struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
952+ std::unique_ptr<netdev_bind_rx_rsp> rsp;
953+ struct nlmsghdr *nlh;
954+ int err;
955+
956+ nlh = ynl_gemsg_start_req (ys, ((struct ynl_sock *)ys)->family_id , NETDEV_CMD_BIND_RX, 1 );
957+ ((struct ynl_sock *)ys)->req_policy = &netdev_dmabuf_nest;
958+ yrs.yarg .rsp_policy = &netdev_dmabuf_nest;
959+
960+ if (req.ifindex .has_value ())
961+ ynl_attr_put_u32 (nlh, NETDEV_A_DMABUF_IFINDEX, req.ifindex .value ());
962+ if (req.fd .has_value ())
963+ ynl_attr_put_u32 (nlh, NETDEV_A_DMABUF_FD, req.fd .value ());
964+ for (unsigned int i = 0 ; i < req.queues .size (); i++)
965+ netdev_queue_id_put (nlh, NETDEV_A_DMABUF_QUEUES, req.queues [i]);
966+
967+ rsp.reset (new netdev_bind_rx_rsp ());
968+ yrs.yarg .data = rsp.get ();
969+ yrs.cb = netdev_bind_rx_rsp_parse;
970+ yrs.rsp_cmd = NETDEV_CMD_BIND_RX;
971+
972+ err = ynl_exec (ys, nlh, &yrs);
973+ if (err < 0 )
974+ return nullptr ;
975+
976+ return rsp;
977+ }
978+
873979static constexpr std::array<ynl_ntf_info, NETDEV_CMD_PAGE_POOL_CHANGE_NTF + 1 > netdev_ntf_info = []() {
874980 std::array<ynl_ntf_info, NETDEV_CMD_PAGE_POOL_CHANGE_NTF + 1 > arr{};
875981 arr[NETDEV_CMD_DEV_ADD_NTF] = {
0 commit comments