From e7f13cca244490ee6f5fc6e80c6836384b562568 Mon Sep 17 00:00:00 2001 From: garciay <yann.garcia@fscom.fr> Date: Fri, 31 Jan 2025 16:32:35 +0100 Subject: [PATCH] Bug fixed in SCTP offline --- ccsrc/Protocols/Sctp/sctp_offline_layer.cc | 26 ++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/ccsrc/Protocols/Sctp/sctp_offline_layer.cc b/ccsrc/Protocols/Sctp/sctp_offline_layer.cc index 051bdcf..2ae3e45 100644 --- a/ccsrc/Protocols/Sctp/sctp_offline_layer.cc +++ b/ccsrc/Protocols/Sctp/sctp_offline_layer.cc @@ -111,24 +111,24 @@ void sctp_offline_layer::process_chunk(const OCTETSTRING& p_chunk, params &p_par p += 2; // Skip Chunk type + Chunk flag // Chunk length uint16_t l = (*p << 8 | *(p + 1)) & 0xffff; - loggers::get_instance().log("sctp_offline_layer::receive_data: l: %d", l); + loggers::get_instance().log("sctp_offline_layer::process_chunk: l: %d", l); p += 2; p += 4; // Skip Transmission sequence number // Stream identifier OCTETSTRING stream_id = OCTETSTRING(2, p); - loggers::get_instance().log_msg("sctp_offline_layer::receive_data: stream_id: ", stream_id); + loggers::get_instance().log_msg("sctp_offline_layer::process_chunk: stream_id: ", stream_id); p += 2; // Stream sequence number OCTETSTRING stream_num = OCTETSTRING(2, p); - loggers::get_instance().log_msg("sctp_offline_layer::receive_data: stream_num: ", stream_num); + loggers::get_instance().log_msg("sctp_offline_layer::process_chunk: stream_num: ", stream_num); p += 2; // Protocol uint32_t protocol = (*p << 24 | *(p + 1) << 16 | *(p + 2) << 8 | *(p + 3)) & 0xffffffff; - loggers::get_instance().log("sctp_offline_layer::receive_data: protocol: %d", protocol); + loggers::get_instance().log("sctp_offline_layer::process_chunk: protocol: %d", protocol); p += 4; - loggers::get_instance().log("sctp_offline_layer::receive_data: pointer offset: %d", (uint32_t)(p - static_cast<const uint8_t*>(p_chunk))); + loggers::get_instance().log("sctp_offline_layer::process_chunk: pointer offset: %d", (uint32_t)(p - static_cast<const uint8_t*>(p_chunk))); p_payload = OCTETSTRING(p_chunk.lengthof() - (uint32_t)(p - static_cast<const uint8_t*>(p_chunk)), p); } break; @@ -136,7 +136,19 @@ void sctp_offline_layer::process_chunk(const OCTETSTRING& p_chunk, params &p_par break; case 0x02: // INIT_ACK chunk break; - case 0x03: // SACK + case 0x03: { // SACK + loggers::get_instance().log("sctp_offline_layer::process_chunk (SACK): position: %02x", static_cast<const uint8_t>(*(p))); + const uint8_t f = static_cast<const uint8_t>(*(p + 1)); + loggers::get_instance().log("sctp_offline_layer::process_chunk (SACK): flags: %04x", f); + const uint16_t l = static_cast<const uint16_t>((*(p + 2) << 8 | *(p + 3)) & 0xffff); + loggers::get_instance().log("sctp_offline_layer::process_chunk (SACK): length: %d", l); + loggers::get_instance().log("sctp_offline_layer::process_chunk (SACK): p_chunk.lengthof(): %d", p_chunk.lengthof()); + if (p_chunk.lengthof() > l) { + // Extract and process the next chunk + OCTETSTRING chunk(p_chunk.lengthof() - l, p + l); + process_chunk(chunk, p_params, p_payload); + } + } break; case 0x04: // HEARTBEAT break; @@ -147,7 +159,7 @@ void sctp_offline_layer::process_chunk(const OCTETSTRING& p_chunk, params &p_par case 0x0b: // COOKIE_ACK chunk break; default: // - loggers::get_instance().warning("sctp_offline_layer::send_data: Unprocessed chunk: 0x%02x", *p); + loggers::get_instance().warning("sctp_offline_layer::process_chunk: Unprocessed chunk: 0x%02x", *p); } loggers::get_instance().log_msg("<<< sctp_offline_layer::process_chunk: p_payload: ", p_payload); -- GitLab