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