@@ -11,106 +11,106 @@ use uefi::{
11
11
pub fn test ( image : Handle , bt : & BootServices ) {
12
12
info ! ( "Testing Network protocols" ) ;
13
13
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 ") ;
115
115
}
116
116
}
0 commit comments