| 824 | } |
| 825 | |
| 826 | void routing_manager_client::on_message(const byte_t* _data, length_t _size, const local_client_data& _peer_data) { |
| 827 | protocol::id_e its_id; |
| 828 | client_t its_client; |
| 829 | service_t its_service; |
| 830 | instance_t its_instance; |
| 831 | eventgroup_t its_eventgroup; |
| 832 | event_t its_event; |
| 833 | major_version_t its_major; |
| 834 | client_t its_subscriber; |
| 835 | remote_subscription_id_t its_pending_id(PENDING_SUBSCRIPTION_ID); |
| 836 | #ifndef VSOMEIP_DISABLE_SECURITY |
| 837 | bool is_internal_policy_update(false); |
| 838 | #endif // !VSOMEIP_DISABLE_SECURITY |
| 839 | std::vector<byte_t> its_buffer(_data, _data + _size); |
| 840 | protocol::error_e its_error; |
| 841 | |
| 842 | protocol::command_header its_header{}; |
| 843 | if (protocol::deserialize(_data, _size, its_header)) { |
| 844 | its_id = its_header.id_; |
| 845 | its_client = its_header.client_; |
| 846 | |
| 847 | bool is_from_routing = (_peer_data.id_ == VSOMEIP_ROUTING_CLIENT); |
| 848 | |
| 849 | if (configuration_->is_security_enabled() && routing_mode_ == routing_mode_e::UDS_ONLY && !is_from_routing |
| 850 | && _peer_data.id_ != its_client) { |
| 851 | VSOMEIP_WARNING_P << "Client 0x" << hex4(get_client()) << " received a message with command " << static_cast<int>(its_id) |
| 852 | << " from " << hex4(its_client) << " which doesn't match the bound client " << hex4(_peer_data.id_) |
| 853 | << " ~> skip message!"; |
| 854 | return; |
| 855 | } |
| 856 | |
| 857 | switch (its_id) { |
| 858 | case protocol::id_e::SEND_ID: { |
| 859 | protocol::send_command its_send_command(protocol::id_e::SEND_ID); |
| 860 | its_send_command.deserialize(its_buffer, its_error); |
| 861 | if (its_error == protocol::error_e::ERROR_OK) { |
| 862 | |
| 863 | auto a_deserializer = get_deserializer(); |
| 864 | a_deserializer->set_data(its_send_command.get_message()); |
| 865 | std::shared_ptr<message_impl> its_message = a_deserializer->deserialize_message(); |
| 866 | a_deserializer->reset(); |
| 867 | put_deserializer(a_deserializer); |
| 868 | |
| 869 | if (its_message) { |
| 870 | its_message->set_instance(its_send_command.get_instance()); |
| 871 | its_message->set_reliable(its_send_command.is_reliable()); |
| 872 | its_message->set_check_result(its_send_command.get_status()); |
| 873 | its_message->set_sec_client(_peer_data.sec_client_); |
| 874 | its_message->set_env(_peer_data.env_); |
| 875 | |
| 876 | if (!is_from_routing) { |
| 877 | if (utility::is_request(its_message->get_message_type())) { |
| 878 | if (configuration_->is_security_enabled() && routing_mode_ == routing_mode_e::UDS_ONLY |
| 879 | && its_message->get_client() != _peer_data.id_) { |
| 880 | VSOMEIP_WARNING << "vSomeIP Security: Client 0x" << hex4(get_client()) |
| 881 | << " received a request from client 0x" << hex4(its_message->get_client()) |
| 882 | << " to service/instance/method " << hex4(its_message->get_service()) << "/" |
| 883 | << hex4(its_message->get_instance()) << "/" << hex4(its_message->get_method()) |
nothing calls this directly
no test coverage detected