CCSDS File Delivery Protocol (CCSDS 727.0-B-5) for space file transfer
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cfdp: fix metadata closure bit and finished delivery/spare bit positions

Interop testing against spacepackets 0.31.0 revealed two bitfield layout
bugs in the CFDP directive codecs:

- Metadata byte: was closure(1)|reserved(3)|checksum(4), actually
reserved(1)|closure(1)|reserved(2)|checksum(4) per CCSDS 727.0-B-5 §5.2.5

- Finished byte: delivery_code and spare bits were swapped. Actual layout
is condition(4)|spare(1)|delivery(1)|file_status(2) per §5.2.3

Both bugs were invisible in roundtrip tests (encode/decode symmetric).

+10 -6
+10 -6
lib/cfdp.ml
··· 744 744 pfi_file_status : int; 745 745 } 746 746 747 + (* CCSDS 727.0-B-5 Section 5.2.3: condition(4) | spare(1) | delivery(1) | file_status(2) *) 747 748 let w_fin_condition = Wire.Field.v "condition" (bits8 4) 748 - let w_fin_delivery = Wire.Field.v "delivery" (bits8 1) 749 749 let w_fin_spare = Wire.Field.v "spare" (bits8 1) 750 + let w_fin_delivery = Wire.Field.v "delivery" (bits8 1) 750 751 let w_fin_file_status = Wire.Field.v "file_status" (bits8 2) 751 752 752 753 let finished_codec = 753 754 Wire.Codec.v "CfdpFinished" 754 - (fun condition delivery spare file_status -> 755 + (fun condition spare delivery file_status -> 755 756 { 756 757 pfi_condition = condition; 757 758 pfi_delivery = delivery; ··· 761 762 Wire.Codec. 762 763 [ 763 764 (w_fin_condition $ fun f -> f.pfi_condition); 764 - (w_fin_delivery $ fun f -> f.pfi_delivery); 765 765 (w_fin_spare $ fun f -> f.pfi_spare); 766 + (w_fin_delivery $ fun f -> f.pfi_delivery); 766 767 (w_fin_file_status $ fun f -> f.pfi_file_status); 767 768 ] 768 769 ··· 827 828 pm_dst_name : string; 828 829 } 829 830 831 + (* CCSDS 727.0-B-5 Section 5.2.5: reserved(1) | closure(1) | reserved(2) | checksum_type(4) *) 832 + let w_meta_reserved_hi = Wire.Field.v "reserved_hi" (bits8 1) 830 833 let w_meta_closure = Wire.Field.v "closure" (bits8 1) 831 - let w_meta_reserved = Wire.Field.v "reserved" (bits8 3) 834 + let w_meta_reserved = Wire.Field.v "reserved" (bits8 2) 832 835 let w_meta_checksum_type = Wire.Field.v "checksum_type" (bits8 4) 833 836 let w_meta_file_size = Wire.Field.v "file_size" (Wire.byte_array ~size:fss_size) 834 837 ··· 842 845 843 846 let metadata_codec = 844 847 Wire.Codec.v "CfdpMetadata" 845 - (fun closure reserved checksum_type file_size src_len src_name dst_len 846 - dst_name -> 848 + (fun _reserved_hi closure reserved checksum_type file_size src_len src_name 849 + dst_len dst_name -> 847 850 { 848 851 pm_closure = closure; 849 852 pm_reserved = reserved; ··· 856 859 }) 857 860 Wire.Codec. 858 861 [ 862 + (w_meta_reserved_hi $ fun _ -> 0); 859 863 (w_meta_closure $ fun m -> m.pm_closure); 860 864 (w_meta_reserved $ fun m -> m.pm_reserved); 861 865 (w_meta_checksum_type $ fun m -> m.pm_checksum_type);