improvement for NAK API #162
@@ -383,8 +383,9 @@ impl NakPduCreatorWithReservedSeqReqsBuf<'_> {
|
|||||||
|
|
||||||
/// This function allows writing the start and end of scope fields in the mutable
|
/// This function allows writing the start and end of scope fields in the mutable
|
||||||
/// buffer slice directly.
|
/// buffer slice directly.
|
||||||
pub fn set_start_and_end_of_scope(
|
fn set_start_and_end_of_scope(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
||||||
start_of_scope: u64,
|
start_of_scope: u64,
|
||||||
end_of_scope: u64,
|
end_of_scope: u64,
|
||||||
) -> Result<(), InvalidStartOrEndOfScopeError> {
|
) -> Result<(), InvalidStartOrEndOfScopeError> {
|
||||||
@@ -436,9 +437,15 @@ impl NakPduCreatorWithReservedSeqReqsBuf<'_> {
|
|||||||
|
|
||||||
/// Finalizes the NAK PDU creation.
|
/// Finalizes the NAK PDU creation.
|
||||||
///
|
///
|
||||||
/// It writes all NAK PDU fields which were not written by the dedicated setter methods and
|
/// It writes all NAK PDU fields which were not written by the dedicated setter methods,
|
||||||
/// adding the CRC-16 depending on the PDU header configuration.
|
/// in addition to the start and end of scope. It also adds a CRC-16 depending on the PDU
|
||||||
pub fn finish(self) -> usize {
|
/// header configuration.
|
||||||
|
pub fn finish(
|
||||||
|
mut self,
|
||||||
|
start_of_scope: u64,
|
||||||
|
end_of_scope: u64,
|
||||||
|
) -> Result<usize, InvalidStartOrEndOfScopeError> {
|
||||||
|
self.set_start_and_end_of_scope(start_of_scope, end_of_scope)?;
|
||||||
let mut current_idx = self.pdu_header.write_to_bytes(self.buf).unwrap();
|
let mut current_idx = self.pdu_header.write_to_bytes(self.buf).unwrap();
|
||||||
self.buf[current_idx] = FileDirectiveType::NakPdu as u8;
|
self.buf[current_idx] = FileDirectiveType::NakPdu as u8;
|
||||||
current_idx += 1;
|
current_idx += 1;
|
||||||
@@ -452,7 +459,7 @@ impl NakPduCreatorWithReservedSeqReqsBuf<'_> {
|
|||||||
if self.pdu_header.common_pdu_conf().crc_flag == CrcFlag::WithCrc {
|
if self.pdu_header.common_pdu_conf().crc_flag == CrcFlag::WithCrc {
|
||||||
current_idx = add_pdu_crc(self.buf, current_idx);
|
current_idx = add_pdu_crc(self.buf, current_idx);
|
||||||
}
|
}
|
||||||
current_idx
|
Ok(current_idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn calc_pdu_datafield_len(&self) -> usize {
|
fn calc_pdu_datafield_len(&self) -> usize {
|
||||||
@@ -1023,7 +1030,7 @@ mod tests {
|
|||||||
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
||||||
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
||||||
let pdu_header = *nak_pdu.pdu_header();
|
let pdu_header = *nak_pdu.pdu_header();
|
||||||
let len_written = nak_pdu.finish();
|
let len_written = nak_pdu.finish(0, 0).unwrap();
|
||||||
verify_raw_header(&pdu_header, &buf);
|
verify_raw_header(&pdu_header, &buf);
|
||||||
let mut current_idx = pdu_header.header_len();
|
let mut current_idx = pdu_header.header_len();
|
||||||
assert_eq!(current_idx + 9, len_written);
|
assert_eq!(current_idx + 9, len_written);
|
||||||
@@ -1048,11 +1055,8 @@ mod tests {
|
|||||||
assert!(nak_pdu.segment_request_buffer().is_empty());
|
assert!(nak_pdu.segment_request_buffer().is_empty());
|
||||||
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
||||||
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
||||||
nak_pdu
|
|
||||||
.set_start_and_end_of_scope(100, 200)
|
|
||||||
.expect("setting start and end of scope failed");
|
|
||||||
let pdu_header = *nak_pdu.pdu_header();
|
let pdu_header = *nak_pdu.pdu_header();
|
||||||
let len_written = nak_pdu.finish();
|
let len_written = nak_pdu.finish(100, 200).unwrap();
|
||||||
verify_raw_header(&pdu_header, &buf);
|
verify_raw_header(&pdu_header, &buf);
|
||||||
let mut current_idx = pdu_header.header_len();
|
let mut current_idx = pdu_header.header_len();
|
||||||
assert_eq!(current_idx + 1 + 8 + 2, len_written);
|
assert_eq!(current_idx + 1 + 8 + 2, len_written);
|
||||||
@@ -1079,7 +1083,7 @@ mod tests {
|
|||||||
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
||||||
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
||||||
let pdu_header = *nak_pdu.pdu_header();
|
let pdu_header = *nak_pdu.pdu_header();
|
||||||
let len_written = nak_pdu.finish();
|
let len_written = nak_pdu.finish(0, 0).unwrap();
|
||||||
verify_raw_header(&pdu_header, &buf);
|
verify_raw_header(&pdu_header, &buf);
|
||||||
let mut current_idx = pdu_header.header_len();
|
let mut current_idx = pdu_header.header_len();
|
||||||
assert_eq!(current_idx + 1 + 16, len_written);
|
assert_eq!(current_idx + 1 + 16, len_written);
|
||||||
@@ -1119,12 +1123,11 @@ mod tests {
|
|||||||
assert!(nak_pdu.segment_request_buffer().is_empty());
|
assert!(nak_pdu.segment_request_buffer().is_empty());
|
||||||
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
assert!(nak_pdu.segment_request_buffer_mut().is_empty());
|
||||||
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
assert_eq!(nak_pdu.segment_request_iter().count(), 0);
|
||||||
nak_pdu
|
|
||||||
.set_start_and_end_of_scope(100, u32::MAX as u64 + 1)
|
|
||||||
.expect("setting start and end of scope failed");
|
|
||||||
assert_eq!(nak_pdu.len_written(), pdu_header.header_len() + 1 + 16);
|
assert_eq!(nak_pdu.len_written(), pdu_header.header_len() + 1 + 16);
|
||||||
let pdu_header = *nak_pdu.pdu_header();
|
let pdu_header = *nak_pdu.pdu_header();
|
||||||
let len_written = nak_pdu.finish();
|
let len_written = nak_pdu
|
||||||
|
.finish(100, u32::MAX as u64 + 1)
|
||||||
|
.expect("setting start and end of scope failed");
|
||||||
verify_raw_header(&pdu_header, &buf);
|
verify_raw_header(&pdu_header, &buf);
|
||||||
let mut current_idx = pdu_header.header_len();
|
let mut current_idx = pdu_header.header_len();
|
||||||
assert_eq!(current_idx + 1 + 16, len_written);
|
assert_eq!(current_idx + 1 + 16, len_written);
|
||||||
@@ -1147,9 +1150,6 @@ mod tests {
|
|||||||
let pdu_header = PduHeader::new_for_file_directive(pdu_conf, 0);
|
let pdu_header = PduHeader::new_for_file_directive(pdu_conf, 0);
|
||||||
let mut nak_pdu =
|
let mut nak_pdu =
|
||||||
NakPduCreatorWithReservedSeqReqsBuf::new(&mut buf, pdu_header, num_segments).unwrap();
|
NakPduCreatorWithReservedSeqReqsBuf::new(&mut buf, pdu_header, num_segments).unwrap();
|
||||||
nak_pdu
|
|
||||||
.set_start_and_end_of_scope(100, 200)
|
|
||||||
.expect("setting start and end of scope failed");
|
|
||||||
assert_eq!(nak_pdu.segment_request_buffer().len(), num_segments * 8);
|
assert_eq!(nak_pdu.segment_request_buffer().len(), num_segments * 8);
|
||||||
assert_eq!(nak_pdu.segment_request_buffer_mut().len(), num_segments * 8);
|
assert_eq!(nak_pdu.segment_request_buffer_mut().len(), num_segments * 8);
|
||||||
let seg_req_buf_mut = nak_pdu.segment_request_buffer_mut();
|
let seg_req_buf_mut = nak_pdu.segment_request_buffer_mut();
|
||||||
@@ -1167,7 +1167,7 @@ mod tests {
|
|||||||
assert_eq!(seg1.0 as u32, seg2.0);
|
assert_eq!(seg1.0 as u32, seg2.0);
|
||||||
assert_eq!(seg1.1 as u32, seg2.1);
|
assert_eq!(seg1.1 as u32, seg2.1);
|
||||||
}
|
}
|
||||||
let len_written = nak_pdu.finish();
|
let len_written = nak_pdu.finish(0, 40).unwrap();
|
||||||
verify_raw_header(&pdu_header, &buf);
|
verify_raw_header(&pdu_header, &buf);
|
||||||
let mut current_idx = pdu_header.header_len();
|
let mut current_idx = pdu_header.header_len();
|
||||||
assert_eq!(current_idx + 1 + 8 + num_segments * 8, len_written);
|
assert_eq!(current_idx + 1 + 8 + num_segments * 8, len_written);
|
||||||
@@ -1179,8 +1179,8 @@ mod tests {
|
|||||||
let end_of_scope =
|
let end_of_scope =
|
||||||
u32::from_be_bytes(buf[current_idx..current_idx + 4].try_into().unwrap());
|
u32::from_be_bytes(buf[current_idx..current_idx + 4].try_into().unwrap());
|
||||||
current_idx += 4;
|
current_idx += 4;
|
||||||
assert_eq!(start_of_scope, 100);
|
assert_eq!(start_of_scope, 0);
|
||||||
assert_eq!(end_of_scope, 200);
|
assert_eq!(end_of_scope, 40);
|
||||||
for seg_req in seg_reqs.iter() {
|
for seg_req in seg_reqs.iter() {
|
||||||
let seg_start =
|
let seg_start =
|
||||||
u32::from_be_bytes(buf[current_idx..current_idx + 4].try_into().unwrap());
|
u32::from_be_bytes(buf[current_idx..current_idx + 4].try_into().unwrap());
|
||||||
@@ -1223,7 +1223,7 @@ mod tests {
|
|||||||
assert_eq!(seg1.0, seg2.0);
|
assert_eq!(seg1.0, seg2.0);
|
||||||
assert_eq!(seg1.1, seg2.1);
|
assert_eq!(seg1.1, seg2.1);
|
||||||
}
|
}
|
||||||
let len_written = nak_pdu.finish();
|
let len_written = nak_pdu.finish(0, u32::MAX as u64 + 1).unwrap();
|
||||||
verify_raw_header(&pdu_header, &buf);
|
verify_raw_header(&pdu_header, &buf);
|
||||||
let mut current_idx = pdu_header.header_len();
|
let mut current_idx = pdu_header.header_len();
|
||||||
assert_eq!(current_idx + 1 + 16 + num_segments * 16, len_written);
|
assert_eq!(current_idx + 1 + 16 + num_segments * 16, len_written);
|
||||||
@@ -1235,7 +1235,7 @@ mod tests {
|
|||||||
let end_of_scope =
|
let end_of_scope =
|
||||||
u64::from_be_bytes(buf[current_idx..current_idx + 8].try_into().unwrap());
|
u64::from_be_bytes(buf[current_idx..current_idx + 8].try_into().unwrap());
|
||||||
current_idx += 8;
|
current_idx += 8;
|
||||||
assert_eq!(start_of_scope, 100);
|
assert_eq!(start_of_scope, 0);
|
||||||
assert_eq!(end_of_scope, u32::MAX as u64 + 1);
|
assert_eq!(end_of_scope, u32::MAX as u64 + 1);
|
||||||
for seg_req in seg_reqs.iter() {
|
for seg_req in seg_reqs.iter() {
|
||||||
let seg_start =
|
let seg_start =
|
||||||
|
|||||||
Reference in New Issue
Block a user