Skip to content

Commit ca0315a

Browse files
uefi: Use uefi_raw::Boolean in pxe::BaseCode
This is an intermediate step towards using the uefi-raw definition of the protocol.
1 parent 65113c7 commit ca0315a

File tree

1 file changed

+53
-43
lines changed

1 file changed

+53
-43
lines changed

uefi/src/proto/network/pxe.rs

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ use core::ffi::c_void;
1212
use core::fmt::{self, Debug, Display, Formatter};
1313
use core::iter::from_fn;
1414
use core::mem::MaybeUninit;
15-
use core::ptr::{null, null_mut};
15+
use core::ptr::{self, null, null_mut};
1616
use ptr_meta::Pointee;
1717
use uefi_raw::protocol::network::pxe::PxeBaseCodeTftpOpcode;
18+
use uefi_raw::Boolean;
1819

1920
pub use uefi_raw::protocol::network::pxe::{
2021
PxeBaseCodeBootType as BootstrapType, PxeBaseCodeIpFilterFlags as IpFilters,
@@ -28,27 +29,27 @@ pub use uefi_raw::protocol::network::pxe::{
2829
#[allow(clippy::type_complexity)]
2930
pub struct BaseCode {
3031
revision: u64,
31-
start: unsafe extern "efiapi" fn(this: &Self, use_ipv6: bool) -> Status,
32+
start: unsafe extern "efiapi" fn(this: &Self, use_ipv6: Boolean) -> Status,
3233
stop: unsafe extern "efiapi" fn(this: &Self) -> Status,
33-
dhcp: unsafe extern "efiapi" fn(this: &Self, sort_offers: bool) -> Status,
34+
dhcp: unsafe extern "efiapi" fn(this: &Self, sort_offers: Boolean) -> Status,
3435
discover: unsafe extern "efiapi" fn(
3536
this: &Self,
3637
ty: BootstrapType,
3738
layer: &mut u16,
38-
use_bis: bool,
39+
use_bis: Boolean,
3940
info: *const FfiDiscoverInfo,
4041
) -> Status,
4142
mtftp: unsafe extern "efiapi" fn(
4243
this: &Self,
4344
operation: PxeBaseCodeTftpOpcode,
4445
buffer: *mut c_void,
45-
overwrite: bool,
46+
overwrite: Boolean,
4647
buffer_size: &mut u64,
4748
block_size: Option<&usize>,
4849
server_ip: &IpAddress,
4950
filename: *const Char8,
5051
info: Option<&MtftpInfo>,
51-
dont_use_buffer: bool,
52+
dont_use_buffer: Boolean,
5253
) -> Status,
5354
udp_write: unsafe extern "efiapi" fn(
5455
this: &Self,
@@ -83,11 +84,11 @@ pub struct BaseCode {
8384
) -> Status,
8485
set_parameters: unsafe extern "efiapi" fn(
8586
this: &Self,
86-
new_auto_arp: Option<&bool>,
87-
new_send_guid: Option<&bool>,
87+
new_auto_arp: *const Boolean,
88+
new_send_guid: *const Boolean,
8889
new_ttl: Option<&u8>,
8990
new_tos: Option<&u8>,
90-
new_make_callback: Option<&bool>,
91+
new_make_callback: *const Boolean,
9192
) -> Status,
9293
set_station_ip: unsafe extern "efiapi" fn(
9394
this: &Self,
@@ -96,12 +97,12 @@ pub struct BaseCode {
9697
) -> Status,
9798
set_packets: unsafe extern "efiapi" fn(
9899
this: &Self,
99-
new_dhcp_discover_valid: Option<&bool>,
100-
new_dhcp_ack_received: Option<&bool>,
101-
new_proxy_offer_received: Option<&bool>,
102-
new_pxe_discover_valid: Option<&bool>,
103-
new_pxe_reply_received: Option<&bool>,
104-
new_pxe_bis_reply_received: Option<&bool>,
100+
new_dhcp_discover_valid: *const Boolean,
101+
new_dhcp_ack_received: *const Boolean,
102+
new_proxy_offer_received: *const Boolean,
103+
new_pxe_discover_valid: *const Boolean,
104+
new_pxe_reply_received: *const Boolean,
105+
new_pxe_bis_reply_received: *const Boolean,
105106
new_dhcp_discover: Option<&Packet>,
106107
new_dhcp_ack: Option<&Packet>,
107108
new_proxy_offer: Option<&Packet>,
@@ -115,7 +116,7 @@ pub struct BaseCode {
115116
impl BaseCode {
116117
/// Enables the use of the PXE Base Code Protocol functions.
117118
pub fn start(&mut self, use_ipv6: bool) -> Result {
118-
unsafe { (self.start)(self, use_ipv6) }.to_result()
119+
unsafe { (self.start)(self, use_ipv6.into()) }.to_result()
119120
}
120121

121122
/// Disables the use of the PXE Base Code Protocol functions.
@@ -126,7 +127,7 @@ impl BaseCode {
126127
/// Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request /
127128
/// acknowledge) or DHCPv6 S.A.R.R (solicit / advertise / request / reply) sequence.
128129
pub fn dhcp(&mut self, sort_offers: bool) -> Result {
129-
unsafe { (self.dhcp)(self, sort_offers) }.to_result()
130+
unsafe { (self.dhcp)(self, sort_offers.into()) }.to_result()
130131
}
131132

132133
/// Attempts to complete the PXE Boot Server and/or boot image discovery
@@ -145,7 +146,7 @@ impl BaseCode {
145146
})
146147
.unwrap_or(null());
147148

148-
unsafe { (self.discover)(self, ty, layer, use_bis, info) }.to_result()
149+
unsafe { (self.discover)(self, ty, layer, use_bis.into(), info) }.to_result()
149150
}
150151

151152
/// Returns the size of a file located on a TFTP server.
@@ -157,13 +158,13 @@ impl BaseCode {
157158
self,
158159
PxeBaseCodeTftpOpcode::TFTP_GET_FILE_SIZE,
159160
null_mut(),
160-
false,
161+
Boolean::FALSE,
161162
&mut buffer_size,
162163
None,
163164
server_ip,
164165
filename.as_ptr(),
165166
None,
166-
false,
167+
Boolean::FALSE,
167168
)
168169
};
169170
status.to_result_with_val(|| buffer_size)
@@ -178,17 +179,17 @@ impl BaseCode {
178179
) -> Result<u64> {
179180
let (buffer_ptr, mut buffer_size, dont_use_buffer) = if let Some(buffer) = buffer {
180181
let buffer_size = u64::try_from(buffer.len()).unwrap();
181-
(buffer.as_mut_ptr().cast(), buffer_size, false)
182+
(buffer.as_mut_ptr().cast(), buffer_size, Boolean::FALSE)
182183
} else {
183-
(null_mut(), 0, true)
184+
(null_mut(), 0, Boolean::TRUE)
184185
};
185186

186187
let status = unsafe {
187188
(self.mtftp)(
188189
self,
189190
PxeBaseCodeTftpOpcode::TFTP_READ_FILE,
190191
buffer_ptr,
191-
false,
192+
Boolean::FALSE,
192193
&mut buffer_size,
193194
None,
194195
server_ip,
@@ -216,13 +217,13 @@ impl BaseCode {
216217
self,
217218
PxeBaseCodeTftpOpcode::TFTP_WRITE_FILE,
218219
buffer_ptr,
219-
overwrite,
220+
overwrite.into(),
220221
&mut buffer_size,
221222
None,
222223
server_ip,
223224
filename.as_ptr(),
224225
None,
225-
false,
226+
Boolean::FALSE,
226227
)
227228
}
228229
.to_result()
@@ -244,13 +245,13 @@ impl BaseCode {
244245
self,
245246
PxeBaseCodeTftpOpcode::TFTP_READ_DIRECTORY,
246247
buffer_ptr,
247-
false,
248+
Boolean::FALSE,
248249
&mut buffer_size,
249250
None,
250251
server_ip,
251252
directory_name.as_ptr(),
252253
None,
253-
false,
254+
Boolean::FALSE,
254255
)
255256
};
256257
status.to_result()?;
@@ -317,13 +318,13 @@ impl BaseCode {
317318
self,
318319
PxeBaseCodeTftpOpcode::MTFTP_GET_FILE_SIZE,
319320
null_mut(),
320-
false,
321+
Boolean::FALSE,
321322
&mut buffer_size,
322323
None,
323324
server_ip,
324325
filename.as_ptr(),
325326
Some(info),
326-
false,
327+
Boolean::FALSE,
327328
)
328329
};
329330
status.to_result_with_val(|| buffer_size)
@@ -339,17 +340,17 @@ impl BaseCode {
339340
) -> Result<u64> {
340341
let (buffer_ptr, mut buffer_size, dont_use_buffer) = if let Some(buffer) = buffer {
341342
let buffer_size = u64::try_from(buffer.len()).unwrap();
342-
(buffer.as_mut_ptr().cast(), buffer_size, false)
343+
(buffer.as_mut_ptr().cast(), buffer_size, Boolean::FALSE)
343344
} else {
344-
(null_mut(), 0, true)
345+
(null_mut(), 0, Boolean::TRUE)
345346
};
346347

347348
let status = unsafe {
348349
(self.mtftp)(
349350
self,
350351
PxeBaseCodeTftpOpcode::MTFTP_READ_FILE,
351352
buffer_ptr,
352-
false,
353+
Boolean::FALSE,
353354
&mut buffer_size,
354355
None,
355356
server_ip,
@@ -377,13 +378,13 @@ impl BaseCode {
377378
self,
378379
PxeBaseCodeTftpOpcode::MTFTP_READ_DIRECTORY,
379380
buffer_ptr,
380-
false,
381+
Boolean::FALSE,
381382
&mut buffer_size,
382383
None,
383384
server_ip,
384385
null_mut(),
385386
Some(info),
386-
false,
387+
Boolean::FALSE,
387388
)
388389
};
389390
status.to_result()?;
@@ -555,11 +556,11 @@ impl BaseCode {
555556
unsafe {
556557
(self.set_parameters)(
557558
self,
558-
new_auto_arp.as_ref(),
559-
new_send_guid.as_ref(),
559+
opt_bool_to_ptr(&new_auto_arp),
560+
opt_bool_to_ptr(&new_send_guid),
560561
new_ttl.as_ref(),
561562
new_tos.as_ref(),
562-
new_make_callback.as_ref(),
563+
opt_bool_to_ptr(&new_make_callback),
563564
)
564565
}
565566
.to_result()
@@ -595,12 +596,12 @@ impl BaseCode {
595596
unsafe {
596597
(self.set_packets)(
597598
self,
598-
new_dhcp_discover_valid.as_ref(),
599-
new_dhcp_ack_received.as_ref(),
600-
new_proxy_offer_received.as_ref(),
601-
new_pxe_discover_valid.as_ref(),
602-
new_pxe_reply_received.as_ref(),
603-
new_pxe_bis_reply_received.as_ref(),
599+
opt_bool_to_ptr(&new_dhcp_discover_valid),
600+
opt_bool_to_ptr(&new_dhcp_ack_received),
601+
opt_bool_to_ptr(&new_proxy_offer_received),
602+
opt_bool_to_ptr(&new_pxe_discover_valid),
603+
opt_bool_to_ptr(&new_pxe_reply_received),
604+
opt_bool_to_ptr(&new_pxe_bis_reply_received),
604605
new_dhcp_discover,
605606
new_dhcp_ack,
606607
new_proxy_offer,
@@ -619,6 +620,15 @@ impl BaseCode {
619620
}
620621
}
621622

623+
/// Convert an `&Option<bool>` to a `*const Boolean`.
624+
///
625+
/// This is always a valid conversion; `bool` is an 8-bit `0` or `1`.
626+
fn opt_bool_to_ptr(arg: &Option<bool>) -> *const Boolean {
627+
arg.as_ref()
628+
.map(|arg| ptr::from_ref(arg).cast::<Boolean>())
629+
.unwrap_or_else(null)
630+
}
631+
622632
opaque_type! {
623633
/// Opaque type that should be used to represent a pointer to a [`DiscoverInfo`] in
624634
/// foreign function interfaces. This type produces a thin pointer, unlike

0 commit comments

Comments
 (0)