diff options
Diffstat (limited to 'implementation/routing/include/routing_manager_impl.hpp')
-rw-r--r-- | implementation/routing/include/routing_manager_impl.hpp | 160 |
1 files changed, 76 insertions, 84 deletions
diff --git a/implementation/routing/include/routing_manager_impl.hpp b/implementation/routing/include/routing_manager_impl.hpp index 9741f3e..13936a4 100644 --- a/implementation/routing/include/routing_manager_impl.hpp +++ b/implementation/routing/include/routing_manager_impl.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +// Copyright (C) 2014-2016 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/. @@ -10,16 +10,17 @@ #include <memory> #include <mutex> #include <vector> +#include <list> #include <unordered_set> #include <boost/asio/ip/address.hpp> #include <boost/asio/io_service.hpp> #include <vsomeip/primitive_types.hpp> +#include <vsomeip/handler.hpp> -#include "routing_manager.hpp" +#include "routing_manager_base.hpp" #include "routing_manager_stub_host.hpp" -#include "../../endpoints/include/endpoint_host.hpp" #include "../../service_discovery/include/service_discovery_host.hpp" namespace vsomeip { @@ -31,24 +32,20 @@ class eventgroupinfo; class routing_manager_host; class routing_manager_stub; class servicegroup; -class serviceinfo; class serializer; class service_endpoint; namespace sd { - class service_discovery; +} // namespace sd -} // namespace sd // TODO: encapsulate common parts of classes "routing_manager_impl" // and "routing_manager_proxy" into a base class. -class routing_manager_impl: public routing_manager, - public endpoint_host, +class routing_manager_impl: public routing_manager_base, public routing_manager_stub_host, - public sd::service_discovery_host, - public std::enable_shared_from_this<routing_manager_impl> { + public sd::service_discovery_host { public: routing_manager_impl(routing_manager_host *_host); ~routing_manager_impl(); @@ -66,7 +63,7 @@ public: minor_version_t _minor); void stop_offer_service(client_t _client, service_t _service, - instance_t _instance); + 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, @@ -85,7 +82,7 @@ public: bool send(client_t _client, std::shared_ptr<message> _message, bool _flush); bool send(client_t _client, const byte_t *_data, uint32_t _size, - instance_t _instance, bool _flush, bool _reliable); + instance_t _instance, bool _flush, bool _reliable, bool _initial = false); bool send_to(const std::shared_ptr<endpoint_definition> &_target, std::shared_ptr<message> _message); @@ -93,12 +90,15 @@ public: bool send_to(const std::shared_ptr<endpoint_definition> &_target, const byte_t *_data, uint32_t _size); - void register_event(client_t _client, service_t _service, + bool send_to(const std::shared_ptr<endpoint_definition> &_target, + const byte_t *_data, uint32_t _size, uint16_t _sd_port); + + void register_shadow_event(client_t _client, service_t _service, instance_t _instance, event_t _event, const std::set<eventgroup_t> &_eventgroups, bool _is_field, bool _is_provided); - void unregister_event(client_t _client, service_t _service, + void unregister_shadow_event(client_t _client, service_t _service, instance_t _instance, event_t _event, bool _is_provided); @@ -108,14 +108,23 @@ public: void notify_one(service_t _service, instance_t _instance, event_t _event, std::shared_ptr<payload> _payload, client_t _client); + void on_subscribe_nack(client_t _client, service_t _service, + instance_t _instance, eventgroup_t _eventgroup); + + void on_subscribe_ack(client_t _client, service_t _service, + instance_t _instance, eventgroup_t _eventgroup); + + void on_identify_response(client_t _client, service_t _service, instance_t _instance, + bool _reliable); + + bool queue_message(const byte_t *_data, uint32_t _size) const; + // interface to stub - std::shared_ptr<endpoint> create_local(client_t _client); std::shared_ptr<endpoint> find_local(client_t _client); std::shared_ptr<endpoint> find_or_create_local(client_t _client); void remove_local(client_t _client); - std::shared_ptr<endpoint> find_local(service_t _service, - instance_t _instance); - void on_stop_offer_service(service_t _service, instance_t _instance); + void on_stop_offer_service(service_t _service, instance_t _instance, + major_version_t _major, minor_version_t _minor); // interface "endpoint_host" std::shared_ptr<endpoint> find_or_create_remote_client(service_t _service, @@ -124,11 +133,14 @@ public: 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); - void on_message(const byte_t *_data, length_t _length, endpoint *_receiver); + void on_message(const byte_t *_data, length_t _length, endpoint *_receiver, + const boost::asio::ip::address &_destination); void on_message(service_t _service, instance_t _instance, const byte_t *_data, length_t _size, bool _reliable); void on_notification(client_t _client, service_t _service, - instance_t _instance, const byte_t *_data, length_t _size); + instance_t _instance, const byte_t *_data, length_t _size, + bool _notify_one); + void release_port(uint16_t _port, bool _reliable); // interface "service_discovery_host" typedef std::map<std::string, std::shared_ptr<servicegroup> > servicegroups_t; @@ -147,12 +159,17 @@ public: uint16_t _unreliable_port); void del_routing_info(service_t _service, instance_t _instance, bool _has_reliable, bool _has_unreliable); - ttl_t update_routing_info(ttl_t _elapsed); + std::chrono::milliseconds update_routing_info(std::chrono::milliseconds _elapsed); void on_subscribe(service_t _service, instance_t _instance, eventgroup_t _eventgroup, std::shared_ptr<endpoint_definition> _subscriber, - std::shared_ptr<endpoint_definition> _target); + std::shared_ptr<endpoint_definition> _target, + const std::chrono::high_resolution_clock::time_point &_expiration); + bool on_subscribe_accepted(service_t _service, instance_t _instance, + eventgroup_t _eventgroup, + std::shared_ptr<endpoint_definition> _target, + const std::chrono::high_resolution_clock::time_point &_expiration); void on_unsubscribe(service_t _service, instance_t _instance, eventgroup_t _eventgroup, std::shared_ptr<endpoint_definition> _target); @@ -162,45 +179,34 @@ public: void expire_subscriptions(const boost::asio::ip::address &_address); void expire_services(const boost::asio::ip::address &_address); + std::chrono::high_resolution_clock::time_point expire_subscriptions(); + + bool has_identified(client_t _client, service_t _service, + instance_t _instance, bool _reliable); + private: bool deliver_message(const byte_t *_data, length_t _length, instance_t _instance, bool _reliable); bool deliver_notification(service_t _service, instance_t _instance, const byte_t *_data, length_t _length, bool _reliable); - bool send_local( - std::shared_ptr<endpoint> &_target, client_t _client, - const byte_t *_data, uint32_t _size, instance_t _instance, - bool _flush, bool _reliable) const; - - client_t find_local_client(service_t _service, instance_t _instance); - std::set<client_t> find_local_clients(service_t _service, - instance_t _instance, eventgroup_t _eventgroup); + instance_t find_instance(service_t _service, endpoint *_endpoint); - std::shared_ptr<serviceinfo> find_service(service_t _service, - instance_t _instance) const; - std::shared_ptr<serviceinfo> create_service_info(service_t _service, - instance_t _instance, major_version_t _major, - minor_version_t _minor, ttl_t _ttl, bool _is_local_service); + 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 _port, + const boost::asio::ip::address &_address, + uint16_t _local_port, uint16_t _remote_port, bool _reliable, client_t _client, bool _start); - void remove_eventgroup_info(service_t _service, instance_t _instance, - eventgroup_t _eventgroup); - 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); + bool _reliable) const; std::shared_ptr<endpoint> find_or_create_server_endpoint(uint16_t _port, bool _reliable, bool _start); - std::set<std::shared_ptr<event> > find_events(service_t _service, - instance_t _instance, eventgroup_t _eventgroup); - std::shared_ptr<event> find_event(service_t _service, instance_t _instance, - event_t _event) const; bool is_field(service_t _service, instance_t _instance, event_t _event) const; @@ -216,19 +222,8 @@ private: void clear_client_endpoints(service_t _service, instance_t _instance, bool _reliable); void stop_and_delete_client_endpoint(std::shared_ptr<endpoint> _endpoint); void clear_multicast_endpoints(service_t _service, instance_t _instance); - void clear_service_info(service_t _service, instance_t _instance, bool _reliable); private: - void send_subscribe(client_t _client, service_t _service, - instance_t _instance, eventgroup_t _eventgroup, - major_version_t _major); - - void send_unsubscribe(client_t _client, service_t _service, - instance_t _instance, eventgroup_t _eventgroup); - - bool insert_subscription(service_t _service, instance_t _instance, - eventgroup_t _eventgroup, client_t _client); - return_code_e check_error(const byte_t *_data, length_t _size, instance_t _instance); @@ -236,23 +231,22 @@ private: length_t _size, instance_t _instance, bool _reliable, endpoint *_receiver); - routing_manager_host *host_; - boost::asio::io_service &io_; + void identify_for_subscribe(client_t _client, service_t _service, + instance_t _instance, major_version_t _major); - std::shared_ptr<deserializer> deserializer_; - std::shared_ptr<serializer> serializer_; + bool supports_selective(service_t _service, instance_t _instance); - std::shared_ptr<configuration> configuration_; + 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); std::shared_ptr<routing_manager_stub> stub_; std::shared_ptr<sd::service_discovery> discovery_; - // Routing info - - // Local - std::map<client_t, std::shared_ptr<endpoint> > local_clients_; - std::map<service_t, std::map<instance_t, client_t> > local_services_; - // Server endpoints for local services std::map<uint16_t, std::map<bool, std::shared_ptr<endpoint> > > server_endpoints_; std::map<service_t, std::map<endpoint *, instance_t> > service_instances_; @@ -268,29 +262,27 @@ private: std::map<instance_t, std::map<client_t, std::map<bool, std::shared_ptr<endpoint> > > > >remote_services_; std::map<boost::asio::ip::address, std::map<uint16_t, std::map<bool, std::shared_ptr<endpoint> > > > client_endpoints_by_ip_; - - // Services - services_t services_; - - // Eventgroups - std::map<service_t, - std::map<instance_t, - std::map<eventgroup_t, std::shared_ptr<eventgroupinfo> > > > eventgroups_; - std::map<service_t, - std::map<instance_t, std::map<event_t, std::shared_ptr<event> > > > events_; - std::map<service_t, - std::map<instance_t, std::map<eventgroup_t, std::set<client_t> > > > eventgroup_clients_; + 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_; - mutable std::mutex local_mutex_; - std::mutex serialize_mutex_; - mutable std::mutex services_mutex_; - mutable std::mutex eventgroups_mutex_; + std::mutex identified_clients_mutex_; + std::mutex requested_services_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<client_t, std::shared_ptr<endpoint_definition>> remote_subscriber_map_; + std::shared_ptr<serviceinfo> sd_info_; - std::unordered_set<client_t> specific_endpoint_clients; + std::map<bool, std::set<uint16_t>> used_client_ports_; }; } // namespace vsomeip |