@@ -5,7 +5,8 @@ use byteorder::{ByteOrder, NativeEndian};
5
5
use netlink_packet_utils:: {
6
6
nla:: { DefaultNla , Nla , NlaBuffer , NlasIterator } ,
7
7
parsers:: {
8
- parse_mac, parse_string, parse_u16, parse_u16_be, parse_u32, parse_u8,
8
+ parse_i32, parse_mac, parse_string, parse_u16, parse_u16_be, parse_u32,
9
+ parse_u8,
9
10
} ,
10
11
traits:: { Emitable , Parseable } ,
11
12
DecodeError ,
@@ -1345,6 +1346,9 @@ pub enum InfoMacVlan {
1345
1346
MacAddr ( [ u8 ; 6 ] ) ,
1346
1347
MacAddrData ( Vec < InfoMacVlan > ) ,
1347
1348
MacAddrCount ( u32 ) ,
1349
+ BcQueueLen ( u32 ) ,
1350
+ BcQueueLenUsed ( u32 ) ,
1351
+ BcCutoff ( i32 ) ,
1348
1352
Other ( DefaultNla ) ,
1349
1353
}
1350
1354
@@ -1359,6 +1363,9 @@ impl Nla for InfoMacVlan {
1359
1363
MacAddr ( _) => 6 ,
1360
1364
MacAddrData ( ref nlas) => nlas. as_slice ( ) . buffer_len ( ) ,
1361
1365
MacAddrCount ( _) => 4 ,
1366
+ BcQueueLen ( _) => 4 ,
1367
+ BcQueueLenUsed ( _) => 4 ,
1368
+ BcCutoff ( _) => 4 ,
1362
1369
Other ( nla) => nla. value_len ( ) ,
1363
1370
}
1364
1371
}
@@ -1373,6 +1380,9 @@ impl Nla for InfoMacVlan {
1373
1380
MacAddr ( bytes) => buffer. copy_from_slice ( bytes) ,
1374
1381
MacAddrData ( ref nlas) => nlas. as_slice ( ) . emit ( buffer) ,
1375
1382
MacAddrCount ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
1383
+ BcQueueLen ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
1384
+ BcQueueLenUsed ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
1385
+ BcCutoff ( value) => NativeEndian :: write_i32 ( buffer, * value) ,
1376
1386
Other ( nla) => nla. emit_value ( buffer) ,
1377
1387
}
1378
1388
}
@@ -1387,6 +1397,9 @@ impl Nla for InfoMacVlan {
1387
1397
MacAddr ( _) => IFLA_MACVLAN_MACADDR ,
1388
1398
MacAddrData ( _) => IFLA_MACVLAN_MACADDR_DATA ,
1389
1399
MacAddrCount ( _) => IFLA_MACVLAN_MACADDR_COUNT ,
1400
+ BcQueueLen ( _) => IFLA_MACVLAN_BC_QUEUE_LEN ,
1401
+ BcQueueLenUsed ( _) => IFLA_MACVLAN_BC_QUEUE_LEN_USED ,
1402
+ BcCutoff ( _) => IFLA_MACVLAN_BC_CUTOFF ,
1390
1403
Other ( nla) => nla. kind ( ) ,
1391
1404
}
1392
1405
}
@@ -1428,6 +1441,18 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVlan {
1428
1441
parse_u32 ( payload)
1429
1442
. context ( "invalid IFLA_MACVLAN_MACADDR_COUNT value" ) ?,
1430
1443
) ,
1444
+ IFLA_MACVLAN_BC_QUEUE_LEN => BcQueueLen (
1445
+ parse_u32 ( payload)
1446
+ . context ( "invalid IFLA_MACVLAN_BC_QUEUE_LEN value" ) ?,
1447
+ ) ,
1448
+ IFLA_MACVLAN_BC_QUEUE_LEN_USED => BcQueueLenUsed (
1449
+ parse_u32 ( payload)
1450
+ . context ( "invalid IFLA_MACVLAN_BC_QUEUE_LEN_USED value" ) ?,
1451
+ ) ,
1452
+ IFLA_MACVLAN_BC_CUTOFF => BcCutoff (
1453
+ parse_i32 ( payload)
1454
+ . context ( "invalid IFLA_MACVLAN_BC_CUTOFF value" ) ?,
1455
+ ) ,
1431
1456
kind => Other (
1432
1457
DefaultNla :: parse ( buf)
1433
1458
. context ( format ! ( "unknown NLA type {kind}" ) ) ?,
@@ -1446,6 +1471,9 @@ pub enum InfoMacVtap {
1446
1471
MacAddr ( [ u8 ; 6 ] ) ,
1447
1472
MacAddrData ( Vec < InfoMacVtap > ) ,
1448
1473
MacAddrCount ( u32 ) ,
1474
+ BcQueueLen ( u32 ) ,
1475
+ BcQueueLenUsed ( u32 ) ,
1476
+ BcCutoff ( i32 ) ,
1449
1477
Other ( DefaultNla ) ,
1450
1478
}
1451
1479
@@ -1460,6 +1488,9 @@ impl Nla for InfoMacVtap {
1460
1488
MacAddr ( _) => 6 ,
1461
1489
MacAddrData ( ref nlas) => nlas. as_slice ( ) . buffer_len ( ) ,
1462
1490
MacAddrCount ( _) => 4 ,
1491
+ BcQueueLen ( _) => 4 ,
1492
+ BcQueueLenUsed ( _) => 4 ,
1493
+ BcCutoff ( _) => 4 ,
1463
1494
Other ( nla) => nla. value_len ( ) ,
1464
1495
}
1465
1496
}
@@ -1474,6 +1505,9 @@ impl Nla for InfoMacVtap {
1474
1505
MacAddr ( bytes) => buffer. copy_from_slice ( bytes) ,
1475
1506
MacAddrData ( ref nlas) => nlas. as_slice ( ) . emit ( buffer) ,
1476
1507
MacAddrCount ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
1508
+ BcQueueLen ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
1509
+ BcQueueLenUsed ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
1510
+ BcCutoff ( value) => NativeEndian :: write_i32 ( buffer, * value) ,
1477
1511
Other ( nla) => nla. emit_value ( buffer) ,
1478
1512
}
1479
1513
}
@@ -1488,6 +1522,9 @@ impl Nla for InfoMacVtap {
1488
1522
MacAddr ( _) => IFLA_MACVLAN_MACADDR ,
1489
1523
MacAddrData ( _) => IFLA_MACVLAN_MACADDR_DATA ,
1490
1524
MacAddrCount ( _) => IFLA_MACVLAN_MACADDR_COUNT ,
1525
+ BcQueueLen ( _) => IFLA_MACVLAN_BC_QUEUE_LEN ,
1526
+ BcQueueLenUsed ( _) => IFLA_MACVLAN_BC_QUEUE_LEN_USED ,
1527
+ BcCutoff ( _) => IFLA_MACVLAN_BC_CUTOFF ,
1491
1528
Other ( nla) => nla. kind ( ) ,
1492
1529
}
1493
1530
}
@@ -1529,6 +1566,18 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVtap {
1529
1566
parse_u32 ( payload)
1530
1567
. context ( "invalid IFLA_MACVLAN_MACADDR_COUNT value" ) ?,
1531
1568
) ,
1569
+ IFLA_MACVLAN_BC_QUEUE_LEN => BcQueueLen (
1570
+ parse_u32 ( payload)
1571
+ . context ( "invalid IFLA_MACVLAN_BC_QUEUE_LEN value" ) ?,
1572
+ ) ,
1573
+ IFLA_MACVLAN_BC_QUEUE_LEN_USED => BcQueueLenUsed (
1574
+ parse_u32 ( payload)
1575
+ . context ( "invalid IFLA_MACVLAN_BC_QUEUE_LEN_USED value" ) ?,
1576
+ ) ,
1577
+ IFLA_MACVLAN_BC_CUTOFF => BcCutoff (
1578
+ parse_i32 ( payload)
1579
+ . context ( "invalid IFLA_MACVLAN_BC_CUTOFF value" ) ?,
1580
+ ) ,
1532
1581
kind => Other (
1533
1582
DefaultNla :: parse ( buf)
1534
1583
. context ( format ! ( "unknown NLA type {kind}" ) ) ?,
@@ -2142,6 +2191,64 @@ mod tests {
2142
2191
assert_eq ! ( & vec[ ..] , & MACVLAN [ ..] ) ;
2143
2192
}
2144
2193
2194
+ #[ rustfmt:: skip]
2195
+ static MACVLAN_BC : [ u8 ; 48 ] = [
2196
+ 0x0c , 0x00 , // length = 12
2197
+ 0x01 , 0x00 , // type = 1 = IFLA_INFO_KIND
2198
+ 0x6d , 0x61 , 0x63 , 0x76 , 0x6c , 0x61 , 0x6e , 0x00 , // V = "macvlan\0"
2199
+ 0x24 , 0x00 , // length = 36
2200
+ 0x02 , 0x00 , // type = 2 = IFLA_INFO_DATA
2201
+ 0x08 , 0x00 , // length = 8
2202
+ 0x01 , 0x00 , // type = IFLA_MACVLAN_MODE
2203
+ 0x02 , 0x00 , 0x00 , 0x00 , // V = 2 = vepa
2204
+
2205
+ 0x08 , 0x00 , // length = 8
2206
+ 0x07 , 0x00 , // type = IFLA_MACVLAN_BC_QUEUE_LEN
2207
+ 0xe8 , 0x03 , 0x00 , 0x00 , // value 1000
2208
+
2209
+ 0x08 , 0x00 , // length = 8
2210
+ 0x08 , 0x00 , // type = IFLA_MACVLAN_BC_QUEUE_LEN_USED
2211
+ 0xe8 , 0x03 , 0x00 , 0x00 , // value 1000
2212
+
2213
+ 0x08 , 0x00 , // length = 8
2214
+ 0x09 , 0x00 , // type = IFLA_MACVLAN_BC_CUTOFF
2215
+ 0xff , 0xff , 0xff , 0xff , // value = -1 (signed two's complement)
2216
+ ] ;
2217
+
2218
+ lazy_static ! {
2219
+ static ref MACVLAN_INFO_BC : Vec <InfoMacVlan > = vec![
2220
+ InfoMacVlan :: Mode ( 2 ) , // vepa
2221
+ InfoMacVlan :: BcQueueLen ( 1000 ) ,
2222
+ InfoMacVlan :: BcQueueLenUsed ( 1000 ) ,
2223
+ InfoMacVlan :: BcCutoff ( -1 ) ,
2224
+ ] ;
2225
+ }
2226
+
2227
+ #[ test]
2228
+ fn parse_info_macvlan_bc ( ) {
2229
+ let nla = NlaBuffer :: new_checked ( & MACVLAN_BC [ ..] ) . unwrap ( ) ;
2230
+ let parsed = VecInfo :: parse ( & nla) . unwrap ( ) . 0 ;
2231
+ let expected = vec ! [
2232
+ Info :: Kind ( InfoKind :: MacVlan ) ,
2233
+ Info :: Data ( InfoData :: MacVlan ( MACVLAN_INFO_BC . clone( ) ) ) ,
2234
+ ] ;
2235
+ assert_eq ! ( expected, parsed) ;
2236
+ }
2237
+
2238
+ #[ test]
2239
+ fn emit_info_macvlan_bc ( ) {
2240
+ let nlas = vec ! [
2241
+ Info :: Kind ( InfoKind :: MacVlan ) ,
2242
+ Info :: Data ( InfoData :: MacVlan ( MACVLAN_INFO_BC . clone( ) ) ) ,
2243
+ ] ;
2244
+
2245
+ assert_eq ! ( nlas. as_slice( ) . buffer_len( ) , 48 ) ;
2246
+
2247
+ let mut vec = vec ! [ 0xff ; 48 ] ;
2248
+ nlas. as_slice ( ) . emit ( & mut vec) ;
2249
+ assert_eq ! ( & vec[ ..] , & MACVLAN_BC [ ..] ) ;
2250
+ }
2251
+
2145
2252
lazy_static ! {
2146
2253
static ref XFRMTUN_INFO : Vec <InfoXfrmTun > = vec![
2147
2254
InfoXfrmTun :: IfId ( 4 ) , // ifid
0 commit comments