@@ -402,6 +402,61 @@ port_cfg_handler(struct ff_config *cfg, const char *section,
402
402
return 1 ;
403
403
}
404
404
405
+ static int
406
+ vdev_cfg_handler (struct ff_config * cfg , const char * section ,
407
+ const char * name , const char * value ) {
408
+
409
+ if (cfg -> dpdk .nb_vdev == 0 ) {
410
+ fprintf (stderr , "vdev_cfg_handler: must config dpdk.nb_vdev first\n" );
411
+ return 0 ;
412
+ }
413
+
414
+ if (cfg -> dpdk .vdev_cfgs == NULL ) {
415
+ struct ff_vdev_cfg * vc = calloc (RTE_MAX_ETHPORTS , sizeof (struct ff_vdev_cfg ));
416
+ if (vc == NULL ) {
417
+ fprintf (stderr , "vdev_cfg_handler malloc failed\n" );
418
+ return 0 ;
419
+ }
420
+ cfg -> dpdk .vdev_cfgs = vc ;
421
+ }
422
+
423
+ int vdevid ;
424
+ int ret = sscanf (section , "vdev%d" , & vdevid );
425
+ if (ret != 1 ) {
426
+ fprintf (stderr , "vdev_cfg_handler section[%s] error\n" , section );
427
+ return 0 ;
428
+ }
429
+
430
+ /* just return true if vdevid >= nb_vdev because it has no effect */
431
+ if (vdevid > cfg -> dpdk .nb_vdev ) {
432
+ fprintf (stderr , "vdev_cfg_handler section[%s] bigger than max vdev id\n" , section );
433
+ return 1 ;
434
+ }
435
+
436
+ struct ff_vdev_cfg * cur = & cfg -> dpdk .vdev_cfgs [vdevid ];
437
+ if (cur -> name == NULL ) {
438
+ cur -> name = strdup (section );
439
+ cur -> vdev_id = vdevid ;
440
+ }
441
+
442
+ if (strcmp (name , "iface" ) == 0 ) {
443
+ cur -> iface = strdup (value );
444
+ } else if (strcmp (name , "path" ) == 0 ) {
445
+ cur -> path = strdup (value );
446
+ } else if (strcmp (name , "queues" ) == 0 ) {
447
+ cur -> nb_queues = atoi (value );
448
+ } else if (strcmp (name , "queue_size" ) == 0 ) {
449
+ cur -> queue_size = atoi (value );
450
+ } else if (strcmp (name , "mac" ) == 0 ) {
451
+ cur -> mac = strdup (value );
452
+ } else if (strcmp (name , "cq" ) == 0 ) {
453
+ cur -> nb_cq = atoi (value );
454
+ }
455
+
456
+ return 1 ;
457
+ }
458
+
459
+
405
460
static int
406
461
ini_parse_handler (void * user , const char * section , const char * name ,
407
462
const char * value )
@@ -424,6 +479,8 @@ ini_parse_handler(void* user, const char* section, const char* name,
424
479
pconfig -> dpdk .base_virtaddr = strdup (value );
425
480
} else if (MATCH ("dpdk" , "port_list" )) {
426
481
return parse_port_list (pconfig , value );
482
+ } else if (MATCH ("dpdk" , "nb_vdev" )) {
483
+ pconfig -> dpdk .nb_vdev = atoi (value );
427
484
} else if (MATCH ("dpdk" , "promiscuous" )) {
428
485
pconfig -> dpdk .promiscuous = atoi (value );
429
486
} else if (MATCH ("dpdk" , "numa_on" )) {
@@ -456,6 +513,8 @@ ini_parse_handler(void* user, const char* section, const char* name,
456
513
return freebsd_conf_handler (pconfig , "sysctl" , name , value );
457
514
} else if (strncmp (section , "port" , 4 ) == 0 ) {
458
515
return port_cfg_handler (pconfig , section , name , value );
516
+ } else if (strncmp (section , "vdev" , 4 ) == 0 ) {
517
+ return vdev_cfg_handler (pconfig , section , name , value );
459
518
}
460
519
461
520
return 1 ;
@@ -492,8 +551,40 @@ dpdk_args_setup(struct ff_config *cfg)
492
551
dpdk_argv [n ++ ] = strdup (temp );
493
552
}
494
553
554
+ if (cfg -> dpdk .nb_vdev ) {
555
+ for (i = 0 ; i < cfg -> dpdk .nb_vdev ; i ++ ) {
556
+ sprintf (temp , "--vdev=virtio_user%d,path=%s" ,
557
+ cfg -> dpdk .vdev_cfgs [i ].vdev_id ,
558
+ cfg -> dpdk .vdev_cfgs [i ].path );
559
+ if (cfg -> dpdk .vdev_cfgs [i ].nb_queues ) {
560
+ sprintf (temp , "%s,queues=%u" ,
561
+ temp , cfg -> dpdk .vdev_cfgs [i ].nb_queues );
562
+ }
563
+ if (cfg -> dpdk .vdev_cfgs [i ].nb_cq ) {
564
+ sprintf (temp , "%s,cq=%u" ,
565
+ temp , cfg -> dpdk .vdev_cfgs [i ].nb_cq );
566
+ }
567
+ if (cfg -> dpdk .vdev_cfgs [i ].queue_size ) {
568
+ sprintf (temp , "%s,queue_size=%u" ,
569
+ temp , cfg -> dpdk .vdev_cfgs [i ].queue_size );
570
+ }
571
+ if (cfg -> dpdk .vdev_cfgs [i ].mac ) {
572
+ sprintf (temp , "%s,mac=%s" ,
573
+ temp , cfg -> dpdk .vdev_cfgs [i ].mac );
574
+ }
575
+ dpdk_argv [n ++ ] = strdup (temp );
576
+ }
577
+ sprintf (temp , "--no-pci" );
578
+ dpdk_argv [n ++ ] = strdup (temp );
579
+ sprintf (temp , "--file-prefix=container" );
580
+ dpdk_argv [n ++ ] = strdup (temp );
581
+ }
582
+
495
583
dpdk_argc = n ;
496
584
585
+ for (i = 0 ; i < n ; i ++ )
586
+ printf ("%s " , dpdk_argv [i ]);
587
+
497
588
return n ;
498
589
}
499
590
0 commit comments