@@ -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