@@ -128,6 +128,45 @@ impl Tcp4 {
128
128
}
129
129
}
130
130
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
+
131
170
unsafe fn create_evt ( & self ) -> io:: Result < helpers:: OwnedEvent > {
132
171
self . flag . store ( false , Ordering :: Relaxed ) ;
133
172
helpers:: OwnedEvent :: new (
0 commit comments