You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SomeIpDriverClient.rpc_call() returns SomeIpMessageResponse objects with payload='' (empty string) for every RPC call, and receive_event() always times out — even though the ECU is correctly sending payloads on the wire. The root cause is a silent degradation chain: when the opensomeip C++ extension fails to load, RpcClient.call() falls through to a stub code-path that returns a synthetic empty response instead of raising an error.
someip.subscribe_eventgroup(0x0001)
event=someip.receive_event(timeout=10.0)
# Observed: TimeoutError (DEADLINE_EXCEEDED)# Expected: SomeIpEventNotification with payload
Proof: ECU payloads are correct on the wire
Bypassing Jumpstarter entirely and running a native POSIX MPU application that uses the C++ opensomeip library against the same ECU on the same network, payloads arrive correctly:
This confirms the ECU firmware and network are working. The issue is strictly in the Jumpstarter driver → opensomeip-python pipeline.
Root cause analysis
1. opensomeip C++ extension not loading (macOS libc++ ABI mismatch)
On macOS, opensomeip._opensomeip (the pybind11 C++ extension) commonly fails to load due to a libc++ ABI mismatch when installed from source with Homebrew LLVM. When this happens, opensomeip emits an ImportWarning and falls back to pure-Python stub classes. This warning is easy to miss because Python filters ImportWarning by default.
The _bridge.py module sets HAS_NATIVE = False and get_ext() returns None.
2. RpcClient.call() stub path returns a fake empty response
In opensomeip/rpc.py, when the C++ extension is unavailable, RpcClient.call() falls through to:
# Stub path — no actual network response is waited forrequest=Message(
message_id=method_id,
request_id=RequestId(client_id=self._client_id, session_id=self._next_session()),
message_type=MessageType.REQUEST,
payload=payload,
)
self._transport.send(request) # Also a no-op when cpp is NonereturnMessage(
message_id=method_id,
request_id=request.request_id,
message_type=MessageType.RESPONSE,
return_code=ReturnCode.E_OK,
# ← No payload! Defaults to b""
)
This path:
Sends the request via transport (which is also a no-op stub — no sockets opened)
Returns a syntheticMessage with return_code=E_OK and empty payload
The caller has no way to distinguish this from a real response
Additionally, even when the C++ extension IS loaded, call_method_sync failures are silently swallowed:
ifself._cppisnotNone:
try:
result=self._cpp.call_method_sync(...)
ifint(result.result) ==0:
returnMessage(...) # Only returns here on successexceptException:
pass# ← Silently falls through to the stub path!
3. Event receive never gets data
EventSubscriber.subscribe() without the C++ extension only records the eventgroup ID in a local set — it doesn't subscribe over the network. The MessageReceiver._sync_queue never receives any messages, so receive_event() always times out.
The SomeIp driver (driver.py) creates an OsipClient and calls its methods, but never checks whether opensomeip._bridge.HAS_NATIVE is True. All operations silently degrade to stubs returning fake data.
Impact
Operation
Observed behavior
Expected behavior
rpc_call()
return_code=0, payload=''
return_code=0, payload='01'
receive_event()
TimeoutError
SomeIpEventNotification(payload='43480000')
find_service()
Returns [] (no services found)
Returns service entries
The failure is silent — no errors, no warnings in Jumpstarter logs. RPC calls appear to succeed (return_code=0) but have no data. This makes debugging extremely difficult.
Proposed fix
In jumpstarter-driver-someip (this repo)
Validate native extension at driver init: In SomeIp.__post_init__(), check opensomeip._bridge.HAS_NATIVE and raise a clear error if the C++ extension is not available:
fromopensomeip._bridgeimportget_extdef__post_init__(self):
ifget_ext() isNone:
raiseRuntimeError(
"opensomeip C++ extension is not available. ""The SOME/IP driver requires the native extension for real network I/O. ""See https://github.com/vtz/opensomeip-python#troubleshooting"
)
# ... rest of init
Log a warning on empty RPC payloads for methods that are expected to return data (optional, defense-in-depth).
Upstream in opensomeip-python (vtz/opensomeip-python)
RpcClient.call() stub should raise, not return fake data: The fallthrough path should raise RuntimeError("C++ extension required for RPC calls") instead of returning a synthetic response.
Remove except Exception: pass: The blanket exception swallowing in the C++ code path should at minimum log the exception, or better, let it propagate.
Workaround
Ensure the opensomeip C++ extension is properly installed. On macOS, rebuild with the system compiler:
Summary
SomeIpDriverClient.rpc_call()returnsSomeIpMessageResponseobjects withpayload=''(empty string) for every RPC call, andreceive_event()always times out — even though the ECU is correctly sending payloads on the wire. The root cause is a silent degradation chain: when the opensomeip C++ extension fails to load,RpcClient.call()falls through to a stub code-path that returns a synthetic empty response instead of raising an error.Environment
jmp shell --exporter-config export.yaml --directjumpstarter_driver_someip.driver.SomeIp(from PR feat: add SOME/IP driver wrapping opensomeip Python binding #391)opensomeip==0.1.2(Python binding for the C++ SOME/IP stack)Exporter config
Reproduction steps
jmp shell --exporter-config export.yaml --directProof: ECU payloads are correct on the wire
Bypassing Jumpstarter entirely and running a native POSIX MPU application that uses the C++ opensomeip library against the same ECU on the same network, payloads arrive correctly:
This confirms the ECU firmware and network are working. The issue is strictly in the Jumpstarter driver → opensomeip-python pipeline.
Root cause analysis
1. opensomeip C++ extension not loading (macOS libc++ ABI mismatch)
On macOS,
opensomeip._opensomeip(the pybind11 C++ extension) commonly fails to load due to a libc++ ABI mismatch when installed from source with Homebrew LLVM. When this happens, opensomeip emits anImportWarningand falls back to pure-Python stub classes. This warning is easy to miss because Python filtersImportWarningby default.The
_bridge.pymodule setsHAS_NATIVE = Falseandget_ext()returnsNone.2.
RpcClient.call()stub path returns a fake empty responseIn
opensomeip/rpc.py, when the C++ extension is unavailable,RpcClient.call()falls through to:This path:
Messagewithreturn_code=E_OKand empty payloadAdditionally, even when the C++ extension IS loaded,
call_method_syncfailures are silently swallowed:3. Event receive never gets data
EventSubscriber.subscribe()without the C++ extension only records the eventgroup ID in a local set — it doesn't subscribe over the network. TheMessageReceiver._sync_queuenever receives any messages, soreceive_event()always times out.4. Jumpstarter driver doesn't validate native extension availability
The
SomeIpdriver (driver.py) creates anOsipClientand calls its methods, but never checks whetheropensomeip._bridge.HAS_NATIVEisTrue. All operations silently degrade to stubs returning fake data.Impact
rpc_call()return_code=0, payload=''return_code=0, payload='01'receive_event()TimeoutErrorSomeIpEventNotification(payload='43480000')find_service()[](no services found)The failure is silent — no errors, no warnings in Jumpstarter logs. RPC calls appear to succeed (return_code=0) but have no data. This makes debugging extremely difficult.
Proposed fix
In
jumpstarter-driver-someip(this repo)SomeIp.__post_init__(), checkopensomeip._bridge.HAS_NATIVEand raise a clear error if the C++ extension is not available:Upstream in opensomeip-python (vtz/opensomeip-python)
RpcClient.call()stub should raise, not return fake data: The fallthrough path should raiseRuntimeError("C++ extension required for RPC calls")instead of returning a synthetic response.Remove
except Exception: pass: The blanket exception swallowing in the C++ code path should at minimum log the exception, or better, let it propagate.Workaround
Ensure the opensomeip C++ extension is properly installed. On macOS, rebuild with the system compiler:
Verify the extension loads:
Related
jumpstarter-driver-someip