15 #include "common/logger.h" 
   21 namespace tcp_channel {
 
  182       msg << 
"unknown source address.";
 
  185       msg << 
"all socket active.";
 
  188       msg << 
"SA different on already connected socket.";
 
  191       msg << 
"SA active on different socket.";
 
  194       msg << 
"missing authentication.";
 
  197       msg << 
"rejected confirmation.";
 
  200       msg << 
"unsupported routing activation type.";
 
  203       msg << 
"required TLS socket.";
 
  206       msg << 
"unknown reason.";
 
  209   msg << 
" (0x" << std::hex << static_cast<int>(act_type.
act_type_) << 
")";
 
  221     -> std::vector<std::uint8_t> {
 
  222   std::vector<std::uint8_t> output_buffer{};
 
  225   output_buffer.emplace_back(
static_cast<std::uint8_t
>((payload_type & 0xFF00) >> 8));
 
  226   output_buffer.emplace_back(
static_cast<std::uint8_t
>(payload_type & 0x00FF));
 
  227   output_buffer.emplace_back(
static_cast<std::uint8_t
>((payload_len & 0xFF000000) >> 24));
 
  228   output_buffer.emplace_back(
static_cast<std::uint8_t
>((payload_len & 0x00FF0000) >> 16));
 
  229   output_buffer.emplace_back(
static_cast<std::uint8_t
>((payload_len & 0x0000FF00) >> 8));
 
  230   output_buffer.emplace_back(
static_cast<std::uint8_t
>(payload_len & 0x000000FF));
 
  231   return output_buffer;
 
  262                             std::make_unique<kIdle>(RoutingActivationState::kIdle));
 
  265                             std::make_unique<kWaitForRoutingActivationRes>(
 
  266                                 RoutingActivationState::kWaitForRoutingActivationRes));
 
  269                             std::make_unique<kRoutingActivationSuccessful>(
 
  270                                 RoutingActivationState::kRoutingActivationSuccessful));
 
  273                             std::make_unique<kRoutingActivationFailed>(
 
  274                                 RoutingActivationState::kRoutingActivationFailed));
 
  348   if (handler_impl_->GetStateContext().GetActiveState().GetState() ==
 
  349       RoutingActivationState::kWaitForRoutingActivationRes) {
 
  351     RoutingActivationAckType 
const rout_act_type{doip_payload.GetPayload()[0u]};
 
  352     switch (rout_act_type.act_type_) {
 
  355         final_state = RoutingActivationState::kRoutingActivationSuccessful;
 
  357             FILE_NAME, __LINE__, __func__, [&doip_payload](std::stringstream &msg) {
 
  358               msg << 
"RoutingActivation successfully activated in remote " 
  359                      "server with logical Address" 
  360                   << 
" (0x" << std::hex << doip_payload.GetServerAddress() << 
")";
 
  366             FILE_NAME, __LINE__, __func__, [&doip_payload](std::stringstream &msg) {
 
  367               msg << 
"RoutingActivation is activated, confirmation required in " 
  368                      "remote server with logical Address" 
  369                   << 
" (0x" << std::hex << doip_payload.GetServerAddress() << 
")";
 
  375             FILE_NAME, __LINE__, __func__, [&rout_act_type](std::stringstream &msg) {
 
  376               msg << 
"Routing activation denied due to " << rout_act_type;
 
  380     handler_impl_->GetStateContext().TransitionTo(final_state);
 
  381     handler_impl_->GetSyncTimer().CancelWait();
 
  392   if (handler_impl_->GetStateContext().GetActiveState().GetState() ==
 
  393       RoutingActivationState::kIdle) {
 
  394     if (SendRoutingActivationRequest(std::move(routing_activation_request)) ==
 
  397       handler_impl_->GetStateContext().TransitionTo(
 
  398           RoutingActivationState::kWaitForRoutingActivationRes);
 
  399       handler_impl_->GetSyncTimer().WaitForTimeout(
 
  402             handler_impl_->GetStateContext().TransitionTo(RoutingActivationState::kIdle);
 
  404                 FILE_NAME, __LINE__, 
"", [](std::stringstream &msg) {
 
  405                   msg << 
"RoutingActivation response timeout, no response " 
  411             if (handler_impl_->GetStateContext().GetActiveState().GetState() ==
 
  412                 RoutingActivationState::kRoutingActivationSuccessful) {
 
  416                   FILE_NAME, __LINE__, 
"", [](std::stringstream &msg) {
 
  417                     msg << 
"RoutingActivation successful with remote server";
 
  420               handler_impl_->GetStateContext().TransitionTo(RoutingActivationState::kIdle);
 
  422                   FILE_NAME, __LINE__, 
"", [](std::stringstream &msg) {
 
  423                     msg << 
"RoutingActivation failed with remote server";
 
  430       handler_impl_->GetStateContext().TransitionTo(RoutingActivationState::kIdle);
 
  432           FILE_NAME, __LINE__, 
"", [](std::stringstream &msg) {
 
  433             msg << 
"RoutingActivation Request send failed with remote server";
 
  440         [](std::stringstream &msg) { msg << 
"RoutingActivation channel not free"; });
 
  446   return (
handler_impl_->GetStateContext().GetActiveState().GetState() ==
 
  447           RoutingActivationState::kRoutingActivationSuccessful);
 
  457   TcpMessage::BufferType compose_routing_activation_req{
 
  462   compose_routing_activation_req.emplace_back(
 
  463       static_cast<std::uint8_t
>((message->GetSa() & 0xFF00) >> 8u));
 
  464   compose_routing_activation_req.emplace_back(
static_cast<std::uint8_t
>(message->GetSa() & 0x00FF));
 
  468   compose_routing_activation_req.emplace_back(0x00);
 
  469   compose_routing_activation_req.emplace_back(0x00);
 
  470   compose_routing_activation_req.emplace_back(0x00);
 
  471   compose_routing_activation_req.emplace_back(0x00);
 
  474       std::make_unique<TcpMessage>(message->GetHostIpAddress(), message->GetHostPortNumber(),
 
  475                                    std::move(compose_routing_activation_req))};
 
  477   if (handler_impl_->GetSocketHandler().Transmit(std::move(doip_routing_act_req))) {
 
Immutable class to store received doip message.
 
Class implements routing activation handler.
 
RoutingActivationStateContext state_context_
Stores the routing activation states.
 
auto GetStateContext() noexcept -> RoutingActivationStateContext &
Function to get the Routing Activation State context.
 
sockets::TcpSocketHandler & tcp_socket_handler_
The reference to socket handler.
 
auto GetSyncTimer() noexcept -> SyncTimer &
Function to get the sync timer.
 
SyncTimer sync_timer_
Store the synchronous timer.
 
void Stop()
Function to stop the handler.
 
RoutingActivationHandlerImpl(sockets::TcpSocketHandler &tcp_socket_handler)
Constructs an instance of RoutingActivationHandlerImpl.
 
void Reset()
Function to reset the handler.
 
auto GetSocketHandler() noexcept -> sockets::TcpSocketHandler &
Function to get the socket handler.
 
void Start()
Function to start the handler.
 
sockets::TcpSocketHandler::MessagePtr TcpMessagePtr
Type alias for Tcp message pointer.
 
void Stop()
Function to stop the handler.
 
void Reset()
Function to reset the handler.
 
void ProcessDoIPRoutingActivationResponse(DoipMessage &doip_payload) noexcept
Function to process received routing activation response.
 
auto SendRoutingActivationRequest(uds_transport::UdsMessageConstPtr routing_activation_request) noexcept -> uds_transport::UdsTransportProtocolMgr::TransmissionResult
Function to send routing activation request.
 
~RoutingActivationHandler()
Destruct an instance of RoutingActivationHandler.
 
RoutingActivationHandler(sockets::TcpSocketHandler &tcp_socket_handler)
Constructs an instance of RoutingActivationHandler.
 
std::unique_ptr< RoutingActivationHandlerImpl > handler_impl_
Stores the Handler implementation.
 
auto HandleRoutingActivationRequest(uds_transport::UdsMessageConstPtr routing_activation_request) noexcept -> uds_transport::UdsTransportProtocolMgr::ConnectionResult
Function to handle sending of routing activation request.
 
auto IsRoutingActivated() noexcept -> bool
Check if routing activation is active for this handler.
 
void Start()
Function to start the handler.
 
Class implements routing activation failure.
 
kRoutingActivationFailed(RoutingActivationState state)
Constructs an instance of kRoutingActivationFailed.
 
void Start() override
Function to start the current state.
 
void Stop() override
Function to stop the current state.
 
Class implements routing activation success.
 
kRoutingActivationSuccessful(RoutingActivationState state)
Constructs an instance of kRoutingActivationSuccessful.
 
void Start() override
Function to start the current state.
 
void Stop() override
Function to stop the current state.
 
Class implements idle state.
 
kIdle(RoutingActivationState state)
Constructs an instance of kIdle.
 
void Start() override
Function to start the current state.
 
void Stop() override
Function to stop the current state.
 
Class implements wait for routing activation response.
 
void Start() override
Function to start the current state.
 
kWaitForRoutingActivationRes(RoutingActivationState state)
Constructs an instance of kWaitForRoutingActivationRes.
 
void Stop() override
Function to stop the current state.
 
static auto GetDiagClientLogger() noexcept -> DoipClientLogger &
 
Handler class to manage different socket of various client (Udp / Tcp)
 
void TransitionTo(EnumState state)
 
void AddState(EnumState state, std::unique_ptr< State< EnumState >> state_ptr)
 
void CancelWait()
Function to cancel the synchronous wait.
 
auto IsTimerActive()
Function to query if timer is running.
 
constexpr std::uint8_t kDoipRoutingActivationResCodeUnknownSa
Routing Activation response code values.
 
RoutingActivationState
Different routing activation state.
 
constexpr std::uint32_t kDoipRoutingActivationReqMinLen
Routing Activation request lengths.
 
constexpr std::uint8_t kDoipRoutingActivationResCodeDifferentSa
 
constexpr std::uint8_t kDoip_RoutingActivation_ReqActType_CentralSec
 
constexpr std::uint32_t kDoipRoutingActivationReqMaxLen
 
constexpr std::uint8_t kDoip_RoutingActivation_ReqActType_Default
Routing Activation request activation types.
 
constexpr std::uint8_t kDoipRoutingActivationResCodeUnsupportdActType
 
constexpr std::uint16_t kDoip_RoutingActivation_ResType
 
constexpr std::uint8_t kDoipRoutingActivationResCodeConfirmtnRejectd
 
std::ostream & operator<<(std::ostream &msg, RoutingActivationAckType act_type)
Function to stream the routing activation type.
 
constexpr std::uint8_t kDoipRoutingActivationResCodeActiveSa
 
constexpr std::uint8_t kDoipRoutingActivationResCodeAuthentnMissng
 
constexpr std::uint8_t kDoip_RoutingActivation_ReqActType_WWHOBD
 
constexpr std::uint8_t kDoipRoutingActivationResCodeAllSocketActive
 
constexpr std::uint8_t kDoipRoutingActivationResCodeConfirmtnRequired
 
constexpr std::uint32_t kDoIPRoutingActivationTimeout
The timeout value for a DoIP Routing Activation request.
 
constexpr std::uint8_t kDoipRoutingActivationResCodeRoutingSuccessful
 
constexpr std::uint16_t kDoip_RoutingActivation_ReqType
Routing Activation response Type.
 
constexpr std::uint8_t kDoipRoutingActivationResCodeTlsRequired
 
auto CreateDoipGenericHeader(std::uint16_t payload_type, std::uint32_t payload_len) noexcept -> std::vector< std::uint8_t >
Function to create doip generic header.
 
SocketHandler< boost_support::client::tcp::TcpClient > TcpSocketHandler
Type alias of Tcp socket handler.
 
constexpr std::uint8_t kDoipheadrSize
 
constexpr std::uint8_t kDoip_ProtocolVersion
 
std::unique_ptr< const UdsMessage > UdsMessageConstPtr
 
Type holding activation type.
 
State
Definitions of different connection state.