everything seems to work now
Some checks failed
Rust/sat-rs/pipeline/pr-main There was a failure building this commit

This commit is contained in:
Robin Müller 2023-09-03 20:48:39 +02:00
parent 40c8c36af3
commit dca7449edd
Signed by: muellerr
GPG Key ID: A649FB78196E3849

View File

@ -335,6 +335,9 @@ impl DestinationHandler {
} else { } else {
self.tparams.tstate.condition_code = ConditionCode::FileChecksumFailure; self.tparams.tstate.condition_code = ConditionCode::FileChecksumFailure;
} }
// TODO: Check progress, and implement transfer completion timer as specified in the
// standard. This timer protects against out of order arrival of packets.
if self.tparams.tstate.progress != self.tparams.file_size() {}
if self.state == State::BusyClass1Nacked { if self.state == State::BusyClass1Nacked {
self.step = TransactionStep::TransferCompletion; self.step = TransactionStep::TransferCompletion;
} else { } else {
@ -369,11 +372,6 @@ impl DestinationHandler {
if self.step == TransactionStep::TransactionStart { if self.step == TransactionStep::TransactionStart {
self.transaction_start(cfdp_user)?; self.transaction_start(cfdp_user)?;
} }
if self.step == TransactionStep::ReceivingFileDataPdus
&& self.tparams.tstate.progress == self.tparams.file_size()
{
self.step = TransactionStep::TransferCompletion;
}
if self.step == TransactionStep::TransferCompletion { if self.step == TransactionStep::TransferCompletion {
self.transfer_completion(cfdp_user)?; self.transfer_completion(cfdp_user)?;
} }
@ -382,7 +380,6 @@ impl DestinationHandler {
} }
if self.step == TransactionStep::SendingFinishedPdu { if self.step == TransactionStep::SendingFinishedPdu {
self.reset(); self.reset();
return Ok(());
} }
Ok(()) Ok(())
} }
@ -464,13 +461,6 @@ impl DestinationHandler {
} }
fn transfer_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { fn transfer_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> {
// This function should never be called with metadata parameters not set
if self.tparams.metadata_params().closure_requested {
self.prepare_finished_pdu()?;
self.step = TransactionStep::SendingFinishedPdu;
} else {
self.step = TransactionStep::Idle;
}
let transaction_finished_params = TransactionFinishedParams { let transaction_finished_params = TransactionFinishedParams {
id: self.tparams.tstate.transaction_id.unwrap(), id: self.tparams.tstate.transaction_id.unwrap(),
condition_code: self.tparams.tstate.condition_code, condition_code: self.tparams.tstate.condition_code,
@ -478,6 +468,15 @@ impl DestinationHandler {
file_status: self.tparams.tstate.file_status, file_status: self.tparams.tstate.file_status,
}; };
cfdp_user.transaction_finished_indication(&transaction_finished_params); cfdp_user.transaction_finished_indication(&transaction_finished_params);
// This function should never be called with metadata parameters not set
if self.tparams.metadata_params().closure_requested {
self.prepare_finished_pdu()?;
self.step = TransactionStep::SendingFinishedPdu;
} else {
self.reset();
self.state = State::Idle;
self.step = TransactionStep::Idle;
}
Ok(()) Ok(())
} }
@ -732,6 +731,8 @@ mod tests {
if let Err(e) = result { if let Err(e) = result {
panic!("destination handler packet insertion error: {e}"); panic!("destination handler packet insertion error: {e}");
} }
let result = dest_handler.state_machine(&mut test_user);
assert!(result.is_ok());
let mut digest = CRC_32.digest(); let mut digest = CRC_32.digest();
digest.update(file_data); digest.update(file_data);
@ -742,5 +743,10 @@ mod tests {
let packet_info = PacketInfo::new(&buf).expect("generating packet info failed"); let packet_info = PacketInfo::new(&buf).expect("generating packet info failed");
let result = dest_handler.insert_packet(&packet_info); let result = dest_handler.insert_packet(&packet_info);
assert!(result.is_ok()); assert!(result.is_ok());
let result = dest_handler.state_machine(&mut test_user);
assert!(result.is_ok());
assert_eq!(dest_handler.state(), State::Idle);
assert_eq!(dest_handler.step(), TransactionStep::Idle);
} }
} }