diff --git a/tools/socktap/dcc_passthrough.cpp b/tools/socktap/dcc_passthrough.cpp index 6e061a81e..c6af5c60d 100644 --- a/tools/socktap/dcc_passthrough.cpp +++ b/tools/socktap/dcc_passthrough.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #ifdef SOCKTAP_WITH_COHDA_LLC #include "cohda.hpp" @@ -43,7 +44,9 @@ void DccPassthrough::request(const dcc::DataRequest& request, std::unique_ptr(); if (mib.itsGnProtocolVersion != 0 && mib.itsGnProtocolVersion != 1) { @@ -144,6 +148,7 @@ int main(int argc, const char** argv) for (auto& chain_path : vm["certificate-chain"].as >()) { auto chain_certificate = security::load_certificate_from_file(chain_path); chain.push_back(chain_certificate); + cert_cache.insert(chain_certificate); // Only add root certificates to trust store, so certificate requests are visible for demo purposes. if (chain_certificate.subject_info.subject_type == security::SubjectType::Root_CA) { @@ -172,7 +177,7 @@ int main(int argc, const char** argv) security::VerifyService verify_service = straight_verify_service(trigger.runtime(), *certificate_provider, *certificate_validator, *crypto_backend, cert_cache, sign_header_policy, positioning); security::DelegatingSecurityEntity security_entity(sign_service, verify_service); - RouterContext context(raw_socket, mib, trigger, positioning, security_entity); + RouterContext context(raw_socket, mib, trigger, positioning, &security_entity); context.require_position_fix(vm.count("require-gnss-fix") > 0); CamApplication cam_app(positioning, trigger.runtime()); diff --git a/tools/socktap/main_hello.cpp b/tools/socktap/main_hello.cpp index d390542dc..318825c14 100644 --- a/tools/socktap/main_hello.cpp +++ b/tools/socktap/main_hello.cpp @@ -98,7 +98,7 @@ int main(int argc, const char** argv) security::dummy_verify_service(security::VerificationReport::Success, security::CertificateValidity::valid()); security::DelegatingSecurityEntity security_entity(sign_service, verify_service); - RouterContext context(raw_socket, mib, trigger, positioning, security_entity); + RouterContext context(raw_socket, mib, trigger, positioning, &security_entity); context.require_position_fix(vm.count("require-gnss-fix") > 0); asio::steady_timer hello_timer(io_service); diff --git a/tools/socktap/router_context.cpp b/tools/socktap/router_context.cpp index 8369fce61..a00709c66 100644 --- a/tools/socktap/router_context.cpp +++ b/tools/socktap/router_context.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #ifdef SOCKTAP_WITH_COHDA_LLC @@ -20,7 +21,7 @@ namespace asio = boost::asio; using boost::asio::generic::raw_protocol; using namespace vanetza; -RouterContext::RouterContext(raw_protocol::socket& socket, const geonet::MIB& mib, TimeTrigger& trigger, vanetza::PositionProvider& positioning, vanetza::security::SecurityEntity& security_entity) : +RouterContext::RouterContext(raw_protocol::socket& socket, const geonet::MIB& mib, TimeTrigger& trigger, vanetza::PositionProvider& positioning, vanetza::security::SecurityEntity* security_entity) : mib_(mib), router_(trigger.runtime(), mib_), socket_(socket), trigger_(trigger), positioning_(positioning), request_interface_(new DccPassthrough(socket, trigger)), @@ -30,7 +31,7 @@ RouterContext::RouterContext(raw_protocol::socket& socket, const geonet::MIB& mi router_.set_address(mib_.itsGnLocalGnAddr); router_.set_access_interface(request_interface_.get()); router_.set_transport_handler(geonet::UpperProtocol::BTP_B, &dispatcher_); - router_.set_security_entity(&security_entity); + router_.set_security_entity(security_entity); update_position_vector(); do_receive(); @@ -40,14 +41,16 @@ RouterContext::RouterContext(raw_protocol::socket& socket, const geonet::MIB& mi RouterContext::~RouterContext() { for (auto* app : applications_) { - app->router_ = nullptr; + disable(app); } } void RouterContext::log_packet_drop(geonet::Router::PacketDropReason reason) { auto reason_string = stringify(reason); - std::cout << "Router dropped packet because of " << reason_string << " (" << static_cast(reason) << ")\n"; + std::ostringstream ostream; + ostream << "Router dropped packet because of " << reason_string << " (" << static_cast(reason) << ")\n"; + std::cout << ostream.str(); } void RouterContext::do_receive() @@ -84,7 +87,10 @@ void RouterContext::pass_up(CohesivePacket&& packet) EthernetHeader hdr = decode_ethernet_header(link_range.begin(), link_range.end()); #endif if (hdr.source != mib_.itsGnLocalGnAddr.mid() && hdr.type == access::ethertype::GeoNetworking) { - std::cout << "received packet from " << hdr.source << " (" << packet.size() << " bytes)\n"; + std::ostringstream ostream; + ostream << "received packet from " << hdr.source << " (" << packet.size() << " bytes)\n"; + std::cout << ostream.str(); + std::unique_ptr up { new PacketVariant(std::move(packet)) }; trigger_.schedule(); // ensure the clock is up-to-date for the security entity router_.indicate(std::move(up), hdr.source, hdr.destination); @@ -103,6 +109,16 @@ void RouterContext::enable(Application* app) } } +void RouterContext::disable(Application* app) +{ + if (app->port() != btp::port_type(0)) { + dispatcher_.set_non_interactive_handler(app->port(), nullptr); + } + dispatcher_.remove_promiscuous_hook(app->promiscuous_hook()); + + app->router_ = nullptr; +} + void RouterContext::require_position_fix(bool flag) { require_position_fix_ = flag; diff --git a/tools/socktap/router_context.hpp b/tools/socktap/router_context.hpp index a13787c14..641d7950d 100644 --- a/tools/socktap/router_context.hpp +++ b/tools/socktap/router_context.hpp @@ -19,9 +19,10 @@ class TimeTrigger; class RouterContext { public: - RouterContext(boost::asio::generic::raw_protocol::socket&, const vanetza::geonet::MIB&, TimeTrigger&, vanetza::PositionProvider&, vanetza::security::SecurityEntity&); + RouterContext(boost::asio::generic::raw_protocol::socket&, const vanetza::geonet::MIB&, TimeTrigger&, vanetza::PositionProvider&, vanetza::security::SecurityEntity*); ~RouterContext(); void enable(Application*); + void disable(Application*); /** * Allow/disallow transmissions without GNSS position fix diff --git a/vanetza/btp/port_dispatcher.cpp b/vanetza/btp/port_dispatcher.cpp index 50adf099d..0f5b4be9b 100644 --- a/vanetza/btp/port_dispatcher.cpp +++ b/vanetza/btp/port_dispatcher.cpp @@ -38,6 +38,13 @@ void PortDispatcher::add_promiscuous_hook(PromiscuousHook* hook) } } +void PortDispatcher::remove_promiscuous_hook(PromiscuousHook* hook) +{ + if (hook != nullptr) { + m_promiscuous_hooks.remove(hook); + } +} + void PortDispatcher::set_interactive_handler( port_type port, IndicationInterface* handler) diff --git a/vanetza/btp/port_dispatcher.hpp b/vanetza/btp/port_dispatcher.hpp index 28b1618af..5ae6a220e 100644 --- a/vanetza/btp/port_dispatcher.hpp +++ b/vanetza/btp/port_dispatcher.hpp @@ -55,6 +55,11 @@ class PortDispatcher : public geonet::TransportInterface */ void add_promiscuous_hook(PromiscuousHook*); + /** + * Remove a hook + */ + void remove_promiscuous_hook(PromiscuousHook*); + // Implementation of geonet::TransportInterface void indicate(const geonet::DataIndication&, std::unique_ptr) override; diff --git a/vanetza/geonet/router.cpp b/vanetza/geonet/router.cpp index 7eb7a47a1..d811f3f70 100644 --- a/vanetza/geonet/router.cpp +++ b/vanetza/geonet/router.cpp @@ -398,7 +398,6 @@ void Router::indicate_basic(IndicationContextBasic& ctx) indicate_secured(ctx, *basic); } else if (basic->next_header == NextHeaderBasic::Common) { if (!m_mib.itsGnSecurity || SecurityDecapHandling::Non_Strict == m_mib.itsGnSnDecapResultHandling) { - indication.security_report = security::DecapReport::Unsigned_Message, indicate_common(ctx, *basic); } else { packet_dropped(PacketDropReason::Decap_Unsuccessful_Strict);