1 // Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) 2 // This Source Code Form is subject to the terms of the Mozilla Public 3 // License, v. 2.0. If a copy of the MPL was not distributed with this 4 // file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 6 #ifndef VSOMEIP_V3_ROUTING_MANAGER_BASE_ 7 #define VSOMEIP_V3_ROUTING_MANAGER_BASE_ 8 9 #include <mutex> 10 #include <unordered_set> 11 #include <queue> 12 #include <condition_variable> 13 14 #include <vsomeip/constants.hpp> 15 16 #include "routing_host.hpp" 17 #include "routing_manager.hpp" 18 #include "routing_manager_host.hpp" 19 #include "types.hpp" 20 #include "serviceinfo.hpp" 21 #include "event.hpp" 22 #include "eventgroupinfo.hpp" 23 #include "../../message/include/serializer.hpp" 24 #include "../../message/include/deserializer.hpp" 25 #include "../../configuration/include/configuration.hpp" 26 #include "../../endpoints/include/endpoint_manager_base.hpp" 27 28 namespace vsomeip_v3 { 29 30 #ifdef USE_DLT 31 namespace trace { 32 class connector_impl; 33 } // namespace trace 34 #endif 35 36 class serializer; 37 38 class routing_manager_base : public routing_manager, 39 public routing_host, 40 public std::enable_shared_from_this<routing_manager_base> { 41 42 public: 43 routing_manager_base(routing_manager_host *_host); 44 virtual ~routing_manager_base() = default; 45 46 virtual boost::asio::io_service & get_io(); 47 virtual client_t get_client() const; 48 virtual void set_client(const client_t &_client); 49 virtual session_t get_session(); 50 51 virtual void init() = 0; 52 void init(const std::shared_ptr<endpoint_manager_base>& _endpoint_manager); 53 54 virtual bool offer_service(client_t _client, 55 service_t _service, instance_t _instance, 56 major_version_t _major, minor_version_t _minor); 57 58 virtual void stop_offer_service(client_t _client, 59 service_t _service, instance_t _instance, 60 major_version_t _major, minor_version_t _minor); 61 62 virtual void request_service(client_t _client, 63 service_t _service, instance_t _instance, 64 major_version_t _major, minor_version_t _minor); 65 66 virtual void release_service(client_t _client, 67 service_t _service, instance_t _instance); 68 69 virtual void register_event(client_t _client, 70 service_t _service, instance_t _instance, 71 event_t _notifier, 72 const std::set<eventgroup_t> &_eventgroups, 73 const event_type_e _type, reliability_type_e _reliability, 74 std::chrono::milliseconds _cycle, bool _change_resets_cycle, 75 bool _update_on_change, epsilon_change_func_t _epsilon_change_func, 76 bool _is_provided, bool _is_shadow = false, 77 bool _is_cache_placeholder = false); 78 79 virtual void unregister_event(client_t _client, 80 service_t _service, instance_t _instance, event_t _event, 81 bool _is_provided); 82 83 virtual std::set<std::shared_ptr<event>> find_events(service_t _service, 84 instance_t _instance, eventgroup_t _eventgroup) const; 85 86 virtual void subscribe(client_t _client, uid_t _uid, gid_t _gid, 87 service_t _service, instance_t _instance, 88 eventgroup_t _eventgroup, major_version_t _major, event_t _event); 89 90 virtual void unsubscribe(client_t _client, uid_t _uid, gid_t _gid, 91 service_t _service, instance_t _instance, 92 eventgroup_t _eventgroup, event_t _event); 93 94 virtual void notify(service_t _service, instance_t _instance, 95 event_t _event, std::shared_ptr<payload> _payload, bool _force); 96 97 virtual void notify_one(service_t _service, instance_t _instance, 98 event_t _event, std::shared_ptr<payload> _payload, 99 client_t _client, bool _force 100 #ifdef VSOMEIP_ENABLE_COMPAT 101 , bool _remote_subscriber 102 #endif 103 ); 104 105 virtual bool send(client_t _client, std::shared_ptr<message> _message); 106 107 virtual bool send(client_t _client, const byte_t *_data, uint32_t _size, 108 instance_t _instance, bool _reliable, 109 client_t _bound_client = VSOMEIP_ROUTING_CLIENT, 110 credentials_t _credentials = {ANY_UID, ANY_GID}, 111 uint8_t _status_check = 0, bool _sent_from_remote = false) = 0; 112 113 // routing host -> will be implemented by routing_manager_impl/_proxy/ 114 virtual void on_message(const byte_t *_data, length_t _length, 115 endpoint *_receiver, const boost::asio::ip::address &_destination 116 = boost::asio::ip::address(), client_t _bound_client = VSOMEIP_ROUTING_CLIENT, 117 credentials_t _credentials = {ANY_UID, ANY_GID}, 118 const boost::asio::ip::address &_remote_address = boost::asio::ip::address(), 119 std::uint16_t _remote_port = 0) = 0; 120 121 122 virtual void set_routing_state(routing_state_e _routing_state) = 0; 123 124 virtual routing_state_e get_routing_state(); 125 126 virtual void register_client_error_handler(client_t _client, 127 const std::shared_ptr<endpoint> &_endpoint) = 0; 128 129 virtual void send_get_offered_services_info(client_t _client, offer_type_e _offer_type) = 0; 130 131 std::set<client_t> find_local_clients(service_t _service, instance_t _instance); 132 133 std::shared_ptr<serviceinfo> find_service(service_t _service, instance_t _instance) const; 134 135 client_t find_local_client(service_t _service, instance_t _instance) const; 136 client_t find_local_client_unlocked(service_t _service, instance_t _instance) const; 137 138 std::shared_ptr<event> find_event(service_t _service, instance_t _instance, 139 event_t _event) const; 140 141 virtual void on_connect(const std::shared_ptr<endpoint>& _endpoint) = 0; 142 virtual void on_disconnect(const std::shared_ptr<endpoint>& _endpoint) = 0; 143 protected: 144 std::shared_ptr<serviceinfo> create_service_info(service_t _service, 145 instance_t _instance, major_version_t _major, 146 minor_version_t _minor, ttl_t _ttl, bool _is_local_service); 147 148 void clear_service_info(service_t _service, instance_t _instance, bool _reliable); 149 services_t get_services() const; 150 services_t get_services_remote() const; 151 bool is_available(service_t _service, instance_t _instance, major_version_t _major); 152 153 void remove_local(client_t _client, bool _remove_uid); 154 void remove_local(client_t _client, 155 const std::set<std::tuple<service_t, instance_t, eventgroup_t>>& _subscribed_eventgroups, 156 bool _remove_uid); 157 158 std::shared_ptr<eventgroupinfo> find_eventgroup(service_t _service, 159 instance_t _instance, eventgroup_t _eventgroup) const; 160 161 void remove_eventgroup_info(service_t _service, instance_t _instance, 162 eventgroup_t _eventgroup); 163 164 bool send_local_notification(client_t _client, 165 const byte_t *_data, uint32_t _size, instance_t _instance, 166 bool _reliable = false, uint8_t _status_check = 0); 167 168 bool send_local( 169 std::shared_ptr<endpoint> &_target, client_t _client, 170 const byte_t *_data, uint32_t _size, instance_t _instance, 171 bool _reliable, uint8_t _command, uint8_t _status_check = 0) const; 172 173 bool insert_subscription(service_t _service, instance_t _instance, 174 eventgroup_t _eventgroup, event_t _event, client_t _client, 175 std::set<event_t> *_already_subscribed_events); 176 177 std::shared_ptr<serializer> get_serializer(); 178 void put_serializer(const std::shared_ptr<serializer> &_serializer); 179 std::shared_ptr<deserializer> get_deserializer(); 180 void put_deserializer(const std::shared_ptr<deserializer> &_deserializer); 181 182 void send_pending_subscriptions(service_t _service, 183 instance_t _instance, major_version_t _major); 184 185 virtual void send_subscribe(client_t _client, service_t _service, 186 instance_t _instance, eventgroup_t _eventgroup, 187 major_version_t _major, event_t _event) = 0; 188 189 void remove_pending_subscription(service_t _service, instance_t _instance, 190 eventgroup_t _eventgroup, event_t _event); 191 #ifdef VSOMEIP_ENABLE_COMPAT 192 void send_pending_notify_ones(service_t _service, instance_t _instance, 193 eventgroup_t _eventgroup, client_t _client, bool _remote_subscriber = false); 194 #endif 195 196 void unset_all_eventpayloads(service_t _service, instance_t _instance); 197 void unset_all_eventpayloads(service_t _service, instance_t _instance, 198 eventgroup_t _eventgroup); 199 200 void notify_one_current_value(client_t _client, service_t _service, 201 instance_t _instance, 202 eventgroup_t _eventgroup, event_t _event, 203 const std::set<event_t> &_events_to_exclude); 204 205 std::set<std::tuple<service_t, instance_t, eventgroup_t>> 206 get_subscriptions(const client_t _client); 207 208 std::vector<event_t> find_events(service_t _service, instance_t _instance) const; 209 210 bool is_response_allowed(client_t _sender, service_t _service, 211 instance_t _instance, method_t _method); 212 bool is_subscribe_to_any_event_allowed(credentials_t _credentials, client_t _client, 213 service_t _service, instance_t _instance, eventgroup_t _eventgroup); 214 void unsubscribe_all(service_t _service, instance_t _instance); 215 216 #ifdef VSOMEIP_ENABLE_COMPAT 217 void set_incoming_subscription_state(client_t _client, service_t _service, instance_t _instance, 218 eventgroup_t _eventgroup, event_t _event, subscription_state_e _state); 219 220 subscription_state_e get_incoming_subscription_state(client_t _client, service_t _service, instance_t _instance, 221 eventgroup_t _eventgroup, event_t _event); 222 223 void erase_incoming_subscription_state(client_t _client, service_t _service, instance_t _instance, 224 eventgroup_t _eventgroup, event_t _event); 225 #endif 226 227 private: 228 virtual bool create_placeholder_event_and_subscribe( 229 service_t _service, instance_t _instance, eventgroup_t _eventgroup, 230 event_t _event, client_t _client) = 0; 231 232 protected: 233 routing_manager_host *host_; 234 boost::asio::io_service &io_; 235 std::atomic<client_t> client_; 236 237 std::shared_ptr<configuration> configuration_; 238 239 std::queue<std::shared_ptr<serializer>> serializers_; 240 std::mutex serializer_mutex_; 241 std::condition_variable serializer_condition_; 242 243 std::queue<std::shared_ptr<deserializer>> deserializers_; 244 std::mutex deserializer_mutex_; 245 std::condition_variable deserializer_condition_; 246 247 mutable std::mutex local_services_mutex_; 248 typedef std::map<service_t, std::map<instance_t, 249 std::tuple<major_version_t, minor_version_t, client_t>>> local_services_map_t; 250 local_services_map_t local_services_; 251 std::map<service_t, std::map<instance_t, std::set<client_t> > > local_services_history_; 252 253 // Eventgroups 254 mutable std::mutex eventgroups_mutex_; 255 std::map<service_t, 256 std::map<instance_t, 257 std::map<eventgroup_t, std::shared_ptr<eventgroupinfo> > > > eventgroups_; 258 // Events (part of one or more eventgroups) 259 mutable std::mutex events_mutex_; 260 std::map<service_t, 261 std::map<instance_t, 262 std::map<event_t, 263 std::shared_ptr<event> > > > events_; 264 265 std::mutex event_registration_mutex_; 266 267 std::mutex routing_state_mutex_; 268 routing_state_e routing_state_; 269 270 #ifdef USE_DLT 271 std::shared_ptr<trace::connector_impl> tc_; 272 #endif 273 274 struct subscription_data_t { 275 service_t service_; 276 instance_t instance_; 277 eventgroup_t eventgroup_; 278 major_version_t major_; 279 event_t event_; 280 uid_t uid_; 281 gid_t gid_; 282 operator <vsomeip_v3::routing_manager_base::subscription_data_t283 bool operator<(const subscription_data_t &_other) const { 284 return (service_ < _other.service_ 285 || (service_ == _other.service_ 286 && instance_ < _other.instance_) 287 || (service_ == _other.service_ 288 && instance_ == _other.instance_ 289 && eventgroup_ < _other.eventgroup_) 290 || (service_ == _other.service_ 291 && instance_ == _other.instance_ 292 && eventgroup_ == _other.eventgroup_ 293 && event_ < _other.event_)); 294 } 295 }; 296 std::set<subscription_data_t> pending_subscriptions_; 297 298 services_t services_remote_; 299 mutable std::mutex services_remote_mutex_; 300 301 std::shared_ptr<endpoint_manager_base> ep_mgr_; 302 303 std::uint32_t own_uid_; 304 std::uint32_t own_gid_; 305 306 private: 307 services_t services_; 308 mutable std::mutex services_mutex_; 309 310 #ifdef VSOMEIP_ENABLE_COMPAT 311 std::map<service_t, 312 std::map<instance_t, 313 std::map<eventgroup_t, 314 std::shared_ptr<message> > > > pending_notify_ones_; 315 std::recursive_mutex pending_notify_ones_mutex_; 316 std::map<client_t, 317 std::map<service_t, 318 std::map<instance_t, 319 std::map<eventgroup_t, 320 std::map<event_t, 321 subscription_state_e> > > > > incoming_subscription_state_; 322 std::recursive_mutex incoming_subscription_state_mutex_; 323 #endif 324 325 }; 326 327 } // namespace vsomeip_v3 328 329 #endif // VSOMEIP_V3_ROUTING_MANAGER_BASE_ 330