Skip to content

Release 3.6.4#1018

Merged
fcmonteiro merged 35 commits into
COVESA:masterfrom
andrefesilva:release-3.6.4
Mar 31, 2026
Merged

Release 3.6.4#1018
fcmonteiro merged 35 commits into
COVESA:masterfrom
andrefesilva:release-3.6.4

Conversation

@andrefesilva
Copy link
Copy Markdown
Contributor

No description provided.

kai-moritzkumkar and others added 5 commits March 24, 2026 16:44
Something that should be dead since at least the introduction
of the local_endpoints.
Noticed in a dirty build. Not important, but a little confusing.
For local development it helps to have these pre-filled, so that they
can be modified
Refactor the local_endpoint::start method to add a very nice property
to the overall class:
Any public method of a local_endpoint can be called without running the
risk of invoking directly any provided callbacks.
The scoped lock to all defined lock guard recursive mutexes
Follow up to 269e983
Trivial changes, do not expect to have any functional impact.
Motivation: Uniform , modernize code base to leverage C++17 features.
Usually changing standard lock guard to std::scoped_lock is generally
safe and beneficial.
Note: scoped_lock type is kept defined purposely as it may help code analysis.
@fcmonteiro fcmonteiro requested a review from Copilot March 26, 2026 11:03
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Release 3.6.4 focuses on improving testability and stability by introducing test-specific libraries/exports, simplifying test execution (PATH-based example binaries), and refactoring several runtime/endpoint behaviors.

Changes:

  • Introduce *-test shared libraries and update tests/benchmarks to link against them; adjust exported symbol map accordingly.
  • Refactor networking/endpoints and routing internals (remove prepare_stop, adjust local endpoint start/process flow, concurrency/logging updates, debounce behavior adjustments).
  • Update test harness/scripts and presets (PATH setup for example binaries, CTest preset tweaks), bump version to 3.6.4, and remove the debounce_callback_tests suite.

Reviewed changes

Copilot reviewed 298 out of 478 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
test/network_tests/debounce_filter_tests/conf/debounce_filter_test_master_starter.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/debounce_epsilon_tests/conf/debounce_epsilon_test_service.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/debounce_callback_tests/docs/debounce_callback_test_service.puml Remove debounce-callback test documentation diagram (deleted)
test/network_tests/debounce_callback_tests/docs/debounce_callback_test_client.puml Remove debounce-callback test documentation diagram (deleted)
test/network_tests/debounce_callback_tests/debounce_callback_test_service.hpp Switch header guard to #pragma once
test/network_tests/debounce_callback_tests/debounce_callback_test_common.hpp Switch header guard to #pragma once
test/network_tests/debounce_callback_tests/debounce_callback_test_client.hpp Switch header guard to #pragma once
test/network_tests/debounce_callback_tests/debounce_callback_test.md Remove debounce-callback test documentation (deleted)
test/network_tests/debounce_callback_tests/conf/debounce_callback_test_slave_starter.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/debounce_callback_tests/conf/debounce_callback_test_service.json.in Remove debounce-callback service test config (deleted)
test/network_tests/debounce_callback_tests/conf/debounce_callback_test_master_starter.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/debounce_callback_tests/conf/debounce_callback_test_client.json.in Remove debounce-callback client test config (deleted)
test/network_tests/debounce_callback_tests/CMakeLists.txt Remove debounce-callback test build target (deleted)
test/network_tests/cyclic_event_tests/conf/cyclic_event_test_slave_starter.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/cyclic_event_tests/conf/cyclic_event_test_master_starter.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/cpu_load_tests/CMakeLists.txt Remove Valgrind trace-children-skip tweak
test/network_tests/configuration_tests/CMakeLists.txt Link configuration test against new *-test libraries
test/network_tests/conf/setup_test.sh.in Add PATH augmentation for example binaries; update copyright years
test/network_tests/client_id_tests/client_id_test_globals.hpp Switch header guard to #pragma once
test/network_tests/client_id_tests/CMakeLists.txt Link utility against *-cfg-test
test/network_tests/cached_event_tests/conf/cached_event_test_client.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/big_payload_tests/big_payload_test_service.hpp Switch header guard to #pragma once
test/network_tests/big_payload_tests/big_payload_test_globals.hpp Switch header guard to #pragma once; reduce random message count
test/network_tests/big_payload_tests/big_payload_test_client.hpp Switch header guard to #pragma once
test/network_tests/availability_handler_tests/availability_handler_test_globals.hpp Switch header guard to #pragma once
test/network_tests/application_tests/conf/application_test_starter.sh.in Start routingmanagerd via PATH instead of relative build path
test/network_tests/application_tests/application_test_globals.hpp Switch header guard to #pragma once
test/network_tests/application_tests/application_test.cpp Adjust application tests (remove sleeps, disable watchdog test, change restart test flow)
test/network_tests/application_tests/CMakeLists.txt Remove Valgrind trace-children-skip tweak
test/network_tests/CMakeLists.txt Link tests against *-test libs; remove debounce-callback tests; add shutdown tests; depend on example binaries
test/internal_routing_disabled_acceptance_test/CMakeLists.txt Link acceptance test against vsomeip3-test
test/common/src/process.cpp Stop explicitly propagating LD_LIBRARY_PATH to child processes
test/common/include/common/vsomeip_app_utilities.hpp Switch header guard to #pragma once
test/common/include/common/timeout_detector.hpp Add license header
test/common/include/common/test_timer.hpp Switch header guard to #pragma once
test/common/include/common/process_manager.hpp Rewrite process manager (synchronous spawn, stricter lifecycle rules)
test/common/include/common/external/process.hpp Switch header guard to #pragma once
test/common/CMakeLists.txt Convert test/common to OBJECT library; link to *-test
test/benchmark_tests/CMakeLists.txt Link benchmarks against *-test libs
test/CMakeLists.txt Add *-test shared libraries and update test targets to depend on them
libvsomeip.yaml Bump version to 3.6.4
interface/vsomeip/vsomeip.hpp Switch header guard to #pragma once
interface/vsomeip/trace.hpp Switch header guard to #pragma once
interface/vsomeip/structured_types.hpp Switch header guard to #pragma once; simplify !=; mark send_current_value_after_ as ignored
interface/vsomeip/runtime.hpp Switch header guard to #pragma once
interface/vsomeip/primitive_types.hpp Switch header guard to #pragma once
interface/vsomeip/plugins/pre_configuration_plugin.hpp Switch header guard to #pragma once
interface/vsomeip/plugins/application_plugin.hpp Switch header guard to #pragma once
interface/vsomeip/plugin.hpp Switch header guard to #pragma once
interface/vsomeip/payload.hpp Switch header guard to #pragma once
interface/vsomeip/message_base.hpp Switch header guard to #pragma once
interface/vsomeip/message.hpp Switch header guard to #pragma once
interface/vsomeip/internal/serializable.hpp Switch header guard to #pragma once
interface/vsomeip/internal/policy_manager.hpp Switch header guard to #pragma once
interface/vsomeip/internal/plugin_manager.hpp Switch header guard to #pragma once
interface/vsomeip/internal/logger.hpp Switch header guard to #pragma once
interface/vsomeip/internal/deserializable.hpp Switch header guard to #pragma once
interface/vsomeip/handler.hpp Switch header guard to #pragma once
interface/vsomeip/function_types.hpp Switch header guard to #pragma once
interface/vsomeip/export.hpp Switch header guard to #pragma once
interface/vsomeip/error.hpp Switch header guard to #pragma once
interface/vsomeip/enumeration_types.hpp Switch header guard to #pragma once
interface/vsomeip/deprecated.hpp Add license header; switch to #pragma once
interface/vsomeip/defines.hpp Switch header guard to #pragma once
interface/vsomeip/constants.hpp Switch header guard to #pragma once
interface/vsomeip/application.hpp Switch header guard to #pragma once
implementation/utility/include/utility.hpp Switch header guard; adjust export qualifiers on is_file/is_folder
implementation/utility/include/service_instance_map.hpp Switch header guard to #pragma once
implementation/utility/include/qnx_helper.hpp Switch header guard to #pragma once inside __QNX__
implementation/utility/include/is_value.hpp Switch header guard to #pragma once
implementation/utility/include/criticalsection.hpp Switch header guard to #pragma once
implementation/utility/include/byteorder.hpp Switch header guard to #pragma once
implementation/utility/include/bithelper.hpp Switch header guard to #pragma once
implementation/tracing/include/header.hpp Switch header guard to #pragma once
implementation/tracing/include/enumeration_types.hpp Switch header guard to #pragma once
implementation/tracing/include/defines.hpp Switch header guard to #pragma once
implementation/tracing/include/connector_impl.hpp Switch header guard to #pragma once
implementation/tracing/include/channel_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/src/service_discovery_impl.cpp Adjust SD init (remove max message sizing); switch several locks to std::scoped_lock; fix entry type in resubscription branch
implementation/service_discovery/include/unknown_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/subscription.hpp Switch header guard to #pragma once
implementation/service_discovery/include/serviceentry_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/service_discovery_impl.hpp Switch header guard; remove max_message_size_ member
implementation/service_discovery/include/service_discovery_host.hpp Switch header guard to #pragma once
implementation/service_discovery/include/service_discovery.hpp Switch header guard to #pragma once
implementation/service_discovery/include/selective_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/runtime_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/runtime.hpp Switch header guard to #pragma once
implementation/service_discovery/include/request.hpp Switch header guard to #pragma once
implementation/service_discovery/include/remote_subscription_ack.hpp Switch header guard to #pragma once
implementation/service_discovery/include/protection_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/primitive_types.hpp Switch header guard to #pragma once
implementation/service_discovery/include/option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/message_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/message_element_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/load_balancing_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/ipv6_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/ipv4_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/ip_option_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/eventgroupentry_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/enumeration_types.hpp Switch header guard to #pragma once
implementation/service_discovery/include/entry_impl.hpp Switch header guard to #pragma once
implementation/service_discovery/include/deserializer.hpp Switch header guard to #pragma once
implementation/service_discovery/include/defines.hpp Switch header guard; remove TCP SD payload define and some unused constants
implementation/service_discovery/include/constants.hpp Switch header guard to #pragma once
implementation/service_discovery/include/configuration_option_impl.hpp Switch header guard to #pragma once
implementation/security/include/security.hpp Switch header guard to #pragma once
implementation/security/include/policy_manager_impl.hpp Switch header guard to #pragma once
implementation/security/include/policy.hpp Switch header guard to #pragma once
implementation/runtime/src/application_impl.cpp Store plugin manager in application_impl; avoid singleton use during teardown; use cached runtime pointer
implementation/runtime/include/runtime_impl.hpp Switch header guard to #pragma once
implementation/runtime/include/application_impl.hpp Switch header guard; add member plugin_manager_
implementation/routing/src/routing_client_state_machine.cpp Improve logging (include client id); adjust assignment transition to accept client id
implementation/routing/src/event.cpp Drop debounce timer integration; log unsupported send_current_value_after_
implementation/routing/include/types.hpp Switch header guard to #pragma once
implementation/routing/include/serviceinfo.hpp Switch header guard to #pragma once
implementation/routing/include/routing_manager_stub_host.hpp Switch header guard to #pragma once
implementation/routing/include/routing_manager_stub.hpp Switch header guard to #pragma once
implementation/routing/include/routing_manager_impl.hpp Switch header guard; add has_requester declaration
implementation/routing/include/routing_manager_host.hpp Switch header guard to #pragma once
implementation/routing/include/routing_manager_client.hpp Switch header guard; simplify notify_remote_initially signature
implementation/routing/include/routing_manager_base.hpp Switch header guard; remove debounce APIs and related state; adjust subscription helpers signature
implementation/routing/include/routing_manager_adapter.hpp Adjust header end (include guard cleanup)
implementation/routing/include/routing_manager.hpp Switch header guard; remove debounce APIs from interface
implementation/routing/include/routing_host.hpp Switch header guard to #pragma once
implementation/routing/include/routing_client_state_machine.hpp Switch header guard; add logging client id member; include config headers for constants
implementation/routing/include/remote_subscription.hpp Switch header guard to #pragma once
implementation/routing/include/function_types.hpp Switch header guard to #pragma once
implementation/routing/include/eventgroupinfo.hpp Switch header guard to #pragma once
implementation/routing/include/event.hpp Switch header guard; remove pending debounce update helper
implementation/protocol/include/update_security_policy_response_command.hpp Switch header guard to #pragma once
implementation/protocol/include/update_security_policy_command.hpp Switch header guard to #pragma once
implementation/protocol/include/update_security_credentials_command.hpp Switch header guard to #pragma once
implementation/protocol/include/unsubscribe_command.hpp Switch header guard to #pragma once
implementation/protocol/include/unsubscribe_ack_command.hpp Switch header guard to #pragma once
implementation/protocol/include/unregister_event_command.hpp Switch header guard to #pragma once
implementation/protocol/include/suspend_command.hpp Switch header guard to #pragma once
implementation/protocol/include/subscribe_nack_command.hpp Switch header guard to #pragma once
implementation/protocol/include/subscribe_command_base.hpp Switch header guard to #pragma once
implementation/protocol/include/subscribe_command.hpp Switch header guard to #pragma once
implementation/protocol/include/subscribe_ack_command_base.hpp Switch header guard to #pragma once
implementation/protocol/include/subscribe_ack_command.hpp Switch header guard to #pragma once
implementation/protocol/include/stop_offer_service_command.hpp Switch header guard to #pragma once
implementation/protocol/include/simple_command.hpp Switch header guard to #pragma once
implementation/protocol/include/service_command_base.hpp Switch header guard to #pragma once
implementation/protocol/include/send_command.hpp Switch header guard to #pragma once
implementation/protocol/include/security_policy_response_command_base.hpp Switch header guard to #pragma once
implementation/protocol/include/routing_info_entry.hpp Switch header guard to #pragma once
implementation/protocol/include/routing_info_command.hpp Switch header guard to #pragma once
implementation/protocol/include/resend_provided_events_command.hpp Switch header guard to #pragma once
implementation/protocol/include/request_service_command.hpp Switch header guard to #pragma once
implementation/protocol/include/remove_security_policy_response_command.hpp Switch header guard to #pragma once
implementation/protocol/include/remove_security_policy_command.hpp Switch header guard to #pragma once
implementation/protocol/include/release_service_command.hpp Switch header guard to #pragma once
implementation/protocol/include/registered_ack_command.hpp Switch header guard to #pragma once
implementation/protocol/include/register_events_command.hpp Switch header guard to #pragma once
implementation/protocol/include/register_event.hpp Switch header guard to #pragma once
implementation/protocol/include/register_application_command.hpp Switch header guard to #pragma once
implementation/protocol/include/protocol.hpp Switch header guard to #pragma once
implementation/protocol/include/pong_command.hpp Switch header guard to #pragma once
implementation/protocol/include/ping_command.hpp Switch header guard to #pragma once
implementation/protocol/include/offered_services_response_command.hpp Switch header guard to #pragma once
implementation/protocol/include/offered_services_request_command.hpp Switch header guard to #pragma once
implementation/protocol/include/offer_service_command.hpp Switch header guard to #pragma once
implementation/protocol/include/multiple_services_command_base.hpp Switch header guard to #pragma once
implementation/protocol/include/expire_command.hpp Switch header guard to #pragma once
implementation/protocol/include/dummy_command.hpp Switch header guard to #pragma once
implementation/protocol/include/distribute_security_policies_command.hpp Switch header guard to #pragma once
implementation/protocol/include/deregister_application_command.hpp Switch header guard to #pragma once
implementation/protocol/include/config_command.hpp Switch header guard to #pragma once
implementation/protocol/include/command.hpp Switch header guard to #pragma once
implementation/protocol/include/assign_client_command.hpp Switch header guard to #pragma once
implementation/protocol/include/assign_client_ack_command.hpp Switch header guard to #pragma once
implementation/plugin/src/plugin_manager_impl.cpp Use std::scoped_lock for recursive mutex
implementation/plugin/include/plugin_manager_impl.hpp Switch header guard to #pragma once
implementation/message/include/serializer.hpp Switch header guard to #pragma once
implementation/message/include/payload_impl.hpp Switch header guard to #pragma once
implementation/message/include/message_impl.hpp Switch header guard to #pragma once
implementation/message/include/message_header_impl.hpp Switch header guard to #pragma once
implementation/message/include/message_base_impl.hpp Switch header guard to #pragma once
implementation/message/include/deserializer.hpp Switch header guard to #pragma once
implementation/logger/include/logger_impl.hpp Switch header guard to #pragma once
implementation/endpoints/src/virtual_server_endpoint_impl.cpp Remove prepare_stop and stored io_context reference
implementation/endpoints/src/udp_client_endpoint_impl.cpp Remove last-sent locking; lock for get_local_port()
implementation/endpoints/src/tcp_server_endpoint_impl.cpp Release connections outside locks; remove prepare-stop handler logic on drop
implementation/endpoints/src/tcp_client_endpoint_impl.cpp Lock for get_local_port()
implementation/endpoints/src/netlink_connector.cpp Capture shared_from_this() in async callbacks
implementation/endpoints/src/local_server.cpp Adjust connection start locking; improve logging format
implementation/endpoints/src/local_endpoint.cpp Refactor start() and process() to avoid synchronous callback re-entrancy
implementation/endpoints/src/endpoint_impl.cpp Remove remove_stop_handler implementation
implementation/endpoints/src/credentials.cpp Remove Linux credentials helper implementation (deleted)
implementation/endpoints/src/client_endpoint_impl.cpp Remove prepare_stop; switch to std::scoped_lock usages
implementation/endpoints/include/virtual_server_endpoint_impl.hpp Switch header guard; remove prepare_stop/stop-handler APIs and io_context member
implementation/endpoints/include/uds_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/uds_acceptor.hpp Switch header guard to #pragma once
implementation/endpoints/include/udp_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/udp_server_endpoint_impl_receive_op.hpp Switch header guard to #pragma once
implementation/endpoints/include/udp_server_endpoint_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/udp_client_endpoint_impl.hpp Switch header guard; remove last_sent_mutex_
implementation/endpoints/include/tp_reassembler.hpp Switch header guard to #pragma once
implementation/endpoints/include/tp_message.hpp Switch header guard to #pragma once
implementation/endpoints/include/tp.hpp Switch header guard to #pragma once
implementation/endpoints/include/timer.hpp Switch header guard to #pragma once
implementation/endpoints/include/tcp_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/tcp_server_endpoint_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/tcp_client_endpoint_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/server_endpoint_impl.hpp Switch header guard; remove prepare-stop API and handler storage
implementation/endpoints/include/netlink_connector.hpp Switch header guard; remove unused retry constants
implementation/endpoints/include/local_socket_uds_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_socket_tcp_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_server.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_receive_buffer.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_endpoint.hpp Switch header guard; document callback guarantees; adjust process() signature
implementation/endpoints/include/local_acceptor_uds_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_acceptor_tcp_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/local_acceptor.hpp Switch header guard to #pragma once
implementation/endpoints/include/io_control_operation.hpp Switch header guard to #pragma once
implementation/endpoints/include/endpoint_manager_impl.hpp Switch header guard to #pragma once
implementation/endpoints/include/endpoint_manager_base.hpp Switch header guard to #pragma once
implementation/endpoints/include/endpoint_impl.hpp Switch header guard; remove error_handler mutex and stop-handler API
implementation/endpoints/include/endpoint_definition.hpp Switch header guard to #pragma once
implementation/endpoints/include/credentials.hpp Remove Linux credentials helper interface (deleted)
implementation/endpoints/include/client_endpoint_impl.hpp Switch header guard; remove prepare_stop
implementation/endpoints/include/client_endpoint.hpp Switch header guard to #pragma once
implementation/endpoints/include/buffer.hpp Switch header guard to #pragma once
implementation/endpoints/include/boardnet_endpoint_host.hpp Switch header guard to #pragma once
implementation/endpoints/include/boardnet_endpoint.hpp Switch header guard; remove prepare-stop & stop-handler API from base interface
implementation/endpoints/include/asio_uds_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/asio_uds_acceptor.hpp Switch header guard to #pragma once
implementation/endpoints/include/asio_udp_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/asio_timer.hpp Switch header guard to #pragma once
implementation/endpoints/include/asio_tcp_socket.hpp Switch header guard to #pragma once
implementation/endpoints/include/asio_socket_factory.hpp Switch header guard to #pragma once
implementation/endpoints/include/abstract_timer.hpp Switch header guard to #pragma once
implementation/endpoints/include/abstract_socket_factory.hpp Switch header guard to #pragma once
implementation/endpoints/include/abstract_netlink_connector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2exf/config.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile_interface/protector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile_interface/profile_interface.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile_interface/checker.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile_custom/protector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile_custom/profile_custom.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile_custom/checker.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile07/protector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile07/profile_07.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile07/checker.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile05/protector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile05/profile_05.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile05/checker.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile04/protector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile04/profile_04.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile04/checker.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile01/protector.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile01/profile_01.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/profile01/checker.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/e2e_provider_impl.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/e2e/profile/e2e_provider.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/crc/crc.hpp Switch header guard to #pragma once
implementation/e2e_protection/include/buffer/buffer.hpp Switch header guard to #pragma once
implementation/configuration/src/configuration_impl.cpp Warn when parsing unsupported debounce send_current_value_after
implementation/configuration/include/watchdog.hpp Switch header guard to #pragma once
implementation/configuration/include/trace.hpp Switch header guard to #pragma once
implementation/configuration/include/service_instance_range.hpp Switch header guard to #pragma once
implementation/configuration/include/service.hpp Switch header guard to #pragma once
implementation/configuration/include/routing.hpp Switch header guard to #pragma once
implementation/configuration/include/local_clients_keepalive.hpp Switch header guard to #pragma once
implementation/configuration/include/internal_android.hpp Switch header guard; remove unused constants/macros
implementation/configuration/include/internal.hpp.in Switch header guard; remove unused constants/macros
implementation/configuration/include/eventgroup.hpp Switch header guard to #pragma once
implementation/configuration/include/event.hpp Switch header guard to #pragma once
implementation/configuration/include/e2e.hpp Switch header guard to #pragma once
implementation/configuration/include/debounce_filter_impl.hpp Switch header guard to #pragma once
implementation/configuration/include/configuration_plugin_impl.hpp Switch header guard to #pragma once
implementation/configuration/include/configuration_plugin.hpp Switch header guard to #pragma once
implementation/configuration/include/configuration_impl.hpp Switch header guard to #pragma once
implementation/configuration/include/configuration_element.hpp Switch header guard to #pragma once
implementation/configuration/include/configuration.hpp Switch header guard to #pragma once
implementation/configuration/include/client.hpp Switch header guard to #pragma once
implementation/configuration/include/application_configuration.hpp Switch header guard to #pragma once
exportmap.gcc Update exported symbols strategy for test libraries
examples/wait-until-available/wait-until-available.cpp Add new helper tool to block until service becomes available
examples/wait-until-available/CMakeLists.txt Build and link new wait-until-available example
examples/sample-ids.hpp Switch header guard to #pragma once
examples/routingmanagerd/CMakeLists.txt Add dependencies on cfg/sd/e2e libs to ensure runtime availability
documentation/vsomeipConfiguration.md Remove send_current_value_after from debounce documentation
CMakePresets.json Adjust coverage flags; tweak test preset environment/output/filtering
CHANGES Add 3.6.4 changelog entry
Android.mk Bump VSOMEIP_VERSION to 3.6.4
Android.bp Bump VSOMEIP_VERSION to 3.6.4

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


# add common binaries to path
# bit of a strong assumption on the directory structure, but this is anyhow just to simplify tests
export PATH="$PATH:../../../examples/routingmanagerd:../../../examples/wait-until-available"
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PATH update is relative to the current working directory, not the script location. If the script is invoked from a different cwd (common in CI/ctest), routingmanagerd/wait-until-available won’t be found and the updated starter scripts will fail. Build the PATH entries from the script directory (e.g., based on realpath \"$0\" / dirname) or export absolute paths.

Suggested change
export PATH="$PATH:../../../examples/routingmanagerd:../../../examples/wait-until-available"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
EXAMPLES_DIR="$(realpath "${SCRIPT_DIR}/../../../examples")"
export PATH="$PATH:${EXAMPLES_DIR}/routingmanagerd:${EXAMPLES_DIR}/wait-until-available"

Copilot uses AI. Check for mistakes.
Comment on lines 220 to 223
}
}
});
// Carful: A call to start might end up calling the error handler causing a lock inversion
lock.unlock();
ep->start();
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The previous code explicitly unlocked before calling ep->start() to avoid lock inversion (comment mentioned that start() can synchronously hit the error handler). With the unlock removed, ep->start() now executes while the surrounding lock is still held, which can reintroduce deadlocks. Restore the unlock-before-start pattern (or otherwise ensure start() cannot re-enter code paths that need the same lock).

Copilot uses AI. Check for mistakes.
Comment on lines 95 to 103
std::thread t([&]() {
its_promise.set_value(true);
app_->start();
app_->stop();
});
EXPECT_TRUE(its_promise.get_future().get());
std::this_thread::sleep_for(std::chrono::milliseconds(100));
VSOMEIP_WARNING << "An error message should appear now";
// should print error
app_->start();
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test restart_without_stopping no longer reliably tests 'start without stopping'. By stopping inside the worker thread immediately after start(), the main thread may call app_->start() after the application has already stopped, making the "should print error" assertion flaky/incorrect. Keep app_->stop() after the main thread performs the second start() (or add a synchronization point so the second start() happens while the app is still running).

Copilot uses AI. Check for mistakes.
@@ -19,5 +19,3 @@ class routing_manager_adapter {
};

} // namespace vsomeip_v3
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This header’s closing include-guard #endif was removed in the diff, but there is no corresponding #pragma once change shown for this file. If the opening #ifndef/#define remained, this will cause a preprocessing error; if the guard was removed without adding #pragma once, it can cause ODR/multiple-include issues. Ensure the file either consistently uses #pragma once at the top or keeps a complete #ifndef/#define ... #endif guard.

Suggested change
} // namespace vsomeip_v3
} // namespace vsomeip_v3
#endif // VSOMEIP_V3_ROUTING_MANAGER_ADAPTER_

Copilot uses AI. Check for mistakes.
Comment on lines +44 to +51
} else if (arg == "-t" || arg == "--timeout") {
if (i + 1 < argc) {
timeout = std::chrono::seconds(std::stoul(argv[++i]));
} else {
std::cerr << "Error: --timeout requires a value" << std::endl;
print_help();
return EXIT_FAILURE;
}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::stoul can throw on invalid/negative/overflow inputs (e.g. --timeout foo), which will currently terminate the program. Handle parsing errors similarly to the service-id parsing (catch exceptions and print a clear error), and consider validating that the timeout is within a reasonable range.

Copilot uses AI. Check for mistakes.
ricardolleite added 3 commits March 26, 2026 12:08
prepare_stop was introduced in fe6cd73 (along nPDU), as a way to
ensure that queued messages (for a given service) are sent before the
StopOffer for that service
This is, however, folly - we can NEVER guarantee that the receiver
ECU will not receive messages after a StopOffer, because StopOffers go
via SOME/IP-SD, whereas messages go by SOME/IP, via different ports.
These are fundamentally asynchronous, independent channels. We cannot
even guarantee it in the sender side - nothing stops, for example, a
TCP retransmission of a SOME/IP message after StopOffer
Furthermore, the implementation is (and has always been) broken. While
it does guarantee that messages in the queue (sei::targets_::queue_)
are sent out, it does NOT guarantee that messages in dispatched
trains ( sei::targets_::dispatched_trains_) are sent out
Therefore in the very simple scenario of: 1) offer service, 2) send 10
messages at once (which will trigger one queued message, 9 dispatched
trains), 3) stop offer, 9 messages will be sent after StopOffer is sent!
Lastly, it is a maintenance nightmare. There are many, many, many issues
(crashes, memory leaks, ...) that can be traced to prepare_stop. See
b2eb361, 31c1a16, ec4ca02, afd7f65, 8c41b4c, ..
These are hiding issues, and there is already a top-level one,
well expanded in 318b78b
Otherwise normal applications can block (for a few seconds), as they'll
never get the DELETE_CLIENT to complete the deregistration
Fix async_receive issue in the fake socket machinery that would also
lead to applications to never receive DELETE_CLIENT
While at it, disable service discovery and version logging, these
provoke a lot of useless logs in the fake_socket tests
@andrefesilva andrefesilva force-pushed the release-3.6.4 branch 2 times, most recently from db51708 to b0101e1 Compare March 31, 2026 13:37
ricardolleite and others added 17 commits March 31, 2026 14:44
In application_test: remove sleeps, disable watchdog test that takes
>10s and has little value; fix found race
In debounce_filter_tests: wait for a number of messages instead of
blindly sleeping for 15s, reduce debounce intervals
In debounce_callback_test: reduce debounce intervals
In restart_routing_tests: remove sleeps between messages
In big_payload_*: reduce number of messages for the random variant; each
message can go up to 10MBs, so it will always be significantly slow
All in all, another couple of minutes less in test execution
Remove unused definitions
Cleanup unused definitions in defines.hpp
Also change entry type to STOP_SUBSCRIBE_EVENTGROUP on create_eventgroup_entry
for easier understanding the code.
Before this change it could happen that on disconnect,
the socket that should react would call async_receive that
would then fail, leading to an unintended error handling
Enable single execution of fake socket tests
Instruct cmake to scan for gtest cases in the fake socket tests, adding them
to ctest. This allows to either use ctest -R test-name, or to name a single test
case in the CMakePresets.json
A missing race case on shutdown from 9662c86.
In essence, the plugin_manager singleton was not captured for the case where dispatch threads from some
application outlive the main thread and thus the C __terminate routine
Use the newly available overload for a local_endpoint to add the
ip address, the port and the local protocol type to the trace header
in the routing_manager_client.
Meanwhile:
Remove left-over mutex
Remove magic sleeps for IPC
Magic sleeps added in dd30512 have been removed.
These magic sleeps were necessary to ensure the last message was sent before stopping the application.
At this point, for IPC, they are no longer needed since the implementation has been fixed.
Fix PR: fc4a635
Note: The magic sleeps were not removed from all tests because they are still needed for boardnet.
6e60328 introduced sending of initial event regardless of subscription
state, but only for event (not eventgroup!) subscriptions, and only
internally
High-level, it just makes sense - if we're already spending resources to
anyhow send a SUBSCRIBE_ACK, might as well send the initial event, too
Requirement-wise, it is allowed - see TR_SOMEIP_00571+TR_SOMEIP_00572,
and note that the change does NOT collide with TR_SOMEIP_00570, since
it only affects non-initial events
(initial events aside, all of the work from 293502b makes sense)
Low-level, it solves ton of bloody-difficult-to-avoid races in local
communication, which is also the reason for 6e60328. Consider, for
example, that client error handling happens when there is an error in
the "outgoing" endpoint, but SUBSCRIBE comes via the "incoming" endpoint
This is also one of the reasons for the flakiness of initial_event_*
tests - due to 338f60d, client-ids are reused aggressively, and the
initial_event_* tests launches dozens of applications that subscribe to
an eventgroup, which significantly increases the odds of a race where a
new connecting application with a reused client-id is "already
subscribed", and therefore never received an initial notification
(again, note that 6e60328 did not change eventgroups..)
Add a test for the race described, simplify initial event code which
longer needs to care about subscription state
This PR introduces a new wait-until-available CLI utility for checking service availability and refactors all network
test scripts to use PATH-based binary resolution instead of hardcoded relative paths. This improves test portability
and maintainability while providing a useful debugging/scripting tool.
New wait-until-available Example Utility

Added a new command-line tool in examples/wait-until-available/ that blocks until a specified SOME/IP service
becomes available
Accepts a service ID in hexadecimal format and an optional timeout parameter (default: 30 seconds)
Returns EXIT_SUCCESS (0) if the service becomes available, EXIT_FAILURE (1) on timeout
This utility is useful for test synchronization and debugging service discovery issues
Build system integration via new CMakeLists.txt and inclusion in the root build configuration

Test Infrastructure Improvements

Modified test/network_tests/conf/setup_test.sh.in to add routingmanagerd and wait-until-available binaries
to $PATH
This change decouples test scripts from the exact build directory structure, making tests more robust when
run from different locations or CI environments

Build System Updates

Added wait-until-available as a build dependency for network tests (alongside routingmanagerd)
Updated comment in test/network_tests/CMakeLists.txt to reflect that tests now depend on multiple
example binaries

Improved Test Reliability

Replaced a sleep 1 timing hack in offer_test_local_starter.sh.in with a proper wait-until-available 0x1111 call
This eliminates a race condition where the test could fail intermittently if the service start took longer than 1s
ucei::last_sent_ is already covered by socket_mutex_
This was noticed when the CONFIG_ID was printed as a "1"
Both of these tests do usei::restart while sending a boatload of
messages, and how many messages are processed is of course
undeterministic - depends how fast the test is vs usei::restart
Therefore moderate the message reception expectations by a lot, which
fixes the flakiness of these tests
exportmap.gcc contains a crapload of symbols that should not be
exported by libvsomeip, and that are there only to enable testing
Instead of exporting too many symbols, compile object files and build
two sets of libraries: test libraries that exports all symbols, and
normal libraries that export only public symbols
The tests, of course, use the test libraries. This allows the removal of
all testing exports from exportmap.gcc
A few technical notes:

examples, of course, keep linking against normal libs
easier to construct shared libraries out of object files, hence the
use of object files instead of a static library
libvsomeip (both test and normal libs) needs a RPATH/RUNPATH ref so
that when it dlopens libvsomeip-cfg, it loads the correct lib

Besides the build cleanup, the effects of this change are visible when
looking at the symbol list.
Before:
[ric@g05 vsomeip-lib 0]$ nm -gDC ./libvsomeip3.so.3 | wc -l
3497

After:
[ric@g05 vsomeip-lib 0]$ nm -gDC ./libvsomeip3.so.3 | wc -l
899

Furthermore, even though more binaries are produced (object files, extra
set of libs..), there is a reduction in redundant building, so it is
even a slight build improvement.
Before:
real    0m54,814s
user    36m5,839s
sys     4m17,354s

real    0m53,389s
user    36m1,121s
sys     4m17,560s

real    0m58,188s
user    34m54,926s
sys     4m22,480s

After:
real    0m47,270s
user    33m27,981s
sys     4m24,039s

real    0m50,417s
user    33m20,682s
sys     4m31,863s

real    0m50,545s
user    31m53,337s
sys     4m7,359s
Simplify it, force user to wait for processes (else they keep running in
the background and disturb next tests..!)
Furthermore, drop any fancy usage of boost::process::child - the thing
was and probably still is unstable, so keep usage straightforward
This PR aims to fix a sporadic failure on someip_tp_tests.
The non-vsomeip application subscription phase was independent of the availability of vsomeip's services
availability, which caused vsomeip to send a SubNack whenever this was done before the service was offered.
Besides that, the non-vsomeip application also lacked a robust method to ensure it
subscribed to the vsomeip application, sending just a single subscription message throughout the entire test.
This PR aims to fix both issues by calling subscribe_at_master() only when the
vsomeip's service is offered, or when it receives a SubNack
(with a short sleep between such retries to avoid overloading the vsomeip application).
f9b44d6 forgot one of the sub-tests which also does a sleep 1 and
has the same underlying race condition
Furthermore, wait-until-available is subtly broken, because doing
register_availability_handler(.., ANY_INSTANCE) immediately invokes
the availability handler with ON_AVAILABLE
(which is a massive, massive footgun..)
As rscm does the state changes, it makes sense for it to show
the client-id as well
@andrefesilva andrefesilva force-pushed the release-3.6.4 branch 2 times, most recently from 43222d0 to 6d5208a Compare March 31, 2026 14:53
ricardolleite and others added 10 commits March 31, 2026 15:54
It's shorter, it's nicer, and even though it's non-standard you have to
go to hilariously ancient/badly supported compilers for it to not work
Create double_insert_subscription test.

The test simply verifies whether calling insert_subscription twice results in
create_placeholder_event_and_subscribe also being called twice (which it shouldn't).
The test fails in 3.5.10 (without the fix)
and passes in 3.5.11 (after the fix)
Fix racy get_local_port() calls
race reported by ThreadSanitizer: data race (pid=7743) in maintain/3.6 (see it here)
The race happens during the release of a service by an application call together w/
a client trying to connect (which will claim a local port).
It could happen that while a new client is claiming a new port, the release_service operation
could be releasing this newly claimed port.
Currently, calls to get_local_port() are not protected at all, thus racy.
Previously, socket_mutex_ was used for this purpose on top of other socket operations.
However, later removed along w/ socket operations..
details here)
This PR brings back the mutex to protect the calls to get_local_port() on tcei and ucei.
The implementation from 0753082 is irremediably flawed:

iterator issues causing crashes/livelocks (addressed in c6066fb)
infinite-loops if the filter does not have interval set
does nothing for internal communication
broken for external communication; unrelated events from other
services cause updates
small interval causes wasteful wakeups (due to how
debounce_clients_ and timer are structured)

Keep only the configuration parsing and SUBSCRIBE_ID
serialization/deserialization code, and drop everything else
Add fake_socket test coverage, to cover the testing gap in internal
communication for the other debouncing parameters
(also, keep the test that shows broken send_current_value_after)
Add shutdown test for IPC
The purpose of the test is to replicate/test the behavior of applications that start, send 5 messages, and immediately
exit to verify that we ensure the messages are sent before stopping the application.
The test tests the sending and immediate exit of the client to verify if the service receives the message, whether
with or without routing manager, and also tests the sending and immediate exit of the service to verify if the client
receives the message, whether with or without routing manager.
Test created with executions in local communication for TCP and UDS.
The drop of the command has to be prepared before the
actually happens, else it will lose the message
Catch missing internal_android.hpp on the CI build
This change fixes an issue where vsomeip would not immediately
trigger availability events for new services offers that already
had a UDP "connection" established.
The code responsible for this was only checking TCP connections,
but the changes introduced in 98f2fec require that this must also
be done for UDP "connections".
This change fixes an issue where vsomeip would not send a
FindService entry to the network on resume if a client had released
the service during suspend.
The issue was that vsomeip was unconditionally releasing the
service even if other clients were still requesting it.
This fix involves simply checking if there are other requesters
before releasing the service.
vSomeIP-Lib 3.6.4 Release
remove dead credentials code
fix logging prefix in flush function
misc: add defaults to CMakePresets
the public API of local_endpoints does not re-enter caller
scoped lock to all defined lock guard recursive mutexes
endpoints: drop prepare_stop
tests: remove valgrind trace-children-skip
tests: stop routing app last
tests: more test speedups
remove unused definitions
Extend helpers to simulate suspend
enable ctest -R for fake socket tests
Fix plugin_manager_impl singleton free-after-use on dtor bug
use local_endpoint in rmc to prepare header
Remove magic sleeps for IPC
routing: send initial event on EVERY sub
tests: fix offer_test_local race
misc: remove unused defs + useless mutex
print command id as number
tests: fix usei_fixture.no_overwrite*
build: cleanup exported symbols
tests: rewrite process_manager
Fix someip_tp_tests fragility
tests: fix offer_test_local race (again)
rscm: add logging of client-id
misc: "pragma once" the entire codebase
Create subscribe_before_register test
fixes data race when calling get_local_port()
debouncing: drop send_current_value_after
Add shutdown_test for IPC
tests: fix block_registration_process
Fix internal.hpp with ANDROID_CI_BUILD flag
fix delayed availability
fix missing find on resume
@fcmonteiro fcmonteiro marked this pull request as ready for review March 31, 2026 16:00
@fcmonteiro fcmonteiro merged commit 41c3900 into COVESA:master Mar 31, 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.

4 participants