Skip to content

Commit e3f4f53

Browse files
KyllianAubryGitHub Enterprise
authored andcommitted
SKA-889: fix asio throw in ethernet mode (#147)
1 parent 59ffef3 commit e3f4f53

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

eth/adapter/EthSocketToEthControllerAdapter.cpp

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ EthSocketToEthControllerAdapter::EthSocketToEthControllerAdapter(SilKit::IPartic
3939
const std::string& ethernetControllerName,
4040
const std::string& ethernetNetworkName,
4141
bool enableDomainSockets)
42-
: _socket{io_context}
42+
: _ioContext{&io_context}
43+
, _socket{io_context}
4344
, _logger{participant->GetLogger()}
4445
, _ethController(participant->CreateEthernetController(ethernetControllerName, ethernetNetworkName))
4546
, _onNewFrameHandler(std::move([&](std::vector<std::uint8_t> data) {
@@ -117,13 +118,31 @@ EthSocketToEthControllerAdapter::EthSocketToEthControllerAdapter(SilKit::IPartic
117118
_ethController->Activate();
118119
}
119120

121+
void ShutdownEthSocketToEthControllerAdapter(SilKit::Services::Logging::ILogger* logger, asio::io_context* ioContext,
122+
asio::generic::stream_protocol::socket& socket,
123+
const std::string& logMessage)
124+
{
125+
logger->Error(logMessage);
126+
socket.close();
127+
ioContext->stop();
128+
#ifdef WIN32
129+
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
130+
#else
131+
std::raise(SIGINT);
132+
#endif
133+
}
134+
120135
void EthSocketToEthControllerAdapter::DoReceiveFrameFromQemu()
121136
{
122137
asio::async_read(_socket, asio::buffer(_frame_size_buffer.data(), _frame_size_buffer.size()),
123138
[this](const std::error_code ec, const std::size_t bytes_received) {
124139
if (ec || bytes_received != _frame_size_buffer.size())
125140
{
126-
throw IncompleteReadError{};
141+
const std::string errorMsg =
142+
"Error during socket read. Closing the socket and shutting down the adapter. (error code="
143+
+ std::to_string(ec.value()) + ", message=" + ec.message() + ")";
144+
145+
ShutdownEthSocketToEthControllerAdapter(_logger, _ioContext, _socket, errorMsg);
127146
}
128147

129148
std::uint32_t frame_size = 0;
@@ -134,14 +153,22 @@ void EthSocketToEthControllerAdapter::DoReceiveFrameFromQemu()
134153

135154
if (frame_size > _frame_data_buffer.size())
136155
{
137-
throw InvalidFrameSizeError{};
156+
const std::string errorMsg =
157+
"Invalid frame size. Closing the socket and shutting down the adapter. (frame size="
158+
+ std::to_string(frame_size) + ")";
159+
160+
ShutdownEthSocketToEthControllerAdapter(_logger, _ioContext, _socket, errorMsg);
138161
}
139162

140163
asio::async_read(_socket, asio::buffer(_frame_data_buffer.data(), frame_size),
141164
[this, frame_size](const std::error_code ec, const std::size_t bytes_received) {
142165
if (ec || bytes_received != frame_size)
143166
{
144-
throw IncompleteReadError{};
167+
const std::string errorMsg =
168+
"Error during socket read. Closing the socket and shutting down the adapter. (error code="
169+
+ std::to_string(ec.value()) + ", message=" + ec.message() + ")";
170+
171+
ShutdownEthSocketToEthControllerAdapter(_logger, _ioContext, _socket, errorMsg);
145172
}
146173

147174
auto frame_data = std::vector<std::uint8_t>(frame_size);

eth/adapter/EthSocketToEthControllerAdapter.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class EthSocketToEthControllerAdapter
4242
private:
4343
void DoReceiveFrameFromQemu();
4444

45+
asio::io_context* _ioContext;
4546
asio::generic::stream_protocol::socket _socket;
4647
SilKit::Services::Logging::ILogger* _logger;
4748

0 commit comments

Comments
 (0)