Merge "Process large messages from TA"
diff --git a/trusty/keymint/src/keymint_hal_main.rs b/trusty/keymint/src/keymint_hal_main.rs
index d2d5f27..cfa859f 100644
--- a/trusty/keymint/src/keymint_hal_main.rs
+++ b/trusty/keymint/src/keymint_hal_main.rs
@@ -14,7 +14,9 @@
// limitations under the License.
//! This module implements the HAL service for Keymint (Rust) in Trusty.
-use kmr_hal::{keymint, rpc, secureclock, send_hal_info, sharedsecret, SerializedChannel};
+use kmr_hal::{
+ extract_rsp, keymint, rpc, secureclock, send_hal_info, sharedsecret, SerializedChannel,
+};
use log::{error, info};
use std::{
ffi::CString,
@@ -41,6 +43,7 @@
struct TipcChannel(trusty::TipcChannel);
impl SerializedChannel for TipcChannel {
+ const MAX_SIZE: usize = 4000;
fn execute(&mut self, serialized_req: &[u8]) -> binder::Result<Vec<u8>> {
self.0.send(serialized_req).map_err(|e| {
binder::Status::new_exception(
@@ -54,21 +57,27 @@
),
)
})?;
- let mut recv_buf = Vec::new();
- // TODO(b/253501976): cope with fragmentation of responses
- self.0.recv(&mut recv_buf).map_err(|e| {
- binder::Status::new_exception(
- binder::ExceptionCode::TRANSACTION_FAILED,
- Some(
- &CString::new(format!(
- "Failed to receive the response via tipc channel because of {:?}",
- e
- ))
- .unwrap(),
- ),
- )
- })?;
- Ok(recv_buf)
+ let mut expect_more_msgs = true;
+ let mut full_rsp = Vec::new();
+ while expect_more_msgs {
+ let mut recv_buf = Vec::new();
+ self.0.recv(&mut recv_buf).map_err(|e| {
+ binder::Status::new_exception(
+ binder::ExceptionCode::TRANSACTION_FAILED,
+ Some(
+ &CString::new(format!(
+ "Failed to receive the response via tipc channel because of {:?}",
+ e
+ ))
+ .unwrap(),
+ ),
+ )
+ })?;
+ let current_rsp_content;
+ (expect_more_msgs, current_rsp_content) = extract_rsp(&recv_buf)?;
+ full_rsp.extend_from_slice(current_rsp_content);
+ }
+ Ok(full_rsp)
}
}