Changelog¶
All notable changes to this project are documented in this file. The format follows Keep a Changelog, and the project adheres to Semantic Versioning.
Unreleased¶
2.0.1 - 2026-10-26¶
Version 2.0.0 was tagged but not published as a GitHub Release, and its tag cannot be reused. 2.0.1 is the first published release of version 2: it contains every change listed under 2.0.0 and the fixes below. The library code is unchanged.
Fixed¶
- The documentation is deployed after the Release workflow of a
vX.Y.Ztag, from the tagged commit, instead of after every build onmain. - The documentation is pushed to
gh-pageswith the deploy key again; thegh-pagesruleset rejects pushes made withGITHUB_TOKEN.
2.0.0 - 2026-10-26¶
Version 2 is a rewrite of the library to the SystemFromScratch® protocol-library standard. The public API changed; the wire format is ISO 15765-2 as before.
Added¶
- Layered library:
isotp_defs.h(constants, N_Result codes),isotp_protocol.h(frame codec:isotp_decode(),isotp_encode_*(),isotp_frame_pad(), STmin) andisotp_link.h(transport layer), each usable on its own. - Explicit time input: every link call takes
now_us; the library no longer callsisotp_user_get_us()or any other platform function. struct isotp_link_configwith run-time block size, STmin, N_Bs, N_Cr, N_WFTmax and padding per link;isotp_link_config_default().- Callbacks with a context:
on_message(),on_tx_done()(every transmission, with its N_Result) andon_rx_error(). isotp_link_send_functional()for functional (broadcast) Single Frames.- Diagnostics:
isotp_link_tx_busy(),isotp_link_tx_result(),isotp_link_rx_result(),isotp_link_invalid_frames(). - Examples: bare-metal UDS-style ECU with a simulated tester (CTest), Linux SocketCAN request tool, Zephyr application.
- Python twin of the codec with a C/Python cross-check and end-to-end tests of the C link against the twin.
- Documentation website in the SystemFromScratch® style, MISRA deviation register,
measured RAM and stack figures,
CITATION.cff, release workflow.
Changed¶
- Breaking:
IsoTpLinkis nowstruct isotp_link;isotp_init_link(),isotp_on_can_message(),isotp_send(),isotp_poll()are replaced byisotp_link_init(),isotp_link_receive(),isotp_link_send(),isotp_link_poll(). - Breaking: the message buffers are part of
struct isotp_link, sized byISOTP_TX_BUFFER_SIZEandISOTP_RX_BUFFER_SIZE, instead of caller pointers. - Breaking: received messages are delivered to
on_message(); the polledisotp_receive()and the weakisotp_user_*()functions are removed. - Breaking: configuration macros renamed from
ISO_TP_*toISOTP_*; the compile-time switches for callbacks, padding and the send argument are now run-time configuration. - Return codes reduced to
ISOTP_OK,ISOTP_ERROR,ISOTP_BUSY; protocol outcomes use theISOTP_N_*N_Result codes. - One Consecutive Frame per
isotp_link_poll()call, with wrap-safe timers.
Fixed¶
- The 32-bit FF_DL is encoded and decoded big-endian on every host (it was byte-swapped only on little-endian hosts).
- Reserved STmin values are treated as 127 ms, as ISO 15765-2 requires (they were 0).
- The requested STmin is rounded up when encoded, never down.
- Flow Control frames are only accepted while the sender waits for one; an escape First Frame announcing 4095 bytes or less is ignored.
- Segmented transmissions are no longer allowed to functional addresses.
- The N_Cr timer works when the deadline is 0 after a clock wrap.
- No
<stdio.h>,snprintf()orassert()in the library.
Quality¶
- 82 unit tests, 100 % line and branch coverage of
src/(gate in CI). - 62 integration tests (pytest) against the Python twin.
- Cppcheck MISRA C:2012 addon: 0 violations (gate in CI); 3 documented advisory deviations.
1.6.0 and earlier¶
Versions 1.x of the fork kept the API of isotp-c by Li Shen and Simon Cahill. See the Git history and the releases.