@@ -25,6 +25,7 @@ static const char * const netdev_op_strmap[] = {
2525 [NETDEV_CMD_QUEUE_GET ] = "queue-get" ,
2626 [NETDEV_CMD_NAPI_GET ] = "napi-get" ,
2727 [NETDEV_CMD_QSTATS_GET ] = "qstats-get" ,
28+ [NETDEV_CMD_BIND_RX ] = "bind-rx" ,
2829};
2930
3031const char * netdev_op_str (int op )
@@ -114,6 +115,16 @@ const struct ynl_policy_nest netdev_page_pool_info_nest = {
114115 .table = netdev_page_pool_info_policy ,
115116};
116117
118+ const struct ynl_policy_attr netdev_queue_id_policy [NETDEV_A_QUEUE_MAX + 1 ] = {
119+ [NETDEV_A_QUEUE_ID ] = { .name = "id" , .type = YNL_PT_U32 , },
120+ [NETDEV_A_QUEUE_TYPE ] = { .name = "type" , .type = YNL_PT_U32 , },
121+ };
122+
123+ const struct ynl_policy_nest netdev_queue_id_nest = {
124+ .max_attr = NETDEV_A_QUEUE_MAX ,
125+ .table = netdev_queue_id_policy ,
126+ };
127+
117128const struct ynl_policy_attr netdev_dev_policy [NETDEV_A_DEV_MAX + 1 ] = {
118129 [NETDEV_A_DEV_IFINDEX ] = { .name = "ifindex" , .type = YNL_PT_U32 , },
119130 [NETDEV_A_DEV_PAD ] = { .name = "pad" , .type = YNL_PT_IGNORE , },
@@ -135,6 +146,7 @@ const struct ynl_policy_attr netdev_page_pool_policy[NETDEV_A_PAGE_POOL_MAX + 1]
135146 [NETDEV_A_PAGE_POOL_INFLIGHT ] = { .name = "inflight" , .type = YNL_PT_UINT , },
136147 [NETDEV_A_PAGE_POOL_INFLIGHT_MEM ] = { .name = "inflight-mem" , .type = YNL_PT_UINT , },
137148 [NETDEV_A_PAGE_POOL_DETACH_TIME ] = { .name = "detach-time" , .type = YNL_PT_UINT , },
149+ [NETDEV_A_PAGE_POOL_DMABUF ] = { .name = "dmabuf" , .type = YNL_PT_U32 , },
138150};
139151
140152const struct ynl_policy_nest netdev_page_pool_nest = {
@@ -167,6 +179,7 @@ const struct ynl_policy_attr netdev_queue_policy[NETDEV_A_QUEUE_MAX + 1] = {
167179 [NETDEV_A_QUEUE_IFINDEX ] = { .name = "ifindex" , .type = YNL_PT_U32 , },
168180 [NETDEV_A_QUEUE_TYPE ] = { .name = "type" , .type = YNL_PT_U32 , },
169181 [NETDEV_A_QUEUE_NAPI_ID ] = { .name = "napi-id" , .type = YNL_PT_U32 , },
182+ [NETDEV_A_QUEUE_DMABUF ] = { .name = "dmabuf" , .type = YNL_PT_U32 , },
170183};
171184
172185const struct ynl_policy_nest netdev_queue_nest = {
@@ -225,6 +238,18 @@ const struct ynl_policy_nest netdev_qstats_nest = {
225238 .table = netdev_qstats_policy ,
226239};
227240
241+ const struct ynl_policy_attr netdev_dmabuf_policy [NETDEV_A_DMABUF_MAX + 1 ] = {
242+ [NETDEV_A_DMABUF_IFINDEX ] = { .name = "ifindex" , .type = YNL_PT_U32 , },
243+ [NETDEV_A_DMABUF_QUEUES ] = { .name = "queues" , .type = YNL_PT_NEST , .nest = & netdev_queue_id_nest , },
244+ [NETDEV_A_DMABUF_FD ] = { .name = "fd" , .type = YNL_PT_U32 , },
245+ [NETDEV_A_DMABUF_ID ] = { .name = "id" , .type = YNL_PT_U32 , },
246+ };
247+
248+ const struct ynl_policy_nest netdev_dmabuf_nest = {
249+ .max_attr = NETDEV_A_DMABUF_MAX ,
250+ .table = netdev_dmabuf_policy ,
251+ };
252+
228253/* Common nested types */
229254void netdev_page_pool_info_free (struct netdev_page_pool_info * obj )
230255{
@@ -270,6 +295,25 @@ int netdev_page_pool_info_parse(struct ynl_parse_arg *yarg,
270295 return 0 ;
271296}
272297
298+ void netdev_queue_id_free (struct netdev_queue_id * obj )
299+ {
300+ }
301+
302+ int netdev_queue_id_put (struct nlmsghdr * nlh , unsigned int attr_type ,
303+ struct netdev_queue_id * obj )
304+ {
305+ struct nlattr * nest ;
306+
307+ nest = ynl_attr_nest_start (nlh , attr_type );
308+ if (obj -> _present .id )
309+ ynl_attr_put_u32 (nlh , NETDEV_A_QUEUE_ID , obj -> id );
310+ if (obj -> _present .type )
311+ ynl_attr_put_u32 (nlh , NETDEV_A_QUEUE_TYPE , obj -> type );
312+ ynl_attr_nest_end (nlh , nest );
313+
314+ return 0 ;
315+ }
316+
273317/* ============== NETDEV_CMD_DEV_GET ============== */
274318/* NETDEV_CMD_DEV_GET - do */
275319void netdev_dev_get_req_free (struct netdev_dev_get_req * req )
@@ -453,6 +497,11 @@ int netdev_page_pool_get_rsp_parse(const struct nlmsghdr *nlh,
453497 return YNL_PARSE_CB_ERROR ;
454498 dst -> _present .detach_time = 1 ;
455499 dst -> detach_time = ynl_attr_get_uint (attr );
500+ } else if (type == NETDEV_A_PAGE_POOL_DMABUF ) {
501+ if (ynl_attr_validate (yarg , attr ))
502+ return YNL_PARSE_CB_ERROR ;
503+ dst -> _present .dmabuf = 1 ;
504+ dst -> dmabuf = ynl_attr_get_u32 (attr );
456505 }
457506 }
458507
@@ -752,6 +801,11 @@ int netdev_queue_get_rsp_parse(const struct nlmsghdr *nlh,
752801 return YNL_PARSE_CB_ERROR ;
753802 dst -> _present .ifindex = 1 ;
754803 dst -> ifindex = ynl_attr_get_u32 (attr );
804+ } else if (type == NETDEV_A_QUEUE_DMABUF ) {
805+ if (ynl_attr_validate (yarg , attr ))
806+ return YNL_PARSE_CB_ERROR ;
807+ dst -> _present .dmabuf = 1 ;
808+ dst -> dmabuf = ynl_attr_get_u32 (attr );
755809 }
756810 }
757811
@@ -1077,6 +1131,80 @@ netdev_qstats_get_dump(struct ynl_sock *ys,
10771131 return NULL ;
10781132}
10791133
1134+ /* ============== NETDEV_CMD_BIND_RX ============== */
1135+ /* NETDEV_CMD_BIND_RX - do */
1136+ void netdev_bind_rx_req_free (struct netdev_bind_rx_req * req )
1137+ {
1138+ unsigned int i ;
1139+
1140+ for (i = 0 ; i < req -> n_queues ; i ++ )
1141+ netdev_queue_id_free (& req -> queues [i ]);
1142+ free (req -> queues );
1143+ free (req );
1144+ }
1145+
1146+ void netdev_bind_rx_rsp_free (struct netdev_bind_rx_rsp * rsp )
1147+ {
1148+ free (rsp );
1149+ }
1150+
1151+ int netdev_bind_rx_rsp_parse (const struct nlmsghdr * nlh ,
1152+ struct ynl_parse_arg * yarg )
1153+ {
1154+ struct netdev_bind_rx_rsp * dst ;
1155+ const struct nlattr * attr ;
1156+
1157+ dst = yarg -> data ;
1158+
1159+ ynl_attr_for_each (attr , nlh , yarg -> ys -> family -> hdr_len ) {
1160+ unsigned int type = ynl_attr_type (attr );
1161+
1162+ if (type == NETDEV_A_DMABUF_ID ) {
1163+ if (ynl_attr_validate (yarg , attr ))
1164+ return YNL_PARSE_CB_ERROR ;
1165+ dst -> _present .id = 1 ;
1166+ dst -> id = ynl_attr_get_u32 (attr );
1167+ }
1168+ }
1169+
1170+ return YNL_PARSE_CB_OK ;
1171+ }
1172+
1173+ struct netdev_bind_rx_rsp *
1174+ netdev_bind_rx (struct ynl_sock * ys , struct netdev_bind_rx_req * req )
1175+ {
1176+ struct ynl_req_state yrs = { .yarg = { .ys = ys , }, };
1177+ struct netdev_bind_rx_rsp * rsp ;
1178+ struct nlmsghdr * nlh ;
1179+ int err ;
1180+
1181+ nlh = ynl_gemsg_start_req (ys , ys -> family_id , NETDEV_CMD_BIND_RX , 1 );
1182+ ys -> req_policy = & netdev_dmabuf_nest ;
1183+ yrs .yarg .rsp_policy = & netdev_dmabuf_nest ;
1184+
1185+ if (req -> _present .ifindex )
1186+ ynl_attr_put_u32 (nlh , NETDEV_A_DMABUF_IFINDEX , req -> ifindex );
1187+ if (req -> _present .fd )
1188+ ynl_attr_put_u32 (nlh , NETDEV_A_DMABUF_FD , req -> fd );
1189+ for (unsigned int i = 0 ; i < req -> n_queues ; i ++ )
1190+ netdev_queue_id_put (nlh , NETDEV_A_DMABUF_QUEUES , & req -> queues [i ]);
1191+
1192+ rsp = calloc (1 , sizeof (* rsp ));
1193+ yrs .yarg .data = rsp ;
1194+ yrs .cb = netdev_bind_rx_rsp_parse ;
1195+ yrs .rsp_cmd = NETDEV_CMD_BIND_RX ;
1196+
1197+ err = ynl_exec (ys , nlh , & yrs );
1198+ if (err < 0 )
1199+ goto err_free ;
1200+
1201+ return rsp ;
1202+
1203+ err_free :
1204+ netdev_bind_rx_rsp_free (rsp );
1205+ return NULL ;
1206+ }
1207+
10801208static const struct ynl_ntf_info netdev_ntf_info [] = {
10811209 [NETDEV_CMD_DEV_ADD_NTF ] = {
10821210 .alloc_sz = sizeof (struct netdev_dev_get_ntf ),
0 commit comments