summaryrefslogtreecommitdiff
path: root/implementation/service_discovery
diff options
context:
space:
mode:
authorJuergen Gehring <juergen.gehring@bmw.de>2017-06-20 02:54:31 -0700
committerJuergen Gehring <juergen.gehring@bmw.de>2017-06-20 02:54:31 -0700
commitfdf86239b4a6867e0a961a307649a6d5eb3a2f93 (patch)
treeb25be00a044a41135d11ddd3f15c1adce3a6411b /implementation/service_discovery
parent27698301f8bb528c2f618af5995865523de7e0d6 (diff)
downloadvSomeIP-fdf86239b4a6867e0a961a307649a6d5eb3a2f93.tar.gz
vSomeIP 2.7.02.7.0
Diffstat (limited to 'implementation/service_discovery')
-rw-r--r--implementation/service_discovery/include/runtime.hpp1
-rw-r--r--implementation/service_discovery/include/runtime_impl.hpp7
-rw-r--r--implementation/service_discovery/include/service_discovery.hpp2
-rw-r--r--implementation/service_discovery/include/service_discovery_host.hpp3
-rw-r--r--implementation/service_discovery/include/service_discovery_impl.hpp4
-rw-r--r--implementation/service_discovery/src/ipv4_option_impl.cpp2
-rwxr-xr-ximplementation/service_discovery/src/ipv6_option_impl.cpp2
-rw-r--r--implementation/service_discovery/src/runtime.cpp40
-rw-r--r--implementation/service_discovery/src/runtime_impl.cpp8
-rw-r--r--implementation/service_discovery/src/service_discovery_impl.cpp102
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