Skip to content

Commit 0512dc3

Browse files
committed
uefi-test-runner: SNP: decouple finding handle from test
Although the changes look big, most things were just reordered (moved out of the loop body) and decoupled. The function finding the proper handle verifies the interface has the right MAC, to prevent failure and ease debugging.
1 parent 005802d commit 0512dc3

File tree

1 file changed

+128
-99
lines changed
  • uefi-test-runner/src/proto/network

1 file changed

+128
-99
lines changed

uefi-test-runner/src/proto/network/snp.rs

Lines changed: 128 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -2,71 +2,102 @@
22

33
use core::time::Duration;
44

5+
use uefi::boot::ScopedProtocol;
56
use uefi::proto::network::MacAddress;
67
use uefi::proto::network::snp::{InterruptStatus, ReceiveFlags, SimpleNetwork};
78
use uefi::{Status, boot};
89

9-
pub fn test() {
10-
// This test currently depends on the PXE test running first.
11-
if cfg!(not(feature = "pxe")) {
12-
return;
13-
}
10+
/// The MAC address configured for the interface.
11+
const EXPECTED_MAC: [u8; 6] = [0x52, 0x54, 0, 0, 0, 0x1];
1412

15-
info!("Testing the simple network protocol");
13+
fn find_network_device() -> Option<ScopedProtocol<SimpleNetwork>> {
14+
let mut maybe_handle = None;
1615

1716
let handles = boot::find_handles::<SimpleNetwork>().unwrap_or_default();
1817

18+
// We iterate over all handles until we found the right network device.
1919
for handle in handles {
20-
let simple_network = boot::open_protocol_exclusive::<SimpleNetwork>(handle);
21-
if simple_network.is_err() {
20+
let Ok(handle) = boot::open_protocol_exclusive::<SimpleNetwork>(handle) else {
2221
continue;
23-
}
24-
let simple_network = simple_network.unwrap();
25-
26-
// Check shutdown
27-
let res = simple_network.shutdown();
28-
assert!(res == Ok(()) || res == Err(Status::NOT_STARTED.into()));
22+
};
2923

30-
// Check stop
31-
let res = simple_network.stop();
32-
assert!(res == Ok(()) || res == Err(Status::NOT_STARTED.into()));
24+
// Check media is present
25+
if !bool::from(handle.mode().media_present_supported)
26+
|| !bool::from(handle.mode().media_present)
27+
{
28+
continue;
29+
}
3330

34-
// Check start
35-
simple_network
36-
.start()
37-
.expect("Failed to start Simple Network");
31+
// Check MAC address
32+
let has_mac = handle.mode().current_address.0[0..6] == EXPECTED_MAC
33+
&& handle.mode().permanent_address.0[0..6] == EXPECTED_MAC;
34+
if !has_mac {
35+
continue;
36+
}
3837

39-
// Check initialize
40-
simple_network
41-
.initialize(0, 0)
42-
.expect("Failed to initialize Simple Network");
38+
maybe_handle.replace(handle);
39+
}
4340

44-
// edk2 virtio-net driver does not support statistics, so
45-
// allow UNSUPPORTED (same for collect_statistics below).
46-
let res = simple_network.reset_statistics();
47-
assert!(res == Ok(()) || res == Err(Status::UNSUPPORTED.into()));
41+
maybe_handle
42+
}
4843

49-
// Reading the interrupt status clears it
50-
simple_network.get_interrupt_status().unwrap();
44+
pub fn test() {
45+
// This test currently depends on the PXE test running first.
46+
if cfg!(not(feature = "pxe")) {
47+
return;
48+
}
5149

52-
// Set receive filters
53-
simple_network
54-
.receive_filters(
55-
ReceiveFlags::UNICAST | ReceiveFlags::BROADCAST,
56-
ReceiveFlags::empty(),
57-
false,
58-
None,
59-
)
60-
.expect("Failed to set receive filters");
61-
62-
// Check media
63-
if !bool::from(simple_network.mode().media_present_supported)
64-
|| !bool::from(simple_network.mode().media_present)
65-
{
66-
continue;
67-
}
50+
info!("Testing the simple network protocol");
6851

69-
let payload = b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
52+
// The handle to our specific network device, as the test requires also a
53+
// specific environment. We do not test all possible handles.
54+
let simple_network = find_network_device().unwrap_or_else(|| panic!(
55+
"Failed to find SNP handle for network device with MAC address {:x}:{:x}:{:x}:{:x}:{:x}:{:x}",
56+
EXPECTED_MAC[0],
57+
EXPECTED_MAC[1],
58+
EXPECTED_MAC[2],
59+
EXPECTED_MAC[3],
60+
EXPECTED_MAC[4],
61+
EXPECTED_MAC[5]
62+
));
63+
64+
// Check shutdown
65+
let res = simple_network.shutdown();
66+
assert!(res == Ok(()) || res == Err(Status::NOT_STARTED.into()));
67+
68+
// Check stop
69+
let res = simple_network.stop();
70+
assert!(res == Ok(()) || res == Err(Status::NOT_STARTED.into()));
71+
72+
// Check start
73+
simple_network
74+
.start()
75+
.expect("Failed to start Simple Network");
76+
77+
// Check initialize
78+
simple_network
79+
.initialize(0, 0)
80+
.expect("Failed to initialize Simple Network");
81+
82+
// edk2 virtio-net driver does not support statistics, so
83+
// allow UNSUPPORTED (same for collect_statistics below).
84+
let res = simple_network.reset_statistics();
85+
assert!(res == Ok(()) || res == Err(Status::UNSUPPORTED.into()));
86+
87+
// Reading the interrupt status clears it
88+
simple_network.get_interrupt_status().unwrap();
89+
90+
// Set receive filters
91+
simple_network
92+
.receive_filters(
93+
ReceiveFlags::UNICAST | ReceiveFlags::BROADCAST,
94+
ReceiveFlags::empty(),
95+
false,
96+
None,
97+
)
98+
.expect("Failed to set receive filters");
99+
100+
let payload = b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
70101
\x45\x00\
71102
\x00\x21\
72103
\x00\x01\
@@ -82,64 +113,62 @@ pub fn test() {
82113
\xa9\xe4\
83114
\x04\x01\x02\x03\x04";
84115

85-
let dest_addr = MacAddress([0xffu8; 32]);
86-
assert!(
87-
!simple_network
88-
.get_interrupt_status()
89-
.unwrap()
90-
.contains(InterruptStatus::TRANSMIT)
91-
);
92-
93-
// Send the frame
94-
simple_network
95-
.transmit(
96-
simple_network.mode().media_header_size as usize,
97-
payload,
98-
None,
99-
Some(dest_addr),
100-
Some(0x0800),
101-
)
102-
.expect("Failed to transmit frame");
103-
104-
info!("Waiting for the transmit");
105-
while !simple_network
116+
let dest_addr = MacAddress([0xffu8; 32]);
117+
assert!(
118+
!simple_network
106119
.get_interrupt_status()
107120
.unwrap()
108121
.contains(InterruptStatus::TRANSMIT)
109-
{}
110-
111-
// Attempt to receive a frame
112-
let mut buffer = [0u8; 1500];
122+
);
123+
124+
// Send the frame
125+
simple_network
126+
.transmit(
127+
simple_network.mode().media_header_size as usize,
128+
payload,
129+
None,
130+
Some(dest_addr),
131+
Some(0x0800),
132+
)
133+
.expect("Failed to transmit frame");
134+
135+
info!("Waiting for the transmit");
136+
while !simple_network
137+
.get_interrupt_status()
138+
.unwrap()
139+
.contains(InterruptStatus::TRANSMIT)
140+
{}
141+
142+
// Attempt to receive a frame
143+
let mut buffer = [0u8; 1500];
144+
145+
info!("Waiting for the reception");
146+
if simple_network.receive(&mut buffer, None, None, None, None) == Err(Status::NOT_READY.into())
147+
{
148+
boot::stall(Duration::from_secs(1));
113149

114-
info!("Waiting for the reception");
115-
if simple_network.receive(&mut buffer, None, None, None, None)
116-
== Err(Status::NOT_READY.into())
117-
{
118-
boot::stall(Duration::from_secs(1));
119-
120-
simple_network
121-
.receive(&mut buffer, None, None, None, None)
122-
.unwrap();
123-
}
150+
simple_network
151+
.receive(&mut buffer, None, None, None, None)
152+
.unwrap();
153+
}
124154

125-
assert_eq!(buffer[42..47], [4, 4, 3, 2, 1]);
155+
assert_eq!(buffer[42..47], [4, 4, 3, 2, 1]);
126156

127-
// Get stats
128-
let res = simple_network.collect_statistics();
129-
match res {
130-
Ok(stats) => {
131-
info!("Stats: {:?}", stats);
157+
// Get stats
158+
let res = simple_network.collect_statistics();
159+
match res {
160+
Ok(stats) => {
161+
info!("Stats: {:?}", stats);
132162

133-
// One frame should have been transmitted and one received
134-
assert_eq!(stats.tx_total_frames().unwrap(), 1);
135-
assert_eq!(stats.rx_total_frames().unwrap(), 1);
136-
}
137-
Err(e) => {
138-
if e == Status::UNSUPPORTED.into() {
139-
info!("Stats: unsupported.");
140-
} else {
141-
panic!("{e}");
142-
}
163+
// One frame should have been transmitted and one received
164+
assert_eq!(stats.tx_total_frames().unwrap(), 1);
165+
assert_eq!(stats.rx_total_frames().unwrap(), 1);
166+
}
167+
Err(e) => {
168+
if e == Status::UNSUPPORTED.into() {
169+
info!("Stats: unsupported.");
170+
} else {
171+
panic!("{e}");
143172
}
144173
}
145174
}

0 commit comments

Comments
 (0)