@@ -11,106 +11,106 @@ use uefi::{
1111pub fn test ( image : Handle , bt : & BootServices ) {
1212 info ! ( "Testing Network protocols" ) ;
1313
14- let handles = bt
15- . find_handles :: < BaseCode > ( )
16- . expect ( "Failed to get handles for `BaseCode` protocol" ) ;
17-
18- for handle in handles {
19- let base_code = bt
20- . open_protocol :: < BaseCode > (
21- OpenProtocolParams {
22- handle ,
23- agent : image ,
24- controller : None ,
25- } ,
26- OpenProtocolAttributes :: Exclusive ,
27- )
28- . unwrap ( ) ;
29-
30- let base_code = unsafe { & mut * base_code. interface . get ( ) } ;
31-
32- info ! ( "Starting PXE Base Code") ;
33- base_code
34- . start ( false )
35- . expect ( "failed to start PXE Base Code " ) ;
36- base_code
37- . dhcp ( false )
38- . expect ( "failed to complete a dhcpv4 handshake" ) ;
39-
40- assert ! ( base_code . mode ( ) . dhcp_ack_received ) ;
41- let dhcp_ack : & DhcpV4Packet = base_code . mode ( ) . dhcp_ack . as_ref ( ) ;
42- let server_ip = dhcp_ack . bootp_si_addr ;
43- let server_ip = IpAddress :: new_v4 ( server_ip ) ;
44-
45- const EXAMPLE_FILE_NAME : & [ u8 ] = b"example-file.txt \0 " ;
46- const EXAMPLE_FILE_CONTENT : & [ u8 ] = b"Hello world!" ;
47- let example_file_name = CStr8 :: from_bytes_with_nul ( EXAMPLE_FILE_NAME ) . unwrap ( ) ;
48-
49- info ! ( "Getting remote file size") ;
50- let file_size = base_code
51- . tftp_get_file_size ( & server_ip , example_file_name )
52- . expect ( "failed to query file size ") ;
53- assert_eq ! ( file_size , EXAMPLE_FILE_CONTENT . len ( ) as u64 ) ;
54-
55- info ! ( "Reading remote file" ) ;
56- let mut buffer = [ 0 ; 512 ] ;
57- let len = base_code
58- . tftp_read_file ( & server_ip , example_file_name , Some ( & mut buffer) )
59- . expect ( "failed to read file" ) ;
60- let len = usize :: try_from ( len ) . unwrap ( ) ;
61- assert_eq ! ( EXAMPLE_FILE_CONTENT , & buffer [ ..len ] ) ;
62-
63- base_code
64- . set_ip_filter ( & IpFilter :: new ( IpFilters :: STATION_IP , & [ ] ) )
65- . expect ( "failed to set ip filter" ) ;
66-
67- const EXAMPLE_SERVICE_PORT : u16 = 21572 ;
68-
69- info ! ( "Writing UDP packet to example service" ) ;
70-
71- let payload = [ 1 , 2 , 3 , 4 ] ;
72- let header = [ payload . len ( ) as u8 ] ;
73- let mut write_src_port = 0 ;
74- base_code
75- . udp_write (
76- UdpOpFlags :: ANY_SRC_PORT ,
77- & server_ip ,
78- EXAMPLE_SERVICE_PORT ,
79- None ,
80- None ,
81- Some ( & mut write_src_port ) ,
82- Some ( & header ) ,
83- & payload ,
84- )
85- . expect ( "failed to write UDP packet" ) ;
86-
87- info ! ( "Reading UDP packet from example service" ) ;
88-
89- let mut src_ip = server_ip ;
90- let mut src_port = EXAMPLE_SERVICE_PORT ;
91- let mut dest_ip = base_code . mode ( ) . station_ip ;
92- let mut dest_port = write_src_port ;
93- let mut header = [ 0 ; 1 ] ;
94- let mut received = [ 0 ; 4 ] ;
95- base_code
96- . udp_read (
97- UdpOpFlags :: USE_FILTER ,
98- Some ( & mut dest_ip ) ,
99- Some ( & mut dest_port ) ,
100- Some ( & mut src_ip ) ,
101- Some ( & mut src_port ) ,
102- Some ( & mut header ) ,
103- & mut received ,
104- )
105- . unwrap ( ) ;
106-
107- // Check the header.
108- assert_eq ! ( header [ 0 ] as usize , payload . len ( ) ) ;
109- // Check that we receive the reversed payload.
110- received . reverse ( ) ;
111- assert_eq ! ( payload , received ) ;
112-
113- info ! ( "Stopping PXE Base Code" ) ;
114- base_code . stop ( ) . expect ( "failed to stop PXE Base Code") ;
14+ if let Ok ( handles) = bt. find_handles :: < BaseCode > ( ) {
15+ for handle in handles {
16+ let base_code = bt
17+ . open_protocol :: < BaseCode > (
18+ OpenProtocolParams {
19+ handle ,
20+ agent : image ,
21+ controller : None ,
22+ } ,
23+ OpenProtocolAttributes :: Exclusive ,
24+ )
25+ . unwrap ( ) ;
26+
27+ let base_code = unsafe { & mut * base_code . interface . get ( ) } ;
28+
29+ info ! ( "Starting PXE Base Code" ) ;
30+ base_code
31+ . start ( false )
32+ . expect ( "failed to start PXE Base Code") ;
33+ base_code
34+ . dhcp ( false )
35+ . expect ( "failed to complete a dhcpv4 handshake " ) ;
36+
37+ assert ! ( base_code . mode ( ) . dhcp_ack_received ) ;
38+ let dhcp_ack : & DhcpV4Packet = base_code . mode ( ) . dhcp_ack . as_ref ( ) ;
39+ let server_ip = dhcp_ack . bootp_si_addr ;
40+ let server_ip = IpAddress :: new_v4 ( server_ip ) ;
41+
42+ const EXAMPLE_FILE_NAME : & [ u8 ] = b"example-file.txt \0 " ;
43+ const EXAMPLE_FILE_CONTENT : & [ u8 ] = b"Hello world!" ;
44+ let example_file_name = CStr8 :: from_bytes_with_nul ( EXAMPLE_FILE_NAME ) . unwrap ( ) ;
45+
46+ info ! ( "Getting remote file size" ) ;
47+ let file_size = base_code
48+ . tftp_get_file_size ( & server_ip , example_file_name )
49+ . expect ( "failed to query file size") ;
50+ assert_eq ! ( file_size, EXAMPLE_FILE_CONTENT . len ( ) as u64 ) ;
51+
52+ info ! ( "Reading remote file") ;
53+ let mut buffer = [ 0 ; 512 ] ;
54+ let len = base_code
55+ . tftp_read_file ( & server_ip , example_file_name , Some ( & mut buffer ) )
56+ . expect ( "failed to read file" ) ;
57+ let len = usize :: try_from ( len ) . unwrap ( ) ;
58+ assert_eq ! ( EXAMPLE_FILE_CONTENT , & buffer[ ..len ] ) ;
59+
60+ base_code
61+ . set_ip_filter ( & IpFilter :: new ( IpFilters :: STATION_IP , & [ ] ) )
62+ . expect ( "failed to set ip filter" ) ;
63+
64+ const EXAMPLE_SERVICE_PORT : u16 = 21572 ;
65+
66+ info ! ( "Writing UDP packet to example service" ) ;
67+
68+ let payload = [ 1 , 2 , 3 , 4 ] ;
69+ let header = [ payload . len ( ) as u8 ] ;
70+ let mut write_src_port = 0 ;
71+ base_code
72+ . udp_write (
73+ UdpOpFlags :: ANY_SRC_PORT ,
74+ & server_ip ,
75+ EXAMPLE_SERVICE_PORT ,
76+ None ,
77+ None ,
78+ Some ( & mut write_src_port ) ,
79+ Some ( & header ) ,
80+ & payload ,
81+ )
82+ . expect ( "failed to write UDP packet" ) ;
83+
84+ info ! ( "Reading UDP packet from example service" ) ;
85+
86+ let mut src_ip = server_ip ;
87+ let mut src_port = EXAMPLE_SERVICE_PORT ;
88+ let mut dest_ip = base_code . mode ( ) . station_ip ;
89+ let mut dest_port = write_src_port ;
90+ let mut header = [ 0 ; 1 ] ;
91+ let mut received = [ 0 ; 4 ] ;
92+ base_code
93+ . udp_read (
94+ UdpOpFlags :: USE_FILTER ,
95+ Some ( & mut dest_ip ) ,
96+ Some ( & mut dest_port ) ,
97+ Some ( & mut src_ip ) ,
98+ Some ( & mut src_port ) ,
99+ Some ( & mut header ) ,
100+ & mut received ,
101+ )
102+ . unwrap ( ) ;
103+
104+ // Check the header.
105+ assert_eq ! ( header [ 0 ] as usize , payload . len ( ) ) ;
106+ // Check that we receive the reversed payload.
107+ received . reverse ( ) ;
108+ assert_eq ! ( payload , received ) ;
109+
110+ info ! ( "Stopping PXE Base Code" ) ;
111+ base_code . stop ( ) . expect ( "failed to stop PXE Base Code" ) ;
112+ }
113+ } else {
114+ warn ! ( " PXE Base Code protocol is not supported ") ;
115115 }
116116}
0 commit comments