summaryrefslogtreecommitdiff
path: root/implementation/tracing/src/trace_connector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/tracing/src/trace_connector.cpp')
-rw-r--r--implementation/tracing/src/trace_connector.cpp381
1 files changed, 0 insertions, 381 deletions
diff --git a/implementation/tracing/src/trace_connector.cpp b/implementation/tracing/src/trace_connector.cpp
deleted file mode 100644
index 93f7d6e..0000000
--- a/implementation/tracing/src/trace_connector.cpp
+++ /dev/null
@@ -1,381 +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/trace_connector.hpp"
-
-#include <vsomeip/constants.hpp>
-
-#include "../include/defines.hpp"
-#include "../../configuration/include/internal.hpp"
-
-namespace vsomeip {
-namespace tc {
-
-std::shared_ptr<trace_connector> trace_connector::get() {
- static std::shared_ptr<trace_connector> instance = std::make_shared<trace_connector>();
- return instance;
-}
-
-trace_connector::trace_connector() :
- is_enabled_(false),
- is_sd_enabled_(false),
- is_initialized_(false),
- channels_(),
- filter_rules_()
- {
- channels_.insert(std::make_pair(VSOMEIP_TC_DEFAULT_CHANNEL_ID, VSOMEIP_TC_DEFAULT_CHANNEL_NAME));
-}
-
-trace_connector::~trace_connector() {
- reset();
-}
-
-void trace_connector::init() {
-#ifdef USE_DLT
- if(!is_initialized_) {
- // register channels/contexts
- std::lock_guard<std::mutex> lock(dlt_contexts_mutex);
- for(auto it = channels_.begin(); it != channels_.end(); ++it) {
- DltContext *dlt_context = new DltContext();
- dlt_contexts_.insert(std::make_pair(it->first, dlt_context));
- DLT_REGISTER_CONTEXT_LL_TS(*dlt_context, it->first.c_str(), it->second.c_str(), DLT_LOG_INFO, DLT_TRACE_STATUS_ON);
- }
- }
-#endif
- is_initialized_ = true;
-}
-
-void trace_connector::reset() {
- std::lock_guard<std::mutex> its_lock_channels(channels_mutex_);
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
- std::lock_guard<std::mutex> its_lock_dlt_contexts(dlt_contexts_mutex);
-
-#ifdef USE_DLT
- // unregister channels/contexts
- for(auto it = dlt_contexts_.begin(); it != dlt_contexts_.end(); ++it) {
- DLT_UNREGISTER_CONTEXT(*it->second);
- delete it->second;
- }
- dlt_contexts_.clear();
-#endif
-
- // reset to default
-
- channels_.clear();
- channels_.insert(std::make_pair(VSOMEIP_TC_DEFAULT_CHANNEL_ID, VSOMEIP_TC_DEFAULT_CHANNEL_NAME));
-
- filter_rules_.clear();
-
- is_initialized_ = false;
-}
-
-void trace_connector::set_enabled(const bool _enabled) {
- is_enabled_ = _enabled;
-}
-
-bool trace_connector::is_enabled() const {
- return is_enabled_;
-}
-
-void trace_connector::set_sd_enabled(const bool _sd_enabled) {
- is_sd_enabled_ = _sd_enabled;
-}
-
-bool trace_connector::is_sd_enabled() const {
- return is_sd_enabled_;
-}
-
-bool trace_connector::is_sd_message(const byte_t *_data, uint16_t _data_size) const {
- if (VSOMEIP_METHOD_POS_MAX < _data_size) {
- return (_data[VSOMEIP_SERVICE_POS_MIN] == 0xFF && _data[VSOMEIP_SERVICE_POS_MAX] == 0xFF &&
- _data[VSOMEIP_METHOD_POS_MIN] == 0x81 && _data[VSOMEIP_METHOD_POS_MAX] == 0x00);
- }
- return false;
-}
-
-bool trace_connector::add_channel(const trace_channel_t &_id, const std::string &_name) {
- std::lock_guard<std::mutex> its_lock_channels(channels_mutex_);
- std::lock_guard<std::mutex> its_lock_dlt_contexts(dlt_contexts_mutex);
-
- bool channel_inserted = false;
- bool dlt_context_registered = false;
-
- // add channel
- channel_inserted = channels_.insert(std::make_pair(_id, _name)).second;
-
- // register context
-#ifdef USE_DLT
- if(channel_inserted) {
- DltContext *dlt_context = new DltContext();
- dlt_context_registered = dlt_contexts_.insert(std::make_pair(_id, dlt_context)).second;
- DLT_REGISTER_CONTEXT_LL_TS(*dlt_context, _id.c_str(), _name.c_str(), DLT_LOG_INFO, DLT_TRACE_STATUS_ON);
- }
-#endif
-
- return (channel_inserted && dlt_context_registered);
-}
-
-bool trace_connector::remove_channel(const trace_channel_t &_id) {
-
- if(_id == VSOMEIP_TC_DEFAULT_CHANNEL_ID) {
- // the default channel can not be removed
- return false;
- }
-
- std::lock_guard<std::mutex> its_lock_channels(channels_mutex_);
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
- std::lock_guard<std::mutex> its_lock_dlt_contexts(dlt_contexts_mutex);
-
- bool channel_removed = false;
- bool dlt_context_unregistered = false;
-
- // remove channel
- channel_removed = (channels_.erase(_id) == 1);
- if(channel_removed) {
-
- // unregister context
-#ifdef USE_DLT
- auto it = dlt_contexts_.find(_id);
- if(it != dlt_contexts_.end()) {
- DltContext *dlt_context = it->second;
- DLT_UNREGISTER_CONTEXT(*dlt_context);
- dlt_context_unregistered = true;
- }
-#endif
-
- // remove filter
- filter_rules_.erase(_id);
- }
- return (channel_removed && dlt_context_unregistered);
-}
-
-bool trace_connector::add_filter_rule(const trace_channel_t &_channel_id,
- const filter_rule_t _filter_rule) {
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
- std::lock_guard<std::mutex> its_lock_channels(channels_mutex_);
-
- // find channel
- auto it = channels_.find(_channel_id);
- if(it != channels_.end()) {
- // add filter rule
- return filter_rules_.insert(std::make_pair(_channel_id, _filter_rule)).second;
- }
- return false;
-}
-
-bool trace_connector::add_filter_expression(const trace_channel_t &_channel_id,
- const filter_criteria_e _criteria,
- const filter_expression_t _expression) {
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
-
- // find filter rule
- auto it_filter_rules = filter_rules_.find(_channel_id);
- if(it_filter_rules != filter_rules_.end()) {
- filter_rule_t its_filter_rule = it_filter_rules->second;
-
- // find filter criteria
- auto it_filter_rule_map = its_filter_rule.second.find(_criteria);
- if(it_filter_rule_map != its_filter_rule.second.end()) {
- // add expression
- it_filter_rule_map->second.push_back(_expression);
- return true;
- }
- }
- return false;
-}
-
-bool trace_connector::change_filter_expressions(const trace_channel_t &_channel_id,
- const filter_criteria_e _criteria,
- const filter_expressions_t _expressions) {
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
-
- // find filter rule
- auto it_filter_rules = filter_rules_.find(_channel_id);
- if(it_filter_rules != filter_rules_.end()) {
- filter_rule_t its_filter_rule = it_filter_rules->second;
-
- // find filter criteria
- auto it_filter_rule_map = its_filter_rule.second.find(_criteria);
- if(it_filter_rule_map != its_filter_rule.second.end()) {
- // change expressions
- it_filter_rule_map->second = _expressions;
- return true;
- }
- }
- return false;
-}
-
-bool trace_connector::remove_filter_rule(const trace_channel_t &_channel_id) {
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
-
- auto it = filter_rules_.find(_channel_id);
- if(it != filter_rules_.end()) {
- return (filter_rules_.erase(_channel_id) == 1);
- }
- return false;
-}
-
-void trace_connector::trace(const byte_t *_header, uint16_t _header_size,
- const byte_t *_data, uint16_t _data_size) {
-#ifdef USE_DLT
- if(!is_enabled_)
- return;
-
- std::lock_guard<std::mutex> its_lock_filter_rules(filter_rules_mutex_);
- std::lock_guard<std::mutex> its_lock_channels(channels_mutex_);
- std::lock_guard<std::mutex> its_lock_dlt_contexts(dlt_contexts_mutex);
-
- if (_data_size == 0)
- return; // no data
-
- if (is_sd_message(_data, _data_size) && !is_sd_enabled_)
- return; // tracing of service discovery messages is disabled!
-
- // check if filter rules match
- std::vector<trace_channel_t> its_channels;
- if (apply_filter_rules(_data, _data_size, its_channels)) {
- // send message over 'its_channels'
- for(auto channel_id : its_channels) {
- //find dlt context
- auto it = dlt_contexts_.find(channel_id);
- if (it != dlt_contexts_.end()) {
- DltContext *dlt_context = it->second;
- DLT_TRACE_NETWORK_SEGMENTED(*dlt_context,
- DLT_NW_TRACE_IPC,
- _header_size, static_cast<void *>(const_cast<byte_t *>(_header)),
- _data_size, static_cast<void *>(const_cast<byte_t *>(_data)));
- }
- }
- }
-#else
- (void)_header;
- (void)_header_size;
- (void)_data;
- (void)_data_size;
-#endif
-}
-
-trace_connector::channels_t trace_connector::get_channels() {
- std::lock_guard<std::mutex>its_lock_channels(channels_mutex_);
- return channels_;
-}
-
-trace_connector::filter_rules_t trace_connector::get_filter_rules() {
- std::lock_guard<std::mutex> its_lock_filters(filter_rules_mutex_);
- return filter_rules_;
-}
-
-trace_connector::filter_rule_t trace_connector::get_filter_rule(const trace_channel_t &_channel_id) {
- std::lock_guard<std::mutex> its_lock_filters(filter_rules_mutex_);
-
- // find filter
- auto it = filter_rules_.find(_channel_id);
- if (it != filter_rules_.end()) {
- return filter_rules_[_channel_id];
- } else {
- return filter_rule_t();
- }
-}
-
-bool trace_connector::apply_filter_rules(const byte_t *_data, uint16_t _data_size,
- std::vector<trace_channel_t> &_send_msg_over_channels) {
- _send_msg_over_channels.clear();
- if (filter_rules_.size() == 0) {
- // no filter rules -> send message over all channels to DLT
- for(auto it=channels_.begin(); it !=channels_.end(); ++it)
- _send_msg_over_channels.push_back(it->first);
- return true;
- }
-
- // loop through filter rules
- for(auto it_filter_rules = filter_rules_.begin(); it_filter_rules != filter_rules_.end(); ++it_filter_rules) {
- trace_channel_t its_channel = it_filter_rules->first;
- filter_rule_t its_filter_rule = it_filter_rules->second;
-
- // apply filter rule
- bool trace_message = true;
- filter_type_e its_filter_type = its_filter_rule.first;
- for(auto it_filter_rule_map = its_filter_rule.second.begin();
- it_filter_rule_map != its_filter_rule.second.end() && trace_message;
- ++it_filter_rule_map) {
-
- filter_criteria_e its_criteria = it_filter_rule_map->first;
- auto &its_filter_expressions = it_filter_rule_map->second;
-
- if(its_filter_expressions.size() != 0) {
- // check if filter expressions of filter criteria match
- const bool filter_rule_matches = filter_expressions_match(its_criteria, its_filter_expressions, _data, _data_size);
- trace_message = !(filter_rule_matches && its_filter_type == filter_type_e::NEGATIVE);
- }
- }
-
- if(trace_message) {
- //filter rule matches -> send message over 'its_channel' to DLT
- _send_msg_over_channels.push_back(its_channel);
- }
- }
- return (_send_msg_over_channels.size() != 0);
-}
-
-bool trace_connector::filter_expressions_match(
- const filter_criteria_e _criteria, const filter_expressions_t _expressions,
- const byte_t *_data, uint16_t _data_size) {
-
- // ignore empty filter expressions
- if (_expressions.size() == 0) {
- return true;
- }
-
- // extract criteria from message
- bool is_successful(false);
- byte_t first = 0;
- byte_t second = 0;
- switch (_criteria) {
- case filter_criteria_e::SERVICES:
- if (VSOMEIP_SERVICE_POS_MAX < _data_size) {
- first = _data[VSOMEIP_SERVICE_POS_MIN];
- second = _data[VSOMEIP_SERVICE_POS_MAX];
- is_successful = true;
- }
- break;
- case filter_criteria_e::METHODS:
- if (VSOMEIP_SERVICE_POS_MAX < _data_size) {
- first = _data[VSOMEIP_METHOD_POS_MIN];
- second = _data[VSOMEIP_METHOD_POS_MAX];
- is_successful = true;
- }
- break;
- case filter_criteria_e::CLIENTS:
- if (VSOMEIP_CLIENT_POS_MAX < _data_size) {
- first = _data[VSOMEIP_CLIENT_POS_MIN];
- second = _data[VSOMEIP_CLIENT_POS_MAX];
- is_successful = true;
- }
- break;
- default:
- break;
- }
-
- // if extraction is successful, filter
- if (is_successful) {
- bool filter_expressions_matches = false;
- for (auto it_expressions = _expressions.begin();
- it_expressions != _expressions.end() && !filter_expressions_matches;
- ++it_expressions) {
- filter_expression_t its_filter_expression = *it_expressions;
- uint16_t its_message_value = 0;
-
- its_message_value = (uint16_t)((its_message_value << 8) + first);
- its_message_value = (uint16_t)((its_message_value << 8) + second);
-
- filter_expressions_matches = (its_filter_expression == its_message_value);
- }
- return filter_expressions_matches;
- }
- return false;
-}
-
-} // namespace tc
-} // namespace vsomeip