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.