@@ -128,6 +128,45 @@ impl Tcp4 {
128128 }
129129 }
130130
131+ pub ( crate ) fn read ( & self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
132+ let evt = unsafe { self . create_evt ( ) } ?;
133+ let completion_token =
134+ tcp4:: CompletionToken { event : evt. as_ptr ( ) , status : Status :: SUCCESS } ;
135+ let data_len = u32:: try_from ( buf. len ( ) ) . unwrap_or ( u32:: MAX ) ;
136+
137+ let fragment = tcp4:: FragmentData {
138+ fragment_length : data_len,
139+ fragment_buffer : buf. as_mut_ptr ( ) . cast :: < crate :: ffi:: c_void > ( ) ,
140+ } ;
141+ let mut tx_data = tcp4:: ReceiveData {
142+ urgent_flag : r_efi:: efi:: Boolean :: FALSE ,
143+ data_length : data_len,
144+ fragment_count : 1 ,
145+ fragment_table : [ fragment] ,
146+ } ;
147+
148+ let protocol = self . protocol . as_ptr ( ) ;
149+ let mut token = tcp4:: IoToken {
150+ completion_token,
151+ packet : tcp4:: IoTokenPacket {
152+ rx_data : ( & raw mut tx_data) . cast :: < tcp4:: ReceiveData < 0 > > ( ) ,
153+ } ,
154+ } ;
155+
156+ let r = unsafe { ( ( * protocol) . receive ) ( protocol, & mut token) } ;
157+ if r. is_error ( ) {
158+ return Err ( io:: Error :: from_raw_os_error ( r. as_usize ( ) ) ) ;
159+ }
160+
161+ self . wait_for_flag ( ) ;
162+
163+ if completion_token. status . is_error ( ) {
164+ Err ( io:: Error :: from_raw_os_error ( completion_token. status . as_usize ( ) ) )
165+ } else {
166+ Ok ( data_len as usize )
167+ }
168+ }
169+
131170 unsafe fn create_evt ( & self ) -> io:: Result < helpers:: OwnedEvent > {
132171 self . flag . store ( false , Ordering :: Relaxed ) ;
133172 helpers:: OwnedEvent :: new (
0 commit comments