summaryrefslogtreecommitdiff
path: root/implementation/routing/src/routing_manager_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/routing/src/routing_manager_impl.cpp')
-rw-r--r--implementation/routing/src/routing_manager_impl.cpp88
1 files changed, 52 insertions, 36 deletions
diff --git a/implementation/routing/src/routing_manager_impl.cpp b/implementation/routing/src/routing_manager_impl.cpp
index 88aaca3..6af17a4 100644
--- a/implementation/routing/src/routing_manager_impl.cpp
+++ b/implementation/routing/src/routing_manager_impl.cpp
@@ -1029,7 +1029,9 @@ void routing_manager_impl::on_message(const byte_t *_data, length_t _size,
method_t its_method;
bool its_is_crc_valid(true);
instance_t its_instance(0x0);
-
+#ifdef USE_DLT
+ bool is_forwarded(true);
+#endif
if (_size >= VSOMEIP_SOMEIP_HEADER_SIZE) {
its_service = VSOMEIP_BYTES_TO_WORD(_data[VSOMEIP_SERVICE_POS_MIN],
_data[VSOMEIP_SERVICE_POS_MAX]);
@@ -1121,30 +1123,36 @@ void routing_manager_impl::on_message(const byte_t *_data, length_t _size,
its_data[VSOMEIP_CLIENT_POS_MAX] = 0x0;
}
// Common way of message handling
+#ifdef USE_DLT
+ is_forwarded =
+#endif
on_message(its_service, its_instance, _data, _size, _receiver->is_reliable(), its_is_crc_valid);
+
}
}
}
#ifdef USE_DLT
- const uint16_t its_data_size
- = uint16_t(_size > USHRT_MAX ? USHRT_MAX : _size);
-
- tc::trace_header its_header;
- const boost::asio::ip::address_v4 its_remote_address =
- _remote_address.is_v4() ? _remote_address.to_v4() :
- boost::asio::ip::address_v4::from_string("6.6.6.6");
- tc::protocol_e its_protocol =
- _receiver->is_local() ? tc::protocol_e::local :
- _receiver->is_reliable() ? tc::protocol_e::tcp :
+ if (is_forwarded) {
+ const uint16_t its_data_size
+ = uint16_t(_size > USHRT_MAX ? USHRT_MAX : _size);
+
+ tc::trace_header its_header;
+ const boost::asio::ip::address_v4 its_remote_address =
+ _remote_address.is_v4() ? _remote_address.to_v4() :
+ boost::asio::ip::address_v4::from_string("6.6.6.6");
+ tc::protocol_e its_protocol =
+ _receiver->is_local() ? tc::protocol_e::local :
+ _receiver->is_reliable() ? tc::protocol_e::tcp :
tc::protocol_e::udp;
- its_header.prepare(its_remote_address, _remote_port, its_protocol, false,
- its_instance);
- tc_->trace(its_header.data_, VSOMEIP_TRACE_HEADER_SIZE, _data,
- its_data_size);
+ its_header.prepare(its_remote_address, _remote_port, its_protocol, false,
+ its_instance);
+ tc_->trace(its_header.data_, VSOMEIP_TRACE_HEADER_SIZE, _data,
+ its_data_size);
+ }
#endif
}
-void routing_manager_impl::on_message(
+bool routing_manager_impl::on_message(
service_t _service, instance_t _instance,
const byte_t *_data, length_t _size,
bool _reliable, bool _is_valid_crc) {
@@ -1158,6 +1166,7 @@ void routing_manager_impl::on_message(
VSOMEIP_INFO << msg.str();
#endif
client_t its_client;
+ bool is_forwarded(true);
if (utility::is_request(_data[VSOMEIP_MESSAGE_TYPE_POS])) {
its_client = find_local_client(_service, _instance);
@@ -1169,12 +1178,13 @@ void routing_manager_impl::on_message(
if (its_client == VSOMEIP_ROUTING_CLIENT
&& utility::is_notification(_data[VSOMEIP_MESSAGE_TYPE_POS])) {
- deliver_notification(_service, _instance, _data, _size, _reliable, _is_valid_crc);
+ is_forwarded = deliver_notification(_service, _instance, _data, _size, _reliable, _is_valid_crc);
} else if (its_client == host_->get_client()) {
deliver_message(_data, _size, _instance, _reliable, _is_valid_crc);
} else {
send(its_client, _data, _size, _instance, true, _reliable, _is_valid_crc); //send to proxy
}
+ return is_forwarded;
}
void routing_manager_impl::on_notification(client_t _client,
@@ -1515,21 +1525,20 @@ bool routing_manager_impl::deliver_notification(
service_t _service, instance_t _instance,
const byte_t *_data, length_t _length,
bool _reliable, bool _is_valid_crc) {
- bool is_delivered(false);
-
method_t its_method = VSOMEIP_BYTES_TO_WORD(_data[VSOMEIP_METHOD_POS_MIN],
_data[VSOMEIP_METHOD_POS_MAX]);
std::shared_ptr<event> its_event = find_event(_service, _instance, its_method);
if (its_event) {
- if(its_event->is_field() && !its_event->is_provided()) {
- // store the current value of the remote field
+ if (!its_event->is_provided()) {
const uint32_t its_length(utility::get_payload_size(_data, _length));
- std::shared_ptr<payload> its_payload =
- runtime::get()->create_payload(
- &_data[VSOMEIP_PAYLOAD_POS],
- its_length);
- its_event->set_payload_dont_notify(its_payload);
+ std::shared_ptr<payload> its_payload
+ = runtime::get()->create_payload(&_data[VSOMEIP_PAYLOAD_POS],
+ its_length);
+ if (!its_event->set_payload_dont_notify(its_payload)) {
+ // do not forward the notification as it was filtered
+ return false;
+ }
}
for (const auto its_local_client : its_event->get_subscribers()) {
@@ -1545,7 +1554,7 @@ bool routing_manager_impl::deliver_notification(
}
}
- return is_delivered;
+ return true;
}
std::shared_ptr<eventgroupinfo> routing_manager_impl::find_eventgroup(
@@ -1727,7 +1736,9 @@ std::shared_ptr<endpoint> routing_manager_impl::create_client_endpoint(
configuration_->get_max_message_size_reliable(
_address.to_string(), _remote_port),
configuration_->get_buffer_shrink_threshold(),
- std::chrono::milliseconds(configuration_->get_sd_ttl() * 666));
+ std::chrono::milliseconds(configuration_->get_sd_ttl() * 666),
+ configuration_->get_endpoint_queue_limit(
+ _address.to_string(), _remote_port));
if (configuration_->has_enabled_magic_cookies(_address.to_string(),
_remote_port)) {
@@ -1742,7 +1753,8 @@ std::shared_ptr<endpoint> routing_manager_impl::create_client_endpoint(
boost::asio::ip::udp::v6()),
_local_port),
boost::asio::ip::udp::endpoint(_address, _remote_port),
- io_);
+ io_, configuration_->get_endpoint_queue_limit(
+ _address.to_string(), _remote_port));
}
} catch (...) {
host_->on_error(error_code_e::CLIENT_ENDPOINT_CREATION_FAILED);
@@ -1765,7 +1777,9 @@ std::shared_ptr<endpoint> routing_manager_impl::create_server_endpoint(
configuration_->get_max_message_size_reliable(
its_unicast.to_string(), _port),
configuration_->get_buffer_shrink_threshold(),
- std::chrono::milliseconds(configuration_->get_sd_ttl() * 666));
+ std::chrono::milliseconds(configuration_->get_sd_ttl() * 666),
+ configuration_->get_endpoint_queue_limit(
+ its_unicast.to_string(), _port));
if (configuration_->has_enabled_magic_cookies(
its_unicast.to_string(), _port) ||
configuration_->has_enabled_magic_cookies(
@@ -1773,6 +1787,9 @@ std::shared_ptr<endpoint> routing_manager_impl::create_server_endpoint(
its_endpoint->enable_magic_cookies();
}
} else {
+ configuration::endpoint_queue_limit_t its_limit =
+ configuration_->get_endpoint_queue_limit(
+ its_unicast.to_string(), _port);
#ifndef _WIN32
if (its_unicast.is_v4()) {
its_unicast = boost::asio::ip::address_v4::any();
@@ -1782,8 +1799,7 @@ std::shared_ptr<endpoint> routing_manager_impl::create_server_endpoint(
#endif
boost::asio::ip::udp::endpoint ep(its_unicast, _port);
its_endpoint = std::make_shared<udp_server_endpoint_impl>(
- shared_from_this(),
- ep, io_);
+ shared_from_this(), ep, io_, its_limit);
}
} else {
@@ -3287,10 +3303,10 @@ void routing_manager_impl::clear_remote_subscriber(
if (its_instance != its_service->second.end()) {
auto its_client = its_instance->second.find(_client);
if (its_client != its_instance->second.end()) {
- if (its_client->second.size() <= 1) {
- its_instance->second.erase(_client);
- } else {
- its_client->second.erase(_target);
+ if (its_client->second.erase(_target)) {
+ if (!its_client->second.size()) {
+ its_instance->second.erase(_client);
+ }
}
}
}