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_UDP_SERVER_ENDPOINT_IMPL_HPP_
7 #define VSOMEIP_V3_UDP_SERVER_ENDPOINT_IMPL_HPP_
8 
9 #include <boost/asio/io_service.hpp>
10 #include <boost/asio/ip/udp_ext.hpp>
11 
12 #include <atomic>
13 
14 #include <vsomeip/defines.hpp>
15 
16 #include "server_endpoint_impl.hpp"
17 #include "tp_reassembler.hpp"
18 
19 namespace vsomeip_v3 {
20 
21 typedef server_endpoint_impl<
22             boost::asio::ip::udp_ext
23         > udp_server_endpoint_base_impl;
24 
25 class udp_server_endpoint_impl: public udp_server_endpoint_base_impl {
26 
27 public:
28     udp_server_endpoint_impl(const std::shared_ptr<endpoint_host>& _endpoint_host,
29                              const std::shared_ptr<routing_host>& _routing_host,
30                              const endpoint_type& _local,
31                              boost::asio::io_service &_io,
32                              const std::shared_ptr<configuration>& _configuration);
33     virtual ~udp_server_endpoint_impl();
34 
35     void start();
36     void stop();
37 
38     void receive();
39 
40     bool send_to(const std::shared_ptr<endpoint_definition> _target,
41             const byte_t *_data, uint32_t _size);
42     bool send_error(const std::shared_ptr<endpoint_definition> _target,
43                 const byte_t *_data, uint32_t _size);
44     void send_queued(const queue_iterator_type _queue_iterator);
45     void get_configured_times_from_endpoint(
46             service_t _service, method_t _method,
47             std::chrono::nanoseconds *_debouncing,
48             std::chrono::nanoseconds *_maximum_retention) const;
49 
50     VSOMEIP_EXPORT void join(const std::string &_address);
51     VSOMEIP_EXPORT void join_unlocked(const std::string &_address);
52     void leave(const std::string &_address);
53 
54     void add_default_target(service_t _service,
55             const std::string &_address, uint16_t _port);
56     void remove_default_target(service_t _service);
57     bool get_default_target(service_t _service, endpoint_type &_target) const;
58 
59     std::uint16_t get_local_port() const;
60     void set_local_port(uint16_t _port);
61     bool is_local() const;
62 
63     void print_status();
64     bool is_reliable() const;
65 
66 private:
67     void leave_unlocked(const std::string &_address);
68     void set_broadcast();
69     void receive_unicast();
70     void receive_multicast(uint8_t _id);
71     bool is_joined(const std::string &_address) const;
72     bool is_joined(const std::string &_address, bool* _received) const;
73     std::string get_remote_information(
74             const queue_iterator_type _queue_iterator) const;
75     std::string get_remote_information(const endpoint_type& _remote) const;
76 
77     const std::string get_address_port_local() const;
78     bool tp_segmentation_enabled(service_t _service, method_t _method) const;
79 
80     void on_unicast_received(boost::system::error_code const &_error,
81             std::size_t _bytes,
82             boost::asio::ip::address const &_destination);
83 
84     void on_multicast_received(boost::system::error_code const &_error,
85             std::size_t _bytes,
86             boost::asio::ip::address const &_destination,
87             uint8_t _multicast_id);
88 
89     void on_message_received(boost::system::error_code const &_error,
90                      std::size_t _bytes,
91                      boost::asio::ip::address const &_destination,
92                      endpoint_type const &_remote,
93                      message_buffer_t const &_buffer);
94 
95 private:
96     socket_type unicast_socket_;
97     endpoint_type unicast_remote_;
98     message_buffer_t unicast_recv_buffer_;
99     mutable std::mutex unicast_mutex_;
100 
101     std::unique_ptr<socket_type> multicast_socket_;
102     std::unique_ptr<endpoint_type> multicast_local_;
103     endpoint_type multicast_remote_;
104     message_buffer_t multicast_recv_buffer_;
105     mutable std::mutex multicast_mutex_;
106     uint8_t multicast_id_;
107     std::map<std::string, bool> joined_;
108     std::atomic<bool> joined_group_;
109 
110     mutable std::mutex default_targets_mutex_;
111     std::map<service_t, endpoint_type> default_targets_;
112 
113     const std::uint16_t local_port_;
114 
115     std::shared_ptr<tp::tp_reassembler> tp_reassembler_;
116     boost::asio::steady_timer tp_cleanup_timer_;
117 };
118 
119 } // namespace vsomeip_v3
120 
121 #endif // VSOMEIP_V3_UDP_SERVER_ENDPOINT_IMPL_HPP_
122