Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
200 commits
Select commit Hold shift + click to select a range
370d3ac
Extract SdStateManager from server mod
JustinKovacich Apr 22, 2026
9c73ab8
Shifted tests around, added a test, removed dead impl Default
JustinKovacich Apr 22, 2026
4f9f709
Add multicast-loopback coverage for SdStateManager::send_offer_service
JustinKovacich Apr 23, 2026
d3315e8
fmt: apply rustfmt style to the new multicast tests
JustinKovacich Apr 23, 2026
e9d1805
server: track SD session wrap, propagate reboot flag everywhere
JustinKovacich Apr 23, 2026
3116a1c
server: fix SD wrap-flag ordering across all emission paths
JustinKovacich Apr 23, 2026
7f975cc
round-3: drop branch-specific note from #[ignore] reason
JustinKovacich Apr 24, 2026
ada2553
Switch to existing collections to heapless, hide other non-embedded f…
JustinKovacich Apr 22, 2026
a36af2f
Address PR #76 review feedback
JustinKovacich Apr 23, 2026
7d3da6e
phase 2: cover pending_responses saturation branch
JustinKovacich Apr 23, 2026
540899d
client+server: harden re-enqueue + misc Copilot round-2
JustinKovacich Apr 23, 2026
d6cca3a
chore(clippy): add Panics doc + safe cast in move_vec PR
JustinKovacich Apr 23, 2026
951b02d
round-3: handle displaced-sender branch in pending_responses insert
JustinKovacich Apr 24, 2026
073ee80
docs(error): flag variant additions on client::Error as breaking
JustinKovacich Apr 24, 2026
34e1a05
server: NACK on Subscribe capacity overflow instead of false ACK
JustinKovacich Apr 24, 2026
97eca58
round-4: address Copilot feedback on session/sub_manager docs + log w…
JustinKovacich Apr 24, 2026
cea2204
round-5: clean up Subscribe-NACK reason path + CHANGELOG + doc
JustinKovacich Apr 24, 2026
5a804cf
PR #76 round: trim stale changelog, specific NACK reasons, truthful s…
JustinKovacich Apr 24, 2026
bceae77
Update src/server/mod.rs
JustinKovacich Apr 24, 2026
3881278
Max buffer size set to 1500, avoid heap allocation/vecs, overflow ret…
JustinKovacich Apr 22, 2026
3b4c10f
Responding to PR Feedback
JustinKovacich Apr 23, 2026
92cf7f8
phase 3: add coverage for publish_event pre-encode overflow branch
JustinKovacich Apr 23, 2026
cb2c7ed
docs: clarify UDP_BUFFER_SIZE scope + wording (Copilot round-2)
JustinKovacich Apr 23, 2026
edea683
round-3: clarify UDP_BUFFER_SIZE + memory-footprint docs
JustinKovacich Apr 24, 2026
4aadf73
test(event_publisher): cover E2E-protected overflow guard in publish_…
JustinKovacich Apr 24, 2026
9fbd8e0
round-4: fix E2E-overflow log wording + MTU-vs-UDP_BUFFER_SIZE comment
JustinKovacich Apr 24, 2026
32233bd
fix(event_publisher): guard against usize overflow in raw-event total…
JustinKovacich Apr 24, 2026
f5bf200
round-5: derive oversize fixtures from UDP_BUFFER_SIZE + fix log wording
JustinKovacich Apr 24, 2026
b786551
Added Transport Socket, Transport Factory and Timer traits
JustinKovacich Apr 22, 2026
495f661
phase 4: rewrite Send-bound docs to remove nonexistent type reference
JustinKovacich Apr 23, 2026
2b5dd3e
docs: fix transport.rs + lib.rs module-level accuracy (Copilot round-2)
JustinKovacich Apr 23, 2026
3e0b68c
docs: reword transport-module doc on lib.rs to match transport.rs
JustinKovacich Apr 23, 2026
1a35836
docs: drop pub on structs inside doctest wrapper fn
JustinKovacich Apr 24, 2026
db44209
transport: make TransportSocket I/O methods take &self
JustinKovacich Apr 24, 2026
756f4b2
docs(transport): correct backend wording; add Errors sections
JustinKovacich Apr 24, 2026
40b82f4
Add a new tokio transport layer that uses semantics identical to the …
JustinKovacich Apr 22, 2026
6b85988
bind_discovery_seeded and bind are async and construct a TokioSocket …
JustinKovacich Apr 22, 2026
8526f9f
Added bind_with_transport methods that accept a factory that produces…
JustinKovacich Apr 22, 2026
e37d061
Responding to PR feedback
JustinKovacich Apr 22, 2026
5fd8387
phase 5: respond to PR #79 feedback
JustinKovacich Apr 23, 2026
d50d21b
tokio_transport: document truncation caveat + triage log levels
JustinKovacich Apr 23, 2026
f76c2b6
docs: fix transport.rs intra-doc links under default features
JustinKovacich Apr 23, 2026
e703de2
chore(clippy): tidy new warnings in tokio_transport
JustinKovacich Apr 23, 2026
2b46f0b
fix(socket_manager): correct error log on recv_from failure
JustinKovacich Apr 24, 2026
24a470c
round-N: align map_io_error + spawn_socket_loop docs with implementation
JustinKovacich Apr 24, 2026
d9e08c4
client/socket_manager: clean up error-log + if-let-Ok patterns
JustinKovacich Apr 24, 2026
24aef9d
Potential fix for pull request finding
JustinKovacich Apr 24, 2026
92cf168
fix(rebase): resolve semantic conflicts from base-trait migration
JustinKovacich Apr 25, 2026
94cb236
Apply hoists: run_future doesnt call tokio::spawn, client::new/with_l…
JustinKovacich Apr 22, 2026
07f7abe
Add testing, add sensible panics, updated docs
JustinKovacich Apr 23, 2026
84ee4e8
phase 6: respond to PR #80 feedback (typed Shutdown + test/doc fixes)
JustinKovacich Apr 23, 2026
7a8d2d4
lints: address must_use + README wording (Copilot round-2)
JustinKovacich Apr 23, 2026
a1a01ed
chore(clippy): address new warnings in hoist_tokio PR
JustinKovacich Apr 23, 2026
ffffa1a
PR #80 round: apply reviewer suggestions
JustinKovacich Apr 24, 2026
452e47b
examples: bind spawn handle in client_server to avoid let_underscore_…
JustinKovacich Apr 24, 2026
6646cf3
server: add #[must_use] to announcement_loop
JustinKovacich Apr 24, 2026
118c8ce
client: distinguish pending_responses saturation from shutdown
JustinKovacich Apr 24, 2026
8964f75
docs(error): add "pending_responses" to Capacity tag list
JustinKovacich Apr 24, 2026
92606c1
fix: capture tokio::spawn JoinHandle to avoid unused_must_use warnings
JustinKovacich Apr 24, 2026
d92c5a3
fix: store and observe JoinHandles in production/example code
JustinKovacich Apr 24, 2026
861c5d3
fix: use Tokio-specific wording and unique test service IDs
JustinKovacich Apr 25, 2026
82df573
docs(server): fix Result signatures and executor wording in README AP…
JustinKovacich Apr 25, 2026
398289b
phase 7: select-fairness, FusedFuture migration, Timer trait wiring
JustinKovacich Apr 25, 2026
e4ab414
phase 8: bare_metal example as trait-surface canary
JustinKovacich Apr 25, 2026
e87c128
phase 9: Spawner trait + executor-agnostic Client construction
JustinKovacich Apr 25, 2026
81d1dee
phase 9: round-N response to consolidated review feedback
JustinKovacich Apr 27, 2026
43118c7
phase 10: lock-handle abstraction (Arc<Mutex/RwLock<_>> → trait handles)
JustinKovacich Apr 27, 2026
fbc2998
phase 11: channel replacement (tokio::sync → ChannelFactory trait)
JustinKovacich Apr 27, 2026
d31fa2d
phase 12: socket-bound relax via TransportSocket GATs
JustinKovacich Apr 27, 2026
05565d7
phase 13a: feature-flag detangle (client side)
JustinKovacich Apr 27, 2026
97553d6
phase 13.5: no-tokio Client construction
JustinKovacich Apr 27, 2026
0cc8b25
phase 13.6a: ChannelFactory bounded const-N quirk fix
JustinKovacich Apr 28, 2026
fd01d5c
phase 13.6b: ChannelFactory per-T Pooled<C> bounds
JustinKovacich Apr 28, 2026
6cbece8
phase 13.6c: src/static_channels/ pool primitives
JustinKovacich Apr 28, 2026
c17e0f6
phase 13.6d: define_static_channels! macro
JustinKovacich Apr 28, 2026
1bd1fc0
phase 13.6e: alloc-counting witness + bare_metal_client uses StaticCh…
JustinKovacich Apr 28, 2026
6547a91
phase 13.6f: waker tests, Debug impls, macro vis fragment, drop spuri…
JustinKovacich Apr 28, 2026
7c57598
phase 14a: server feature-flag detangle (topology only)
JustinKovacich Apr 28, 2026
e2e9a73
phase 14a fixup: refresh stale doc text after the server split
JustinKovacich Apr 28, 2026
22a1737
phase 14b: server engine retargeting (Server reachable without tokio)
JustinKovacich Apr 28, 2026
b4f4c96
phase 15: rewrite bare_metal example as Client::new_with_deps integra…
JustinKovacich Apr 28, 2026
7171ffc
phase 15: add bare_metal_server example; rename bare_metal → bare_met…
JustinKovacich Apr 28, 2026
503a55d
phase 16: no-alloc CI gate — StaticE2EHandle, AtomicInterfaceHandle, …
JustinKovacich Apr 28, 2026
085c3f7
phase 16 review: explicit CI gate, first-claim/recv/Profile5 witnesses,
JustinKovacich Apr 28, 2026
732cd89
cleanup: fix three correctness bugs in transport / E2E / server bind
JustinKovacich Apr 28, 2026
2d9238f
cleanup: honor close-semantic contracts on embassy + static-pool back…
JustinKovacich Apr 28, 2026
6a22fd2
cleanup: !Send Client construction via LocalSpawner + BindDispatch
JustinKovacich Apr 28, 2026
7c58649
cleanup: drop per-event allocations + Send bounds from server hot path
JustinKovacich Apr 28, 2026
76e4b21
cleanup: fix MockRecvFut busy-wake + MockTimer duration violations
JustinKovacich Apr 28, 2026
3f6e027
fix: phase 17 cleanup - docs, API alignment, alloc gating
JustinKovacich Apr 28, 2026
4c099ac
Fix tests so they run serially and don't flake.
JustinKovacich Apr 28, 2026
2d1c768
Fix waker being held during waker.wake when it didnt need to be
JustinKovacich Apr 28, 2026
850800c
Improve code coverage and remove dead code.
JustinKovacich Apr 28, 2026
1f2fd79
fix: address round-2 review comments on #95/#96
JustinKovacich Apr 28, 2026
8303b31
fix: address adversarial review for #95 (3 Crit + 12 High + 13 Med + …
JustinKovacich Apr 28, 2026
fe618cf
fix(examples): port workspace example mocks to GAT BindFuture/SleepFu…
JustinKovacich Apr 28, 2026
61c67f4
test: add regression tests for H3/H4/H5/H10/H12
JustinKovacich Apr 28, 2026
de31890
chore: remove accidentally-committed local config files
JustinKovacich Apr 28, 2026
dcb0f83
fix: address remaining Copilot inline comments on #95
JustinKovacich Apr 28, 2026
9aa2619
docs: correct assert_no_alloc semantics (abort, not panic)
JustinKovacich Apr 28, 2026
e943c52
phase 18a: port E2ERegistry to heapless::FnvIndexMap
JustinKovacich Apr 29, 2026
9127891
phase 18b: SubscriptionManager off std::vec::Vec on the no_std path
JustinKovacich Apr 29, 2026
537e997
phase 18c: ungate StaticE2EHandle; add StaticSubscriptionHandle
JustinKovacich Apr 29, 2026
54245e3
phase 18d: drop std from `client` / `server` Cargo features
JustinKovacich Apr 29, 2026
6789fee
phase 18d follow-up: actually compile for thumbv7em-none-eabihf
JustinKovacich Apr 29, 2026
12a0450
phase 18e: add no_std-target CI gate (thumbv7em-none-eabihf)
JustinKovacich Apr 29, 2026
24ef942
phase 18f: docs sweep, examples on Static*Handle, finalize 0.8.0
JustinKovacich Apr 29, 2026
300070c
phase 19a: scaffold simple-someip-embassy-net workspace member
JustinKovacich Apr 29, 2026
5a5cd5b
phase 19b: EmbassyNetFactory + SocketPool storage
JustinKovacich Apr 29, 2026
261ccb0
phase 19c: EmbassyNetSocket send/recv via poll_send_to / poll_recv_from
JustinKovacich Apr 29, 2026
10fdfdc
phase 19e: adapter-level loopback test (LoopbackDriver pair + UDP rou…
JustinKovacich Apr 29, 2026
96f6afa
phase 19e: lockfile update for tokio/futures dev-deps
JustinKovacich Apr 29, 2026
165f02d
phase 19f: SocketHandle abstraction over Server's socket storage
JustinKovacich Apr 29, 2026
93858d5
phase 19g: SOME/IP Client+Server roundtrip over embassy-net loopback
JustinKovacich Apr 29, 2026
b148fc3
phase 19h: examples/embassy_net_client/ — runnable adapter demo
JustinKovacich Apr 29, 2026
4f9d36e
server: split run() into run_with_buffers + alloc shim
JustinKovacich Apr 29, 2026
9220cde
server: SdStateHandle trait + drop Arc<SdStateManager> requirement
JustinKovacich Apr 29, 2026
c72c3cf
phase 20c: EventPublisherHandle trait + drop Arc<EventPublisher> requ…
JustinKovacich Apr 29, 2026
bf8f774
phase 20d: Server::new_with_handles + new_passive_with_handles
JustinKovacich Apr 29, 2026
9f17909
phase 20e: consolidate handle traits into SharedHandle<T>
JustinKovacich Apr 29, 2026
d961fc1
phase 20f: vsomeip-based SD-conformance test (POC, #[ignore]'d)
JustinKovacich Apr 29, 2026
39a9290
tools: thumbv7em flash-size measurement probe
JustinKovacich Apr 29, 2026
886e2fe
phase 20g: vsomeip docker harness for SD-conformance test
JustinKovacich Apr 29, 2026
a305e5b
phase 20h: TX-direction SD wire-format conformance + CI gate
JustinKovacich Apr 29, 2026
5ad28ee
phase 20 cleanup: workspace clippy + embassy-net adapter soundness
JustinKovacich Apr 30, 2026
878122e
phase 20 cleanup: alloc cfg + OfferedEndpoint visibility
JustinKovacich Apr 30, 2026
416b989
phase 20 cleanup: select_biased fairness + CI audit holes
JustinKovacich Apr 30, 2026
573346f
phase 20 cleanup: vsomeip conformance hardening
JustinKovacich Apr 30, 2026
c5885ba
phase 20 cleanup: size_probe, sd_state visibility, spawner
JustinKovacich Apr 30, 2026
62dfac3
phase 20 cleanup: MED clusters A/B/C/D
JustinKovacich Apr 30, 2026
7b0aa61
phase 20 cleanup: changelog [Unreleased] + final verification
JustinKovacich Apr 30, 2026
a6e13d4
phase 20 cleanup: tests for new code + Copilot review fixes
JustinKovacich Apr 30, 2026
b8c5911
phase 20 cleanup: address adversarial review of new tests
JustinKovacich Apr 30, 2026
9b4b4c8
phase 20 cleanup: correct embassy-sync dep-version comment
JustinKovacich Apr 30, 2026
f2e6b79
phase 21a: align Client/Server generic-parameter order
JustinKovacich Apr 30, 2026
5610c67
phase 21c: tokio-defaulted Deps constructors + fluent builders
JustinKovacich Apr 30, 2026
11ad05c
phase 21e: ServerConfig fluent builder
JustinKovacich Apr 30, 2026
19c7415
phase 21d: surface required client channel types as discoverable rustdoc
JustinKovacich Apr 30, 2026
b81b34f
phase 21 cleanup: address adversarial review
JustinKovacich May 1, 2026
e3ba8f4
phase 21b + 21F: Server constructor reshape + SubscriptionHandle GATs
JustinKovacich May 1, 2026
03132d8
phase 21: collapse [Unreleased] into [0.8.0]
JustinKovacich May 1, 2026
7807df7
phase 21: address Copilot review on PR #114
JustinKovacich May 1, 2026
892cb5b
make tracing optional behind a feature
JustinKovacich May 5, 2026
be292bb
feat(server): make client+server+bare_metal alloc-free, add NonSdRequ…
Jun 1, 2026
3dafd3e
Apply suggestions from code review
FelicianoAngulo2 Jun 1, 2026
64fcc08
feat(server): add announce_only_future method for SD service announce…
Jun 3, 2026
191b6b6
style: rustfmt + clippy cleanup over the #124 base
JustinKovacich Jun 10, 2026
2abb6ff
feat(transport): promote Null* stubs to a public probe module
JustinKovacich Jun 10, 2026
391ce77
test(client): future-size witness for tokio run/socket-loop futures
JustinKovacich Jun 10, 2026
1a6d84c
test(server): future-size witness for the tokio run future
JustinKovacich Jun 10, 2026
b772e08
test(bare_metal): client + server future-size witnesses on static cha…
JustinKovacich Jun 10, 2026
a7b1c6f
feat(tools): thumbv7em -Zprint-type-sizes capture + committed size ba…
JustinKovacich Jun 10, 2026
2316fb6
ci: add -Zbuild-std=core halo gate; extend nm alloc audit to server,b…
JustinKovacich Jun 10, 2026
9593206
docs: changelog for PR 0 measurement harness
JustinKovacich Jun 10, 2026
ef988f7
docs: purge remaining 'server pulls alloc' staleness (Copilot review)
JustinKovacich Jun 10, 2026
da3e02c
docs: design for PR 1 (#124 follow-ups)
JustinKovacich Jun 11, 2026
8772524
docs: implementation plan for PR 1 (#124 follow-ups)
JustinKovacich Jun 11, 2026
97e6cf3
feat(server)!: NonSdRequestCallback gains an opaque ctx:usize argument
JustinKovacich Jun 11, 2026
a02d579
test(server): per-socket mock pipes routed by multicast_if_v4
JustinKovacich Jun 11, 2026
1c58700
test(server): live-witness negative tests for the non-SD observer
JustinKovacich Jun 11, 2026
df65260
docs(server): document eager-at-construction timing of Ready-based su…
JustinKovacich Jun 11, 2026
6bc74c4
docs(server): record why announce_only_future may split the run shape
JustinKovacich Jun 11, 2026
23f0872
docs: UDP_BUFFER_SIZE rustdoc — outbound SD paths are stack-buffered
JustinKovacich Jun 11, 2026
9d0647c
docs: changelog for the ctx-carrying NonSdRequestCallback break
JustinKovacich Jun 11, 2026
9fd7260
docs: fix builder owner + heap-Vec-removal attribution in PR 1 design
JustinKovacich Jun 11, 2026
7969457
test(embassy-net): add missing non_sd_observer field to ServerDeps inits
JustinKovacich Jun 11, 2026
8e41b0e
feat(server)!: NonSdRequestCallback adopts the parsed union contract
JustinKovacich Jun 11, 2026
e7c3a8c
docs: implementation plan for the #128 rebase + DispatchFn union adop…
JustinKovacich Jun 11, 2026
27db35a
docs: implementation plan for PR 2 (#125 client async-state reduction)
JustinKovacich Jun 17, 2026
9124c1b
feat(static_channels): BufferPool + BufferLease claim/release primiti…
JustinKovacich Jun 17, 2026
34b1d07
test(static_channels): isolate buffer_pool tests per-pool; doc unsafe…
JustinKovacich Jun 17, 2026
e4b19e9
feat(transport): BufferProvider trait + static/tokio impls; relocate …
JustinKovacich Jun 17, 2026
2f6552c
style(transport): blank line after buffer_pool mod; document required…
JustinKovacich Jun 17, 2026
bca75a0
feat(client): move socket-loop buffer out of the future via BufferPro…
JustinKovacich Jun 17, 2026
d8c4b79
test(client): rename buffer-claim test to match its actual coverage (…
JustinKovacich Jun 17, 2026
a121539
test+docs(client): tighten socket-loop future budget to 1024 B; rewri…
JustinKovacich Jun 17, 2026
c997ac0
docs: repair pre-existing unresolved intra-doc links + transport doct…
JustinKovacich Jun 17, 2026
7367b2b
fix(client): E2E-protect send must bound-check against buf.len(), not…
JustinKovacich Jun 17, 2026
8e6e245
fix(client): replace per-client Box::leak with Arc-backed buffer pool…
JustinKovacich Jun 17, 2026
6b0aaa3
fix(client): make inbound-oversize drop+survive real on embassy-net; …
JustinKovacich Jun 17, 2026
434ed6f
docs: implementation plan for PR 3 (#125 server buffer extraction + f…
JustinKovacich Jun 17, 2026
4ac4652
feat(server): SD send helpers take caller scratch, bound on buf.len()…
JustinKovacich Jun 17, 2026
6e9e916
feat(server): thread recv+announce send-scratch through run_with_buff…
JustinKovacich Jun 17, 2026
613dcf0
feat(server): EventPublisher publish paths take caller scratch; E2E g…
JustinKovacich Jun 17, 2026
67e1810
test(server): retighten run-future budget 9664->4416 after send-buffe…
JustinKovacich Jun 17, 2026
e36207a
docs(server): fix PR3-introduced unresolved intra-doc links (#125 PR3)
JustinKovacich Jun 17, 2026
ccb45a2
fix(server): public announce_only_with_buffer + publish error symmetr…
JustinKovacich Jun 17, 2026
82be01d
fix: address #132 + #133 Copilot review comments (#125)
JustinKovacich Jun 17, 2026
3076fa6
docs: handoff for porting #126 (polled) onto the #125 stack
JustinKovacich Jun 17, 2026
dd0f52d
feat(server)!: accept Subscribe for co-offered services on a shared r…
Jun 18, 2026
8567644
feat(bare-metal): port reusable embassy runtime onto the #125 stack
Jun 18, 2026
7b07ee7
style: clear clippy::pedantic across the bare-metal runtime
Jun 18, 2026
8a79a0f
ci(bare-metal-runtime): split --all-features into alloc + nightly lanes
Jun 19, 2026
f54fc83
fix(docs): resolve intra-doc links under the no-std / no-alloc doc lanes
Jun 19, 2026
20b60af
feat(server)!: enhance non-SD request handling with support for gette…
Jun 24, 2026
48952bb
fix(protocol)!: MessageTypeField::new emits the SOME/IP wire byte
JustinKovacich Jun 24, 2026
bcfde58
fix(server)!: bound non-SD response length + validate co-offer major …
JustinKovacich Jun 24, 2026
c5f79e4
fix(bare-metal): end publish/deinit buffer aliasing + make init idemp…
JustinKovacich Jun 24, 2026
bf21b2c
feat(config): allow runtime constants to be configured via environmen…
Jun 26, 2026
6932a62
feat(runtime): make RX_SLOTS configurable via environment variable
Jun 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,23 @@ leak-timeout = "1s"
filter = 'test(server::tests::) | binary(client_server)'
test-group = 'serial-sd-port'

# bare_metal_e2e tests share static channel pools declared via
# `define_static_channels!` — pool slots are not reclaimed until the
# process exits, so parallel tests exhaust the pools. Run serially.
[[profile.default.overrides]]
filter = 'binary(bare_metal_e2e)'
test-group = 'serial-static-pools'

# static_channels_alloc_witness tests share a counting global allocator
# and static channel pools. The internal MEASURE_LOCK serializes allocation
# measurement, but pool exhaustion still requires serial execution.
[[profile.default.overrides]]
filter = 'binary(static_channels_alloc_witness)'
test-group = 'serial-static-pools'

[test-groups]
serial-sd-port = { max-threads = 1 }
serial-static-pools = { max-threads = 1 }

[profile.default.junit] # Output the junit coverage for tools
path = "junit.xml"
219 changes: 217 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@ on:
branches: [main]
merge_group:

# Every public feature EXCEPT `bare-metal-runtime`. That feature is no-alloc
# and pulls a nightly-only crate feature (`impl_trait_in_assoc_type`), so it
# is mutually exclusive with the alloc features (`std` / `_alloc` /
# `embassy_channels`) and cannot share a `--all-features` build — it gets its
# own nightly job (`bare-metal-runtime`). This list replaces the former
# `--all-features` invocations on the alloc/host lane; keep it in sync when a
# feature is added (or switch to `cargo hack --exclude-features bare-metal-runtime`).
env:
ALLOC_FEATURES: std,tracing,client,client-tokio,server,server-tokio,bare_metal,embassy_channels

jobs:
check:
name: Format & Lint
Expand All @@ -18,8 +28,52 @@ jobs:
components: clippy, rustfmt
- uses: Swatinem/rust-cache@v2
- run: cargo fmt --all --check
- run: cargo clippy --workspace --all-features -- -D warnings -D clippy::pedantic
# `--workspace --all-features` activates every feature on every
# workspace member through cargo's feature unification, which
# gives strong "max coverage" but means that, e.g., a clippy
# regression triggered only by smoltcp's `proto-ipv6` (pulled in
# transitively via the embassy-net adapter under all-features)
# blocks merges on the parent simple-someip crate. The explicit
# per-feature passes below run clippy on `simple-someip` alone
# under the feature combos we actually ship, so a feature-set
# regression surfaces against its responsible feature flag
# rather than as workspace-wide noise.
#
# `$ALLOC_FEATURES` is every feature except `bare-metal-runtime` (which
# is no-alloc + nightly and runs in the `bare-metal-runtime` job); it
# replaces the former `--all-features` pass, which can no longer build
# once a no-alloc-only feature exists.
- run: cargo clippy --workspace --no-default-features --features $ALLOC_FEATURES -- -D warnings -D clippy::pedantic
- run: cargo clippy --no-default-features -- -D warnings -D clippy::pedantic
- run: cargo clippy -p simple-someip --no-default-features --features client,bare_metal -- -D warnings -D clippy::pedantic
- run: cargo clippy -p simple-someip --no-default-features --features server,bare_metal -- -D warnings -D clippy::pedantic
- run: cargo clippy -p simple-someip --no-default-features --features client,server,bare_metal -- -D warnings -D clippy::pedantic

bare-metal-runtime:
name: Bare-metal runtime (nightly)
runs-on: ubuntu-latest
# The `bare-metal-runtime` feature is no-alloc and pulls the nightly-only
# `impl_trait_in_assoc_type` crate feature (embassy's static task pool), so
# it cannot be built on stable or alongside the alloc features the
# `check`/coverage jobs cover. Its own nightly lane: clippy under the
# feature combos it ships, plus a real no_std target build via build-std.
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@nightly
with:
components: clippy, rust-src
targets: thumbv7em-none-eabihf
- uses: Swatinem/rust-cache@v2
- run: cargo clippy -p simple-someip --no-default-features --features bare-metal-runtime,client -- -D warnings -D clippy::pedantic
- run: cargo clippy -p simple-someip --no-default-features --features bare-metal-runtime,server -- -D warnings -D clippy::pedantic
# Compile for a real no_std target (no prebuilt core) — the gate that
# proves the runtime stays no_std / no-alloc.
- run: cargo build -Z build-std=core --target thumbv7em-none-eabihf --no-default-features --features bare-metal-runtime,client
- run: cargo build -Z build-std=core --target thumbv7em-none-eabihf --no-default-features --features bare-metal-runtime,server
- name: Doc — bare-metal-runtime
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --no-deps --no-default-features --features bare-metal-runtime,client

linear-history:
name: Linear PR History
Expand Down Expand Up @@ -51,6 +105,133 @@ jobs:
- uses: Swatinem/rust-cache@v2
- uses: obi1kenobi/cargo-semver-checks-action@v2

no_std_target:
# Cross-build for a true no_std target (cortex-m4f, no allocator,
# no std). This is the literal phase-18 gate from
# `bare_metal_plan_v3.md`: phases 4–17 shipped the trait surface
# and no-alloc primitives, but until this job is green the crate
# cannot actually be consumed on cortex-m. Each combination here
# is a separate `cargo build` so a failure surfaces the specific
# feature combo that regressed.
#
# Builds every bare-metal feature combo against the prebuilt
# thumbv7em sysroot, then audits the rlibs for allocator symbols.
# Since PR #124 BOTH `client + bare_metal` and `server +
# bare_metal` must be alloc-free; the build_std_core job below is
# the stronger sysroot-level certification, this audit is the
# cheap stable-toolchain tripwire that names the offending symbol
# when something regresses.
name: no_std target build (thumbv7em-none-eabihf)
needs: check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
targets: thumbv7em-none-eabihf
- uses: Swatinem/rust-cache@v2
- name: bare_metal alone
run: cargo build --target thumbv7em-none-eabihf --no-default-features --features bare_metal
- name: server + bare_metal
run: cargo build --target thumbv7em-none-eabihf --no-default-features --features server,bare_metal
- name: client + server + bare_metal
run: cargo build --target thumbv7em-none-eabihf --no-default-features --features client,server,bare_metal
# Each audited combo below is a `cargo clean -p` + build
# immediately followed by its own alloc-symbol audit, so the
# rlib in target/thumbv7em-none-eabihf/debug/ is guaranteed to
# come from exactly that feature set when the audit reads it.
- name: client + bare_metal
run: |
# Invalidate the cargo fingerprint for any prior `simple-someip`
# rlib in this target so the audit step sees an artifact built
# under exactly `client,bare_metal` and not a leftover from
# `bare_metal alone` / `server + bare_metal` / `client + server +
# bare_metal` — `rm -f` of just the rlib does NOT invalidate the
# fingerprint, so the next build would no-op without rewriting
# it. `cargo clean -p` does both in one step.
cargo clean -p simple-someip --target thumbv7em-none-eabihf
cargo build --target thumbv7em-none-eabihf --no-default-features --features client,bare_metal
- name: alloc-symbol audit (client + bare_metal must be alloc-free)
# If `client + bare_metal` ever starts pulling `__rust_alloc`,
# something inside the client engine has regressed onto an
# allocator-bound primitive. Fail loudly so it gets caught in
# the PR rather than discovered downstream. (`server +
# bare_metal` gets the same audit below; the combined
# `client+server` build is covered by the build_std_core job.)
run: |
# Pin to the exact rlib path. `find ... | head -1` was
# nondeterministic and silently picked up stale debug-script
# artifacts. With `cargo clean -p` above, this path is
# guaranteed to be the artifact built by the previous step.
rlib="target/thumbv7em-none-eabihf/debug/libsimple_someip.rlib"
if [ ! -f "$rlib" ]; then
echo "::error::expected rlib not found at $rlib"
ls -la target/thumbv7em-none-eabihf/debug/ || true
exit 1
fi
# No `2>/dev/null` on `nm`: a tool failure (e.g. missing
# binutils, malformed rlib) used to swallow the error and
# report 0 alloc refs, silently letting a regression through.
# `set -o pipefail` plus visible stderr makes that loud.
set -o pipefail
alloc_refs=$(nm -A "$rlib" | grep -c -E '__rust_alloc|__rg_alloc' || true)
echo "client+bare_metal alloc-symbol references: $alloc_refs"
if [ "$alloc_refs" -ne 0 ]; then
echo "::error::client+bare_metal must be alloc-free; found $alloc_refs alloc references."
nm -A "$rlib" | grep -E '__rust_alloc|__rg_alloc' || true
exit 1
fi
- name: server + bare_metal rebuild for audit
run: |
# Same fingerprint-invalidation rationale as the client
# audit above: `cargo clean -p` guarantees the rlib below
# was built under exactly `server,bare_metal`.
cargo clean -p simple-someip --target thumbv7em-none-eabihf
cargo build --target thumbv7em-none-eabihf --no-default-features --features server,bare_metal
- name: alloc-symbol audit (server + bare_metal must be alloc-free)
# Alloc-free since PR #124 (phase 22). A regression here means
# something in the server engine reacquired an allocator-bound
# primitive — fail loudly and name the symbols.
run: |
rlib="target/thumbv7em-none-eabihf/debug/libsimple_someip.rlib"
if [ ! -f "$rlib" ]; then
echo "::error::expected rlib not found at $rlib"
ls -la target/thumbv7em-none-eabihf/debug/ || true
exit 1
fi
set -o pipefail
alloc_refs=$(nm -A "$rlib" | grep -c -E '__rust_alloc|__rg_alloc' || true)
echo "server+bare_metal alloc-symbol references: $alloc_refs"
if [ "$alloc_refs" -ne 0 ]; then
echo "::error::server+bare_metal must be alloc-free; found $alloc_refs alloc references."
nm -A "$rlib" | grep -E '__rust_alloc|__rg_alloc' || true
exit 1
fi

build_std_core:
# Halo's TC4 proxy compiles with `-Zbuild-std=core`: `alloc` is
# absent from the sysroot entirely. The prebuilt-sysroot thumb job
# above SHIPS alloc, so an `extern crate alloc` regression passes
# there and still breaks halo. This job is the halo-certification
# gate (phase 22 / measurement PR 0 — see
# docs/simple_someip/plans/2026-06-09-phase22-125-memory-reduction-design.md).
name: build-std core gate (no alloc in sysroot)
needs: check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@nightly
with:
components: rust-src
targets: thumbv7em-none-eabihf
- uses: Swatinem/rust-cache@v2
- name: client + bare_metal
run: cargo +nightly build --no-default-features --features client,bare_metal -Zbuild-std=core --target thumbv7em-none-eabihf
- name: server + bare_metal
run: cargo +nightly build --no-default-features --features server,bare_metal -Zbuild-std=core --target thumbv7em-none-eabihf
- name: client + server + bare_metal
run: cargo +nightly build --no-default-features --features client,server,bare_metal -Zbuild-std=core --target thumbv7em-none-eabihf

test:
name: Build, Test & Coverage
needs: check
Expand All @@ -65,7 +246,41 @@ jobs:
with:
tool: cargo-llvm-cov, cargo-nextest
- run: cargo test --no-default-features
- run: cargo llvm-cov nextest --all-features --lcov --output-path ./target/lcov.info
- name: Build matrix — partial feature subsets
run: |
cargo build --no-default-features --features bare_metal
cargo build --no-default-features --features embassy_channels
cargo build --no-default-features --features client
cargo build --no-default-features --features server
cargo build --no-default-features --features client,server
- name: Doc — partial feature subsets (catch unresolved intra-doc links)
env:
RUSTDOCFLAGS: -D warnings
run: |
cargo doc --no-deps --no-default-features --features client
cargo doc --no-deps --no-default-features --features server,bare_metal
# alloc/host lane (bare-metal-runtime docs build in its nightly job)
cargo doc --no-deps --no-default-features --features $ALLOC_FEATURES
- name: No-alloc witness (explicit gate)
run: cargo test --features client,bare_metal --test no_alloc_witness
- name: SD wire-format conformance (TX direction)
# `tx_announcement_loop_emits_wire_format_offer` is `#[ignore]`'d by
# default because it needs an interface with the `MULTICAST` link
# flag. CI's `lo` lacks it; flip it on, point the test at
# 127.0.0.1, and run just this one test (the rest of the file's
# ignored tests need an external vsomeip docker container — they
# stay skipped).
run: |
sudo ip link set lo multicast on
SIMPLE_SOMEIP_TEST_INTERFACE=127.0.0.1 \
cargo test --features client-tokio,server-tokio \
--test vsomeip_sd_compat \
tx_announcement_loop_emits_wire_format_offer \
-- --ignored --exact --nocapture
# alloc/host lane: bare-metal-runtime has no host tests (its target build
# is gated in the nightly `bare-metal-runtime` job), so coverage uses the
# alloc feature set rather than the invalid `--all-features`.
- run: cargo llvm-cov nextest --no-default-features --features $ALLOC_FEATURES --lcov --output-path ./target/lcov.info
- name: Upload Coverage report
uses: codecov/codecov-action@v5
with:
Expand Down
8 changes: 4 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.DS_Store

/target

.claude/
CLAUDE.md

.DS_Store
lcov.info
/target
tools/size_probe/target
Loading