| 2271 | } |
| 2272 | |
| 2273 | void routing_manager_impl::send_error(return_code_e _return_code, const byte_t* _data, length_t _size, instance_t _instance, bool _reliable, |
| 2274 | boardnet_endpoint* const _receiver, const boost::asio::ip::address& _remote_address, |
| 2275 | std::uint16_t _remote_port) { |
| 2276 | |
| 2277 | client_t its_client = 0; |
| 2278 | service_t its_service = 0; |
| 2279 | method_t its_method = 0; |
| 2280 | session_t its_session = 0; |
| 2281 | major_version_t its_version = 0; |
| 2282 | |
| 2283 | if (_size >= VSOMEIP_CLIENT_POS_MAX) |
| 2284 | its_client = bithelper::read_uint16_be(&_data[VSOMEIP_CLIENT_POS_MIN]); |
| 2285 | if (_size >= VSOMEIP_SERVICE_POS_MAX) |
| 2286 | its_service = bithelper::read_uint16_be(&_data[VSOMEIP_SERVICE_POS_MIN]); |
| 2287 | if (_size >= VSOMEIP_METHOD_POS_MAX) |
| 2288 | its_method = bithelper::read_uint16_be(&_data[VSOMEIP_METHOD_POS_MIN]); |
| 2289 | if (_size >= VSOMEIP_SESSION_POS_MAX) |
| 2290 | its_session = bithelper::read_uint16_be(&_data[VSOMEIP_SESSION_POS_MIN]); |
| 2291 | if (_size >= VSOMEIP_INTERFACE_VERSION_POS) |
| 2292 | its_version = _data[VSOMEIP_INTERFACE_VERSION_POS]; |
| 2293 | |
| 2294 | auto error_message = runtime::get()->create_message(_reliable); |
| 2295 | error_message->set_client(its_client); |
| 2296 | error_message->set_instance(_instance); |
| 2297 | error_message->set_interface_version(its_version); |
| 2298 | error_message->set_message_type(message_type_e::MT_ERROR); |
| 2299 | error_message->set_method(its_method); |
| 2300 | error_message->set_return_code(_return_code); |
| 2301 | error_message->set_service(its_service); |
| 2302 | error_message->set_session(its_session); |
| 2303 | { |
| 2304 | std::shared_ptr<serializer> its_serializer(get_serializer()); |
| 2305 | if (its_serializer->serialize(error_message.get())) { |
| 2306 | if (_receiver) { |
| 2307 | auto its_endpoint_def = std::make_shared<endpoint_definition>(_remote_address, _remote_port, _receiver->is_reliable()); |
| 2308 | its_endpoint_def->set_remote_port(_receiver->get_local_port()); |
| 2309 | auto its_endpoint = |
| 2310 | ep_mgr_impl_->find_server_endpoint(its_endpoint_def->get_remote_port(), its_endpoint_def->is_reliable()); |
| 2311 | if (its_endpoint) { |
| 2312 | its_endpoint->send_error(its_endpoint_def, its_serializer->get_data(), its_serializer->get_size()); |
| 2313 | trace::header its_header; |
| 2314 | if (its_header.prepare(its_endpoint, true, _instance, |
| 2315 | its_endpoint->is_reliable() ? trace::protocol_e::tcp : trace::protocol_e::udp)) |
| 2316 | tc_->trace(its_header.data_, VSOMEIP_TRACE_HEADER_SIZE, _data, _size); |
| 2317 | } |
| 2318 | } |
| 2319 | its_serializer->reset(); |
| 2320 | put_serializer(its_serializer); |
| 2321 | } else { |
| 2322 | VSOMEIP_ERROR << "Failed to serialize error message."; |
| 2323 | } |
| 2324 | } |
| 2325 | } |
| 2326 | |
| 2327 | std::chrono::steady_clock::time_point routing_manager_impl::expire_subscriptions(bool _force) { |
| 2328 |
nothing calls this directly
no test coverage detected