Skip to content

Commit 75499ad

Browse files
committed
Adding more test for increased code coverage
1 parent 37a6745 commit 75499ad

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

vm/devices/net/net_mana/src/lib.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT License.
33

4-
#![forbid(unsafe_code)]
4+
#![cfg_attr(not(test), forbid(unsafe_code))]
55
#![expect(missing_docs)]
66

77
mod test;
@@ -1373,8 +1373,16 @@ impl<T: DeviceBacking> ManaQueue<T> {
13731373
sgl[0].size,
13741374
header_len
13751375
);
1376-
// Drop the LSO packet, if it only has a header segment.
1377-
if meta.offload_tcp_segmentation && sgl.len() == 1 {
1376+
1377+
// Drop the LSO packet if it only has a header segment.
1378+
// In production builds, this check always runs.
1379+
// In test builds, it can be bypassed with ALLOW_LSO_PKT_WITH_ONE_SGE environment variable.
1380+
#[cfg(not(test))]
1381+
let check_lso_segment_count = true;
1382+
#[cfg(test)]
1383+
let check_lso_segment_count = std::env::var("ALLOW_LSO_PKT_WITH_ONE_SGE").is_err();
1384+
1385+
if check_lso_segment_count && meta.offload_tcp_segmentation && sgl.len() == 1 {
13781386
tracelimit::error_ratelimited!(
13791387
sgl_len = sgl.len(),
13801388
"LSO packets should have more than one SGL entry"

vm/devices/net/net_mana/src/test.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
// Licensed under the MIT License.
33

44
#![cfg(test)]
5+
// UNSAFETY: This test module contains unsafe code to set some environment variables
6+
// for getting code coverage.
7+
#![expect(unsafe_code)]
58

69
use crate::GuestDmaMode;
710
use crate::ManaEndpoint;
@@ -99,7 +102,7 @@ async fn test_lso_partial_bytes(driver: DefaultDriver) {
99102
metadata.l3_protocol = net_backend::L3Protocol::Ipv4;
100103
let header_length =
101104
(metadata.l2_len as u16 + metadata.l3_len + metadata.l4_len as u16) as usize;
102-
// Add a few bytes to header to mimick the head segment being larger than the header length.
105+
// Add a few bytes to header to mimic the head segment being larger than the header length.
103106
let packet_len: usize = num_segments * (header_length + 2);
104107
let stats = test_endpoint_lso(driver, packet_len, num_segments, metadata, 1).await;
105108

@@ -154,7 +157,7 @@ async fn test_lso_segment_coalescing_partial_bytes_in_header(driver: DefaultDriv
154157
metadata.l3_protocol = net_backend::L3Protocol::Ipv4;
155158
let header_length =
156159
(metadata.l2_len as u16 + metadata.l3_len + metadata.l4_len as u16) as usize;
157-
// Add a few bytes to header to mimick the head segment being larger than the header length.
160+
// Add a few bytes to header to mimic the head segment being larger than the header length.
158161
let packet_len: usize = num_segments * (header_length + 2);
159162
let stats = test_endpoint_lso(driver, packet_len, num_segments, metadata, 1).await;
160163

@@ -184,12 +187,43 @@ async fn test_lso_segment_coalescing_only_header(driver: DefaultDriver) {
184187
let packet_len: usize = num_segments * header_length;
185188

186189
// An LSO packet without any payload is considered bad packet and should be dropped.
187-
let stats = test_endpoint_lso(driver, packet_len, num_segments, metadata, 0).await;
190+
let stats = test_endpoint_lso(
191+
driver.clone(),
192+
packet_len,
193+
num_segments,
194+
metadata.clone(),
195+
0,
196+
)
197+
.await;
188198

189199
assert_eq!(stats.tx_packets.get(), 0, "tx_packets increase");
190200
assert_eq!(stats.rx_packets.get(), 0, "rx_packets increase");
191201
assert_eq!(stats.tx_errors.get(), 0, "tx_errors remain the same");
192202
assert_eq!(stats.rx_errors.get(), 0, "rx_errors remain the same");
203+
204+
// Set the environment variable to allow LSO packet with only 1 SGE, for testing purposes.
205+
// SAFETY: Setting environment variable for test purposes, to get code coverage.
206+
unsafe {
207+
std::env::set_var("ALLOW_LSO_PKT_WITH_ONE_SGE", "1");
208+
}
209+
210+
let stats = test_endpoint_lso(
211+
driver.clone(),
212+
packet_len,
213+
num_segments,
214+
metadata.clone(),
215+
0,
216+
)
217+
.await;
218+
219+
unsafe {
220+
std::env::remove_var("ALLOW_LSO_PKT_WITH_ONE_SGE");
221+
}
222+
223+
assert_eq!(stats.tx_packets.get(), 0, "tx_packets increase");
224+
assert_eq!(stats.rx_packets.get(), 0, "rx_packets increase");
225+
assert_eq!(stats.tx_errors.get(), 1, "tx_errors remain the same");
226+
assert_eq!(stats.rx_errors.get(), 0, "rx_errors remain the same");
193227
}
194228

195229
macro_rules! lso_split_headers {

0 commit comments

Comments
 (0)