cargo fmt and clippy
This commit is contained in:
110
src/dest.rs
110
src/dest.rs
@@ -57,7 +57,7 @@ use spacepackets::{
|
|||||||
file_data::FileDataPdu,
|
file_data::FileDataPdu,
|
||||||
finished::{DeliveryCode, FileStatus, FinishedPduCreator},
|
finished::{DeliveryCode, FileStatus, FinishedPduCreator},
|
||||||
metadata::{MetadataGenericParams, MetadataPduReader},
|
metadata::{MetadataGenericParams, MetadataPduReader},
|
||||||
nak::NakPduCreatorWithReservedSeqReqsBuf,
|
nak::{NakPduCreator, NakPduCreatorWithReservedSeqReqsBuf},
|
||||||
},
|
},
|
||||||
tlv::{EntityIdTlv, GenericTlv, ReadableTlv, TlvType, msg_to_user::MsgToUserTlv},
|
tlv::{EntityIdTlv, GenericTlv, ReadableTlv, TlvType, msg_to_user::MsgToUserTlv},
|
||||||
},
|
},
|
||||||
@@ -295,6 +295,8 @@ pub enum DestError {
|
|||||||
Io(#[from] std::io::Error),
|
Io(#[from] std::io::Error),
|
||||||
#[error("file store error: {0}")]
|
#[error("file store error: {0}")]
|
||||||
Filestore(#[from] FilestoreError),
|
Filestore(#[from] FilestoreError),
|
||||||
|
#[error("unexpected large file size which is not supported for current transfer")]
|
||||||
|
UnexpectedLargeFileSize,
|
||||||
#[error("lost segment error: {0}")]
|
#[error("lost segment error: {0}")]
|
||||||
LostSegmentError(#[from] LostSegmentError),
|
LostSegmentError(#[from] LostSegmentError),
|
||||||
#[error("path conversion error {0}")]
|
#[error("path conversion error {0}")]
|
||||||
@@ -660,14 +662,21 @@ impl<
|
|||||||
metadata_pdu: MetadataPduReader,
|
metadata_pdu: MetadataPduReader,
|
||||||
first_packet: bool,
|
first_packet: bool,
|
||||||
) -> Result<(), DestError> {
|
) -> Result<(), DestError> {
|
||||||
// TODO: If this arrives while metadata is being awaited (state is waiting on metadata),
|
|
||||||
// reset NAK activity params.
|
|
||||||
if self.state != State::Idle {
|
if self.state != State::Idle {
|
||||||
return Err(DestError::RecvdMetadataButIsBusy);
|
return Err(DestError::RecvdMetadataButIsBusy);
|
||||||
}
|
}
|
||||||
if first_packet {
|
if first_packet {
|
||||||
self.first_packet_handling(metadata_pdu.pdu_header().common_pdu_conf())?;
|
self.first_packet_handling(metadata_pdu.pdu_header().common_pdu_conf())?;
|
||||||
}
|
}
|
||||||
|
self.reset_nak_activity_parameters_if_active();
|
||||||
|
if let Some(acked_params) = self.transaction_params.acked_params.as_mut() {
|
||||||
|
if acked_params.metadata_missing {
|
||||||
|
if let Some(timer) = self.transaction_params.deferred_procedure_timer.as_mut() {
|
||||||
|
acked_params.nak_activity_counter = 0;
|
||||||
|
timer.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.transaction_params.metadata_params = *metadata_pdu.metadata_params();
|
self.transaction_params.metadata_params = *metadata_pdu.metadata_params();
|
||||||
let remote_cfg = self.remote_cfg_table.get(metadata_pdu.source_id().value());
|
let remote_cfg = self.remote_cfg_table.get(metadata_pdu.source_id().value());
|
||||||
@@ -714,6 +723,17 @@ impl<
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn reset_nak_activity_parameters_if_active(&mut self) {
|
||||||
|
if let Some(acked_params) = self.transaction_params.acked_params.as_mut() {
|
||||||
|
if acked_params.metadata_missing {
|
||||||
|
if let Some(timer) = self.transaction_params.deferred_procedure_timer.as_mut() {
|
||||||
|
acked_params.nak_activity_counter = 0;
|
||||||
|
timer.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_file_data_without_previous_metadata(
|
fn handle_file_data_without_previous_metadata(
|
||||||
&mut self,
|
&mut self,
|
||||||
fd_pdu: &FileDataPdu,
|
fd_pdu: &FileDataPdu,
|
||||||
@@ -797,7 +817,6 @@ impl<
|
|||||||
user: &mut impl CfdpUser,
|
user: &mut impl CfdpUser,
|
||||||
fd_pdu: FileDataPdu,
|
fd_pdu: FileDataPdu,
|
||||||
) -> Result<u32, DestError> {
|
) -> Result<u32, DestError> {
|
||||||
// TODO: Lost segment handling.
|
|
||||||
let mut packets_sent = 0;
|
let mut packets_sent = 0;
|
||||||
let mut handle_indication = |id: TransactionId, indication_config: &IndicationConfig| {
|
let mut handle_indication = |id: TransactionId, indication_config: &IndicationConfig| {
|
||||||
if indication_config.file_segment_recv {
|
if indication_config.file_segment_recv {
|
||||||
@@ -830,6 +849,9 @@ impl<
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if self.transmission_mode().unwrap() == TransmissionMode::Acknowledged {
|
||||||
|
self.lost_segment_handling(&fd_pdu)?;
|
||||||
|
}
|
||||||
handle_indication(
|
handle_indication(
|
||||||
self.transaction_id().unwrap(),
|
self.transaction_id().unwrap(),
|
||||||
&self.local_cfg.indication_cfg,
|
&self.local_cfg.indication_cfg,
|
||||||
@@ -857,6 +879,77 @@ impl<
|
|||||||
Ok(packets_sent)
|
Ok(packets_sent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn lost_segment_handling(&mut self, fd_pdu: &FileDataPdu) -> Result<(), DestError> {
|
||||||
|
// Lost segment detection: 4.6.4.3.1 a) and b) are covered by this code. c) is covered
|
||||||
|
//by dedicated code which is run when the EOF PDU is handled.
|
||||||
|
if self.transaction_params.acked_params.is_none() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let acked_params = self.transaction_params.acked_params.as_mut().unwrap();
|
||||||
|
if fd_pdu.offset() > acked_params.last_end_offset {
|
||||||
|
let lost_segment = (acked_params.last_end_offset, fd_pdu.offset());
|
||||||
|
self.lost_segment_tracker.add_lost_segment(lost_segment)?;
|
||||||
|
if self
|
||||||
|
.transaction_params
|
||||||
|
.remote_cfg
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.immediate_nak_mode
|
||||||
|
{
|
||||||
|
let pdu_header = PduHeader::new_no_file_data(self.transaction_params.pdu_conf, 0);
|
||||||
|
if self.transaction_params.pdu_conf.file_flag == LargeFileFlag::Normal
|
||||||
|
&& lost_segment.0 > u32::MAX as u64
|
||||||
|
|| lost_segment.1 > u32::MAX as u64
|
||||||
|
{
|
||||||
|
return Err(DestError::UnexpectedLargeFileSize);
|
||||||
|
}
|
||||||
|
let seg32 = [(lost_segment.0 as u32, lost_segment.1 as u32)];
|
||||||
|
let seg64 = [lost_segment];
|
||||||
|
let nak_pdu = if self.transaction_params.pdu_conf.file_flag == LargeFileFlag::Normal
|
||||||
|
{
|
||||||
|
NakPduCreator::new_normal_file_size(
|
||||||
|
pdu_header,
|
||||||
|
0,
|
||||||
|
self.transaction_params.progress as u32,
|
||||||
|
&seg32,
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
} else {
|
||||||
|
NakPduCreator::new_large_file_size(
|
||||||
|
pdu_header,
|
||||||
|
0,
|
||||||
|
self.transaction_params.progress,
|
||||||
|
&seg64,
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
};
|
||||||
|
let written_len = nak_pdu.write_to_bytes(self.pdu_and_cksum_buffer.get_mut())?;
|
||||||
|
self.pdu_sender.send_file_directive_pdu(
|
||||||
|
FileDirectiveType::NakPdu,
|
||||||
|
&self.pdu_and_cksum_buffer.borrow()[0..written_len],
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fd_pdu.offset() > acked_params.last_end_offset {
|
||||||
|
acked_params.last_start_offset = fd_pdu.offset();
|
||||||
|
acked_params.last_end_offset = fd_pdu.offset() + fd_pdu.file_data().len() as u64;
|
||||||
|
}
|
||||||
|
if fd_pdu.offset() + fd_pdu.file_data().len() as u64 <= acked_params.last_start_offset {
|
||||||
|
// Might be a re-requested FD PDU.
|
||||||
|
let removed = self.lost_segment_tracker.remove_lost_segment((
|
||||||
|
fd_pdu.offset(),
|
||||||
|
fd_pdu.offset() + fd_pdu.file_data().len() as u64,
|
||||||
|
))?;
|
||||||
|
// Reception of missing segments resets the NAK activity parameters.
|
||||||
|
// See CFDP 4.6.4.7.
|
||||||
|
if removed && acked_params.deferred_procedure_active {
|
||||||
|
self.reset_nak_activity_parameters_if_active();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_eof_pdu(
|
fn handle_eof_pdu(
|
||||||
&mut self,
|
&mut self,
|
||||||
cfdp_user: &mut impl CfdpUser,
|
cfdp_user: &mut impl CfdpUser,
|
||||||
@@ -1547,26 +1640,24 @@ impl<
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn handle_positive_ack_procedures(&mut self) -> Result<u32, DestError> {
|
fn handle_positive_ack_procedures(&mut self) -> Result<u32, DestError> {
|
||||||
// 1) Do we have positive-ack params?
|
// Do we have positive-ack params?
|
||||||
let params = match self.transaction_params.positive_ack_params.as_mut() {
|
let params = match self.transaction_params.positive_ack_params.as_mut() {
|
||||||
Some(p) => p,
|
Some(p) => p,
|
||||||
None => return Ok(0),
|
None => return Ok(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
// 2) Has the timer expired?
|
// Has the timer expired?
|
||||||
if !params.ack_timer.has_expired() {
|
if !params.ack_timer.has_expired() {
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3) Load the remote limit (avoid a panicking unwrap later)
|
|
||||||
let expiration_limit = self
|
let expiration_limit = self
|
||||||
.transaction_params
|
.transaction_params
|
||||||
.remote_cfg
|
.remote_cfg
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.positive_ack_timer_expiration_limit;
|
.positive_ack_timer_expiration_limit;
|
||||||
|
// If bumping the counter would exceed the limit, fault & maybe abandon
|
||||||
// 4) If bumping the counter would exceed the limit, fault & maybe abandon
|
|
||||||
if params.ack_counter + 1 >= expiration_limit {
|
if params.ack_counter + 1 >= expiration_limit {
|
||||||
if self.declare_fault(ConditionCode::PositiveAckLimitReached)
|
if self.declare_fault(ConditionCode::PositiveAckLimitReached)
|
||||||
== FaultHandlerCode::AbandonTransaction
|
== FaultHandlerCode::AbandonTransaction
|
||||||
@@ -1576,7 +1667,6 @@ impl<
|
|||||||
return Ok(0);
|
return Ok(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5) Otherwise reset the timer, increment, and send the PDU
|
|
||||||
params.ack_timer.reset();
|
params.ack_timer.reset();
|
||||||
params.ack_counter += 1;
|
params.ack_counter += 1;
|
||||||
self.send_finished_pdu()
|
self.send_finished_pdu()
|
||||||
|
|||||||
Reference in New Issue
Block a user