3
3
4
4
use std:: convert:: TryInto ;
5
5
use std:: ops:: Deref ;
6
+ use std:: result;
6
7
use std:: sync:: { Arc , Mutex } ;
7
- use std:: { fmt, result} ;
8
8
9
9
use devices:: virtio:: net:: TapError ;
10
10
use devices:: virtio:: Net ;
@@ -61,43 +61,23 @@ pub struct NetworkInterfaceUpdateConfig {
61
61
}
62
62
63
63
/// Errors associated with `NetworkInterfaceConfig`.
64
- #[ derive( Debug , derive_more :: From ) ]
64
+ #[ derive( Debug , thiserror :: Error ) ]
65
65
pub enum NetworkInterfaceError {
66
- /// Could not create Network Device.
67
- CreateNetworkDevice ( devices:: virtio:: net:: Error ) ,
68
- /// Failed to create a `RateLimiter` object.
69
- CreateRateLimiter ( std:: io:: Error ) ,
70
- /// The MAC address is already in use.
66
+ /// Could not create Network Device
67
+ #[ error( "Could not create Network Device: {0}" ) ]
68
+ CreateNetworkDevice ( #[ from] devices:: virtio:: net:: Error ) ,
69
+ /// Failed to create a `RateLimiter` object
70
+ #[ error( "Failed to create a `RateLimiter` object: {0}" ) ]
71
+ CreateRateLimiter ( #[ from] std:: io:: Error ) ,
72
+ /// The MAC address is already in use
73
+ #[ error( "The MAC address is already in use: {0}" ) ]
71
74
GuestMacAddressInUse ( String ) ,
72
- /// Error during interface update (patch).
73
- DeviceUpdate ( VmmError ) ,
74
- /// Cannot open/create tap device.
75
- OpenTap ( TapError ) ,
76
- }
77
-
78
- impl fmt:: Display for NetworkInterfaceError {
79
- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
80
- use self :: NetworkInterfaceError :: * ;
81
- match self {
82
- CreateNetworkDevice ( err) => write ! ( f, "Could not create Network Device: {:?}" , err) ,
83
- CreateRateLimiter ( err) => write ! ( f, "Cannot create RateLimiter: {}" , err) ,
84
- GuestMacAddressInUse ( mac_addr) => {
85
- write ! ( f, "The guest MAC address {mac_addr} is already in use." )
86
- }
87
- DeviceUpdate ( err) => write ! ( f, "Error during interface update (patch): {}" , err) ,
88
- OpenTap ( err) => {
89
- // We are propagating the Tap Error. This error can contain
90
- // imbricated quotes which would result in an invalid json.
91
- let mut tap_err = format ! ( "{:?}" , err) ;
92
- tap_err = tap_err. replace ( '\"' , "" ) ;
93
-
94
- write ! (
95
- f,
96
- "Cannot open TAP device. Invalid name/permissions. {tap_err}" ,
97
- )
98
- }
99
- }
100
- }
75
+ /// Error during interface update (patch)
76
+ #[ error( "Error during interface update (patch): {0}" ) ]
77
+ DeviceUpdate ( #[ from] VmmError ) ,
78
+ /// Cannot open/create tap device
79
+ #[ error( "Cannot open/create tap device: {0}" ) ]
80
+ OpenTap ( #[ from] TapError ) ,
101
81
}
102
82
103
83
type Result < T > = result:: Result < T , NetworkInterfaceError > ;
@@ -172,11 +152,13 @@ impl NetBuilder {
172
152
let rx_rate_limiter = cfg
173
153
. rx_rate_limiter
174
154
. map ( super :: RateLimiterConfig :: try_into)
175
- . transpose ( ) ?;
155
+ . transpose ( )
156
+ . map_err ( NetworkInterfaceError :: CreateRateLimiter ) ?;
176
157
let tx_rate_limiter = cfg
177
158
. tx_rate_limiter
178
159
. map ( super :: RateLimiterConfig :: try_into)
179
- . transpose ( ) ?;
160
+ . transpose ( )
161
+ . map_err ( NetworkInterfaceError :: CreateRateLimiter ) ?;
180
162
181
163
// Create and return the Net device
182
164
devices:: virtio:: net:: Net :: new_with_tap (
@@ -285,10 +267,10 @@ mod tests {
285
267
let guest_mac_2 = "01:23:45:67:89:0b" ;
286
268
287
269
let netif_2 = create_netif ( id_2, host_dev_name_2, guest_mac_1) ;
288
- let expected_error = format ! ( "The guest MAC address {} is already in use." , guest_mac_1) ;
270
+ let expected_error = NetworkInterfaceError :: GuestMacAddressInUse ( guest_mac_1. into ( ) ) ;
289
271
assert_eq ! (
290
272
net_builder. build( netif_2) . err( ) . unwrap( ) . to_string( ) ,
291
- expected_error
273
+ expected_error. to_string ( )
292
274
) ;
293
275
assert_eq ! ( net_builder. net_devices. len( ) , 1 ) ;
294
276
@@ -313,10 +295,10 @@ mod tests {
313
295
// Error Cases for UPDATE
314
296
// Error Case: Update netif_2 mac using the same mac as netif_1.
315
297
let netif_2 = create_netif ( id_2, host_dev_name_2, guest_mac_1) ;
316
- let expected_error = format ! ( "The guest MAC address {} is already in use." , guest_mac_1) ;
298
+ let expected_error = NetworkInterfaceError :: GuestMacAddressInUse ( guest_mac_1. into ( ) ) ;
317
299
assert_eq ! (
318
300
net_builder. build( netif_2) . err( ) . unwrap( ) . to_string( ) ,
319
- expected_error
301
+ expected_error. to_string ( )
320
302
) ;
321
303
322
304
// Error Case: Update netif_2 dev_host_name using the same dev_host_name as netif_1.
@@ -333,27 +315,6 @@ mod tests {
333
315
) ;
334
316
}
335
317
336
- #[ test]
337
- fn test_error_display ( ) {
338
- // FIXME: use macro
339
- let err = NetworkInterfaceError :: CreateNetworkDevice ( devices:: virtio:: net:: Error :: TapOpen (
340
- TapError :: InvalidIfname ,
341
- ) ) ;
342
- let _ = format ! ( "{}{:?}" , err, err) ;
343
- let err = NetworkInterfaceError :: CreateRateLimiter ( std:: io:: Error :: from_raw_os_error ( 0 ) ) ;
344
- let _ = format ! ( "{}{:?}" , err, err) ;
345
- let _ = format ! (
346
- "{}{:?}" ,
347
- NetworkInterfaceError :: DeviceUpdate ( VmmError :: VcpuExit ) ,
348
- NetworkInterfaceError :: DeviceUpdate ( VmmError :: VcpuExit )
349
- ) ;
350
- let _ = format ! (
351
- "{}{:?}" ,
352
- NetworkInterfaceError :: OpenTap ( TapError :: InvalidIfname ) ,
353
- NetworkInterfaceError :: OpenTap ( TapError :: InvalidIfname )
354
- ) ;
355
- }
356
-
357
318
#[ test]
358
319
fn test_net_config ( ) {
359
320
let net_id = "id" ;
0 commit comments