Skip to content

0.9.23 — rootless: set_iface_up + disable_iface_offload verbs#181

Merged
click0 merged 1 commit into
mainfrom
claude/release-0.9.23
May 9, 2026
Merged

0.9.23 — rootless: set_iface_up + disable_iface_offload verbs#181
click0 merged 1 commit into
mainfrom
claude/release-0.9.23

Conversation

@click0
Copy link
Copy Markdown
Owner

@click0 click0 commented May 9, 2026

Summary

Twenty-fourth 0.9.x release. First verb-set expansion since 0.9.0 — adds two atomic single-iface verbs needed by crate run's host-side bridge plumbing.

What lands

Two new privops verbs

  • set_iface_up — wraps IfconfigOps::setUp(ifname). Single string arg; idempotent.
  • disable_iface_offload — wraps IfconfigOps::disableOffload(ifname). Same shape; FreeBSD 15 checksum-offload workaround.

Why these two together: same shape (1 ifname, no response data), called as a sibling pair in run_net.cpp::setupBridgeEpair, splitting into separate releases would be unhelpful.

Wire-up across the stack

  • lib/privops_pure.{h,cpp} — enum + request structs + validators (delegate to existing validateIfaceName)
  • lib/privops_wire_pure.{h,cpp} — JSON parsers + formatXxxSuccess builders + dispatcher cases
  • lib/privops_nv_pure.{h,cpp} — nv parsers (FieldMap)
  • lib/privops_client.h + lib/privops_client_pure.cppbuildSetIfaceUp / buildDisableIfaceOffload
  • daemon/privops_handlers.{h,cpp} — handlers + dispatcher cases (HTTP + libnv transports)

CLI wiring

lib/run_net.cpp gets two new file-static helpers (setUpPrivopsOrLocal, disableOffloadPrivopsOrLocal) mirroring the 0.9.20 moveToVnetPrivopsOrLocal pattern. 5 call-sites migrated:

Site Op
createEpair line 160 disableOffload(ifaceA)
createEpair line 161 disableOffload(ifaceB)
setupBridgeEpair line 436 disableOffload(ifaceA)
setupBridgeEpair line 437 disableOffload(ifaceB)
setupBridgeEpair line 440 setUp(ifaceA)

Why expand the verb set

configure_iface (0.9.6) bundles move + IP/MAC + bridge attach. Assumes spec-driven "give me everything at once" usage. The run_net.cpp orchestration is streaming — interleaves IfconfigOps calls with state-tracking and other ops. For that pattern, atomic verbs match better.

The 0.9.0 closed taxonomy isn't broken; new verbs append to it.

Test plan

  • 2 new ATF tests (set_iface_up_minimal, disable_iface_offload_minimal)
  • verb_token_roundtrips_for_every_verb updated to include both new verbs (catches future enum-add-without-mapping)
  • Suite: 1294 → 1296
  • FreeBSD CI must pass

Series state

CLI call-sites wired:

  • crate retune → set_rctl / clear_rctl (0.9.15)
  • crate stop → destroy_jail (0.9.17)
  • crate run ZFS attach + detach → attach_zfs / detach_zfs (0.9.18)
  • crate run nullfs mounts (8 sites) → mount_nullfs (0.9.19)
  • crate run vnet moveToVnet (4 sites) → configure_iface move-only (0.9.20)
  • crate run removeJail teardown → destroy_jail (0.9.21)
  • crate run createJail → create_jail (0.9.22)
  • crate run setUp + disableOffload (5 sites) → set_iface_up / disable_iface_offload ← this PR

Remaining:

  • 0.9.24 — bridge_add_member + set_iface_inet_addr verbs
  • 0.9.25 — create_epair (first response-data verb)
  • 0.9.26 — network_lease per-user paths + RCTL umbrella
  • 0.9.27 — default flip
  • 1.0.0 — setuid removed

Files

  • lib/privops_pure.{h,cpp}, lib/privops_wire_pure.{h,cpp}, lib/privops_nv_pure.{h,cpp} — taxonomy + parsers
  • lib/privops_client.h + lib/privops_client_pure.cpp — builders
  • daemon/privops_handlers.{h,cpp} — handlers + dispatcher
  • lib/run_net.cpp — 2 helpers + 5 call-site replacements
  • tests/unit/privops_pure_test.cpp — 2 new tests
  • cli/args.cppcrate 0.9.23
  • CHANGELOG.md — entry

Generated by Claude Code

Twenty-fourth 0.9.x release. First verb-set expansion since
0.9.0. setUp + disableOffload are atomic single-iface
primitives that don't compose well with the existing
configure_iface composite verb.

Two new privops verbs:
  set_iface_up — wraps IfconfigOps::setUp(ifname). Single
    string arg, idempotent.
  disable_iface_offload — wraps IfconfigOps::disableOffload.
    Same shape; FreeBSD 15 checksum-offload workaround.

Stack-wide wire-up:
  privops_pure: enum + structs + validators (delegate to
    validateIfaceName)
  privops_wire_pure: JSON parsers + format builders +
    dispatcher cases
  privops_nv_pure: nv parsers (FieldMap)
  privops_client: buildSetIfaceUp / buildDisableIfaceOffload
  privops_handlers: handlers + dispatcher cases (HTTP + nv)

CLI wiring: lib/run_net.cpp gets setUpPrivopsOrLocal and
disableOffloadPrivopsOrLocal file-static helpers (sibling
pattern to 0.9.20's moveToVnetPrivopsOrLocal). 5 call-sites
migrated (4 disableOffload + 1 setUp in createEpair /
setupBridgeEpair).

Why expand: configure_iface (0.9.6) assumes spec-driven
"give all at once" usage. run_net.cpp orchestration is
streaming. Atomic verbs match better. The 0.9.0 closed
taxonomy isn't broken — verbs append.

Suite: 1294 -> 1296. verb_token_roundtrips_for_every_verb
updated to include both new verbs.

Remaining iface verbs: bridge_add_member, set_iface_inet_addr
(0.9.24), create_epair (0.9.25, first response-data verb).
@click0 click0 merged commit 67e1d74 into main May 9, 2026
2 checks passed
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.

2 participants