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_CLIENT_ENDPOINT_IMPL_HPP_
7 #define VSOMEIP_V3_UDP_CLIENT_ENDPOINT_IMPL_HPP_
8 
9 #include <memory>
10 
11 #include <boost/asio/io_service.hpp>
12 #include <boost/asio/strand.hpp>
13 #include <boost/asio/ip/udp.hpp>
14 
15 #include <vsomeip/defines.hpp>
16 
17 #include "client_endpoint_impl.hpp"
18 #include "tp_reassembler.hpp"
19 
20 namespace vsomeip_v3 {
21 
22 class endpoint_adapter;
23 
24 typedef client_endpoint_impl<
25             boost::asio::ip::udp
26         > udp_client_endpoint_base_impl;
27 
28 class udp_client_endpoint_impl: virtual public udp_client_endpoint_base_impl {
29 
30 public:
31     udp_client_endpoint_impl(const std::shared_ptr<endpoint_host>& _endpoint_host,
32                              const std::shared_ptr<routing_host>& _routing_host,
33                              const endpoint_type& _local,
34                              const endpoint_type& _remote,
35                              boost::asio::io_service &_io,
36                              const std::shared_ptr<configuration>& _configuration);
37     virtual ~udp_client_endpoint_impl();
38 
39     void start();
40     void restart(bool _force);
41 
42     void receive_cbk(boost::system::error_code const &_error,
43                      std::size_t _bytes, const message_buffer_ptr_t& _recv_buffer);
44 
45     bool get_remote_address(boost::asio::ip::address &_address) const;
46     std::uint16_t get_remote_port() const;
47     bool is_local() const;
48     void print_status();
49     bool is_reliable() const;
50 
51     void send_cbk(boost::system::error_code const &_error, std::size_t _bytes,
52                   const message_buffer_ptr_t &_sent_msg);
53 private:
54     void send_queued(message_buffer_ptr_t _buffer);
55     void get_configured_times_from_endpoint(
56             service_t _service, method_t _method,
57             std::chrono::nanoseconds *_debouncing,
58             std::chrono::nanoseconds *_maximum_retention) const;
59     void connect();
60     void receive();
61     void set_local_port();
62     const std::string get_address_port_remote() const;
63     const std::string get_address_port_local() const;
64     std::string get_remote_information() const;
65     bool tp_segmentation_enabled(service_t _service, method_t _method) const;
66     std::uint32_t get_max_allowed_reconnects() const;
67     void max_allowed_reconnects_reached();
68 
69 private:
70     const boost::asio::ip::address remote_address_;
71     const std::uint16_t remote_port_;
72     int udp_receive_buffer_size_;
73     std::shared_ptr<tp::tp_reassembler> tp_reassembler_;
74 };
75 
76 } // namespace vsomeip_v3
77 
78 #endif // VSOMEIP_V3_UDP_CLIENT_ENDPOINT_IMPL_HPP_
79