Diag-Client-Lib
doip_message.cpp
Go to the documentation of this file.
1 /* Diagnostic Client library
2 * Copyright (C) 2024 Avijit Dey
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8 #include "common/doip_message.h"
9 
10 namespace doip_client {
11 namespace {
12 
13 auto GetDoIPPayloadType(core_type::Span<std::uint8_t> payload) noexcept -> std::uint16_t {
14  return (static_cast<std::uint16_t>(((payload[2u] & 0xFF) << 8) | (payload[3u] & 0xFF)));
15 }
16 
17 auto GetDoIPPayloadLength(core_type::Span<std::uint8_t> payload) noexcept -> std::uint32_t {
18  return ((static_cast<std::uint32_t>(payload[4u] << 24) & 0xFF000000) |
19  (static_cast<std::uint32_t>(payload[5u] << 16) & 0x00FF0000) |
20  (static_cast<std::uint32_t>(payload[6u] << 8) & 0x0000FF00) |
21  (static_cast<std::uint32_t>(payload[7u] & 0x000000FF)));
22 }
23 
24 auto GetServerAddr(core_type::Span<std::uint8_t> payload) noexcept -> std::uint16_t {
25  return (static_cast<std::uint16_t>(((payload[0u] & 0xFF) << 8) | (payload[1u] & 0xFF)));
26 }
27 
28 auto GetClientAddr(core_type::Span<std::uint8_t> payload) noexcept -> std::uint16_t {
29  return (static_cast<std::uint16_t>(((payload[2u] & 0xFF) << 8) | (payload[3u] & 0xFF)));
30 }
31 
32 } // namespace
33 
35  std::uint16_t host_port_number, core_type::Span<std::uint8_t> payload)
36  : message_type_{message_type},
37  host_ip_address_{host_ip_address},
38  host_port_number_{host_port_number},
39  protocol_version_{payload[0u]},
40  protocol_version_inv_{payload[1u]},
41  server_address_{0u},
42  client_address_{0u},
43  payload_type_{GetDoIPPayloadType(payload)},
44  payload_length_{GetDoIPPayloadLength(payload)} {
45  constexpr std::uint8_t kDoipHeaderSize{8u};
46  constexpr std::uint8_t kSourceAddressSize{4u};
47 
49  ? // header + server address(2 byte) + client address(2 byte)
50  core_type::Span<std::uint8_t>{&payload[kDoipHeaderSize + kSourceAddressSize],
51  payload.size() - (kDoipHeaderSize + kSourceAddressSize)}
52  : core_type::Span<std::uint8_t>{&payload[kDoipHeaderSize], payload.size() - kDoipHeaderSize};
53  if (message_type == MessageType::kTcp) {
54  server_address_ = GetServerAddr(payload);
55  client_address_ = GetClientAddr(payload);
56  } // no client
57 }
58 
59 } // namespace doip_client
constexpr size_type size() const noexcept
Return the size of this Span.
Definition: span.h:508
MessageType message_type_
Store the message type.
Definition: doip_message.h:124
DoipMessage(MessageType message_type, IpAddressType host_ip_address, std::uint16_t host_port_number, core_type::Span< std::uint8_t > payload)
Constructs an instance of DoipMessage.
std::uint16_t client_address_
Store server address.
Definition: doip_message.h:153
MessageType
Definition of message type.
Definition: doip_message.h:26
std::uint16_t server_address_
Store server address.
Definition: doip_message.h:148
core_type::Span< std::uint8_t > payload_
Store payload.
Definition: doip_message.h:168
std::string_view IpAddressType
Type alias of IP address type.
Definition: doip_message.h:36
auto GetClientAddr(core_type::Span< std::uint8_t > payload) noexcept -> std::uint16_t
auto GetServerAddr(core_type::Span< std::uint8_t > payload) noexcept -> std::uint16_t
auto GetDoIPPayloadLength(core_type::Span< std::uint8_t > payload) noexcept -> std::uint32_t
auto GetDoIPPayloadType(core_type::Span< std::uint8_t > payload) noexcept -> std::uint16_t