@@ -783,7 +783,7 @@ impl VhostUserMsgValidator for VhostUserVringAddr {
783
783
if ( self . flags & !VhostUserVringAddrFlags :: all ( ) . bits ( ) ) != 0 {
784
784
return false ;
785
785
}
786
-
786
+
787
787
// Check if packed ring format
788
788
if self . flags & VhostUserVringAddrFlags :: VHOST_VRING_F_PACKED . bits ( ) != 0 {
789
789
// Packed ring validation:
@@ -1438,4 +1438,57 @@ mod tests {
1438
1438
msg. flags |= 0x4 ;
1439
1439
assert ! ( !msg. is_valid( ) ) ;
1440
1440
}
1441
+
1442
+ #[ test]
1443
+ fn test_packed_virtqueue_features ( ) {
1444
+ let a = VhostUserVirtioFeatures :: RING_PACKED . bits ( ) ;
1445
+ assert_eq ! ( a, 0x4_0000_0000 ) ;
1446
+
1447
+ let a = VhostUserVringAddrFlags :: VHOST_VRING_F_PACKED . bits ( ) ;
1448
+ assert_eq ! ( a, 0x2 ) ;
1449
+
1450
+ let combined = VhostUserVringAddrFlags :: VHOST_VRING_F_LOG
1451
+ | VhostUserVringAddrFlags :: VHOST_VRING_F_PACKED ;
1452
+ let a = combined. bits ( ) ;
1453
+ assert_eq ! ( a, 0x3 ) ;
1454
+ }
1455
+
1456
+ #[ test]
1457
+ fn test_packed_vring_addr_validation ( ) {
1458
+ let mut addr = VhostUserVringAddr :: new (
1459
+ 0 ,
1460
+ VhostUserVringAddrFlags :: VHOST_VRING_F_PACKED ,
1461
+ 0x1000 ,
1462
+ 0x2000 ,
1463
+ 0x3000 ,
1464
+ 0x4000 ,
1465
+ ) ;
1466
+
1467
+ let a = addr. index ;
1468
+ assert_eq ! ( a, 0 ) ;
1469
+ let a = addr. flags ;
1470
+ assert_eq ! ( a, VhostUserVringAddrFlags :: VHOST_VRING_F_PACKED . bits( ) ) ;
1471
+ let a = addr. descriptor ;
1472
+ assert_eq ! ( a, 0x1000 ) ;
1473
+ let a = addr. used ;
1474
+ assert_eq ! ( a, 0x2000 ) ;
1475
+ let a = addr. available ;
1476
+ assert_eq ! ( a, 0x3000 ) ;
1477
+ let a = addr. log ;
1478
+ assert_eq ! ( a, 0x4000 ) ;
1479
+ assert ! ( addr. is_valid( ) ) ;
1480
+
1481
+ addr. descriptor = 0x1001 ;
1482
+ assert ! ( !addr. is_valid( ) ) ;
1483
+ addr. descriptor = 0x1000 ;
1484
+
1485
+ addr. available = 0x3001 ;
1486
+ assert ! ( !addr. is_valid( ) ) ;
1487
+ addr. available = 0x3000 ;
1488
+
1489
+ addr. used = 0x2001 ;
1490
+ assert ! ( !addr. is_valid( ) ) ;
1491
+ addr. used = 0x2000 ;
1492
+ assert ! ( addr. is_valid( ) ) ;
1493
+ }
1441
1494
}
0 commit comments