Implement timeout capability. Apply timeout to crypto response#278
Implement timeout capability. Apply timeout to crypto response#278AlexLanzano wants to merge 9 commits intowolfSSL:mainfrom
Conversation
There was a problem hiding this comment.
Pull request overview
This PR introduces a generic timeout utility and wires client-side response timeouts into crypto operations, plus unit tests for the timeout helper.
Changes:
- Add a generic timeout module (
wh_timeout.[ch]) based onWH_GETTIME_US()and expose it via configuration (WOLFHSM_CFG_ENABLE_TIMEOUT) and a new error codeWH_ERROR_TIMEOUT. - Extend
whClientContext/whClientConfigand addwh_Client_RecvResponseTimeout, then route all crypto client receive paths through a new_recvCryptoResponsehelper that uses the timeout when enabled. - Add unit tests for the timeout helper and enable timeout support in the test configuration.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| wolfhsm/wh_timeout.h | Declares timeout context/config types and the timeout API used by the client; documentation establishes that timeoutUs == 0 disables the timeout. |
| wolfhsm/wh_settings.h | Documents WOLFHSM_CFG_ENABLE_TIMEOUT as enabling timeout helpers and client response timeouts; also defines WH_GETTIME_US(), which the timeout code relies on. |
| wolfhsm/wh_error.h | Introduces WH_ERROR_TIMEOUT to signal an expired timeout from client operations. |
| wolfhsm/wh_client.h | Adds a per-client respTimeout context, an optional respTimeout config, and declares wh_Client_RecvResponseTimeout behind WOLFHSM_CFG_ENABLE_TIMEOUT. |
| test/wh_test_timeout.h | Declares the whTest_Timeout unit test entry point. |
| test/wh_test_timeout.c | Implements unit tests for wh_Timeout_*, including callback invocation, stop/disable behavior, and bad-argument handling. |
| test/wh_test.c | Wires whTest_Timeout() into the unit test suite when WOLFHSM_CFG_ENABLE_TIMEOUT is defined. |
| test/config/wolfhsm_cfg.h | Enables WOLFHSM_CFG_ENABLE_TIMEOUT in the test configuration and ensures a valid time source via WOLFHSM_CFG_PORT_GETTIME. |
| src/wh_timeout.c | Implements the timeout helper functions; currently treats timeoutUs == 0 as an error in wh_Timeout_Start, which conflicts with the documented “0 disables” semantics and impacts higher-level usage. |
| src/wh_client_crypto.c | Introduces _recvCryptoResponse and switches all crypto receive loops to use it; with timeout support enabled this always goes through wh_Client_RecvResponseTimeout and the per-client respTimeout. |
| src/wh_client.c | Initializes the optional respTimeout context in wh_Client_Init and adds wh_Client_RecvResponseTimeout, which loops on WH_ERROR_NOTREADY until a valid response arrives or the timeout expires. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
5498633 to
f7a30b3
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 11 out of 11 changed files in this pull request and generated 6 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
bigbrett
left a comment
There was a problem hiding this comment.
Overall looks great. Some smaller tweaks and also proposed an extension of functionality that we might want.
Co-authored-by: Brett Nicholas <7547222+bigbrett@users.noreply.github.com>
43255a9 to
066ea59
Compare
bigbrett
left a comment
There was a problem hiding this comment.
two more tweaks then we should be good2go
Change the whTimeoutExpiredCb return type from void to int so callbacks can signal errors. wh_Timeout_Expired now propagates any non-zero callback return value to the caller. Update tests to match the new signature and add WH_TEST_PRINT to timeout test functions. Document the expiration override mechanism in both the doxygen headers and the timeout draft docs.
|
@rizlik over to you. Please review and potentially merge |
fixes #130
Timeout Functionality: Client Perspective
1. Configuration at Init Time
When creating a client, you provide a
whTimeoutConfigspecifying the timeout duration and an optional callback:During
wh_Client_Init(src/wh_client.c:84-89), the config is copied into an embeddedwhTimeoutCtx respTimeout[1]inside the client context viawh_Timeout_Init(). This stores the timeout duration and callback but doesn't start any timer yet.If
respTimeoutConfigis NULL, the timeout context is left zeroed and effectively disabled (atimeoutUsof 0 means "never expires").2. What Happens During a Crypto Call
Before this PR, every crypto function in
wh_client_crypto.chad this pattern after sending a request:If the server never responded, the client would spin forever.
The PR replaces all ~30 of these with a single helper
_recvCryptoResponse()(src/wh_client_crypto.c:165-180):When timeout is enabled, it delegates to
wh_Client_RecvResponseTimeout. When disabled, the old infinite-loop behavior is preserved.3. The Timeout Receive Loop
wh_Client_RecvResponseTimeout(src/wh_client.c:211-231) does this:Starts the timer -- calls
wh_Timeout_Start()which snapshots the current time viaWH_GETTIME_US()intotimeout->startUs.Polls for a response -- calls
wh_Client_RecvResponse()in a loop.On each
WH_ERROR_NOTREADY, checkswh_Timeout_Expired():WH_GETTIME_US()(now - startUs) >= timeoutUsexpiredCb(if set), then returnsWH_ERROR_TIMEOUTOn any other return value (success or error), returns immediately.
4. What the Client Sees
From the application's perspective, the crypto APIs (
wh_Client_AesCbc,wh_Client_RsaFunction,wh_Client_EccSign, etc.) now returnWH_ERROR_TIMEOUT(-2010) instead of hanging indefinitely. The application can then decide how to handle it -- retry, log, fail gracefully, etc.The
expiredCbfires before the error is returned, so you can use it for logging or cleanup without needing to check the return code first.5. Scope Limitations
A few things to note about the current design:
_recvCryptoResponse.respTimeoutcontext with the same duration. You can callwh_Timeout_Set(ctx->respTimeout, newValue)to change it between calls, but there's no per-operation override.