demote IPSS unhandled frames to debug logs; closes #713

This commit is contained in:
Martin Michelsen
2025-11-07 21:10:40 -08:00
parent a122b27b1f
commit 1d11879142
+21 -31
View File
@@ -129,10 +129,7 @@ void IPSSClient::TCPConnection::linearize_outbound_data(size_t size) {
}
IPSSClient::IPSSClient(
shared_ptr<IPStackSimulator> sim,
uint64_t network_id,
VirtualNetworkProtocol protocol,
asio::ip::tcp::socket&& sock)
shared_ptr<IPStackSimulator> sim, uint64_t network_id, VirtualNetworkProtocol protocol, asio::ip::tcp::socket&& sock)
: io_context(sim->get_io_context()),
sim(sim),
network_id(network_id),
@@ -179,8 +176,7 @@ IPSSChannel::IPSSChannel(
std::string IPSSChannel::default_name() const {
auto ipc = this->ipss_client.lock();
if (ipc) {
string addr_str = str_for_endpoint(ipc->sock.remote_endpoint());
return std::format("ipss:N-{}:{}", ipc->network_id, addr_str);
return std::format("ipss:N-{}:{}", ipc->network_id, str_for_endpoint(ipc->sock.remote_endpoint()));
} else {
return std::format("ipss:N-{}:__unknown_address__", ipc->network_id);
}
@@ -213,9 +209,7 @@ void IPSSChannel::add_inbound_data(const void* data, size_t size) {
data = reinterpret_cast<const uint8_t*>(data) + direct_size;
size -= direct_size;
this->recv_buf_size -= direct_size;
this->recv_buf = this->recv_buf_size
? reinterpret_cast<uint8_t*>(this->recv_buf) + direct_size
: nullptr;
this->recv_buf = this->recv_buf_size ? (reinterpret_cast<uint8_t*>(this->recv_buf) + direct_size) : nullptr;
}
// If there is still data left after the above, add it to the pending inbound
@@ -357,11 +351,12 @@ string IPStackSimulator::str_for_tcp_connection(
asio::awaitable<void> IPStackSimulator::send_ethernet_tapserver_frame(
shared_ptr<IPSSClient> c, FrameInfo::Protocol proto, const void* data, size_t size) const {
struct {
struct TapServerEthernetHeader {
phosg::le_uint16_t frame_size;
EthernetHeader ether;
} header;
static_assert(sizeof(header) == 0x10, "Ethernet tapserver header size is incorrect");
} __attribute__((packed));
static_assert(sizeof(TapServerEthernetHeader) == 0x10, "Ethernet tapserver header size is incorrect");
TapServerEthernetHeader header;
header.ether.dest_mac = c->mac_addr;
header.ether.src_mac = this->host_mac_address_bytes;
@@ -381,9 +376,7 @@ asio::awaitable<void> IPStackSimulator::send_ethernet_tapserver_frame(
}
header.frame_size = size + sizeof(EthernetHeader);
array<asio::const_buffer, 2> bufs{
asio::buffer(static_cast<const void*>(&header), sizeof(header)),
asio::buffer(data, size)};
array<asio::const_buffer, 2> bufs{asio::buffer(static_cast<const void*>(&header), sizeof(header)), asio::buffer(data, size)};
co_await asio::async_write(c->sock, bufs, asio::use_awaitable);
}
@@ -465,8 +458,7 @@ asio::awaitable<void> IPStackSimulator::on_client_frame(shared_ptr<IPSSClient> c
FrameInfo fi(link_type, data, size);
if (this->log.should_log(phosg::LogLevel::L_DEBUG)) {
string fi_header = fi.header_str();
this->log.debug_f("Frame header: {}", fi_header);
this->log.debug_f("Frame header: {}", fi.header_str());
}
if (fi.ether) {
@@ -480,8 +472,7 @@ asio::awaitable<void> IPStackSimulator::on_client_frame(shared_ptr<IPSSClient> c
uint16_t stored_checksum = fi.stored_hdlc_checksum();
if (expected_checksum != stored_checksum) {
throw runtime_error(std::format(
"HDLC checksum is incorrect ({:04X} expected, {:04X} received)",
expected_checksum, stored_checksum));
"HDLC checksum is incorrect ({:04X} expected, {:04X} received)", expected_checksum, stored_checksum));
}
} else {
throw runtime_error("frame is not Ethernet or HDLC");
@@ -503,8 +494,7 @@ asio::awaitable<void> IPStackSimulator::on_client_frame(shared_ptr<IPSSClient> c
uint16_t expected_ipv4_checksum = fi.computed_ipv4_header_checksum();
if (fi.ipv4->checksum != expected_ipv4_checksum) {
throw runtime_error(std::format(
"IPv4 header checksum is incorrect ({:04X} expected, {:04X} received)",
expected_ipv4_checksum, fi.ipv4->checksum));
"IPv4 header checksum is incorrect ({:04X} expected, {:04X} received)", expected_ipv4_checksum, fi.ipv4->checksum));
}
if ((fi.ipv4->src_addr != c->ipv4_addr) && (fi.ipv4->src_addr != 0)) {
@@ -515,8 +505,7 @@ asio::awaitable<void> IPStackSimulator::on_client_frame(shared_ptr<IPSSClient> c
uint16_t expected_udp_checksum = fi.computed_udp4_checksum();
if (fi.udp->checksum != expected_udp_checksum) {
throw runtime_error(std::format(
"UDP checksum is incorrect ({:04X} expected, {:04X} received)",
expected_udp_checksum, fi.udp->checksum));
"UDP checksum is incorrect ({:04X} expected, {:04X} received)", expected_udp_checksum, fi.udp->checksum));
}
co_await this->on_client_udp_frame(c, fi);
@@ -524,8 +513,7 @@ asio::awaitable<void> IPStackSimulator::on_client_frame(shared_ptr<IPSSClient> c
uint16_t expected_tcp_checksum = fi.computed_tcp4_checksum();
if (fi.tcp->checksum != expected_tcp_checksum) {
throw runtime_error(std::format(
"TCP checksum is incorrect ({:04X} expected, {:04X} received)",
expected_tcp_checksum, fi.tcp->checksum));
"TCP checksum is incorrect ({:04X} expected, {:04X} received)", expected_tcp_checksum, fi.tcp->checksum));
}
co_await this->on_client_tcp_frame(c, fi);
@@ -991,8 +979,7 @@ asio::awaitable<void> IPStackSimulator::on_client_udp_frame(shared_ptr<IPSSClien
r_ipv4.size = sizeof(IPv4Header) + sizeof(UDPHeader) + r_data.size();
r_udp.size = sizeof(UDPHeader) + r_data.size();
r_ipv4.checksum = FrameInfo::computed_ipv4_header_checksum(r_ipv4);
r_udp.checksum = FrameInfo::computed_udp4_checksum(
r_ipv4, r_udp, r_data.data(), r_data.size());
r_udp.checksum = FrameInfo::computed_udp4_checksum(r_ipv4, r_udp, r_data.data(), r_data.size());
if (this->log.should_log(phosg::LogLevel::L_DEBUG)) {
string remote_str = this->str_for_ipv4_netloc(fi.ipv4->src_addr, fi.udp->src_port);
@@ -1106,11 +1093,15 @@ asio::awaitable<void> IPStackSimulator::on_client_tcp_frame(shared_ptr<IPSSClien
conn_str, conn->acked_server_seq, conn->next_client_seq);
} else {
// This frame isn't a SYN, so a connection object should already exist
// This frame isn't a SYN, so a connection object should already exist;
// ignore the frame if there's no connection
uint64_t key = this->tcp_conn_key_for_client_frame(fi);
auto conn_it = c->tcp_connections.find(key);
if (conn_it == c->tcp_connections.end()) {
throw runtime_error("non-SYN frame does not correspond to any open TCP connection");
if (this->log.debug_f("Ignoring non-SYN TCP frame with no active connection")) {
phosg::print_data(stderr, fi.payload, fi.payload_size);
}
co_return;
}
auto& conn = conn_it->second;
bool conn_valid = true;
@@ -1247,8 +1238,7 @@ asio::awaitable<void> IPStackSimulator::on_client_tcp_frame(shared_ptr<IPSSClien
conn->next_client_seq += payload_size;
conn->bytes_received += payload_size;
if (conn->next_client_seq < payload_size) {
this->log.warning_f("Client sequence number has wrapped (next={:08X}, bytes={:X})",
fi.tcp->seq_num, payload_size);
this->log.warning_f("Client sequence number has wrapped (next={:08X}, bytes={:X})", fi.tcp->seq_num, payload_size);
}
}