Skip to content

FLUTE version 2 (RFC 6726) signalling, off by default: step one of three, no conformance claimed - #65

Open
jordijoangimenez wants to merge 1 commit into
5G-MAG:feature/wave3-rfc6726-compliance-fixesfrom
jordijoangimenez:feature/flute-v2-support
Open

FLUTE version 2 (RFC 6726) signalling, off by default: step one of three, no conformance claimed#65
jordijoangimenez wants to merge 1 commit into
5G-MAG:feature/wave3-rfc6726-compliance-fixesfrom
jordijoangimenez:feature/flute-v2-support

Conversation

@jordijoangimenez

@jordijoangimenez jordijoangimenez commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Base branch. This pull request is based on feature/wave3-rfc6726-compliance-fixes, the head of
#62, not on development, because it builds on that work. The diff therefore shows only this pull
request's own single commit. GitHub will retarget it to development automatically when #62 merges.

Advances #81. Does not close it, and must not be set to.

Dependencies and issues

Depends on: #62, and is based on its branch, so #62 merges first.
Paired with: #61, #64, #68 and #98, independent of this one, either order.
Closes on merge: nothing. It advances #81 by one of the three steps that issue lists, and #81 must
stay open afterwards.

What is in this pull request

One commit. A per-session FLUTE version, defaulting to 1, plus every version 2 rule that differs
from version 1 except congestion control. Nothing here is reachable from a version 1 or 3GPP
session; each difference is behind the selector.

Area Version 2 behaviour
Signalling EXT_FDT version field set to 2, receive accepts only the configured version, RFC 6726 FDT namespace
LCT generation the two bits RFC 3451 used for Sender Current Time and Expected Residual Time size nothing and are stepped over by nothing, per RFC 5651; version 1 unchanged
FDT Instance ID wraps to the smallest expired identifier, refuses one still live, reports exhaustion (RFC 6726 cl. 3.4.1); version 1 keeps RFC 3926's wrap to zero
Expires read in the NTP era nearest the current time (RFC 6726 cl. 3.3)
Shared Content-Location the declaration from the greater FDT Instance ID wins, not whichever completed first (RFC 6726 cl. 3.4.2)
IPsec ESP association sets a replay window, which RFC 6726 cl. 7.5 requires via RFC 5775; version-independent

Checked and already met, so no code changed: EXT_TIME and EXT_AUTH recognition (RFC 5651 asks
only that they be recognised, not parsed); the RFC 3450 to RFC 5775 move, whose two substantive
items were already present; the FDT schema body, whose attribute set matches and whose 3GPP extras
the schema itself admits; and ESP authentication and integrity. README-FLUTE-V2.md records each
of these, how it was established, and where the evidence is a reading rather than a test.

Not implemented: congestion control. RFC 5775 requires it for every packet in a session. It is
a building block, not a patch. No RFC 6726 conformance is claimed for this branch and none can be
until that exists.
It is the only remaining item.

What this is not

This is not FLUTE version 2 support, and makes no conformance claim. #81 separates that into three
steps and this is the first. RFC 6726 requires RFC 5775 and RFC 5651 beneath the FDT; this library's ALC
and LCT layers are still RFC 3450 and RFC 3451, and neither of the newer documents is held by us, so no
version 2 conformance can be asserted either way, whatever the version field says.

What this earns is that the version stops being hardcoded.

Version 1 stays the default because the profile this library's consumers operate, TS 26.517 clause 6.2.1
pointing at TS 26.346 annex L, is scoped to RFC 3926 throughout. That was @davidjwbbc's point on #62, and
it is why this material was split out of that branch rather than merged into it.

Verification

T1: 77 cases passing, including that a version 2 session signals 2 and a version 1 session is unchanged.
No live verification: there is no version 2 peer to test against, and none is claimed.

Merge order

After #62. Independent of the FEC branches.

@jordijoangimenez jordijoangimenez self-assigned this Aug 11, 2026
@jordijoangimenez jordijoangimenez added the enhancement New feature or request label Aug 11, 2026
@dsilhavy dsilhavy added this to the v1.0.0 milestone Aug 14, 2026
@jordijoangimenez
jordijoangimenez marked this pull request as draft August 14, 2026 10:27
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch from 6237b31 to b5be461 Compare August 22, 2026 12:57
@jordijoangimenez jordijoangimenez changed the title FLUTE version 2 on transmit (not 3GPP-compliant — reference/future work, depends on #62) FLUTE version 2 signalling, off by default Aug 22, 2026
@jordijoangimenez
jordijoangimenez changed the base branch from development to feature/wave3-rfc6726-compliance-fixes August 22, 2026 12:59
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch from b5be461 to 26dacc2 Compare August 22, 2026 13:16
@jordijoangimenez
jordijoangimenez deleted the feature/flute-v2-support branch August 22, 2026 13:22
@github-project-automation github-project-automation Bot moved this from In Progress to Done in MBMS: Support for FLUTE Aug 22, 2026
@jordijoangimenez
jordijoangimenez restored the feature/flute-v2-support branch August 22, 2026 13:24
@jordijoangimenez
jordijoangimenez changed the base branch from feature/flute-v1-profile-conformance to development August 22, 2026 13:24
@jordijoangimenez jordijoangimenez changed the title FLUTE version 2 signalling, off by default FLUTE version 2 (RFC 6726) signalling, off by default: step one of three, no conformance claimed Aug 22, 2026
@jordijoangimenez
jordijoangimenez changed the base branch from development to feature/wave3-rfc6726-compliance-fixes August 22, 2026 15:25
@jordijoangimenez
jordijoangimenez marked this pull request as ready for review August 22, 2026 15:38
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch 4 times, most recently from 798ddf8 to 1e97d70 Compare August 22, 2026 18:44
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch from 1e97d70 to 5a9496c Compare August 22, 2026 18:44
@jordijoangimenez
jordijoangimenez force-pushed the feature/wave3-rfc6726-compliance-fixes branch 2 times, most recently from 637cf46 to 12fb037 Compare August 22, 2026 19:02
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch 2 times, most recently from e033e91 to 0d009e8 Compare August 22, 2026 19:50
@jordijoangimenez
jordijoangimenez force-pushed the feature/wave3-rfc6726-compliance-fixes branch from c7306fc to e6bbe48 Compare August 22, 2026 20:01
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch 4 times, most recently from 6e90d9f to 22baee6 Compare August 23, 2026 07:00
@jordijoangimenez
jordijoangimenez force-pushed the feature/wave3-rfc6726-compliance-fixes branch from 4c3e556 to e6bbe48 Compare August 23, 2026 07:29
…ault

Change type
  New feature, not for 3GPP MBMS use. This branch is the FLUTE version 2 delta and nothing else.

Basis
  The two versions are separate protocols, not a compatible upgrade.

  RFC 3926 clause 3.4.1: "This document specifies FLUTE version 1. Hence in any ALC packet that
  carries FDT Instance and that belongs to the file delivery session as specified in this
  specification MUST set this field to '1'."

  RFC 6726 clause 11.1: "Therefore, an implementation that relies on [RFC3926] and RFC 3451 will
  not be backwards compatible with FLUTE as specified in this document."

  RFC 6726 clause 3.1, which is why the receive side checks against a configured value rather than
  accepting whatever arrives: "If multiple FLUTE sessions are sent to a channel, then receivers
  MUST determine the FLUTE protocol version, based on version fields and the (source IP address,
  TSI) pair carried in the ALC/LCT header of the packet."

  On the LCT generation, RFC 6726 clause 11.1: "In [RFC5651], these fields MUST be set to zero and
  MUST be ignored by receivers (instead, the EXT_TIME Header Extensions can convey this
  information if needed)."

  On the identifier sequence, RFC 6726 clause 3.4.1: "After reaching the maximum value (2^20-1),
  the numbering starts from the smallest FDT Instance ID value assigned to an expired FDT
  Instance." and "Senders MUST NOT reuse an FDT Instance ID value that is already in use for a
  non-expired FDT Instance."

  On expiry, RFC 6726 clause 3.3: "both a sender and a receiver easily determine to which
  (136-year) epoch the FDT Instance expiration time value pertains by choosing the epoch for which
  the expiration time is closest in time to the current time."

  On a shared Content-Location, RFC 6726 clause 3.4.2: "the element appearing in the FDT Instance
  with the greater FDT Instance ID is considered to declare a newer instance (e.g., version) of
  the same"

  On security, RFC 6726 clause 7.5 takes its service set from ALC, where RFC 5775 requires
  anti-replay support alongside authentication and integrity.

Change
  A per-session FLUTE version, settable on the Transmitter and Receiver, defaulting to 1, carried
  into the ALC parser, the FDT and the receiver's object handling. Every behavioural difference
  below is reached only when a caller selects version 2, so a version 1 or 3GPP session is
  unchanged in every respect.

  Signalling: transmit writes the selected version into the EXT_FDT nibble, receive accepts only
  the configured version, and the RFC 6726 FDT namespace is enabled.

  LCT generation: under version 2 the two bits RFC 3451 used for the Sender Current Time and
  Expected Residual Time fields contribute no header words and nothing is stepped over, so an
  extension placed after the TOI is reached. Under version 1 the RFC 3451 reading is untouched.
  Transmit has always sent both bits zero, since the header buffer is calloc'd.

  FDT Instance ID: version 2 wraps to the smallest expired identifier, refuses one still live, and
  reports exhaustion, which RFC 6726 clause 3.4.1 leaves to the implementation. Version 1 keeps
  RFC 3926's wrap to zero.

  Expiry: read into the era nearest the current time, version 2 only.

  Shared Content-Location: the receiver records which instance declared each file and keeps the
  one from the greater instance ID rather than whichever completed first, version 2 only.

  IpSec sets a replay window. That one is version-independent and benefits both.

  Four further obligations were checked against the specifications and found already met, so no
  code changed for them: EXT_TIME and EXT_AUTH recognition, the RFC 3450 to RFC 5775 move, the FDT
  schema body, and ESP authentication and integrity. README-FLUTE-V2.md records each, how it was
  established, and where the reading is weaker than a test.

  The default is what keeps this safe: 1 is the version TS 26.346 clause L.4.1 references, so a
  session that does not ask for version 2 behaves exactly as it does on the version 1 branch.

Separation, deliberate
  Rebuilt on the FLUTE version 1 compliance branch rather than on the FEC branches, so it carries
  no Raptor and no RaptorQ: zero files of either. The Raptor and RaptorQ test suites are
  deliberately not registered in tests/CMakeLists.txt here, and the reason is stated at that line.

Verification
  T1: 62 cases pass at the build root, 12 of them in the FluteV2 suite, covering both readings of
  the LCT bits, the three branches of the version 2 identifier sequence, and the worked example
  RFC 6726 clause 3.3 gives for the era calculation. Quotations checked with
  tools/verify-citations.py in --strict mode.
  T2: ip xfrm state show on an installed association reports "replay-window 32" beside the enc and
  auth-trunc lines. 32 is the ceiling the legacy attribute expresses, the kernel holding its replay
  bitmap in a __u32; a request for 64 is clamped.

Not in this change
  Congestion control, which RFC 5775 requires for every packet in a session and which this library
  does not implement. It is a building block, not a patch, and until it exists no RFC 6726
  conformance is claimed for this branch and none can be. It is the only remaining item.
@jordijoangimenez
jordijoangimenez force-pushed the feature/flute-v2-support branch from 22baee6 to 654e052 Compare August 23, 2026 07:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Development

Successfully merging this pull request may close these issues.

2 participants