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_CONFIGURATION_HPP
7 #define VSOMEIP_V3_CONFIGURATION_HPP
8 
9 #include <map>
10 #include <memory>
11 #include <set>
12 #include <string>
13 #include <chrono>
14 
15 #include <boost/asio/ip/address.hpp>
16 #include <boost/icl/interval_set.hpp>
17 
18 #include <vsomeip/export.hpp>
19 #include <vsomeip/defines.hpp>
20 #include <vsomeip/plugin.hpp>
21 #include <vsomeip/primitive_types.hpp>
22 
23 #include "trace.hpp"
24 
25 #include "../../e2e_protection/include/e2exf/config.hpp"
26 #include "e2e.hpp"
27 
28 #include "debounce.hpp"
29 
30 #ifdef ANDROID
31 #include "internal_android.hpp"
32 #else
33 #include "internal.hpp"
34 #endif // ANDROID
35 
36 #include "../../security/include/policy.hpp"
37 
38 #define VSOMEIP_CONFIG_PLUGIN_VERSION              1
39 
40 namespace vsomeip_v3 {
41 
42 class event;
43 
44 class configuration {
45 public:
~configuration()46     virtual ~configuration()
47 #ifndef ANDROID
48     {}
49 #else
50     ;
51 #endif
52 
53     virtual bool load(const std::string &_name) = 0;
54     virtual bool remote_offer_info_add(service_t _service,
55                                        instance_t _instance,
56                                        std::uint16_t _port,
57                                        bool _reliable,
58                                        bool _magic_cookies_enabled) = 0;
59     virtual bool remote_offer_info_remove(service_t _service,
60                                           instance_t _instance,
61                                           std::uint16_t _port,
62                                           bool _reliable,
63                                           bool _magic_cookies_enabled,
64                                           bool* _still_offered_remote) = 0;
65 
66     virtual const std::string &get_network() const = 0;
67 
68     virtual const boost::asio::ip::address & get_unicast_address() const = 0;
69     virtual const boost::asio::ip::address& get_netmask() const = 0;
70     virtual const std::string &get_device() const = 0;
71     virtual diagnosis_t get_diagnosis_address() const = 0;
72     virtual diagnosis_t get_diagnosis_mask() const = 0;
73     virtual bool is_v4() const = 0;
74     virtual bool is_v6() const = 0;
75 
76     virtual bool has_console_log() const = 0;
77     virtual bool has_file_log() const = 0;
78     virtual bool has_dlt_log() const = 0;
79     virtual const std::string & get_logfile() const = 0;
80     virtual logger::level_e get_loglevel() const = 0;
81 
82     virtual const std::string & get_routing_host() const = 0;
83 
84     virtual std::string get_unicast_address(service_t _service,
85             instance_t _instance) const = 0;
86     virtual uint16_t get_reliable_port(service_t _service,
87             instance_t _instance) const = 0;
88     virtual bool has_enabled_magic_cookies(std::string _address,
89             uint16_t _port) const = 0;
90     virtual uint16_t get_unreliable_port(service_t _service,
91             instance_t _instance) const = 0;
92 
93     virtual major_version_t get_major_version(service_t _service,
94             instance_t _instance) const = 0;
95     virtual minor_version_t get_minor_version(service_t _service,
96             instance_t _instance) const = 0;
97     virtual ttl_t get_ttl(service_t _service,
98             instance_t _instance) const = 0;
99 
100     virtual void get_configured_timing_requests(
101             service_t _service, std::string _ip_target,
102             std::uint16_t _port_target, method_t _method,
103             std::chrono::nanoseconds *_debounce_time,
104             std::chrono::nanoseconds *_max_retention_time) const = 0;
105     virtual void get_configured_timing_responses(
106             service_t _service, std::string _ip_service,
107             std::uint16_t _port_service, method_t _method,
108             std::chrono::nanoseconds *_debounce_time,
109             std::chrono::nanoseconds *_max_retention_time) const = 0;
110 
111     virtual bool is_someip(service_t _service, instance_t _instance) const = 0;
112 
113     virtual bool get_client_port(service_t _service, instance_t _instance,
114             uint16_t _remote_port, bool _reliable,
115             std::map<bool, std::set<uint16_t> > &_used_client_ports, uint16_t &_client_port) const = 0;
116 
117     virtual std::set<std::pair<service_t, instance_t> > get_remote_services() const = 0;
118 
119     virtual bool get_multicast(service_t _service, instance_t _instance,
120             eventgroup_t _eventgroup, std::string &_address, uint16_t &_port) const = 0;
121 
122     virtual uint8_t get_threshold(service_t _service, instance_t _instance,
123             eventgroup_t _eventgroup) const = 0;
124 
125     virtual client_t get_id(const std::string &_name) const = 0;
126     virtual bool is_configured_client_id(client_t _id) const = 0;
127 
128     virtual std::size_t get_max_dispatchers(const std::string &_name) const = 0;
129     virtual std::size_t get_max_dispatch_time(const std::string &_name) const = 0;
130     virtual std::size_t get_io_thread_count(const std::string &_name) const = 0;
131     virtual int get_io_thread_nice_level(const std::string &_name) const = 0;
132     virtual std::size_t get_request_debouncing(const std::string &_name) const = 0;
133 #ifdef VSOMEIP_HAS_SESSION_HANDLING_CONFIG
134     virtual bool has_session_handling(const std::string &_name) const = 0;
135 #endif // VSOMEIP_HAS_SESSION_HANDLING_CONFIG
136 
137     virtual std::uint32_t get_max_message_size_local() const = 0;
138     virtual std::uint32_t get_max_message_size_reliable(const std::string& _address,
139                                                     std::uint16_t _port) const = 0;
140     virtual std::uint32_t get_max_message_size_unreliable() const = 0;
141     virtual std::uint32_t get_buffer_shrink_threshold() const = 0;
142 
143     virtual bool supports_selective_broadcasts(boost::asio::ip::address _address) const = 0;
144 
145     virtual bool is_offered_remote(service_t _service, instance_t _instance) const = 0;
146 
147     virtual bool is_local_service(service_t _service, instance_t _instance) const = 0;
148 
149     virtual reliability_type_e get_event_reliability(
150             service_t _service, instance_t _instance, event_t _event) const = 0;
151     virtual reliability_type_e get_service_reliability(
152             service_t _service, instance_t _instance) const = 0;
153 
154     // Service Discovery configuration
155     virtual bool is_sd_enabled() const = 0;
156 
157     virtual const std::string & get_sd_multicast() const = 0;
158     virtual uint16_t get_sd_port() const = 0;
159     virtual const std::string & get_sd_protocol() const = 0;
160 
161     virtual uint32_t get_sd_initial_delay_min() const = 0;
162     virtual uint32_t get_sd_initial_delay_max() const = 0;
163     virtual int32_t get_sd_repetitions_base_delay() const = 0;
164     virtual uint8_t get_sd_repetitions_max() const = 0;
165     virtual ttl_t get_sd_ttl() const = 0;
166     virtual int32_t get_sd_cyclic_offer_delay() const = 0;
167     virtual int32_t get_sd_request_response_delay() const = 0;
168     virtual std::uint32_t get_sd_offer_debounce_time() const = 0;
169 
170     // Trace configuration
171     virtual std::shared_ptr<cfg::trace> get_trace() const = 0;
172 
173     // Watchdog
174     virtual bool is_watchdog_enabled() const = 0;
175     virtual uint32_t get_watchdog_timeout() const = 0;
176     virtual uint32_t get_allowed_missing_pongs() const = 0;
177 
178     // File permissions
179     virtual std::uint32_t get_permissions_uds() const = 0;
180     virtual std::uint32_t get_permissions_shm() const = 0;
181 
182     virtual bool log_version() const = 0;
183     virtual uint32_t get_log_version_interval() const = 0;
184 
185     // Plugins
186     virtual std::map<plugin_type_e, std::set<std::string>> get_plugins(
187             const std::string &_name) const = 0;
188 
189     virtual void set_configuration_path(const std::string &_path) = 0;
190 
191     //E2E
192     virtual std::map<e2exf::data_identifier_t, std::shared_ptr<cfg::e2e>> get_e2e_configuration() const = 0;
193     virtual bool is_e2e_enabled() const = 0;
194 
195     virtual bool log_memory() const = 0;
196     virtual uint32_t get_log_memory_interval() const = 0;
197 
198     virtual bool log_status() const = 0;
199     virtual uint32_t get_log_status_interval() const = 0;
200 
201     // TTL factor
202     typedef std::uint32_t ttl_factor_t;
203     typedef std::map<service_t, std::map<instance_t, ttl_factor_t>> ttl_map_t;
204     virtual ttl_map_t get_ttl_factor_offers() const = 0;
205     virtual ttl_map_t get_ttl_factor_subscribes() const = 0;
206 
207     // Debouncing
208     virtual std::shared_ptr<cfg::debounce> get_debounce(
209             service_t _service, instance_t _instance, event_t _event) const = 0;
210 
211     // Queue size limit endpoints
212     typedef std::uint32_t endpoint_queue_limit_t;
213     virtual endpoint_queue_limit_t get_endpoint_queue_limit(
214             const std::string& _address, std::uint16_t _port) const = 0;
215     virtual endpoint_queue_limit_t get_endpoint_queue_limit_local() const = 0;
216 
217     virtual std::uint32_t get_max_tcp_restart_aborts() const = 0;
218     virtual std::uint32_t get_max_tcp_connect_time() const = 0;
219 
220     // Acceptance handling
221     virtual bool is_protected_device(
222             const boost::asio::ip::address& _address) const = 0;
223     virtual bool is_protected_port(
224             const boost::asio::ip::address& _address, std::uint16_t _port,
225             bool _reliable) const = 0;
226     virtual bool is_secure_port(
227                 const boost::asio::ip::address& _address, std::uint16_t _port,
228                 bool _reliable) const = 0;
229 
230     typedef std::pair<std::uint16_t, std::uint16_t> port_range_t;
231     virtual void set_sd_acceptance_rule(
232             const boost::asio::ip::address &_address,
233             port_range_t _port_range, port_type_e _type,
234             const std::string &_path, bool _reliable, bool _enable, bool _default) = 0;
235 
236     typedef std::map<
237         boost::asio::ip::address, // other device
238         std::pair<
239             std::string, // path to file that determines whether or not IPsec is active
240             std::map<
241                 bool, // false = unreliable (aka UDP), true = reliable (aka TCP)
242                 std::pair<
243                     boost::icl::interval_set<std::uint16_t>, // optional (aka semi-secure) port range
244                     boost::icl::interval_set<std::uint16_t>  // secure port range
245                 >
246             >
247         >
248     > sd_acceptance_rules_t;
249     virtual void set_sd_acceptance_rules(const sd_acceptance_rules_t& _rules,
250                                          bool _enable) = 0;
251     virtual sd_acceptance_rules_t get_sd_acceptance_rules() = 0;
252     virtual void set_sd_acceptance_rules_active(
253             const boost::asio::ip::address& _address, bool _enable) = 0;
254 
255     virtual bool is_secure_service(service_t _service, instance_t _instance) const = 0;
256 
257     virtual int get_udp_receive_buffer_size() const = 0;
258 
259     virtual bool check_routing_credentials(client_t _client, uint32_t _uid, uint32_t _gid) const = 0;
260 
261     // SOME/IP-TP
262     virtual bool tp_segment_messages_client_to_service(
263             service_t _service, std::string _ip_target,
264             std::uint16_t _port_target, method_t _method) const = 0;
265     virtual bool tp_segment_messages_service_to_client(
266             service_t _service, std::string _ip_service,
267             std::uint16_t _port_service, method_t _method) const = 0;
268 
269     // routing shutdown timeout
270     virtual std::uint32_t get_shutdown_timeout() const = 0;
271 
272     virtual bool log_statistics() const = 0;
273     virtual uint32_t get_statistics_interval() const = 0;
274     virtual uint32_t get_statistics_min_freq() const = 0;
275     virtual uint32_t get_statistics_max_messages() const = 0;
276 
277     virtual uint8_t get_max_remote_subscribers() const = 0;
278 
279     virtual partition_id_t get_partition_id(
280             service_t _service, instance_t _instance) const = 0;
281 };
282 
283 } // namespace vsomeip_v3
284 
285 #endif // VSOMEIP_V3_CONFIGURATION_HPP
286