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.

irmin: standalone Proof module with PCC-inspired documentation

+513 -76
+19 -5
lib/cfdp.ml
··· 930 930 Wire.Codec.env codec 931 931 |> Wire.Param.bind p_large_file (if large_file then 1 else 0) 932 932 933 + let entity_id_byte_width (eid : int64) = 934 + (* Minimum number of bytes to represent this entity ID. *) 935 + if eid = 0L then 1 936 + else 937 + let n = ref eid in 938 + let w = ref 0 in 939 + while !n <> 0L do 940 + n := Int64.shift_right_logical !n 8; 941 + incr w 942 + done; 943 + !w 944 + 933 945 let encode_eof ~large_file (eof_pdu : eof) = 934 946 let fss_len = if large_file then 8 else 4 in 935 947 let base_size = 1 + 4 + fss_len in ··· 938 950 match eof_pdu.fault_location with 939 951 | None -> "" 940 952 | Some eid -> 941 - (* TLV: type=0x06, length=8, value=entity_id as 8 BE bytes *) 942 - let tlv = Bytes.create 10 in 953 + (* TLV: type=0x06, length=N, value=entity_id in minimal BE bytes *) 954 + let v = Entity_id.to_int64 eid in 955 + let n = entity_id_byte_width v in 956 + let tlv = Bytes.create (2 + n) in 943 957 Bytes.set_uint8 tlv 0 0x06; 944 - Bytes.set_uint8 tlv 1 8; 945 - let eid_s = int64_to_be_bytes 8 (Entity_id.to_int64 eid) in 946 - Bytes.blit_string eid_s 0 tlv 2 8; 958 + Bytes.set_uint8 tlv 1 n; 959 + let eid_s = int64_to_be_bytes n v in 960 + Bytes.blit_string eid_s 0 tlv 2 n; 947 961 Bytes.to_string tlv 948 962 in 949 963 let packed =
+384 -20
test/interop/spacepackets/scripts/generate.py
··· 127 127 source_entity=1, dest_entity=2, seq_nr=1, 128 128 entity_id_len=1, seq_nr_len=1, 129 129 direction="toward_receiver", mode="unack", 130 - condition="no_error", checksum="12345678", file_size=1024) 130 + condition="no_error", checksum="12345678", file_size=1024, 131 + large_file=False, fault_location="") 131 132 132 133 # --- EOF with 2-byte entity IDs, 4-byte seq --- 133 134 c = cfg_explicit(0x0001, 0x0002, 0x00000001, eid_len=2, seq_len=4) ··· 138 139 source_entity=1, dest_entity=2, seq_nr=1, 139 140 entity_id_len=2, seq_nr_len=4, 140 141 direction="toward_receiver", mode="unack", 141 - condition="no_error", checksum="deadbeef", file_size=65536) 142 + condition="no_error", checksum="deadbeef", file_size=65536, 143 + large_file=False, fault_location="") 142 144 143 145 # --- EOF with 4-byte entity IDs, 4-byte seq --- 144 146 c = cfg_explicit(0x00000100, 0x00000200, 42, eid_len=4, seq_len=4) ··· 149 151 source_entity=256, dest_entity=512, seq_nr=42, 150 152 entity_id_len=4, seq_nr_len=4, 151 153 direction="toward_receiver", mode="unack", 152 - condition="no_error", checksum="00000000", file_size=0) 154 + condition="no_error", checksum="00000000", file_size=0, 155 + large_file=False, fault_location="") 153 156 154 157 # --- EOF with cancel condition --- 155 158 c = cfg_explicit(1, 2, 1, eid_len=1, seq_len=1) ··· 160 163 source_entity=1, dest_entity=2, seq_nr=1, 161 164 entity_id_len=1, seq_nr_len=1, 162 165 direction="toward_receiver", mode="unack", 163 - condition="cancel_received", checksum="00000000", file_size=0) 166 + condition="cancel_received", checksum="00000000", file_size=0, 167 + large_file=False, fault_location="") 164 168 165 169 # --- EOF with checksum failure condition --- 166 170 c = cfg_explicit(1, 2, 5, eid_len=1, seq_len=1) ··· 171 175 source_entity=1, dest_entity=2, seq_nr=5, 172 176 entity_id_len=1, seq_nr_len=1, 173 177 direction="toward_receiver", mode="unack", 174 - condition="file_checksum_failure", checksum="aabbccdd", file_size=2048) 178 + condition="file_checksum_failure", checksum="aabbccdd", file_size=2048, 179 + large_file=False, fault_location="") 175 180 176 181 # --- EOF acknowledged mode --- 177 182 c = cfg_explicit(10, 20, 100, eid_len=1, seq_len=1, ··· 183 188 source_entity=10, dest_entity=20, seq_nr=100, 184 189 entity_id_len=1, seq_nr_len=1, 185 190 direction="toward_receiver", mode="ack", 186 - condition="no_error", checksum="11223344", file_size=512) 191 + condition="no_error", checksum="11223344", file_size=512, 192 + large_file=False, fault_location="") 193 + 194 + # --- Edge cases --- 195 + 196 + # Large file mode (64-bit file sizes) 197 + c = cfg_explicit(1, 2, 1, eid_len=1, seq_len=1, 198 + file_flag=LargeFileFlag.LARGE) 199 + eof = EofPdu(pdu_conf=c, file_checksum=0xCAFEBABE, 200 + file_size=0x0000000100000000, 201 + condition_code=ConditionCode.NO_ERROR) 202 + raw = bytes(eof.pack()) 203 + add("eof_large_file", raw.hex(), 204 + source_entity=1, dest_entity=2, seq_nr=1, 205 + entity_id_len=1, seq_nr_len=1, 206 + direction="toward_receiver", mode="unack", 207 + condition="no_error", checksum="cafebabe", 208 + file_size=0x0000000100000000, large_file=True, 209 + fault_location="") 210 + 211 + # File size = max uint32 (0xFFFFFFFF) 212 + c = cfg_explicit(1, 2, 2, eid_len=1, seq_len=1) 213 + eof = EofPdu(pdu_conf=c, file_checksum=0x00000001, 214 + file_size=0xFFFFFFFF, 215 + condition_code=ConditionCode.NO_ERROR) 216 + raw = bytes(eof.pack()) 217 + add("eof_max_u32_size", raw.hex(), 218 + source_entity=1, dest_entity=2, seq_nr=2, 219 + entity_id_len=1, seq_nr_len=1, 220 + direction="toward_receiver", mode="unack", 221 + condition="no_error", checksum="00000001", 222 + file_size=0xFFFFFFFF, large_file=False, 223 + fault_location="") 224 + 225 + # Checksum = 0 (all zeros) -- already covered by eof_4b_zero but 226 + # explicit test with non-zero file size 227 + c = cfg_explicit(1, 2, 3, eid_len=1, seq_len=1) 228 + eof = EofPdu(pdu_conf=c, file_checksum=0x00000000, file_size=256, 229 + condition_code=ConditionCode.NO_ERROR) 230 + raw = bytes(eof.pack()) 231 + add("eof_checksum_zero", raw.hex(), 232 + source_entity=1, dest_entity=2, seq_nr=3, 233 + entity_id_len=1, seq_nr_len=1, 234 + direction="toward_receiver", mode="unack", 235 + condition="no_error", checksum="00000000", 236 + file_size=256, large_file=False, 237 + fault_location="") 238 + 239 + # Checksum = 0xFFFFFFFF (all ones) 240 + c = cfg_explicit(1, 2, 4, eid_len=1, seq_len=1) 241 + eof = EofPdu(pdu_conf=c, file_checksum=0xFFFFFFFF, file_size=512, 242 + condition_code=ConditionCode.NO_ERROR) 243 + raw = bytes(eof.pack()) 244 + add("eof_checksum_ones", raw.hex(), 245 + source_entity=1, dest_entity=2, seq_nr=4, 246 + entity_id_len=1, seq_nr_len=1, 247 + direction="toward_receiver", mode="unack", 248 + condition="no_error", checksum="ffffffff", 249 + file_size=512, large_file=False, 250 + fault_location="") 251 + 252 + # File size = 0 (empty file) with non-zero checksum 253 + c = cfg_explicit(1, 2, 5, eid_len=1, seq_len=1) 254 + eof = EofPdu(pdu_conf=c, file_checksum=0xABCDEF01, file_size=0, 255 + condition_code=ConditionCode.NO_ERROR) 256 + raw = bytes(eof.pack()) 257 + add("eof_empty_file", raw.hex(), 258 + source_entity=1, dest_entity=2, seq_nr=5, 259 + entity_id_len=1, seq_nr_len=1, 260 + direction="toward_receiver", mode="unack", 261 + condition="no_error", checksum="abcdef01", 262 + file_size=0, large_file=False, 263 + fault_location="") 264 + 265 + # With fault_location entity ID 266 + from spacepackets.cfdp.tlv.tlv import EntityIdTlv 267 + c = cfg_explicit(1, 2, 6, eid_len=1, seq_len=1) 268 + eof = EofPdu(pdu_conf=c, file_checksum=0, file_size=0, 269 + condition_code=ConditionCode.CANCEL_REQUEST_RECEIVED, 270 + fault_location=EntityIdTlv(entity_id=b'\x00\xFF')) 271 + raw = bytes(eof.pack()) 272 + add("eof_fault_location", raw.hex(), 273 + source_entity=1, dest_entity=2, seq_nr=6, 274 + entity_id_len=1, seq_nr_len=1, 275 + direction="toward_receiver", mode="unack", 276 + condition="cancel_received", checksum="00000000", 277 + file_size=0, large_file=False, 278 + fault_location="255") 279 + 280 + # Large file mode with max 64-bit file size that fits 281 + c = cfg_explicit(1, 2, 7, eid_len=1, seq_len=1, 282 + file_flag=LargeFileFlag.LARGE) 283 + eof = EofPdu(pdu_conf=c, file_checksum=0xDEADC0DE, 284 + file_size=0x00FFFFFFFFFFFFFF, 285 + condition_code=ConditionCode.NO_ERROR) 286 + raw = bytes(eof.pack()) 287 + add("eof_large_file_big", raw.hex(), 288 + source_entity=1, dest_entity=2, seq_nr=7, 289 + entity_id_len=1, seq_nr_len=1, 290 + direction="toward_receiver", mode="unack", 291 + condition="no_error", checksum="deadc0de", 292 + file_size=0x00FFFFFFFFFFFFFF, large_file=True, 293 + fault_location="") 187 294 188 295 fieldnames = ["name", "pdu_type", "source_entity", "dest_entity", "seq_nr", 189 296 "entity_id_len", "seq_nr_len", "direction", "mode", 190 - "condition", "checksum", "file_size", "pdu_hex"] 297 + "condition", "checksum", "file_size", "large_file", 298 + "fault_location", "pdu_hex"] 191 299 path = os.path.join(trace_dir, "eof.csv") 192 300 with open(path, "w", newline="") as fh: 193 301 w = csv.DictWriter(fh, fieldnames=fieldnames) ··· 221 329 direction="toward_receiver", mode="unack", 222 330 closure_requested=False, checksum_type="modular", 223 331 file_size=1024, 224 - source_filename="/src/test.bin", dest_filename="/dst/test.bin") 332 + source_filename="/src/test.bin", dest_filename="/dst/test.bin", 333 + large_file=False) 225 334 226 335 # --- Metadata with closure requested and null checksum --- 227 336 c = cfg_explicit(0x0001, 0x0002, 0x00000001, eid_len=2, seq_len=4) ··· 240 349 direction="toward_receiver", mode="unack", 241 350 closure_requested=True, checksum_type="null", 242 351 file_size=0, 243 - source_filename="a.txt", dest_filename="b.txt") 352 + source_filename="a.txt", dest_filename="b.txt", 353 + large_file=False) 244 354 245 355 # --- Metadata with 4-byte entity IDs --- 246 356 c = cfg_explicit(256, 512, 99, eid_len=4, seq_len=4) ··· 259 369 direction="toward_receiver", mode="unack", 260 370 closure_requested=False, checksum_type="modular", 261 371 file_size=65536, 262 - source_filename="/data/payload.dat", dest_filename="/rx/payload.dat") 372 + source_filename="/data/payload.dat", dest_filename="/rx/payload.dat", 373 + large_file=False) 263 374 264 375 # --- Metadata with empty filenames (unbounded transfer) --- 265 376 c = cfg_explicit(1, 2, 7, eid_len=1, seq_len=1) ··· 278 389 direction="toward_receiver", mode="unack", 279 390 closure_requested=False, checksum_type="modular", 280 391 file_size=0, 281 - source_filename="", dest_filename="") 392 + source_filename="", dest_filename="", 393 + large_file=False) 394 + 395 + # --- Edge cases --- 396 + 397 + # Maximum length filenames (255 bytes each) 398 + long_src = "s" * 255 399 + long_dst = "d" * 255 400 + c = cfg_explicit(1, 2, 8, eid_len=1, seq_len=1) 401 + params = MetadataParams( 402 + closure_requested=False, 403 + checksum_type=ChecksumType.MODULAR, 404 + file_size=4096, 405 + source_file_name=long_src, 406 + dest_file_name=long_dst, 407 + ) 408 + md = MetadataPdu(pdu_conf=c, params=params) 409 + raw = bytes(md.pack()) 410 + add("meta_max_filenames", raw.hex(), 411 + source_entity=1, dest_entity=2, seq_nr=8, 412 + entity_id_len=1, seq_nr_len=1, 413 + direction="toward_receiver", mode="unack", 414 + closure_requested=False, checksum_type="modular", 415 + file_size=4096, 416 + source_filename=long_src, dest_filename=long_dst, 417 + large_file=False) 418 + 419 + # File size = 0 with closure requested 420 + c = cfg_explicit(1, 2, 9, eid_len=1, seq_len=1) 421 + params = MetadataParams( 422 + closure_requested=True, 423 + checksum_type=ChecksumType.MODULAR, 424 + file_size=0, 425 + source_file_name="empty.bin", 426 + dest_file_name="empty_copy.bin", 427 + ) 428 + md = MetadataPdu(pdu_conf=c, params=params) 429 + raw = bytes(md.pack()) 430 + add("meta_zero_size_closure", raw.hex(), 431 + source_entity=1, dest_entity=2, seq_nr=9, 432 + entity_id_len=1, seq_nr_len=1, 433 + direction="toward_receiver", mode="unack", 434 + closure_requested=True, checksum_type="modular", 435 + file_size=0, 436 + source_filename="empty.bin", dest_filename="empty_copy.bin", 437 + large_file=False) 438 + 439 + # Large file mode with 64-bit file size 440 + c = cfg_explicit(1, 2, 10, eid_len=1, seq_len=1, 441 + file_flag=LargeFileFlag.LARGE) 442 + params = MetadataParams( 443 + closure_requested=False, 444 + checksum_type=ChecksumType.MODULAR, 445 + file_size=0x0000000200000000, 446 + source_file_name="big.dat", 447 + dest_file_name="big_copy.dat", 448 + ) 449 + md = MetadataPdu(pdu_conf=c, params=params) 450 + raw = bytes(md.pack()) 451 + add("meta_large_file", raw.hex(), 452 + source_entity=1, dest_entity=2, seq_nr=10, 453 + entity_id_len=1, seq_nr_len=1, 454 + direction="toward_receiver", mode="unack", 455 + closure_requested=False, checksum_type="modular", 456 + file_size=0x0000000200000000, 457 + source_filename="big.dat", dest_filename="big_copy.dat", 458 + large_file=True) 459 + 460 + # Null checksum type (different from meta_closure_null: no closure, non-zero size) 461 + c = cfg_explicit(1, 2, 11, eid_len=1, seq_len=1) 462 + params = MetadataParams( 463 + closure_requested=False, 464 + checksum_type=ChecksumType.NULL_CHECKSUM, 465 + file_size=1024, 466 + source_file_name="e.bin", 467 + dest_file_name="f.bin", 468 + ) 469 + md = MetadataPdu(pdu_conf=c, params=params) 470 + raw = bytes(md.pack()) 471 + add("meta_null_checksum", raw.hex(), 472 + source_entity=1, dest_entity=2, seq_nr=11, 473 + entity_id_len=1, seq_nr_len=1, 474 + direction="toward_receiver", mode="unack", 475 + closure_requested=False, checksum_type="null", 476 + file_size=1024, 477 + source_filename="e.bin", dest_filename="f.bin", 478 + large_file=False) 282 479 283 480 fieldnames = ["name", "pdu_type", "source_entity", "dest_entity", "seq_nr", 284 481 "entity_id_len", "seq_nr_len", "direction", "mode", 285 482 "closure_requested", "checksum_type", "file_size", 286 - "source_filename", "dest_filename", "pdu_hex"] 483 + "source_filename", "dest_filename", "large_file", "pdu_hex"] 287 484 path = os.path.join(trace_dir, "metadata.csv") 288 485 with open(path, "w", newline="") as fh: 289 486 w = csv.DictWriter(fh, fieldnames=fieldnames) ··· 467 664 source_entity=1, dest_entity=2, seq_nr=1, 468 665 entity_id_len=1, seq_nr_len=1, 469 666 direction="toward_receiver", mode="unack", 470 - offset=0, data_hex=b"Hello, CFDP!".hex()) 667 + offset=0, data_hex=b"Hello, CFDP!".hex(), 668 + large_file=False) 471 669 472 670 # --- File data at offset --- 473 671 c = cfg_explicit(1, 2, 1, eid_len=1, seq_len=1) ··· 480 678 source_entity=1, dest_entity=2, seq_nr=1, 481 679 entity_id_len=1, seq_nr_len=1, 482 680 direction="toward_receiver", mode="unack", 483 - offset=4096, data_hex=bytes(range(64)).hex()) 681 + offset=4096, data_hex=bytes(range(64)).hex(), 682 + large_file=False) 484 683 485 684 # --- File data with 2-byte entities --- 486 685 c = cfg_explicit(0x0001, 0x0002, 0x00000001, eid_len=2, seq_len=4) ··· 493 692 source_entity=1, dest_entity=2, seq_nr=1, 494 693 entity_id_len=2, seq_nr_len=4, 495 694 direction="toward_receiver", mode="unack", 496 - offset=256, data_hex="deadbeef") 695 + offset=256, data_hex="deadbeef", 696 + large_file=False) 697 + 698 + # --- Edge cases --- 699 + 700 + # Offset = 0, first segment (single byte) 701 + c = cfg_explicit(1, 2, 2, eid_len=1, seq_len=1) 702 + fd = FileDataPdu(pdu_conf=c, params=FileDataParams( 703 + file_data=b"\x42", 704 + offset=0, 705 + )) 706 + raw = bytes(fd.pack()) 707 + add("fd_single_byte", raw.hex(), 708 + source_entity=1, dest_entity=2, seq_nr=2, 709 + entity_id_len=1, seq_nr_len=1, 710 + direction="toward_receiver", mode="unack", 711 + offset=0, data_hex="42", 712 + large_file=False) 713 + 714 + # Large offset (near 32-bit boundary) 715 + c = cfg_explicit(1, 2, 3, eid_len=1, seq_len=1) 716 + fd = FileDataPdu(pdu_conf=c, params=FileDataParams( 717 + file_data=b"\xAA\xBB", 718 + offset=0xFFFFF000, 719 + )) 720 + raw = bytes(fd.pack()) 721 + add("fd_large_offset", raw.hex(), 722 + source_entity=1, dest_entity=2, seq_nr=3, 723 + entity_id_len=1, seq_nr_len=1, 724 + direction="toward_receiver", mode="unack", 725 + offset=0xFFFFF000, data_hex="aabb", 726 + large_file=False) 727 + 728 + # Large payload (1000 bytes) 729 + c = cfg_explicit(1, 2, 4, eid_len=1, seq_len=1) 730 + large_data = bytes(i % 256 for i in range(1000)) 731 + fd = FileDataPdu(pdu_conf=c, params=FileDataParams( 732 + file_data=large_data, 733 + offset=0, 734 + )) 735 + raw = bytes(fd.pack()) 736 + add("fd_large_payload", raw.hex(), 737 + source_entity=1, dest_entity=2, seq_nr=4, 738 + entity_id_len=1, seq_nr_len=1, 739 + direction="toward_receiver", mode="unack", 740 + offset=0, data_hex=large_data.hex(), 741 + large_file=False) 742 + 743 + # Large file mode with 64-bit offset 744 + c = cfg_explicit(1, 2, 5, eid_len=1, seq_len=1, 745 + file_flag=LargeFileFlag.LARGE) 746 + fd = FileDataPdu(pdu_conf=c, params=FileDataParams( 747 + file_data=b"\x01\x02\x03\x04", 748 + offset=0x0000000100000000, 749 + )) 750 + raw = bytes(fd.pack()) 751 + add("fd_large_file_offset", raw.hex(), 752 + source_entity=1, dest_entity=2, seq_nr=5, 753 + entity_id_len=1, seq_nr_len=1, 754 + direction="toward_receiver", mode="unack", 755 + offset=0x0000000100000000, data_hex="01020304", 756 + large_file=True) 757 + 758 + # Acknowledged mode file data 759 + c = cfg_explicit(1, 2, 6, eid_len=1, seq_len=1, 760 + trans_mode=TransmissionMode.ACKNOWLEDGED) 761 + fd = FileDataPdu(pdu_conf=c, params=FileDataParams( 762 + file_data=b"\xCA\xFE", 763 + offset=8192, 764 + )) 765 + raw = bytes(fd.pack()) 766 + add("fd_ack_mode", raw.hex(), 767 + source_entity=1, dest_entity=2, seq_nr=6, 768 + entity_id_len=1, seq_nr_len=1, 769 + direction="toward_receiver", mode="ack", 770 + offset=8192, data_hex="cafe", 771 + large_file=False) 772 + 773 + # 4-byte entity IDs with large offset 774 + c = cfg_explicit(0x00000100, 0x00000200, 1, eid_len=4, seq_len=4) 775 + fd = FileDataPdu(pdu_conf=c, params=FileDataParams( 776 + file_data=b"\x00", 777 + offset=0x80000000, 778 + )) 779 + raw = bytes(fd.pack()) 780 + add("fd_4b_large_offset", raw.hex(), 781 + source_entity=256, dest_entity=512, seq_nr=1, 782 + entity_id_len=4, seq_nr_len=4, 783 + direction="toward_receiver", mode="unack", 784 + offset=0x80000000, data_hex="00", 785 + large_file=False) 497 786 498 787 fieldnames = ["name", "pdu_type", "source_entity", "dest_entity", "seq_nr", 499 788 "entity_id_len", "seq_nr_len", "direction", "mode", 500 - "offset", "data_hex", "pdu_hex"] 789 + "offset", "data_hex", "large_file", "pdu_hex"] 501 790 path = os.path.join(trace_dir, "file_data.csv") 502 791 with open(path, "w", newline="") as fh: 503 792 w = csv.DictWriter(fh, fieldnames=fieldnames) ··· 524 813 entity_id_len=1, seq_nr_len=1, 525 814 direction="toward_sender", mode="unack", 526 815 start_scope=0, end_scope=1024, 527 - segments="0-128;512-640") 816 + segments="0-128;512-640", 817 + large_file=False) 528 818 529 819 # --- NAK metadata re-request --- 530 820 c = cfg_explicit(1, 2, 1, eid_len=1, seq_len=1) ··· 536 826 entity_id_len=1, seq_nr_len=1, 537 827 direction="toward_sender", mode="unack", 538 828 start_scope=0, end_scope=0, 539 - segments="0-0") 829 + segments="0-0", 830 + large_file=False) 540 831 541 832 # --- NAK with 2-byte entities and no segments --- 542 833 c = cfg_explicit(0x0001, 0x0002, 0x00000001, eid_len=2, seq_len=4) ··· 548 839 entity_id_len=2, seq_nr_len=4, 549 840 direction="toward_sender", mode="unack", 550 841 start_scope=0, end_scope=65536, 551 - segments="") 842 + segments="", 843 + large_file=False) 844 + 845 + # --- Edge cases --- 846 + 847 + # Empty segment list (metadata re-request, 1-byte entities) 848 + c = cfg_explicit(1, 2, 2, eid_len=1, seq_len=1) 849 + nak = NakPdu(pdu_conf=c, start_of_scope=0, end_of_scope=0, 850 + segment_requests=[]) 851 + raw = bytes(nak.pack()) 852 + add("nak_empty_1b", raw.hex(), 853 + source_entity=1, dest_entity=2, seq_nr=2, 854 + entity_id_len=1, seq_nr_len=1, 855 + direction="toward_sender", mode="unack", 856 + start_scope=0, end_scope=0, 857 + segments="", 858 + large_file=False) 859 + 860 + # Many segments (12 segments) 861 + c = cfg_explicit(1, 2, 3, eid_len=1, seq_len=1) 862 + segs = [(i * 100, i * 100 + 50) for i in range(12)] 863 + nak = NakPdu(pdu_conf=c, start_of_scope=0, end_of_scope=2000, 864 + segment_requests=segs) 865 + raw = bytes(nak.pack()) 866 + seg_str = ";".join(f"{a}-{b}" for a, b in segs) 867 + add("nak_many_segs", raw.hex(), 868 + source_entity=1, dest_entity=2, seq_nr=3, 869 + entity_id_len=1, seq_nr_len=1, 870 + direction="toward_sender", mode="unack", 871 + start_scope=0, end_scope=2000, 872 + segments=seg_str, 873 + large_file=False) 874 + 875 + # Large file offsets (32-bit boundary values) 876 + c = cfg_explicit(1, 2, 4, eid_len=1, seq_len=1) 877 + nak = NakPdu(pdu_conf=c, start_of_scope=0, end_of_scope=0xFFFFFFFF, 878 + segment_requests=[(0xFFFFF000, 0xFFFFFFFF)]) 879 + raw = bytes(nak.pack()) 880 + add("nak_large_offsets", raw.hex(), 881 + source_entity=1, dest_entity=2, seq_nr=4, 882 + entity_id_len=1, seq_nr_len=1, 883 + direction="toward_sender", mode="unack", 884 + start_scope=0, end_scope=4294967295, 885 + segments="4294963200-4294967295", 886 + large_file=False) 887 + 888 + # Single segment spanning full scope 889 + c = cfg_explicit(1, 2, 5, eid_len=1, seq_len=1) 890 + nak = NakPdu(pdu_conf=c, start_of_scope=0, end_of_scope=65536, 891 + segment_requests=[(0, 65536)]) 892 + raw = bytes(nak.pack()) 893 + add("nak_full_scope", raw.hex(), 894 + source_entity=1, dest_entity=2, seq_nr=5, 895 + entity_id_len=1, seq_nr_len=1, 896 + direction="toward_sender", mode="unack", 897 + start_scope=0, end_scope=65536, 898 + segments="0-65536", 899 + large_file=False) 900 + 901 + # Large file mode NAK with 64-bit scope 902 + c = cfg_explicit(1, 2, 6, eid_len=1, seq_len=1, 903 + file_flag=LargeFileFlag.LARGE) 904 + nak = NakPdu(pdu_conf=c, start_of_scope=0, 905 + end_of_scope=0x0000000100000000, 906 + segment_requests=[(0, 0x0000000080000000), 907 + (0x0000000080000000, 0x0000000100000000)]) 908 + raw = bytes(nak.pack()) 909 + add("nak_large_file", raw.hex(), 910 + source_entity=1, dest_entity=2, seq_nr=6, 911 + entity_id_len=1, seq_nr_len=1, 912 + direction="toward_sender", mode="unack", 913 + start_scope=0, end_scope=4294967296, 914 + segments="0-2147483648;2147483648-4294967296", 915 + large_file=True) 552 916 553 917 fieldnames = ["name", "pdu_type", "source_entity", "dest_entity", "seq_nr", 554 918 "entity_id_len", "seq_nr_len", "direction", "mode", 555 - "start_scope", "end_scope", "segments", "pdu_hex"] 919 + "start_scope", "end_scope", "segments", "large_file", "pdu_hex"] 556 920 path = os.path.join(trace_dir, "nak.csv") 557 921 with open(path, "w", newline="") as fh: 558 922 w = csv.DictWriter(fh, fieldnames=fieldnames)
+66 -31
test/interop/spacepackets/test.ml
··· 136 136 mode : string; 137 137 condition : string; 138 138 checksum : string; 139 - file_size : int; 139 + file_size : int64; 140 + large_file : bool; 141 + fault_location : string; 140 142 pdu_hex : string; 141 143 } 142 144 ··· 157 159 condition 158 160 checksum 159 161 file_size 162 + large_file 163 + fault_location 160 164 pdu_hex 161 165 -> 162 166 { ··· 171 175 condition; 172 176 checksum; 173 177 file_size; 178 + large_file; 179 + fault_location; 174 180 pdu_hex; 175 181 }) 176 182 |> col "name" string ~enc:(fun r -> r.name) ··· 184 190 |> col "mode" string ~enc:(fun r -> r.mode) 185 191 |> col "condition" string ~enc:(fun r -> r.condition) 186 192 |> col "checksum" string ~enc:(fun r -> r.checksum) 187 - |> col "file_size" int ~enc:(fun r -> r.file_size) 193 + |> col "file_size" int64 ~enc:(fun r -> r.file_size) 194 + |> col "large_file" bool ~enc:(fun r -> r.large_file) 195 + |> col "fault_location" string ~enc:(fun r -> r.fault_location) 188 196 |> col "pdu_hex" string ~enc:(fun r -> r.pdu_hex) 189 197 |> finish)) 190 198 ··· 201 209 | Error e -> Alcotest.failf "%s: decode failed: %a" r.name Cfdp.pp_error e 202 210 | Ok (Cfdp.Pdu_file_data _, _) -> 203 211 Alcotest.failf "%s: expected directive, got file data" r.name 204 - | Ok (Cfdp.Pdu_directive (hdr, Cfdp.Eof eof), _) -> 212 + | Ok (Cfdp.Pdu_directive (hdr, Cfdp.Eof eof), _) -> ( 205 213 check_header r.name hdr 206 214 ~source_entity:(Int64.of_int r.source_entity) 207 215 ~dest_entity:(Int64.of_int r.dest_entity) ··· 218 226 Alcotest.(check int32) 219 227 (r.name ^ " checksum") expected_cksum eof.checksum; 220 228 Alcotest.(check int64) 221 - (r.name ^ " file_size") (Int64.of_int r.file_size) eof.file_size 229 + (r.name ^ " file_size") r.file_size eof.file_size; 230 + if r.fault_location = "" then 231 + Alcotest.(check bool) 232 + (r.name ^ " fault_location=None") 233 + true 234 + (Option.is_none eof.fault_location) 235 + else 236 + let expected_fl = Int64.of_int (int_of_string r.fault_location) in 237 + match eof.fault_location with 238 + | None -> 239 + Alcotest.failf "%s: expected fault_location=%Ld, got None" 240 + r.name expected_fl 241 + | Some fl -> 242 + Alcotest.(check int64) 243 + (r.name ^ " fault_location") 244 + expected_fl 245 + (Cfdp.Entity_id.to_int64 fl)) 222 246 | Ok (Cfdp.Pdu_directive (_, _), _) -> 223 247 Alcotest.failf "%s: expected EOF directive" r.name) 224 248 rows ··· 246 270 direction = direction_of_string r.direction; 247 271 transmission_mode = mode_of_string r.mode; 248 272 crc_present = false; 249 - large_file = false; 273 + large_file = r.large_file; 250 274 segment_ctrl = false; 251 275 segment_metadata = false; 252 276 source_entity = Cfdp.Entity_id.of_int_exn r.source_entity; ··· 255 279 data_len = 0; 256 280 } 257 281 in 282 + let fault_location = 283 + if r.fault_location = "" then None 284 + else Some (Cfdp.Entity_id.of_int_exn (int_of_string r.fault_location)) 285 + in 258 286 let eof_pdu = 259 - Cfdp.eof 287 + Cfdp.eof ?fault_location 260 288 ~condition:(condition_of_string r.condition) 261 289 ~checksum:(Int32.of_string ("0x" ^ r.checksum)) 262 - ~file_size:(Int64.of_int r.file_size) () 290 + ~file_size:r.file_size () 263 291 in 264 292 let pdu = Cfdp.Pdu_directive (hdr, Cfdp.Eof eof_pdu) in 265 293 let encoded = Cfdp.encode config pdu in ··· 280 308 mode : string; 281 309 closure_requested : bool; 282 310 checksum_type : string; 283 - file_size : int; 311 + file_size : int64; 284 312 source_filename : string; 285 313 dest_filename : string; 314 + large_file : bool; 286 315 pdu_hex : string; 287 316 } 288 317 ··· 305 334 file_size 306 335 source_filename 307 336 dest_filename 337 + large_file 308 338 pdu_hex 309 339 -> 310 340 { ··· 321 351 file_size; 322 352 source_filename; 323 353 dest_filename; 354 + large_file; 324 355 pdu_hex; 325 356 }) 326 357 |> col "name" string ~enc:(fun r -> r.name) ··· 334 365 |> col "mode" string ~enc:(fun r -> r.mode) 335 366 |> col "closure_requested" bool ~enc:(fun r -> r.closure_requested) 336 367 |> col "checksum_type" string ~enc:(fun r -> r.checksum_type) 337 - |> col "file_size" int ~enc:(fun r -> r.file_size) 368 + |> col "file_size" int64 ~enc:(fun r -> r.file_size) 338 369 |> col "source_filename" string ~enc:(fun r -> r.source_filename) 339 370 |> col "dest_filename" string ~enc:(fun r -> r.dest_filename) 371 + |> col "large_file" bool ~enc:(fun r -> r.large_file) 340 372 |> col "pdu_hex" string ~enc:(fun r -> r.pdu_hex) 341 373 |> finish)) 342 374 ··· 368 400 (Cfdp.int_of_checksum_type expected_ct) 369 401 (Cfdp.int_of_checksum_type md.checksum_type); 370 402 Alcotest.(check int64) 371 - (r.name ^ " file_size") (Int64.of_int r.file_size) md.file_size; 403 + (r.name ^ " file_size") r.file_size md.file_size; 372 404 Alcotest.(check string) 373 405 (r.name ^ " source_filename") 374 406 r.source_filename md.source_filename; ··· 402 434 direction = direction_of_string r.direction; 403 435 transmission_mode = mode_of_string r.mode; 404 436 crc_present = false; 405 - large_file = false; 437 + large_file = r.large_file; 406 438 segment_ctrl = false; 407 439 segment_metadata = false; 408 440 source_entity = Cfdp.Entity_id.of_int_exn r.source_entity; ··· 414 446 let md = 415 447 Cfdp.metadata ~closure_requested:r.closure_requested 416 448 ~checksum_type:(checksum_type_of_string r.checksum_type) 417 - ~file_size:(Int64.of_int r.file_size) 418 - ~source_filename:r.source_filename ~dest_filename:r.dest_filename () 449 + ~file_size:r.file_size ~source_filename:r.source_filename 450 + ~dest_filename:r.dest_filename () 419 451 in 420 452 let pdu = Cfdp.Pdu_directive (hdr, Cfdp.Metadata md) in 421 453 let encoded = Cfdp.encode config pdu in ··· 757 789 seq_nr_len : int; 758 790 direction : string; 759 791 mode : string; 760 - offset : int; 792 + offset : int64; 761 793 data_hex : string; 794 + large_file : bool; 762 795 pdu_hex : string; 763 796 } 764 797 ··· 778 811 mode 779 812 offset 780 813 data_hex 814 + large_file 781 815 pdu_hex 782 816 -> 783 817 { ··· 791 825 mode; 792 826 offset; 793 827 data_hex; 828 + large_file; 794 829 pdu_hex; 795 830 }) 796 831 |> col "name" string ~enc:(fun r -> r.name) ··· 802 837 |> col "seq_nr_len" int ~enc:(fun r -> r.seq_nr_len) 803 838 |> col "direction" string ~enc:(fun r -> r.direction) 804 839 |> col "mode" string ~enc:(fun r -> r.mode) 805 - |> col "offset" int ~enc:(fun r -> r.offset) 840 + |> col "offset" int64 ~enc:(fun r -> r.offset) 806 841 |> col "data_hex" string ~enc:(fun r -> r.data_hex) 842 + |> col "large_file" bool ~enc:(fun r -> r.large_file) 807 843 |> col "pdu_hex" string ~enc:(fun r -> r.pdu_hex) 808 844 |> finish)) 809 845 ··· 827 863 ~seq_nr:(Int64.of_int r.seq_nr) 828 864 ~direction:(direction_of_string r.direction) 829 865 ~mode:(mode_of_string r.mode); 830 - Alcotest.(check int64) 831 - (r.name ^ " offset") (Int64.of_int r.offset) fd.offset; 866 + Alcotest.(check int64) (r.name ^ " offset") r.offset fd.offset; 832 867 let expected_data = hex_to_string r.data_hex in 833 868 Alcotest.(check string) 834 869 (r.name ^ " data") expected_data (Bytes.to_string fd.data)) ··· 857 892 direction = direction_of_string r.direction; 858 893 transmission_mode = mode_of_string r.mode; 859 894 crc_present = false; 860 - large_file = false; 895 + large_file = r.large_file; 861 896 segment_ctrl = false; 862 897 segment_metadata = false; 863 898 source_entity = Cfdp.Entity_id.of_int_exn r.source_entity; ··· 867 902 } 868 903 in 869 904 let fd = 870 - Cfdp.file_data ~offset:(Int64.of_int r.offset) 905 + Cfdp.file_data ~offset:r.offset 871 906 (Bytes.of_string (hex_to_string r.data_hex)) 872 907 in 873 908 let pdu = Cfdp.Pdu_file_data (hdr, fd) in ··· 887 922 seq_nr_len : int; 888 923 direction : string; 889 924 mode : string; 890 - start_scope : int; 891 - end_scope : int; 925 + start_scope : int64; 926 + end_scope : int64; 892 927 segments : string; 928 + large_file : bool; 893 929 pdu_hex : string; 894 930 } 895 931 ··· 910 946 start_scope 911 947 end_scope 912 948 segments 949 + large_file 913 950 pdu_hex 914 951 -> 915 952 { ··· 924 961 start_scope; 925 962 end_scope; 926 963 segments; 964 + large_file; 927 965 pdu_hex; 928 966 }) 929 967 |> col "name" string ~enc:(fun r -> r.name) ··· 935 973 |> col "seq_nr_len" int ~enc:(fun r -> r.seq_nr_len) 936 974 |> col "direction" string ~enc:(fun r -> r.direction) 937 975 |> col "mode" string ~enc:(fun r -> r.mode) 938 - |> col "start_scope" int ~enc:(fun r -> r.start_scope) 939 - |> col "end_scope" int ~enc:(fun r -> r.end_scope) 976 + |> col "start_scope" int64 ~enc:(fun r -> r.start_scope) 977 + |> col "end_scope" int64 ~enc:(fun r -> r.end_scope) 940 978 |> col "segments" string ~enc:(fun r -> r.segments) 979 + |> col "large_file" bool ~enc:(fun r -> r.large_file) 941 980 |> col "pdu_hex" string ~enc:(fun r -> r.pdu_hex) 942 981 |> finish)) 943 982 ··· 972 1011 ~direction:(direction_of_string r.direction) 973 1012 ~mode:(mode_of_string r.mode); 974 1013 Alcotest.(check int64) 975 - (r.name ^ " start_scope") 976 - (Int64.of_int r.start_scope) 977 - nak.start_scope; 1014 + (r.name ^ " start_scope") r.start_scope nak.start_scope; 978 1015 Alcotest.(check int64) 979 - (r.name ^ " end_scope") (Int64.of_int r.end_scope) nak.end_scope; 1016 + (r.name ^ " end_scope") r.end_scope nak.end_scope; 980 1017 let expected_segs = parse_segments r.segments in 981 1018 Alcotest.(check int) 982 1019 (r.name ^ " segment count") ··· 1016 1053 direction = direction_of_string r.direction; 1017 1054 transmission_mode = mode_of_string r.mode; 1018 1055 crc_present = false; 1019 - large_file = false; 1056 + large_file = r.large_file; 1020 1057 segment_ctrl = false; 1021 1058 segment_metadata = false; 1022 1059 source_entity = Cfdp.Entity_id.of_int_exn r.source_entity; ··· 1027 1064 in 1028 1065 let segments = parse_segments r.segments in 1029 1066 let nak_pdu = 1030 - Cfdp.nak 1031 - ~start_scope:(Int64.of_int r.start_scope) 1032 - ~end_scope:(Int64.of_int r.end_scope) segments 1067 + Cfdp.nak ~start_scope:r.start_scope ~end_scope:r.end_scope segments 1033 1068 in 1034 1069 let pdu = Cfdp.Pdu_directive (hdr, Cfdp.Nak nak_pdu) in 1035 1070 let encoded = Cfdp.encode config pdu in
+14 -7
test/interop/spacepackets/traces/eof.csv
··· 1 - name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,condition,checksum,file_size,pdu_hex 2 - eof_basic_1b,eof,1,2,1,1,1,toward_receiver,unack,no_error,12345678,1024,24000a0001010204001234567800000400 3 - eof_basic_2b,eof,1,2,1,2,4,toward_receiver,unack,no_error,deadbeef,65536,24000a1300010000000100020400deadbeef00010000 4 - eof_4b_zero,eof,256,512,42,4,4,toward_receiver,unack,no_error,00000000,0,24000a33000001000000002a0000020004000000000000000000 5 - eof_cancel,eof,1,2,1,1,1,toward_receiver,unack,cancel_received,00000000,0,24000a0001010204f00000000000000000 6 - eof_checksum_failure,eof,1,2,5,1,1,toward_receiver,unack,file_checksum_failure,aabbccdd,2048,24000a000105020450aabbccdd00000800 7 - eof_acknowledged,eof,10,20,100,1,1,toward_receiver,ack,no_error,11223344,512,20000a000a641404001122334400000200 1 + name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,condition,checksum,file_size,large_file,fault_location,pdu_hex 2 + eof_basic_1b,eof,1,2,1,1,1,toward_receiver,unack,no_error,12345678,1024,False,,24000a0001010204001234567800000400 3 + eof_basic_2b,eof,1,2,1,2,4,toward_receiver,unack,no_error,deadbeef,65536,False,,24000a1300010000000100020400deadbeef00010000 4 + eof_4b_zero,eof,256,512,42,4,4,toward_receiver,unack,no_error,00000000,0,False,,24000a33000001000000002a0000020004000000000000000000 5 + eof_cancel,eof,1,2,1,1,1,toward_receiver,unack,cancel_received,00000000,0,False,,24000a0001010204f00000000000000000 6 + eof_checksum_failure,eof,1,2,5,1,1,toward_receiver,unack,file_checksum_failure,aabbccdd,2048,False,,24000a000105020450aabbccdd00000800 7 + eof_acknowledged,eof,10,20,100,1,1,toward_receiver,ack,no_error,11223344,512,False,,20000a000a641404001122334400000200 8 + eof_large_file,eof,1,2,1,1,1,toward_receiver,unack,no_error,cafebabe,4294967296,True,,25000e000101020400cafebabe0000000100000000 9 + eof_max_u32_size,eof,1,2,2,1,1,toward_receiver,unack,no_error,00000001,4294967295,False,,24000a00010202040000000001ffffffff 10 + eof_checksum_zero,eof,1,2,3,1,1,toward_receiver,unack,no_error,00000000,256,False,,24000a0001030204000000000000000100 11 + eof_checksum_ones,eof,1,2,4,1,1,toward_receiver,unack,no_error,ffffffff,512,False,,24000a000104020400ffffffff00000200 12 + eof_empty_file,eof,1,2,5,1,1,toward_receiver,unack,no_error,abcdef01,0,False,,24000a000105020400abcdef0100000000 13 + eof_fault_location,eof,1,2,6,1,1,toward_receiver,unack,cancel_received,00000000,0,False,255,24000e0001060204f00000000000000000060200ff 14 + eof_large_file_big,eof,1,2,7,1,1,toward_receiver,unack,no_error,deadc0de,72057594037927935,True,,25000e000107020400deadc0de00ffffffffffffff
+10 -4
test/interop/spacepackets/traces/file_data.csv
··· 1 - name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,offset,data_hex,pdu_hex 2 - fd_basic,file_data,1,2,1,1,1,toward_receiver,unack,0,48656c6c6f2c204346445021,340010000101020000000048656c6c6f2c204346445021 3 - fd_offset,file_data,1,2,1,1,1,toward_receiver,unack,4096,000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f,3400440001010200001000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f 4 - fd_2b,file_data,1,2,1,2,4,toward_receiver,unack,256,deadbeef,34000813000100000001000200000100deadbeef 1 + name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,offset,data_hex,large_file,pdu_hex 2 + fd_basic,file_data,1,2,1,1,1,toward_receiver,unack,0,48656c6c6f2c204346445021,False,340010000101020000000048656c6c6f2c204346445021 3 + fd_offset,file_data,1,2,1,1,1,toward_receiver,unack,4096,000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f,False,3400440001010200001000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f 4 + fd_2b,file_data,1,2,1,2,4,toward_receiver,unack,256,deadbeef,False,34000813000100000001000200000100deadbeef 5 + fd_single_byte,file_data,1,2,2,1,1,toward_receiver,unack,0,42,False,340005000102020000000042 6 + fd_large_offset,file_data,1,2,3,1,1,toward_receiver,unack,4294963200,aabb,False,34000600010302fffff000aabb 7 + fd_large_payload,file_data,1,2,4,1,1,toward_receiver,unack,0,000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7,False,3403ec0001040200000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7 8 + fd_large_file_offset,file_data,1,2,5,1,1,toward_receiver,unack,4294967296,01020304,True,35000c00010502000000010000000001020304 9 + fd_ack_mode,file_data,1,2,6,1,1,toward_receiver,ack,8192,cafe,False,3000060001060200002000cafe 10 + fd_4b_large_offset,file_data,256,512,1,4,4,toward_receiver,unack,2147483648,00,False,340005330000010000000001000002008000000000
+11 -5
test/interop/spacepackets/traces/metadata.csv
··· 1 - name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,closure_requested,checksum_type,file_size,source_filename,dest_filename,pdu_hex 2 - meta_basic,metadata,1,2,1,1,1,toward_receiver,unack,False,modular,1024,/src/test.bin,/dst/test.bin,240022000101020700000004000d2f7372632f746573742e62696e0d2f6473742f746573742e62696e 3 - meta_closure_null,metadata,1,2,1,2,4,toward_receiver,unack,True,null,0,a.txt,b.txt,240012130001000000010002074f0000000005612e74787405622e747874 4 - meta_4b_eid,metadata,256,512,99,4,4,toward_receiver,unack,False,modular,65536,/data/payload.dat,/rx/payload.dat,24002833000001000000006300000200070000010000112f646174612f7061796c6f61642e6461740f2f72782f7061796c6f61642e646174 5 - meta_empty_filenames,metadata,1,2,7,1,1,toward_receiver,unack,False,modular,0,,,240008000107020700000000000000 1 + name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,closure_requested,checksum_type,file_size,source_filename,dest_filename,large_file,pdu_hex 2 + meta_basic,metadata,1,2,1,1,1,toward_receiver,unack,False,modular,1024,/src/test.bin,/dst/test.bin,False,240022000101020700000004000d2f7372632f746573742e62696e0d2f6473742f746573742e62696e 3 + meta_closure_null,metadata,1,2,1,2,4,toward_receiver,unack,True,null,0,a.txt,b.txt,False,240012130001000000010002074f0000000005612e74787405622e747874 4 + meta_4b_eid,metadata,256,512,99,4,4,toward_receiver,unack,False,modular,65536,/data/payload.dat,/rx/payload.dat,False,24002833000001000000006300000200070000010000112f646174612f7061796c6f61642e6461740f2f72782f7061796c6f61642e646174 5 + meta_empty_filenames,metadata,1,2,7,1,1,toward_receiver,unack,False,modular,0,,,False,240008000107020700000000000000 6 + meta_max_filenames,metadata,1,2,8,1,1,toward_receiver,unack,False,modular,4096,sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss,ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd,False,24020600010802070000001000ff737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373ff646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464 7 + meta_zero_size_closure,metadata,1,2,9,1,1,toward_receiver,unack,True,modular,0,empty.bin,empty_copy.bin,False,24001f0001090207400000000009656d7074792e62696e0e656d7074795f636f70792e62696e 8 + meta_large_file,metadata,1,2,10,1,1,toward_receiver,unack,False,modular,8589934592,big.dat,big_copy.dat,True,25001f00010a0207000000000200000000076269672e6461740c6269675f636f70792e646174 9 + meta_crc32,metadata,1,2,11,1,1,toward_receiver,unack,False,crc32,128,a.bin,b.bin,False,24001200010b0207030000008005612e62696e05622e62696e 10 + meta_crc32c,metadata,1,2,12,1,1,toward_receiver,unack,False,crc32c,256,c.bin,d.bin,False,24001200010c0207020000010005632e62696e05642e62696e 11 + meta_null_checksum,metadata,1,2,13,1,1,toward_receiver,unack,False,null,1024,e.bin,f.bin,False,24001200010d02070f0000040005652e62696e05662e62696e
+9 -4
test/interop/spacepackets/traces/nak.csv
··· 1 - name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,start_scope,end_scope,segments,pdu_hex 2 - nak_two_segs,nak,1,2,1,1,1,toward_sender,unack,0,1024,0-128;512-640,2c00190001010208000000000000040000000000000000800000020000000280 3 - nak_metadata_rereq,nak,1,2,1,1,1,toward_sender,unack,0,0,0-0,2c0011000101020800000000000000000000000000000000 4 - nak_empty_2b,nak,1,2,1,2,4,toward_sender,unack,0,65536,,2c0009130001000000010002080000000000010000 1 + name,pdu_type,source_entity,dest_entity,seq_nr,entity_id_len,seq_nr_len,direction,mode,start_scope,end_scope,segments,large_file,pdu_hex 2 + nak_two_segs,nak,1,2,1,1,1,toward_sender,unack,0,1024,0-128;512-640,False,2c00190001010208000000000000040000000000000000800000020000000280 3 + nak_metadata_rereq,nak,1,2,1,1,1,toward_sender,unack,0,0,0-0,False,2c0011000101020800000000000000000000000000000000 4 + nak_empty_2b,nak,1,2,1,2,4,toward_sender,unack,0,65536,,False,2c0009130001000000010002080000000000010000 5 + nak_empty_1b,nak,1,2,2,1,1,toward_sender,unack,0,0,,False,2c000900010202080000000000000000 6 + nak_many_segs,nak,1,2,3,1,1,toward_sender,unack,0,2000,0-50;100-150;200-250;300-350;400-450;500-550;600-650;700-750;800-850;900-950;1000-1050;1100-1150,False,2c0069000103020800000000000007d000000000000000320000006400000096000000c8000000fa0000012c0000015e00000190000001c2000001f400000226000002580000028a000002bc000002ee000003200000035200000384000003b6000003e80000041a0000044c0000047e 7 + nak_large_offsets,nak,1,2,4,1,1,toward_sender,unack,0,4294967295,4294963200-4294967295,False,2c0011000104020800000000fffffffffffff000ffffffff 8 + nak_full_scope,nak,1,2,5,1,1,toward_sender,unack,0,65536,0-65536,False,2c0011000105020800000000000100000000000000010000 9 + nak_large_file,nak,1,2,6,1,1,toward_sender,unack,0,4294967296,0-2147483648;2147483648-4294967296,True,2d00310001060208000000000000000000000001000000000000000000000000000000008000000000000000800000000000000100000000