// Copyright (C) 2014-2017 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_V3_ROUTING_MANAGER_STUB_ #define VSOMEIP_V3_ROUTING_MANAGER_STUB_ #include #include #include #include #include #include #include #include #include #include #include #include #include "../../endpoints/include/endpoint_host.hpp" #include "../include/routing_host.hpp" #include "types.hpp" namespace vsomeip_v3 { class configuration; struct policy; class routing_manager_stub_host; class routing_manager_stub: public routing_host, public std::enable_shared_from_this { public: routing_manager_stub( routing_manager_stub_host *_host, const std::shared_ptr& _configuration); virtual ~routing_manager_stub(); void init(); void start(); void stop(); void on_message(const byte_t *_data, length_t _size, endpoint *_receiver, const boost::asio::ip::address &_destination, client_t _bound_client, credentials_t _credentials, const boost::asio::ip::address &_remote_address, std::uint16_t _remote_port); void on_offer_service(client_t _client, service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor); void on_stop_offer_service(client_t _client, service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor); bool send_subscribe(const std::shared_ptr& _target, client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, major_version_t _major, event_t _event, remote_subscription_id_t _id); bool send_unsubscribe(const std::shared_ptr& _target, client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event, remote_subscription_id_t _id); bool send_expired_subscription(const std::shared_ptr& _target, client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event, remote_subscription_id_t _id); void send_subscribe_nack(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event); void send_subscribe_ack(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, event_t _event); bool contained_in_routing_info(client_t _client, service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor) const; void create_local_receiver(); bool send_ping(client_t _client); bool is_registered(client_t _client) const; client_t get_client() const; void handle_credentials(const client_t _client, std::set& _requests); void handle_requests(const client_t _client, std::set& _requests); void update_registration(client_t _client, registration_type_e _type); void print_endpoint_status() const; bool send_provided_event_resend_request(client_t _client, pending_remote_offer_id_t _id); bool update_security_policy_configuration(uint32_t _uid, uint32_t _gid, const std::shared_ptr &_policy, const std::shared_ptr &_payload, const security_update_handler_t &_handler); bool remove_security_policy_configuration(uint32_t _uid, uint32_t _gid, const security_update_handler_t &_handler); void on_security_update_response(pending_security_update_id_t _id, client_t _client); void policy_cache_add(uint32_t _uid, const std::shared_ptr& _payload); void policy_cache_remove(uint32_t _uid); bool is_policy_cached(uint32_t _uid); bool send_update_security_policy_request(client_t _client, pending_security_update_id_t _update_id, uint32_t _uid, const std::shared_ptr& _payload); bool send_remove_security_policy_request(client_t _client, pending_security_update_id_t _update_id, uint32_t _uid, uint32_t _gid); bool send_cached_security_policies(client_t _client); bool add_requester_policies(uid_t _uid, gid_t _gid, const std::set > &_policies); void remove_requester_policies(uid_t _uid, gid_t _gid); void send_suspend() const; private: void broadcast(const std::vector &_command) const; void on_register_application(client_t _client); void on_deregister_application(client_t _client); void distribute_credentials(client_t _hoster, service_t _service, instance_t _instance); void inform_provider(client_t _hoster, service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor, routing_info_entry_e _entry); void inform_requesters(client_t _hoster, service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor, routing_info_entry_e _entry, bool _inform_service); void broadcast_ping() const; void on_pong(client_t _client); void start_watchdog(); void check_watchdog(); void client_registration_func(void); void init_routing_endpoint(); void on_ping_timer_expired(boost::system::error_code const &_error); void remove_from_pinged_clients(client_t _client); void set_routing_state(routing_state_e _routing_state) { (void)_routing_state; }; bool is_already_connected(client_t _source, client_t _sink); void create_client_routing_info(const client_t _target); void insert_client_routing_info(client_t _target, routing_info_entry_e _entry, client_t _client, service_t _service = ANY_SERVICE, instance_t _instance = ANY_INSTANCE, major_version_t _major = ANY_MAJOR, minor_version_t _minor = ANY_MINOR); void send_client_routing_info(const client_t _target); void create_offered_services_info(const client_t _target); void insert_offered_services_info(client_t _target, routing_info_entry_e _entry, service_t _service, instance_t _instance, major_version_t _major, minor_version_t _minor); void send_offered_services_info(const client_t _target); void create_client_credentials_info(const client_t _target); void insert_client_credentials_info(client_t _target, std::set> _credentials); void send_client_credentials_info(const client_t _target); void on_client_id_timer_expired(boost::system::error_code const &_error); void get_requester_policies(uid_t _uid, gid_t _gid, std::set > &_policies) const; bool send_requester_policies(const std::unordered_set &_clients, const std::set > &_policies); void on_security_update_timeout( const boost::system::error_code &_error, pending_security_update_id_t _id, std::shared_ptr _timer); pending_security_update_id_t pending_security_update_add( const std::unordered_set &_clients); std::unordered_set pending_security_update_get( pending_security_update_id_t _id); bool pending_security_update_remove( pending_security_update_id_t _id, client_t _client); bool is_pending_security_update_finished( pending_security_update_id_t _id); void add_pending_security_update_handler( pending_security_update_id_t _id, security_update_handler_t _handler); void add_pending_security_update_timer( pending_security_update_id_t _id); private: routing_manager_stub_host *host_; boost::asio::io_service &io_; std::mutex watchdog_timer_mutex_; boost::asio::steady_timer watchdog_timer_; boost::asio::steady_timer client_id_timer_; std::set used_client_ids_; std::mutex used_client_ids_mutex_; std::shared_ptr endpoint_; std::shared_ptr local_receiver_; std::mutex local_receiver_mutex_; std::map> > > > routing_info_; mutable std::mutex routing_info_mutex_; std::shared_ptr configuration_; bool is_socket_activated_; std::atomic client_registration_running_; std::shared_ptr client_registration_thread_; std::mutex client_registration_mutex_; std::condition_variable client_registration_condition_; std::map> pending_client_registrations_; const std::uint32_t max_local_message_size_; static const std::vector its_ping_; const std::chrono::milliseconds configured_watchdog_timeout_; boost::asio::steady_timer pinged_clients_timer_; std::mutex pinged_clients_mutex_; std::map pinged_clients_; std::map > > > service_requests_; std::map> connection_matrix_; std::map> client_routing_info_; std::map> offered_services_info_; std::map> client_credentials_info_; std::mutex pending_security_updates_mutex_; pending_security_update_id_t pending_security_update_id_; std::map> pending_security_updates_; std::recursive_mutex security_update_handlers_mutex_; std::map security_update_handlers_; std::mutex security_update_timers_mutex_; std::map> security_update_timers_; std::mutex updated_security_policies_mutex_; std::map> updated_security_policies_; mutable std::mutex requester_policies_mutex_; std::map > > > requester_policies_; }; } // namespace vsomeip_v3 #endif // VSOMEIP_V3_ROUTING_MANAGER_STUB_