@@ -25,6 +25,7 @@ static const char * const netdev_op_strmap[] = {
25
25
[NETDEV_CMD_QUEUE_GET ] = "queue-get" ,
26
26
[NETDEV_CMD_NAPI_GET ] = "napi-get" ,
27
27
[NETDEV_CMD_QSTATS_GET ] = "qstats-get" ,
28
+ [NETDEV_CMD_BIND_RX ] = "bind-rx" ,
28
29
};
29
30
30
31
const char * netdev_op_str (int op )
@@ -114,6 +115,16 @@ const struct ynl_policy_nest netdev_page_pool_info_nest = {
114
115
.table = netdev_page_pool_info_policy ,
115
116
};
116
117
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
+
117
128
const struct ynl_policy_attr netdev_dev_policy [NETDEV_A_DEV_MAX + 1 ] = {
118
129
[NETDEV_A_DEV_IFINDEX ] = { .name = "ifindex" , .type = YNL_PT_U32 , },
119
130
[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]
135
146
[NETDEV_A_PAGE_POOL_INFLIGHT ] = { .name = "inflight" , .type = YNL_PT_UINT , },
136
147
[NETDEV_A_PAGE_POOL_INFLIGHT_MEM ] = { .name = "inflight-mem" , .type = YNL_PT_UINT , },
137
148
[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 , },
138
150
};
139
151
140
152
const 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] = {
167
179
[NETDEV_A_QUEUE_IFINDEX ] = { .name = "ifindex" , .type = YNL_PT_U32 , },
168
180
[NETDEV_A_QUEUE_TYPE ] = { .name = "type" , .type = YNL_PT_U32 , },
169
181
[NETDEV_A_QUEUE_NAPI_ID ] = { .name = "napi-id" , .type = YNL_PT_U32 , },
182
+ [NETDEV_A_QUEUE_DMABUF ] = { .name = "dmabuf" , .type = YNL_PT_U32 , },
170
183
};
171
184
172
185
const struct ynl_policy_nest netdev_queue_nest = {
@@ -225,6 +238,18 @@ const struct ynl_policy_nest netdev_qstats_nest = {
225
238
.table = netdev_qstats_policy ,
226
239
};
227
240
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
+
228
253
/* Common nested types */
229
254
void netdev_page_pool_info_free (struct netdev_page_pool_info * obj )
230
255
{
@@ -270,6 +295,25 @@ int netdev_page_pool_info_parse(struct ynl_parse_arg *yarg,
270
295
return 0 ;
271
296
}
272
297
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
+
273
317
/* ============== NETDEV_CMD_DEV_GET ============== */
274
318
/* NETDEV_CMD_DEV_GET - do */
275
319
void 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,
453
497
return YNL_PARSE_CB_ERROR ;
454
498
dst -> _present .detach_time = 1 ;
455
499
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 );
456
505
}
457
506
}
458
507
@@ -752,6 +801,11 @@ int netdev_queue_get_rsp_parse(const struct nlmsghdr *nlh,
752
801
return YNL_PARSE_CB_ERROR ;
753
802
dst -> _present .ifindex = 1 ;
754
803
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 );
755
809
}
756
810
}
757
811
@@ -1077,6 +1131,80 @@ netdev_qstats_get_dump(struct ynl_sock *ys,
1077
1131
return NULL ;
1078
1132
}
1079
1133
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
+
1080
1208
static const struct ynl_ntf_info netdev_ntf_info [] = {
1081
1209
[NETDEV_CMD_DEV_ADD_NTF ] = {
1082
1210
.alloc_sz = sizeof (struct netdev_dev_get_ntf ),
0 commit comments