@@ -123,30 +123,17 @@ impl Tcp4Protocol {
123
123
fragment_buffer : buf. as_ptr ( ) as * mut crate :: ffi:: c_void ,
124
124
} ;
125
125
126
- let layout = unsafe {
127
- crate :: alloc :: Layout :: from_size_align_unchecked (
128
- crate :: mem :: size_of :: < tcp4 :: TransmitData > ( )
129
- + crate :: mem :: size_of :: < tcp4 :: FragmentData > ( ) ,
130
- POOL_ALIGNMENT ,
131
- )
126
+ let mut transmit_data = TransmitData {
127
+ push : r_efi :: efi :: Boolean :: TRUE ,
128
+ urgent : r_efi :: efi :: Boolean :: FALSE ,
129
+ data_length : buf_size ,
130
+ fragment_count : 1 ,
131
+ fragment_table : [ fragment_table ; 1 ] ,
132
132
} ;
133
- let mut transmit_data = VariableBox :: < tcp4:: TransmitData > :: new_uninit ( layout) ;
134
133
135
- // Initialize TransmitData
136
- unsafe {
137
- addr_of_mut ! ( ( * transmit_data. as_uninit_mut_ptr( ) ) . push)
138
- . write ( r_efi:: efi:: Boolean :: TRUE ) ;
139
- addr_of_mut ! ( ( * transmit_data. as_uninit_mut_ptr( ) ) . urgent)
140
- . write ( r_efi:: efi:: Boolean :: FALSE ) ;
141
- addr_of_mut ! ( ( * transmit_data. as_uninit_mut_ptr( ) ) . data_length) . write ( buf_size) ;
142
- addr_of_mut ! ( ( * transmit_data. as_uninit_mut_ptr( ) ) . fragment_count) . write ( 1 ) ;
143
- addr_of_mut ! ( ( * transmit_data. as_uninit_mut_ptr( ) ) . fragment_table)
144
- . cast :: < tcp4:: FragmentData > ( )
145
- . copy_from_nonoverlapping ( [ fragment_table] . as_ptr ( ) , 1 ) ;
134
+ let packet = tcp4:: IoTokenPacket {
135
+ tx_data : & mut transmit_data as * mut TransmitData < 1 > as * mut tcp4:: TransmitData ,
146
136
} ;
147
- let mut transmit_data = unsafe { transmit_data. assume_init ( ) } ;
148
-
149
- let packet = tcp4:: IoTokenPacket { tx_data : transmit_data. as_mut_ptr ( ) } ;
150
137
let mut transmit_token = tcp4:: IoToken { completion_token, packet } ;
151
138
unsafe { Self :: transmit_raw ( self . protocol . as_ptr ( ) , & mut transmit_token) } ?;
152
139
@@ -185,7 +172,7 @@ impl Tcp4Protocol {
185
172
POOL_ALIGNMENT ,
186
173
)
187
174
} ;
188
- let mut transmit_data = VariableBox :: < tcp4 :: TransmitData > :: new_uninit ( layout) ;
175
+ let mut transmit_data = VariableBox :: < TransmitData < 0 > > :: new_uninit ( layout) ;
189
176
let fragment_tables_len = fragment_tables. len ( ) ;
190
177
191
178
// Initialize TransmitData
@@ -203,7 +190,7 @@ impl Tcp4Protocol {
203
190
} ;
204
191
let mut transmit_data = unsafe { transmit_data. assume_init ( ) } ;
205
192
206
- let packet = tcp4:: IoTokenPacket { tx_data : transmit_data. as_mut_ptr ( ) } ;
193
+ let packet = tcp4:: IoTokenPacket { tx_data : transmit_data. as_mut_ptr ( ) . cast ( ) } ;
207
194
let mut transmit_token = tcp4:: IoToken { completion_token, packet } ;
208
195
unsafe { Self :: transmit_raw ( self . protocol . as_ptr ( ) , & mut transmit_token) } ?;
209
196
@@ -230,26 +217,16 @@ impl Tcp4Protocol {
230
217
fragment_buffer : buf. as_mut_ptr ( ) . cast ( ) ,
231
218
} ;
232
219
233
- let layout = unsafe {
234
- crate :: alloc:: Layout :: from_size_align_unchecked (
235
- crate :: mem:: size_of :: < tcp4:: ReceiveData > ( )
236
- + crate :: mem:: size_of :: < tcp4:: FragmentData > ( ) ,
237
- POOL_ALIGNMENT ,
238
- )
220
+ let mut receive_data = ReceiveData {
221
+ urgent_flag : r_efi:: efi:: Boolean :: FALSE ,
222
+ data_length : buf_size,
223
+ fragment_count : 1 ,
224
+ fragment_table : [ fragment_table; 1 ] ,
239
225
} ;
240
- let mut receive_data = VariableBox :: < tcp4:: ReceiveData > :: new_uninit ( layout) ;
241
- unsafe {
242
- addr_of_mut ! ( ( * receive_data. as_uninit_mut_ptr( ) ) . urgent_flag)
243
- . write ( r_efi:: efi:: Boolean :: FALSE ) ;
244
- addr_of_mut ! ( ( * receive_data. as_uninit_mut_ptr( ) ) . data_length) . write ( buf_size) ;
245
- addr_of_mut ! ( ( * receive_data. as_uninit_mut_ptr( ) ) . fragment_count) . write ( 1 ) ;
246
- addr_of_mut ! ( ( * receive_data. as_uninit_mut_ptr( ) ) . fragment_table)
247
- . cast :: < tcp4:: FragmentData > ( )
248
- . copy_from_nonoverlapping ( [ fragment_table] . as_ptr ( ) , 1 ) ;
249
- }
250
- let mut receive_data = unsafe { receive_data. assume_init ( ) } ;
251
226
252
- let packet = tcp4:: IoTokenPacket { rx_data : receive_data. as_mut_ptr ( ) } ;
227
+ let packet = tcp4:: IoTokenPacket {
228
+ rx_data : & mut receive_data as * mut ReceiveData < 1 > as * mut tcp4:: ReceiveData ,
229
+ } ;
253
230
let completion_token =
254
231
tcp4:: CompletionToken { event : receive_event. as_raw_event ( ) , status : Status :: ABORTED } ;
255
232
let mut receive_token = tcp4:: IoToken { completion_token, packet } ;
@@ -290,7 +267,7 @@ impl Tcp4Protocol {
290
267
POOL_ALIGNMENT ,
291
268
)
292
269
} ;
293
- let mut receive_data = VariableBox :: < tcp4 :: ReceiveData > :: new_uninit ( layout) ;
270
+ let mut receive_data = VariableBox :: < ReceiveData < 0 > > :: new_uninit ( layout) ;
294
271
unsafe {
295
272
addr_of_mut ! ( ( * receive_data. as_uninit_mut_ptr( ) ) . urgent_flag)
296
273
. write ( r_efi:: efi:: Boolean :: FALSE ) ;
@@ -303,7 +280,7 @@ impl Tcp4Protocol {
303
280
}
304
281
let mut receive_data = unsafe { receive_data. assume_init ( ) } ;
305
282
306
- let packet = tcp4:: IoTokenPacket { rx_data : receive_data. as_mut_ptr ( ) } ;
283
+ let packet = tcp4:: IoTokenPacket { rx_data : receive_data. as_mut_ptr ( ) . cast ( ) } ;
307
284
let completion_token =
308
285
tcp4:: CompletionToken { event : receive_event. as_raw_event ( ) , status : Status :: ABORTED } ;
309
286
let mut receive_token = tcp4:: IoToken { completion_token, packet } ;
@@ -473,3 +450,22 @@ unsafe impl Send for Tcp4Protocol {}
473
450
474
451
// Safety: There are no threads in UEFI
475
452
unsafe impl Sync for Tcp4Protocol { }
453
+
454
+ #[ repr( C ) ]
455
+ #[ derive( Clone , Copy , Debug ) ]
456
+ pub struct TransmitData < const N : usize > {
457
+ pub push : r_efi:: efi:: Boolean ,
458
+ pub urgent : r_efi:: efi:: Boolean ,
459
+ pub data_length : u32 ,
460
+ pub fragment_count : u32 ,
461
+ pub fragment_table : [ tcp4:: FragmentData ; N ] ,
462
+ }
463
+
464
+ #[ repr( C ) ]
465
+ #[ derive( Clone , Copy , Debug ) ]
466
+ pub struct ReceiveData < const N : usize > {
467
+ pub urgent_flag : r_efi:: efi:: Boolean ,
468
+ pub data_length : u32 ,
469
+ pub fragment_count : u32 ,
470
+ pub fragment_table : [ tcp4:: FragmentData ; N ] ,
471
+ }
0 commit comments