Skip to content

feat(ngap): qualify Modify Request Transfer root admission - #887

Open
VerifiedOrganic wants to merge 1 commit into
feat/787-ngap-modify-fields-20260917from
feat/787-ngap-modify-request-20260917
Open

VerifiedOrganic wants to merge 1 commit into
feat/787-ngap-modify-fields-20260917from
feat/787-ngap-modify-request-20260917

Conversation

@VerifiedOrganic

@VerifiedOrganic VerifiedOrganic commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Modify Request Transfer needs to preserve optional session limits and flow parameters while applying the SDK's IE selection policies. This adds bounded admission and canonical construction for optional AMBR, uplink tunnel modifications, add/modify flows and release causes. Empty transfers stay representable; conflicting QFIs fail admission and construction.

Stacked on #885. Refs #787 and #795; this is a partial NGAP slice, with response/failure transfers and enclosing Modify messages still pending.

Contract and independent evidence

  • The four qualified root IEs are independently optional. Modify can retain prior AMBR; absence supplies no default or state claim. QFIs are unique and disjoint across modification/release lists. Directional endpoints and parameter absence use the qualified field types.
  • Complete physical framing is checked before the entry vector is allocated. Entries borrow IE frames; unknown and discarded values are not coalesced. Shared duplicate/unknown/validation policies remain authoritative. Retained unknown reject IEs fail, ignore IEs produce a count, and notify IEs produce identifiers. Known unsupported fields fail even under Drop; SecurityIndication has Modify's ignore criticality.
  • Depth ranges from 4 for empty roots to 10 with flow parameters. The container and nested lists separately use max_ies, with exact input/output limits; the generic allocation budget stays advisory. Formatting is redacted. This does not add a PDU outcome or establish session ownership, request correlation, NAS-forwarding eligibility or resource effects. A typed rejection does not send the prescribed abnormal-condition response.
  • The pinned Release 18 oracle contains 380 complete transfers: 363 admitted and 17 negative. Both unmodified reference encoders agree; structured decoding validates fields/classification. Coverage includes all 16 presence combinations, every flow count, 63 disjoint splits, AMBR bounds, tunnel forms, distinct duplicates, unsupported fields, unknown criticalities and 16K/64K fragments.
  • Generated enclosing encoding matches only the empty transfer (1/380); decoding passes 378/380, failing fragmented cases. Reuse qualified bounded container framing and nested codecs. Schema and dependencies are unchanged.

Validation

Passed: 166 affected Rust 1.89 tests (116 NGAP, 50 fixtures), Rust 1.89/1.98 all-target/all-feature Clippy, warnings-denied MSRV rustdoc, 22 fixture contracts, byte-identical oracle regeneration, fixture drift, Python lint, formatting/shards, both Go vet/test suites and kustomize. No tracked lockfile changes.

The direct-parent API detector fails compilation. Eight injected faults fail runtime regressions: generated container receiver, mandatory AMBR, cross-list QFI conflict, Setup's security criticality, nonminimal lengths, depth undercount, retained unknown reject admission and silently dropped known fields. Sources were restored before final passing gates. The initial test's incorrect AllocationBudget literal was corrected; its compile log is retained.

Fuzz passed 191,366 executions in 61 seconds with all 380 complete independent vectors in shared replay; 1,279 additional inputs and original/resolved fuzz lockfiles are retained locally.

Hosted checks passed on the unchanged head after rerunning failed jobs (47 successful, one skipped). The original session-store snapshot-cancellation timeout remains recorded; its cause is unproven. Required full workspace/persistence checks also passed on this exact head. Ready for independent review; review remains pending.

Revisions

Public main base: 75044f43852cd816d9734d03914515395bf20c69. Direct base: 57f54cd9b225901698c05fe21cac019b1fc6e0d0. Head: be0a8fe05bffe32483e9f7b706645617df47aecf; tree: 206f923e923ebc952067d52ca952dc7664119d65. Published fixture head/tree: 10f1aa35137864b65654b89297374175206652ba / a4387f57dc0cbe8dcb73ea102d2bc7642c68907c. Independent PDF SHA-256: 21617ad6dd826e05a0e8356ef96f44199cf4c7bc1be65e6b915e9135e10b59e2. Transfer oracle SHA-256: 97d75896e03618067fb2ed183218d297269db4c4f7e657050159a643bba2eb8b.

  • Required local and hosted gates complete.
  • Signed-off commit; README, conformance matrix, ADR, status and changelog updated.
  • Independent bytes, fault-removal failures, adversarial checks and bounded fuzzing.

Signed-off-by: VerifiedOrganic <verifiedorganic@sent.com>
@VerifiedOrganic
VerifiedOrganic marked this pull request as ready for review September 17, 2026 19:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant