diff options
Diffstat (limited to 'implementation/routing/include/routing_manager_impl.hpp')
-rw-r--r-- | implementation/routing/include/routing_manager_impl.hpp | 360 |
1 files changed, 158 insertions, 202 deletions
diff --git a/implementation/routing/include/routing_manager_impl.hpp b/implementation/routing/include/routing_manager_impl.hpp index 40abf73..bead207 100644 --- a/implementation/routing/include/routing_manager_impl.hpp +++ b/implementation/routing/include/routing_manager_impl.hpp @@ -1,10 +1,10 @@ -// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +// Copyright (C) 2014-2018 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#ifndef VSOMEIP_ROUTING_MANAGER_IMPL_HPP -#define VSOMEIP_ROUTING_MANAGER_IMPL_HPP +#ifndef VSOMEIP_V3_ROUTING_MANAGER_IMPL_HPP_ +#define VSOMEIP_V3_ROUTING_MANAGER_IMPL_HPP_ #include <map> #include <memory> @@ -26,8 +26,10 @@ #include "../../endpoints/include/netlink_connector.hpp" #include "../../service_discovery/include/service_discovery_host.hpp" +#include "../../endpoints/include/endpoint_manager_impl.hpp" -namespace vsomeip { + +namespace vsomeip_v3 { class configuration; class deserializer; @@ -42,9 +44,9 @@ namespace sd { class service_discovery; } // namespace sd - -// TODO: encapsulate common parts of classes "routing_manager_impl" -// and "routing_manager_proxy" into a base class. +namespace e2e { +class e2e_provider; +} // namespace e2e class routing_manager_impl: public routing_manager_base, public routing_manager_stub_host, @@ -55,61 +57,70 @@ public: boost::asio::io_service & get_io(); client_t get_client() const; - const std::shared_ptr<configuration> get_configuration() const; void init(); void start(); void stop(); - bool offer_service(client_t _client, service_t _service, - instance_t _instance, major_version_t _major, - minor_version_t _minor); + bool offer_service(client_t _client, + service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor); - void stop_offer_service(client_t _client, service_t _service, - instance_t _instance, major_version_t _major, minor_version_t _minor); + void stop_offer_service(client_t _client, + service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor); - void request_service(client_t _client, service_t _service, - instance_t _instance, major_version_t _major, - minor_version_t _minor, bool _use_exclusive_proxy); + void request_service(client_t _client, + service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor); - void release_service(client_t _client, service_t _service, - instance_t _instance); + void release_service(client_t _client, + service_t _service, instance_t _instance); - void subscribe(client_t _client, service_t _service, instance_t _instance, - eventgroup_t _eventgroup, major_version_t _major, event_t _event, - subscription_type_e _subscription_type); + void subscribe(client_t _client, uid_t _uid, gid_t _gid, + service_t _service, instance_t _instance, + eventgroup_t _eventgroup, major_version_t _major, event_t _event); - void unsubscribe(client_t _client, service_t _service, instance_t _instance, + void unsubscribe(client_t _client, uid_t _uid, gid_t _gid, + service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event); - bool send(client_t _client, std::shared_ptr<message> _message, bool _flush); + bool send(client_t _client, std::shared_ptr<message> _message); - virtual bool send(client_t _client, const byte_t *_data, uint32_t _size, - instance_t _instance, bool _flush, bool _reliable, + bool send(client_t _client, const byte_t *_data, uint32_t _size, + instance_t _instance, bool _reliable, client_t _bound_client = VSOMEIP_ROUTING_CLIENT, - bool _is_valid_crc = true, bool _sent_from_remote = false); + credentials_t _credentials = {ANY_UID, ANY_GID}, + uint8_t _status_check = 0, bool _sent_from_remote = false); - bool send_to(const std::shared_ptr<endpoint_definition> &_target, - std::shared_ptr<message> _message, bool _flush); + bool send_to(const client_t _client, + const std::shared_ptr<endpoint_definition> &_target, + std::shared_ptr<message> _message); bool send_to(const std::shared_ptr<endpoint_definition> &_target, const byte_t *_data, uint32_t _size, - instance_t _instance, bool _flush); + instance_t _instance); - bool send_to(const std::shared_ptr<endpoint_definition> &_target, + bool send_via_sd(const std::shared_ptr<endpoint_definition> &_target, const byte_t *_data, uint32_t _size, uint16_t _sd_port); - void register_event(client_t _client, service_t _service, - instance_t _instance, event_t _event, - const std::set<eventgroup_t> &_eventgroups, bool _is_field, + void register_event(client_t _client, + service_t _service, instance_t _instance, + event_t _notifier, + const std::set<eventgroup_t> &_eventgroups, + const event_type_e _type, + reliability_type_e _reliability, std::chrono::milliseconds _cycle, bool _change_resets_cycle, + bool _update_on_change, epsilon_change_func_t _epsilon_change_func, bool _is_provided, bool _is_shadow, bool _is_cache_placeholder); - void register_shadow_event(client_t _client, service_t _service, - instance_t _instance, event_t _event, + void register_shadow_event(client_t _client, + service_t _service, instance_t _instance, + event_t _notifier, const std::set<eventgroup_t> &_eventgroups, - bool _is_field, bool _is_provided); + event_type_e _type, reliability_type_e _reliability, + bool _is_provided); void unregister_shadow_event(client_t _client, service_t _service, instance_t _instance, event_t _event, @@ -117,63 +128,68 @@ public: void notify_one(service_t _service, instance_t _instance, event_t _event, std::shared_ptr<payload> _payload, - client_t _client, bool _force, bool _flush, bool _remote_subscriber); + client_t _client, bool _force +#ifdef VSOMEIP_ENABLE_COMPAT + , bool _remote_subscriber +#endif + ); - void on_subscribe_nack(client_t _client, service_t _service, + void on_subscribe_ack(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event, - pending_subscription_id_t _subscription_id); + remote_subscription_id_t _id); - void on_subscribe_ack(client_t _client, service_t _service, + void on_subscribe_nack(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event, - pending_subscription_id_t _subscription_id); + remote_subscription_id_t _id); - void on_identify_response(client_t _client, service_t _service, instance_t _instance, - bool _reliable); // interface to stub inline std::shared_ptr<endpoint> find_local(client_t _client) { - return routing_manager_base::find_local(_client); + return ep_mgr_->find_local(_client); } inline std::shared_ptr<endpoint> find_or_create_local( client_t _client) { - return routing_manager_base::find_or_create_local(_client); + return ep_mgr_->find_or_create_local(_client); } + std::shared_ptr<endpoint> find_or_create_remote_client( + service_t _service, instance_t _instance, bool _reliable, + client_t _client); + void remove_local(client_t _client, bool _remove_uid); - void on_stop_offer_service(client_t _client, service_t _service, instance_t _instance, + void on_stop_offer_service(client_t _client, + service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor); void on_availability(service_t _service, instance_t _instance, - bool _is_available, major_version_t _major, minor_version_t _minor); + bool _is_available, + major_version_t _major, minor_version_t _minor); void on_pong(client_t _client); + void on_subscribe_ack_with_multicast( + service_t _service, instance_t _instance, + const boost::asio::ip::address &_address, uint16_t _port); void on_unsubscribe_ack(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, - pending_subscription_id_t _unsubscription_id); - - // interface "endpoint_host" - std::shared_ptr<endpoint> find_or_create_remote_client(service_t _service, - instance_t _instance, - bool _reliable, client_t _client); - void on_connect(std::shared_ptr<endpoint> _endpoint); - void on_disconnect(std::shared_ptr<endpoint> _endpoint); - void on_error(const byte_t *_data, length_t _length, endpoint *_receiver, - const boost::asio::ip::address &_remote_address, - std::uint16_t _remote_port); + remote_subscription_id_t _id); + + void on_connect(const std::shared_ptr<endpoint>& _endpoint); + void on_disconnect(const std::shared_ptr<endpoint>& _endpoint); + void on_message(const byte_t *_data, length_t _size, endpoint *_receiver, const boost::asio::ip::address &_destination, - client_t _bound_client, + client_t _bound_client, credentials_t _credentials, const boost::asio::ip::address &_remote_address, std::uint16_t _remote_port); bool on_message(service_t _service, instance_t _instance, const byte_t *_data, length_t _size, bool _reliable, - client_t _bound_client, bool _is_valid_crc = true, + client_t _bound_client, credentials_t _credentials, + uint8_t _check_status = 0, bool _is_from_remote = false); void on_notification(client_t _client, service_t _service, instance_t _instance, const byte_t *_data, length_t _size, bool _notify_one); - void release_port(uint16_t _port, bool _reliable); bool offer_service_remotely(service_t _service, instance_t _instance, std::uint16_t _port, bool _reliable, @@ -206,29 +222,22 @@ public: bool _has_reliable, bool _has_unreliable); void update_routing_info(std::chrono::milliseconds _elapsed); - void on_remote_subscription( - service_t _service, instance_t _instance, eventgroup_t _eventgroup, - const std::shared_ptr<endpoint_definition> &_subscriber, - const std::shared_ptr<endpoint_definition> &_target, ttl_t _ttl, - const std::shared_ptr<sd_message_identifier_t> &_sd_message_id, - const std::function<void(remote_subscription_state_e, client_t)>& _callback); - void on_unsubscribe(service_t _service, instance_t _instance, - eventgroup_t _eventgroup, - std::shared_ptr<endpoint_definition> _target); - void on_subscribe_ack(service_t _service, instance_t _instance, - const boost::asio::ip::address &_address, uint16_t _port); + // Handle remote subscriptions / subscription acks + void on_remote_subscribe( + std::shared_ptr<remote_subscription> &_subscription, + const remote_subscription_callback_t& _callback); + void on_remote_unsubscribe( + std::shared_ptr<remote_subscription> &_subscription); void expire_subscriptions(const boost::asio::ip::address &_address); void expire_services(const boost::asio::ip::address &_address); std::chrono::steady_clock::time_point expire_subscriptions(bool _force); - bool has_identified(client_t _client, service_t _service, - instance_t _instance, bool _reliable); - void register_client_error_handler(client_t _client, const std::shared_ptr<endpoint> &_endpoint); void handle_client_error(client_t _client); + std::shared_ptr<endpoint_manager_impl> get_endpoint_manager() const; void set_routing_state(routing_state_e _routing_state); @@ -241,46 +250,61 @@ public: eventgroup_t _eventgroup, const std::shared_ptr<endpoint_definition> &_subscriber); - void register_offer_acceptance_handler(offer_acceptance_handler_t _handler) const; - void register_reboot_notification_handler(reboot_notification_handler_t _handler) const; - void register_routing_ready_handler(routing_ready_handler_t _handler); - void register_routing_state_handler(routing_state_handler_t _handler); - void offer_acceptance_enabled(boost::asio::ip::address _address); + void print_stub_status() const; + + void send_error(return_code_e _return_code, const byte_t *_data, + length_t _size, instance_t _instance, bool _reliable, + endpoint* const _receiver, + const boost::asio::ip::address &_remote_address, + std::uint16_t _remote_port); + void service_endpoint_connected(service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor, + const std::shared_ptr<endpoint>& _endpoint, + bool _unreliable_only); + void service_endpoint_disconnected(service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor, + const std::shared_ptr<endpoint>& _endpoint); + + void register_sd_acceptance_handler(const sd_acceptance_handler_t& _handler) const; + void register_reboot_notification_handler(const reboot_notification_handler_t& _handler) const; + void register_routing_ready_handler(const routing_ready_handler_t& _handler); + void register_routing_state_handler(const routing_state_handler_t& _handler); + void sd_acceptance_enabled(const boost::asio::ip::address& _address); void on_resend_provided_events_response(pending_remote_offer_id_t _id); - bool update_security_policy_configuration(uint32_t _uid, uint32_t _gid, ::std::shared_ptr<policy> _policy, - std::shared_ptr<payload> _payload, security_update_handler_t _handler); - bool remove_security_policy_configuration(uint32_t _uid, uint32_t _gid, security_update_handler_t _handler); + bool update_security_policy_configuration(uint32_t _uid, uint32_t _gid, const std::shared_ptr<policy>& _policy, + const std::shared_ptr<payload>& _payload, const security_update_handler_t& _handler); + bool remove_security_policy_configuration(uint32_t _uid, uint32_t _gid, const security_update_handler_t& _handler); + client_t find_local_client(service_t _service, instance_t _instance); void on_security_update_response(pending_security_update_id_t _id, client_t _client); std::set<client_t> find_local_clients(service_t _service, instance_t _instance); - bool is_subscribe_to_any_event_allowed(client_t _client, + bool is_subscribe_to_any_event_allowed(credentials_t _credentials, client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup); private: + bool offer_service(client_t _client, + service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor, + bool _must_queue); + + void stop_offer_service(client_t _client, + service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor, + bool _must_queue); + bool deliver_message(const byte_t *_data, length_t _size, instance_t _instance, bool _reliable, client_t _bound_client, - bool _is_valid_crc = true, bool _is_from_remote = false); + credentials_t _credentials, + uint8_t _status_check = 0, bool _is_from_remote = false); bool deliver_notification(service_t _service, instance_t _instance, const byte_t *_data, length_t _length, bool _reliable, client_t _bound_client, - bool _is_valid_crc = true, bool _is_from_remote = false); + credentials_t _credentials, + uint8_t _status_check = 0, bool _is_from_remote = false); - instance_t find_instance(service_t _service, endpoint *_endpoint); void init_service_info(service_t _service, instance_t _instance, bool _is_local_service); - std::shared_ptr<endpoint> create_client_endpoint( - const boost::asio::ip::address &_address, - uint16_t _local_port, uint16_t _remote_port, - bool _reliable, client_t _client); - - std::shared_ptr<endpoint> create_server_endpoint(uint16_t _port, - bool _reliable, bool _start); - std::shared_ptr<endpoint> find_server_endpoint(uint16_t _port, - bool _reliable) const; - std::shared_ptr<endpoint> find_or_create_server_endpoint(uint16_t _port, - bool _reliable, bool _start); - bool is_field(service_t _service, instance_t _instance, event_t _event) const; @@ -290,74 +314,32 @@ private: std::shared_ptr<endpoint> create_remote_client(service_t _service, instance_t _instance, bool _reliable, client_t _client); - bool deliver_specific_endpoint_message(service_t _service, instance_t _instance, - const byte_t *_data, length_t _size, endpoint *_receiver); - void clear_client_endpoints(service_t _service, instance_t _instance, bool _reliable); void clear_multicast_endpoints(service_t _service, instance_t _instance); - bool is_identifying(client_t _client, service_t _service, - instance_t _instance, bool _reliable); - std::set<eventgroup_t> get_subscribed_eventgroups(service_t _service, instance_t _instance); void clear_targets_and_pending_sub_from_eventgroups(service_t _service, instance_t _instance); void clear_remote_subscriber(service_t _service, instance_t _instance); -private: + return_code_e check_error(const byte_t *_data, length_t _size, instance_t _instance); - void send_error(return_code_e _return_code, const byte_t *_data, - length_t _size, instance_t _instance, bool _reliable, - endpoint *_receiver, - const boost::asio::ip::address &_remote_address, - std::uint16_t _remote_port); - - void identify_for_subscribe(client_t _client, service_t _service, - instance_t _instance, major_version_t _major, - subscription_type_e _subscription_type); - bool send_identify_message(client_t _client, service_t _service, - instance_t _instance, major_version_t _major, - bool _reliable); - bool supports_selective(service_t _service, instance_t _instance); - client_t find_client(service_t _service, instance_t _instance, - const std::shared_ptr<eventgroupinfo> &_eventgroup, - const std::shared_ptr<endpoint_definition> &_target) const; - void clear_remote_subscriber(service_t _service, instance_t _instance, client_t _client, const std::shared_ptr<endpoint_definition> &_target); void log_version_timer_cbk(boost::system::error_code const & _error); - void clear_remote_service_info(service_t _service, instance_t _instance, bool _reliable); - bool handle_local_offer_service(client_t _client, service_t _service, instance_t _instance, major_version_t _major,minor_version_t _minor); - void remove_specific_client_endpoint(client_t _client, service_t _service, instance_t _instance, bool _reliable); - - void clear_identified_clients( service_t _service, instance_t _instance); - - void clear_identifying_clients( service_t _service, instance_t _instance); - - void remove_identified_client(service_t _service, instance_t _instance, client_t _client); - - void remove_identifying_client(service_t _service, instance_t _instance, client_t _client); - - void unsubscribe_specific_client_at_sd(service_t _service, instance_t _instance, client_t _client); - - inline std::shared_ptr<endpoint> find_local(service_t _service, instance_t _instance) { - return routing_manager_base::find_local(_service, _instance); - } - void send_subscribe(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, - major_version_t _major, event_t _event, - subscription_type_e _subscription_type); + major_version_t _major, event_t _event); void on_net_interface_or_route_state_changed(bool _is_interface, std::string _if, @@ -373,7 +355,7 @@ private: void call_sd_endpoint_connected(const boost::system::error_code& _error, service_t _service, instance_t _instance, - std::shared_ptr<endpoint> _endpoint, + const std::shared_ptr<endpoint>& _endpoint, std::shared_ptr<boost::asio::steady_timer> _timer); bool create_placeholder_event_and_subscribe(service_t _service, @@ -385,29 +367,26 @@ private: void handle_subscription_state(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event); - client_t is_specific_endpoint_client(client_t _client, service_t _service, instance_t _instance); - std::unordered_set<client_t> get_specific_endpoint_clients(service_t _service, instance_t _instance); - void memory_log_timer_cbk(boost::system::error_code const & _error); void status_log_timer_cbk(boost::system::error_code const & _error); - void send_subscription(client_t _offering_client, - client_t _subscribing_client, service_t _service, - instance_t _instance, eventgroup_t _eventgroup, - major_version_t _major, - pending_subscription_id_t _pending_subscription_id); + void send_subscription(const client_t _offering_client, + const service_t _service, const instance_t _instance, + const eventgroup_t _eventgroup, const major_version_t _major, + const std::set<client_t> &_clients, + const remote_subscription_id_t _id); - void send_unsubscription( - client_t _offering_client, client_t _subscribing_client, - service_t _service, instance_t _instance, eventgroup_t _eventgroup, - pending_subscription_id_t _pending_unsubscription_id); + void send_unsubscription(client_t _offering_client, + const service_t _service, const instance_t _instance, + const eventgroup_t _eventgroup, const major_version_t _major, + const std::set<client_t> &_removed, + const remote_subscription_id_t _id); void cleanup_server_endpoint(service_t _service, const std::shared_ptr<endpoint>& _endpoint); pending_remote_offer_id_t pending_remote_offer_add(service_t _service, instance_t _instance); - std::pair<service_t, instance_t> pending_remote_offer_remove( pending_remote_offer_id_t _id); @@ -417,7 +396,7 @@ private: std::shared_ptr<boost::asio::steady_timer> _timer); pending_security_update_id_t pending_security_update_add( - std::unordered_set<client_t> _clients); + const std::unordered_set<client_t>& _clients); std::unordered_set<client_t> pending_security_update_get( pending_security_update_id_t _id); @@ -428,54 +407,28 @@ private: bool is_pending_security_update_finished( pending_security_update_id_t _id); - std::shared_ptr<routing_manager_stub> stub_; - std::shared_ptr<sd::service_discovery> discovery_; - - // Server endpoints for local services - typedef std::map<uint16_t, std::map<bool, std::shared_ptr<endpoint>>> server_endpoints_t; - server_endpoints_t server_endpoints_; - std::map<service_t, std::map<endpoint *, instance_t> > service_instances_; + bool insert_offer_command(service_t _service, instance_t _instance, uint8_t _command, + client_t _client, major_version_t _major, minor_version_t _minor); + bool erase_offer_command(service_t _service, instance_t _instance); - // Multicast endpoint info (notifications) - std::map<service_t, std::map<instance_t, std::shared_ptr<endpoint_definition> > > multicast_info; + bool is_last_stop_callback(const uint32_t _callback_id); - // Client endpoints for remote services - std::map<service_t, - std::map<instance_t, std::map<bool, std::shared_ptr<endpoint_definition> > > > remote_service_info_; - - typedef std::map<service_t, std::map<instance_t, std::map<client_t, - std::map<bool, std::shared_ptr<endpoint>>>>> remote_services_t; - remote_services_t remote_services_; +private: + std::shared_ptr<routing_manager_stub> stub_; + std::shared_ptr<sd::service_discovery> discovery_; - typedef std::map<boost::asio::ip::address, std::map<uint16_t, - std::map<bool, std::shared_ptr<endpoint>>>> client_endpoints_by_ip_t; - client_endpoints_by_ip_t client_endpoints_by_ip_; + std::mutex requested_services_mutex_; std::map<client_t, std::map<service_t, std::map<instance_t, std::set<std::pair<major_version_t, minor_version_t>>>>> requested_services_; - // Mutexes - mutable std::recursive_mutex endpoint_mutex_; - std::mutex identified_clients_mutex_; - std::mutex requested_services_mutex_; - std::mutex remote_subscribers_mutex_; std::map<service_t, std::map<instance_t, std::map<client_t, std::set<std::shared_ptr<endpoint_definition>>>>> remote_subscribers_; - std::mutex specific_endpoint_clients_mutex_; - std::map<service_t, std::map<instance_t, std::unordered_set<client_t>>>specific_endpoint_clients_; - std::map<service_t, std::map<instance_t, - std::map<bool, std::unordered_set<client_t> > > > identified_clients_; - std::map<service_t, std::map<instance_t, - std::map<bool, std::unordered_set<client_t> > > > identifying_clients_; - std::shared_ptr<serviceinfo> sd_info_; - std::map<bool, std::set<uint16_t>> used_client_ports_; - std::mutex used_client_ports_mutex_; - std::mutex version_log_timer_mutex_; boost::asio::steady_timer version_log_timer_; @@ -488,12 +441,6 @@ private: std::shared_ptr<netlink_connector> netlink_connector_; #endif -#ifndef WITHOUT_SYSTEMD - std::mutex watchdog_timer_mutex_; - boost::asio::steady_timer watchdog_timer_; - void watchdog_cbk(boost::system::error_code const &_error); -#endif - std::mutex pending_offers_mutex_; // map to store pending offers. // 1st client id in tuple: client id of new offering application @@ -509,8 +456,7 @@ private: std::map<std::tuple<service_t, instance_t, eventgroup_t, client_t>, subscription_state_e> remote_subscription_state_; - std::map<e2exf::data_identifier_t, std::shared_ptr<e2e::profile_interface::protector>> custom_protectors; - std::map<e2exf::data_identifier_t, std::shared_ptr<e2e::profile_interface::checker>> custom_checkers; + std::shared_ptr<e2e::e2e_provider> e2e_provider_; std::mutex status_log_timer_mutex_; boost::asio::steady_timer status_log_timer_; @@ -518,6 +464,10 @@ private: std::mutex memory_log_timer_mutex_; boost::asio::steady_timer memory_log_timer_; + std::shared_ptr<endpoint_manager_impl> ep_mgr_impl_; + + reboot_notification_handler_t reboot_notification_handler_; + routing_ready_handler_t routing_ready_handler_; routing_state_handler_t routing_state_handler_; @@ -537,8 +487,14 @@ private: std::mutex security_update_timers_mutex_; std::map<pending_security_update_id_t, std::shared_ptr<boost::asio::steady_timer>> security_update_timers_; + + std::mutex offer_serialization_mutex_; + std::map<std::pair<service_t, instance_t>, std::deque<std::tuple<uint8_t, client_t, major_version_t, minor_version_t>>> offer_commands_; + + std::mutex callback_counts_mutex_; + std::map<uint32_t, uint16_t> callback_counts_; }; -} // namespace vsomeip +} // namespace vsomeip_v3 -#endif // VSOMEIP_ROUTING_MANAGER_IMPL_HPP +#endif // VSOMEIP_V3_ROUTING_MANAGER_IMPL_HPP_ |