@@ -58,20 +58,25 @@ use net::interface::IllegalInterfaceName;
5858use net:: interface:: InterfaceName ;
5959use sha2:: Digest ;
6060use std:: borrow:: Borrow ;
61- use std:: fmt:: Display ;
6261use std:: io:: { Read , Seek , SeekFrom , Write } ;
6362use std:: net:: SocketAddr ;
6463use std:: os:: fd:: { AsFd , AsRawFd , FromRawFd , OwnedFd , RawFd } ;
6564use std:: path:: PathBuf ;
6665use std:: str:: FromStr ;
6766
68- #[ derive( Debug , Clone , PartialEq , serde:: Serialize ) ]
67+ #[ derive(
68+ Debug , PartialEq , Eq , Clone , serde:: Serialize , rkyv:: Serialize , rkyv:: Deserialize , rkyv:: Archive ,
69+ ) ]
70+ #[ rkyv( attr( derive( PartialEq , Eq , Debug ) ) ) ]
6971pub enum PortArg {
7072 PCI ( PciAddress ) , // DPDK driver
7173 KERNEL ( InterfaceName ) , // kernel driver
7274}
7375
74- #[ derive( Debug , Clone , serde:: Serialize ) ]
76+ #[ derive(
77+ Debug , PartialEq , Eq , Clone , serde:: Serialize , rkyv:: Serialize , rkyv:: Deserialize , rkyv:: Archive ,
78+ ) ]
79+ #[ rkyv( attr( derive( PartialEq , Eq , Debug ) ) ) ]
7580#[ allow( unused) ]
7681pub struct InterfaceArg {
7782 pub interface : InterfaceName ,
@@ -309,15 +314,7 @@ impl From<MemFile> for FinalizedMemFile {
309314
310315/// Enum to represent either a TCP socket address or a UNIX socket path
311316#[ derive(
312- Debug ,
313- Clone ,
314- PartialEq ,
315- Eq ,
316- serde:: Serialize ,
317- serde:: Deserialize ,
318- rkyv:: Serialize ,
319- rkyv:: Deserialize ,
320- rkyv:: Archive ,
317+ Debug , Clone , PartialEq , Eq , serde:: Serialize , rkyv:: Serialize , rkyv:: Deserialize , rkyv:: Archive ,
321318) ]
322319#[ rkyv( attr( derive( PartialEq , Eq , Debug ) ) ) ]
323320pub enum GrpcAddress {
@@ -345,14 +342,7 @@ pub enum GrpcAddress {
345342/// - Use **Kernel** for development, testing, or environments without DPDK-compatible
346343/// hardware.
347344#[ derive(
348- Debug ,
349- PartialEq ,
350- Eq ,
351- serde:: Serialize ,
352- serde:: Deserialize ,
353- rkyv:: Serialize ,
354- rkyv:: Deserialize ,
355- rkyv:: Archive ,
345+ Debug , PartialEq , Eq , serde:: Serialize , rkyv:: Serialize , rkyv:: Deserialize , rkyv:: Archive ,
356346) ]
357347#[ serde( tag = "driver" ) ]
358348#[ serde( rename_all = "snake_case" ) ]
@@ -364,57 +354,6 @@ pub enum DriverConfigSection {
364354 Kernel ( KernelDriverConfigSection ) ,
365355}
366356
367- /// Description of a network device by its bus address.
368- ///
369- /// Currently supports PCI-addressed devices, which is the standard addressing
370- /// scheme for NICs in modern systems.
371- ///
372- /// # Example
373- ///
374- /// ```
375- /// use dataplane_args::NetworkDeviceDescription;
376- /// use hardware::pci::address::PciAddress;
377- ///
378- /// // PCI device at bus 0000:01:00.0
379- /// let device = NetworkDeviceDescription::Pci(
380- /// PciAddress::try_from("0000:01:00.0").unwrap()
381- /// );
382- /// ```
383- #[ derive(
384- Debug ,
385- Ord ,
386- PartialEq ,
387- PartialOrd ,
388- Eq ,
389- Hash ,
390- Clone ,
391- serde:: Serialize ,
392- serde:: Deserialize ,
393- rkyv:: Serialize ,
394- rkyv:: Deserialize ,
395- rkyv:: Archive ,
396- ) ]
397- #[ rkyv( attr( derive( PartialEq , Eq , Debug ) ) ) ]
398- pub enum NetworkDeviceDescription {
399- /// The PCI address of the network device to be used
400- Pci ( hardware:: pci:: address:: PciAddress ) ,
401- /// The kernel's name for net network interface
402- Kernel ( InterfaceName ) ,
403- }
404-
405- impl Display for NetworkDeviceDescription {
406- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
407- match self {
408- NetworkDeviceDescription :: Pci ( addr) => {
409- write ! ( f, "pci@{addr}" )
410- }
411- NetworkDeviceDescription :: Kernel ( name) => {
412- write ! ( f, "kernel@{name}" )
413- }
414- }
415- }
416- }
417-
418357/// Configuration for the DPDK (Data Plane Development Kit) driver.
419358///
420359/// DPDK provides kernel-bypass networking for high-performance packet processing.
@@ -425,7 +364,6 @@ impl Display for NetworkDeviceDescription {
425364 PartialEq ,
426365 Eq ,
427366 serde:: Serialize ,
428- serde:: Deserialize ,
429367 rkyv:: Serialize ,
430368 rkyv:: Deserialize ,
431369 rkyv:: Archive ,
@@ -449,7 +387,6 @@ pub struct DpdkDriverConfigSection {
449387 PartialEq ,
450388 Eq ,
451389 serde:: Serialize ,
452- serde:: Deserialize ,
453390 rkyv:: Serialize ,
454391 rkyv:: Deserialize ,
455392 rkyv:: Archive ,
@@ -470,7 +407,6 @@ pub struct KernelDriverConfigSection {
470407 PartialEq ,
471408 Eq ,
472409 serde:: Serialize ,
473- serde:: Deserialize ,
474410 rkyv:: Serialize ,
475411 rkyv:: Deserialize ,
476412 rkyv:: Archive ,
@@ -492,7 +428,6 @@ pub struct CliConfigSection {
492428 PartialEq ,
493429 Eq ,
494430 serde:: Serialize ,
495- serde:: Deserialize ,
496431 rkyv:: Serialize ,
497432 rkyv:: Deserialize ,
498433 rkyv:: Archive ,
@@ -510,7 +445,6 @@ pub struct MetricsConfigSection {
510445 PartialEq ,
511446 Eq ,
512447 serde:: Serialize ,
513- serde:: Deserialize ,
514448 rkyv:: Serialize ,
515449 rkyv:: Deserialize ,
516450 rkyv:: Archive ,
@@ -533,7 +467,6 @@ pub struct TracingConfigSection {
533467 PartialEq ,
534468 Eq ,
535469 serde:: Serialize ,
536- serde:: Deserialize ,
537470 rkyv:: Serialize ,
538471 rkyv:: Deserialize ,
539472 rkyv:: Archive ,
@@ -559,7 +492,6 @@ pub enum TracingDisplayOption {
559492 PartialEq ,
560493 Eq ,
561494 serde:: Serialize ,
562- serde:: Deserialize ,
563495 rkyv:: Serialize ,
564496 rkyv:: Deserialize ,
565497 rkyv:: Archive ,
@@ -578,14 +510,7 @@ pub struct TracingShowSection {
578510/// Defines how the dataplane communicates with FRR (Free Range Routing) and
579511/// related routing components.
580512#[ derive(
581- Debug ,
582- PartialEq ,
583- Eq ,
584- serde:: Serialize ,
585- serde:: Deserialize ,
586- rkyv:: Serialize ,
587- rkyv:: Deserialize ,
588- rkyv:: Archive ,
513+ Debug , PartialEq , Eq , serde:: Serialize , rkyv:: Serialize , rkyv:: Deserialize , rkyv:: Archive ,
589514) ]
590515#[ rkyv( attr( derive( PartialEq , Eq , Debug ) ) ) ]
591516pub struct RoutingConfigSection {
@@ -604,7 +529,6 @@ pub struct RoutingConfigSection {
604529 PartialEq ,
605530 Eq ,
606531 serde:: Serialize ,
607- serde:: Deserialize ,
608532 rkyv:: Serialize ,
609533 rkyv:: Deserialize ,
610534 rkyv:: Archive ,
@@ -638,7 +562,6 @@ pub struct ConfigServerSection {
638562 PartialEq ,
639563 Eq ,
640564 serde:: Serialize ,
641- serde:: Deserialize ,
642565 rkyv:: Serialize ,
643566 rkyv:: Deserialize ,
644567 rkyv:: Archive ,
@@ -668,7 +591,6 @@ pub struct LaunchConfiguration {
668591 PartialEq ,
669592 Eq ,
670593 serde:: Serialize ,
671- serde:: Deserialize ,
672594 rkyv:: Serialize ,
673595 rkyv:: Deserialize ,
674596 rkyv:: Archive ,
@@ -1119,6 +1041,8 @@ pub enum InvalidCmdArguments {
11191041 InvalidDriver ( String ) ,
11201042 #[ error( "Must specify driver as dpdk or kernel" ) ]
11211043 NoDriverSpecified ,
1044+ #[ error( "No network interfaces specified" ) ]
1045+ NoInterfacesSpecified ,
11221046 #[ error( transparent) ]
11231047 UnsupportedByDriver ( #[ from] UnsupportedByDriver ) ,
11241048}
@@ -1152,14 +1076,15 @@ impl TryFrom<CmdArgs> for LaunchConfiguration {
11521076 let eal_args = value
11531077 . interfaces ( )
11541078 . map ( |nic| match nic. port {
1155- NetworkDeviceDescription :: Pci ( pci_address) => {
1079+ Some ( PortArg :: PCI ( pci_address) ) => {
11561080 Ok ( [ "--allow" . to_string ( ) , format ! ( "{pci_address}" ) ] )
11571081 }
1158- NetworkDeviceDescription :: Kernel ( interface_name) => {
1082+ Some ( PortArg :: KERNEL ( interface_name) ) => {
11591083 Err ( InvalidCmdArguments :: UnsupportedByDriver (
11601084 UnsupportedByDriver :: Dpdk ( interface_name. clone ( ) ) ,
11611085 ) )
11621086 }
1087+ None => Err ( InvalidCmdArguments :: NoInterfacesSpecified ) ,
11631088 } )
11641089 . collect :: < Result < Vec < _ > , _ > > ( ) ?
11651090 . into_iter ( )
@@ -1512,7 +1437,7 @@ mod tests {
15121437 use hardware:: pci:: function:: Function ;
15131438 use net:: interface:: InterfaceName ;
15141439
1515- use crate :: { InterfaceArg , NetworkDeviceDescription } ;
1440+ use crate :: { InterfaceArg , PortArg } ;
15161441 use std:: str:: FromStr ;
15171442
15181443 #[ test]
@@ -1522,20 +1447,22 @@ mod tests {
15221447 assert_eq ! ( spec. interface. as_ref( ) , "GbEth1.9000" ) ;
15231448 assert_eq ! (
15241449 spec. port,
1525- NetworkDeviceDescription :: Pci ( PciAddress :: new(
1450+ Some ( PortArg :: PCI ( PciAddress :: new(
15261451 Domain :: from( 0 ) ,
15271452 Bus :: new( 2 ) ,
15281453 Device :: try_from( 1 ) . unwrap( ) ,
15291454 Function :: try_from( 7 ) . unwrap( )
1530- ) )
1455+ ) ) )
15311456 ) ;
15321457
15331458 // interface + port as kernel interface
15341459 let spec = InterfaceArg :: from_str ( "GbEth1.9000=kernel@enp2s1.100" ) . unwrap ( ) ;
15351460 assert_eq ! ( spec. interface. as_ref( ) , "GbEth1.9000" ) ;
15361461 assert_eq ! (
15371462 spec. port,
1538- NetworkDeviceDescription :: Kernel ( InterfaceName :: try_from( "enp2s1.100" ) . unwrap( ) )
1463+ Some ( PortArg :: KERNEL (
1464+ InterfaceName :: try_from( "enp2s1.100" ) . unwrap( )
1465+ ) )
15391466 ) ;
15401467
15411468 // bad pci address
0 commit comments