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