跳转至

Fragmentation

Fragment metadata is carried in FRAGMENT_EXT, not in a payload prefix.

Reassembly Key

source_id + connection_id + session_epoch + message_id

The same message_id in different sessions does not collide.

Range Model

The reassembly manager tracks received byte ranges or chunk ranges, avoiding per-byte scans for large payloads. Duplicate ranges may be ignored; conflicting or out-of-bounds ranges fail closed.

Sender Side

The sender computes per-fragment payload capacity from route MTU, base header, extensions, authentication trailer, and frame CRC. Every fragment carries FRAGMENT_EXT and keeps the same message_id, message_len, connection, and session.

Fragment Budget Formula

The send planner derives the payload budget in two stages:

app_payload_budget =
  route_max_frame_size
  - XGL_WIRE_BASE_HEADER_SIZE
  - app_extensions_len
  - auth_overhead
  - XGL_CRC16_SIZE

fragment_payload_budget =
  app_payload_budget - XGL_FRAGMENT_EXT_SIZE

app_extensions_len includes DATA_TYPE_EXT when data_type != 0. auth_overhead is SECURITY_EXT plus the provider tag length when authentication is enabled. When data_len <= app_payload_budget, the packet is sent as a single frame. When fragmentation is needed, every fragment spends additional TLV space on FRAGMENT_EXT, so fragment_payload_budget is smaller than the single-frame payload budget.

Budget item Source Failure
Route MTU xgl_route_item_t.max_frame_size XGL_ERR_BUFFER_TOO_SMALL or fragmentation planning failure
Base header XGL_WIRE_BASE_HEADER_SIZE Fixed 24 bytes
DATA_TYPE_EXT XGL_DATA_TYPE_EXT_SIZE when data type is non-zero Included in both single-frame and fragmented sends
FRAGMENT_EXT XGL_FRAGMENT_EXT_SIZE Required only on fragments
Auth overhead XGL_SECURITY_EXT_SIZE + tag_len Requires valid provider/tag length
Frame CRC XGL_CRC16_SIZE Always present

Receiver Side

The receiver validates the frame first, then finds a buffer by reassembly key. Only after ranges cover [0, message_len) is the assembled payload delivered to transport.

Reassembly Rules

Condition Behavior Evidence
First valid fragment for a key Allocate a reassembly buffer and reserve message_len bytes src/transport/xgl_fragment_reassembly.c, test/test_fragment.cpp
Non-overlapping range Copy bytes and insert/merge received range src/transport/xgl_fragment_range.c, test/test_fragment.cpp
Duplicate range Accepted only when it does not create an invalid overlap src/transport/xgl_fragment_range.c, test/test_fragment.cpp
message_len == 0 Reject src/transport/xgl_fragment_process.c
fragment_offset > message_len Reject src/transport/xgl_fragment_process.c
data_len > message_len - fragment_offset Reject src/transport/xgl_fragment_process.c
Different message_len for existing key Reject src/transport/xgl_fragment_process.c
All ranges cover [0, message_len) Remove buffer and deliver complete payload src/transport/xgl_fragment_process.c, test/test_fragment.cpp

Budget

Reassembly is bounded by two budgets:

  • maximum concurrent reassembly buffers
  • maximum message size
  • optional aggregate in-flight reassembly bytes

Over-budget fragments are dropped and counted. RESET clears only the target connection/session reassembly state through xgl_fragment_clear_reassembly_scope().

Budget Source Cleanup
Concurrent buffers max_reassembly_buffers New buffer allocation fails when full
Message bytes max_message_size Oversized message is rejected
Aggregate bytes max_reassembly_bytes In-flight reservation prevents exhaustion
Timeout reassembly_timeout_ms xgl_fragment_process_timeouts() frees stale buffers
Scope reset peer + connection_id + session_epoch RESET/CLOSE clear only matching buffers

Attack Surface

Fragmentation is a primary memory-exhaustion entrypoint. Production configurations must limit maximum message length, concurrent reassemblies, per-peer budget, and global budget.

Traceability

Rule Source Tests
Fragment value format src/wire/xgl_wire_ext.c test/test_wire.cpp
Send budget planning src/transport/xgl_transport_send_plan.c test/test_transport.cpp
Fragment emission src/transport/xgl_transport_send_fragment.c test/test_transport.cpp
Reassembly key and buffers src/transport/xgl_fragment_reassembly.c test/test_fragment.cpp
Range merge/overlap rules src/transport/xgl_fragment_range.c test/test_fragment.cpp
Timeout and scope cleanup src/transport/xgl_fragment_maintenance.c, src/transport/xgl_transport_peer.c test/test_fragment.cpp, test/test_transport.cpp