diff options
author | Juergen Gehring <juergen.gehring@bmw.de> | 2017-06-20 02:54:31 -0700 |
---|---|---|
committer | Juergen Gehring <juergen.gehring@bmw.de> | 2017-06-20 02:54:31 -0700 |
commit | fdf86239b4a6867e0a961a307649a6d5eb3a2f93 (patch) | |
tree | b25be00a044a41135d11ddd3f15c1adce3a6411b /implementation/service_discovery | |
parent | 27698301f8bb528c2f618af5995865523de7e0d6 (diff) | |
download | vSomeIP-fdf86239b4a6867e0a961a307649a6d5eb3a2f93.tar.gz |
vSomeIP 2.7.02.7.0
Diffstat (limited to 'implementation/service_discovery')
10 files changed, 69 insertions, 102 deletions
diff --git a/implementation/service_discovery/include/runtime.hpp b/implementation/service_discovery/include/runtime.hpp index 468d5ba..f99fec8 100644 --- a/implementation/service_discovery/include/runtime.hpp +++ b/implementation/service_discovery/include/runtime.hpp @@ -18,7 +18,6 @@ class service_discovery_host; class runtime {
public:
- static std::shared_ptr<runtime> get();
virtual ~runtime() {
}
diff --git a/implementation/service_discovery/include/runtime_impl.hpp b/implementation/service_discovery/include/runtime_impl.hpp index 4a8557f..dcdb7d7 100644 --- a/implementation/service_discovery/include/runtime_impl.hpp +++ b/implementation/service_discovery/include/runtime_impl.hpp @@ -6,14 +6,17 @@ #ifndef VSOMEIP_SD_RUNTIME_IMPL_HPP #define VSOMEIP_SD_RUNTIME_IMPL_HPP +#include <vsomeip/plugin.hpp> #include "runtime.hpp" namespace vsomeip { namespace sd { -class runtime_impl: public runtime { +class runtime_impl + : public runtime, + public plugin_impl<runtime_impl> { public: - static std::shared_ptr<runtime> get(); + runtime_impl(); virtual ~runtime_impl(); std::shared_ptr<service_discovery> create_service_discovery( diff --git a/implementation/service_discovery/include/service_discovery.hpp b/implementation/service_discovery/include/service_discovery.hpp index 19f3c93..703bf22 100644 --- a/implementation/service_discovery/include/service_discovery.hpp +++ b/implementation/service_discovery/include/service_discovery.hpp @@ -63,6 +63,8 @@ public: std::shared_ptr<serviceinfo> _info) = 0; virtual void stop_offer_service(service_t _service, instance_t _instance, std::shared_ptr<serviceinfo> _info) = 0; + + virtual void set_diagnosis_mode(const bool _activate) = 0; }; } // namespace sd diff --git a/implementation/service_discovery/include/service_discovery_host.hpp b/implementation/service_discovery/include/service_discovery_host.hpp index 0e1de9e..e1e0ccd 100644 --- a/implementation/service_discovery/include/service_discovery_host.hpp +++ b/implementation/service_discovery/include/service_discovery_host.hpp @@ -81,9 +81,6 @@ public: virtual void expire_subscriptions(const boost::asio::ip::address &_address) = 0; virtual void expire_services(const boost::asio::ip::address &_address) = 0; - virtual void on_reboot(const boost::asio::ip::address &_address) = 0; - - virtual bool on_subscribe_accepted(service_t _service, instance_t _instance, eventgroup_t _eventgroup, std::shared_ptr<endpoint_definition> _target, const std::chrono::steady_clock::time_point &_expiration) = 0; diff --git a/implementation/service_discovery/include/service_discovery_impl.hpp b/implementation/service_discovery/include/service_discovery_impl.hpp index 910fc61..b7be7ff 100644 --- a/implementation/service_discovery/include/service_discovery_impl.hpp +++ b/implementation/service_discovery/include/service_discovery_impl.hpp @@ -91,6 +91,8 @@ public: void stop_offer_service(service_t _service, instance_t _instance, std::shared_ptr<serviceinfo> _info); + void set_diagnosis_mode(const bool _activate); + private: std::pair<session_t, bool> get_session(const boost::asio::ip::address &_address); void increment_session(const boost::asio::ip::address &_address); @@ -353,6 +355,8 @@ private: std::string sd_multicast_; boost::asio::ip::address current_remote_address_; + + std::atomic<bool> is_diagnosis_; }; } // namespace sd diff --git a/implementation/service_discovery/src/ipv4_option_impl.cpp b/implementation/service_discovery/src/ipv4_option_impl.cpp index b12d60e..00bf7b5 100644 --- a/implementation/service_discovery/src/ipv4_option_impl.cpp +++ b/implementation/service_discovery/src/ipv4_option_impl.cpp @@ -49,7 +49,7 @@ bool ipv4_option_impl::serialize(vsomeip::serializer *_to) const { bool ipv4_option_impl::deserialize(vsomeip::deserializer *_from) {
bool is_successful = option_impl::deserialize(_from)
&& length_ == VSOMEIP_SD_IPV4_OPTION_LENGTH;
- uint8_t its_reserved;
+ uint8_t its_reserved(static_cast<std::uint8_t>(layer_four_protocol_e::UNKNOWN));
_from->deserialize(address_.data(), 4);
_from->deserialize(its_reserved);
_from->deserialize(its_reserved);
diff --git a/implementation/service_discovery/src/ipv6_option_impl.cpp b/implementation/service_discovery/src/ipv6_option_impl.cpp index ac9ebed..94c8fe4 100755 --- a/implementation/service_discovery/src/ipv6_option_impl.cpp +++ b/implementation/service_discovery/src/ipv6_option_impl.cpp @@ -49,7 +49,7 @@ bool ipv6_option_impl::serialize(vsomeip::serializer *_to) const { bool ipv6_option_impl::deserialize(vsomeip::deserializer *_from) {
bool is_successful = option_impl::deserialize(_from)
&& length_ == VSOMEIP_SD_IPV6_OPTION_LENGTH;;
- uint8_t its_reserved;
+ uint8_t its_reserved(static_cast<std::uint8_t>(layer_four_protocol_e::UNKNOWN));
_from->deserialize(address_.data(), 16);
_from->deserialize(its_reserved);
_from->deserialize(its_reserved);
diff --git a/implementation/service_discovery/src/runtime.cpp b/implementation/service_discovery/src/runtime.cpp deleted file mode 100644 index 54276fd..0000000 --- a/implementation/service_discovery/src/runtime.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "../include/runtime_impl.hpp" -#include "../../configuration/include/internal.hpp" - -#ifdef _WIN32 -extern "C" -{ - __declspec(dllexport) std::shared_ptr<vsomeip::sd::runtime> VSOMEIP_SD_RUNTIME_SYMBOL; -} -#else -std::shared_ptr<vsomeip::sd::runtime> VSOMEIP_SD_RUNTIME_SYMBOL(vsomeip::sd::runtime::get()); -#endif - -#ifdef _WIN32 -#define CCALL __cdecl -#pragma section(".CRT$XCU",read) -#define INITIALIZER(f) \ - static void __cdecl f(void); \ - __declspec(allocate(".CRT$XCU")) void(__cdecl*f##_)(void) = f; \ - static void __cdecl f(void) - -INITIALIZER(init_vsomeip_sd) { - VSOMEIP_SD_RUNTIME_SYMBOL = vsomeip::sd::runtime::get(); -} -#endif - -namespace vsomeip { -namespace sd { - -std::shared_ptr<runtime> runtime::get() { - return runtime_impl::get(); -} - -} // namespace sd -} // namespace vsomeip - diff --git a/implementation/service_discovery/src/runtime_impl.cpp b/implementation/service_discovery/src/runtime_impl.cpp index b2ed34d..90743b8 100644 --- a/implementation/service_discovery/src/runtime_impl.cpp +++ b/implementation/service_discovery/src/runtime_impl.cpp @@ -12,13 +12,13 @@ #include "../include/runtime_impl.hpp" #include "../include/service_discovery_impl.hpp" +VSOMEIP_PLUGIN(vsomeip::sd::runtime_impl) + namespace vsomeip { namespace sd { -std::shared_ptr<runtime> runtime_impl::get() { - static std::shared_ptr<runtime> the_runtime = - std::make_shared<runtime_impl>(); - return the_runtime; +runtime_impl::runtime_impl() + : plugin_impl("vsomeip SD plug-in", 1, plugin_type_e::SD_RUNTIME_PLUGIN) { } runtime_impl::~runtime_impl() { diff --git a/implementation/service_discovery/src/service_discovery_impl.cpp b/implementation/service_discovery/src/service_discovery_impl.cpp index 79e60bd..e8937ed 100644 --- a/implementation/service_discovery/src/service_discovery_impl.cpp +++ b/implementation/service_discovery/src/service_discovery_impl.cpp @@ -33,6 +33,7 @@ #include "../../message/include/serializer.hpp" #include "../../routing/include/eventgroupinfo.hpp" #include "../../routing/include/serviceinfo.hpp" +#include "../../plugin/include/plugin_manager.hpp" namespace vsomeip { namespace sd { @@ -62,7 +63,8 @@ service_discovery_impl::service_discovery_impl(service_discovery_host *_host) find_debounce_time_(VSOMEIP_SD_DEFAULT_FIND_DEBOUNCE_TIME), find_debounce_timer_(_host->get_io()), main_phase_timer_(_host->get_io()), - is_suspended_(true) { + is_suspended_(false), + is_diagnosis_(false) { std::chrono::seconds smallest_ttl(DEFAULT_TTL); smallest_ttl_ = std::chrono::duration_cast<std::chrono::milliseconds>(smallest_ttl); @@ -82,7 +84,7 @@ boost::asio::io_service & service_discovery_impl::get_io() { } void service_discovery_impl::init() { - runtime_ = runtime::get(); + runtime_ = std::dynamic_pointer_cast<sd::runtime>(plugin_manager::get()->get_plugin(plugin_type_e::SD_RUNTIME_PLUGIN)); std::shared_ptr < configuration > its_configuration = host_->get_configuration(); @@ -151,33 +153,7 @@ void service_discovery_impl::start() { } void service_discovery_impl::stop() { - boost::system::error_code ec; is_suspended_ = true; - { - std::lock_guard<std::mutex> its_lock(main_phase_timer_mutex_); - main_phase_timer_.cancel(ec); - } - { - std::lock_guard<std::mutex> its_lock(offer_debounce_timer_mutex_); - offer_debounce_timer_.cancel(ec); - } - { - std::lock_guard<std::mutex> its_lock(find_debounce_timer_mutex_); - find_debounce_timer_.cancel(ec); - } - { - std::lock_guard<std::mutex> its_lock(repetition_phase_timers_mutex_); - for(const auto &t : repetition_phase_timers_) { - t.first->cancel(ec); - } - } - { - std::lock_guard<std::mutex> its_lock(find_repetition_phase_timers_mutex_); - for(const auto &t : find_repetition_phase_timers_) { - t.first->cancel(ec); - } - } - } void service_discovery_impl::request_service(service_t _service, @@ -849,20 +825,23 @@ void service_discovery_impl::insert_offer_entries( uint32_t its_size(_size); for (const auto its_service : _services) { for (const auto its_instance : its_service.second) { - // Only insert services with configured endpoint(s) - if ((_ignore_phase || its_instance.second->is_in_mainphase()) - && (its_instance.second->get_endpoint(false) - || its_instance.second->get_endpoint(true))) { - if (i >= _start) { - if (!insert_offer_service(_message, its_service.first, - its_instance.first, its_instance.second, its_size)) { - _start = i; - _done = false; - return; + if ((!is_suspended_) + && ((!is_diagnosis_) || (is_diagnosis_ && !host_->get_configuration()->is_someip(its_service.first, its_instance.first)))) { + // Only insert services with configured endpoint(s) + if ((_ignore_phase || its_instance.second->is_in_mainphase()) + && (its_instance.second->get_endpoint(false) + || its_instance.second->get_endpoint(true))) { + if (i >= _start) { + if (!insert_offer_service(_message, its_service.first, + its_instance.first, its_instance.second, its_size)) { + _start = i; + _done = false; + return; + } } } + i++; } - i++; } } _start = i; @@ -1073,7 +1052,6 @@ void service_discovery_impl::on_message(const byte_t *_data, length_t _length, VSOMEIP_INFO << "Reboot detected: IP=" << _sender.to_string(); host_->expire_subscriptions(_sender); host_->expire_services(_sender); - host_->on_reboot(_sender); } std::chrono::milliseconds expired = stop_ttl_timer(); @@ -1226,9 +1204,11 @@ void service_discovery_impl::process_serviceentry( its_request->set_sent_counter(std::uint8_t(repetitions_max_ + 1)); } unsubscribe_all(its_service, its_instance); - host_->del_routing_info(its_service, its_instance, - (its_reliable_port != ILLEGAL_PORT), - (its_unreliable_port != ILLEGAL_PORT)); + if (!is_diagnosis_ && !is_suspended_) { + host_->del_routing_info(its_service, its_instance, + (its_reliable_port != ILLEGAL_PORT), + (its_unreliable_port != ILLEGAL_PORT)); + } } } @@ -1567,7 +1547,8 @@ bool service_discovery_impl::insert_offer_service( if (its_reliable) { insert_option(_message, its_entry, unicast_, its_reliable->get_local_port(), true); - if (0 == _info->get_ttl()) { + if ((0 == _info->get_ttl() && !is_diagnosis_) + && (0 == _info->get_ttl() && !is_suspended_)) { host_->del_routing_info(_service, _instance, true, false); } @@ -1576,7 +1557,8 @@ bool service_discovery_impl::insert_offer_service( if (its_unreliable) { insert_option(_message, its_entry, unicast_, its_unreliable->get_local_port(), false); - if (0 == _info->get_ttl()) { + if ((0 == _info->get_ttl() && !is_diagnosis_) + && (0 == _info->get_ttl() && !is_suspended_)) { host_->del_routing_info(_service, _instance, false, true); } @@ -1833,8 +1815,6 @@ void service_discovery_impl::process_eventgroupentry( } break; case option_type_e::CONFIGURATION: { - if (entry_type_e::SUBSCRIBE_EVENTGROUP == its_type) { - } break; } case option_type_e::UNKNOWN: @@ -1944,7 +1924,7 @@ void service_discovery_impl::handle_eventgroup_subscription(service_t _service, } else if (_is_second_reliable) { // tcp unicast its_second_target = its_second_subscriber; // check if TCP connection is established by client - if( !is_tcp_connected(_service, _instance, its_second_target) && _ttl > 0) { + if(_ttl > 0 && !is_tcp_connected(_service, _instance, its_second_target)) { insert_subscription_nack(its_message, _service, _instance, _eventgroup, _counter, _major, _reserved); VSOMEIP_ERROR << "TCP connection to target2 : [" << its_second_target->get_address().to_string() @@ -2465,10 +2445,28 @@ void service_discovery_impl::on_offer_debounce_timer_expired( services_t repetition_phase_offers; bool new_offers(false); { + std::vector<services_t::iterator> non_someip_services; std::lock_guard<std::mutex> its_lock(collected_offers_mutex_); if (collected_offers_.size()) { - repetition_phase_offers = collected_offers_; - collected_offers_.clear(); + if (is_diagnosis_) { + for (services_t::iterator its_service = collected_offers_.begin(); + its_service != collected_offers_.end(); its_service++) { + for (auto its_instance : its_service->second) { + if (!host_->get_configuration()->is_someip( + its_service->first, its_instance.first)) { + non_someip_services.push_back(its_service); + } + } + } + for (auto its_service : non_someip_services) { + repetition_phase_offers.insert(*its_service); + collected_offers_.erase(its_service); + } + } else { + repetition_phase_offers = collected_offers_; + collected_offers_.clear(); + } + new_offers = true; } } @@ -2877,5 +2875,9 @@ bool service_discovery_impl::check_source_address( return is_valid; } +void service_discovery_impl::set_diagnosis_mode(const bool _activate) { + is_diagnosis_ = _activate; +} + } // namespace sd } // namespace vsomeip |