Skip to content

Commit

Permalink
Disable crc32 offloading and remove zero checksum option.
Browse files Browse the repository at this point in the history
  • Loading branch information
melpon committed Oct 25, 2023
1 parent 283488d commit 8f6203f
Showing 1 changed file with 6 additions and 16 deletions.
22 changes: 6 additions & 16 deletions src/impl/sctptransport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ SctpTransport::InstancesSet *SctpTransport::Instances = new InstancesSet;

void SctpTransport::Init() {
usrsctp_init(0, SctpTransport::WriteCallback, SctpTransport::DebugCallback);
usrsctp_enable_crc32c_offload(); // We'll compute CRC32 only for outgoing packets
usrsctp_sysctl_set_sctp_pr_enable(1); // Enable Partial Reliability Extension (RFC 3758)
usrsctp_sysctl_set_sctp_ecn_enable(0); // Disable Explicit Congestion Notification
#ifdef SCTP_DEBUG
Expand Down Expand Up @@ -284,15 +283,13 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
throw std::runtime_error("Could not disable SCTP fragmented interleave, errno=" +
std::to_string(errno));

// When using SCTP over DTLS, the data integrity is ensured by DTLS, so there's no need to
// additionally compute CRC32c.
// When using SCTP over DTLS, the data integrity is ensured by DTLS. Therefore, there's no need
// to check CRC32c additionally when receiving.
// See https://datatracker.ietf.org/doc/html/draft-ietf-tsvwg-sctp-zero-checksum
if (config.sctpZeroChecksum) {
int on = 1;
if (usrsctp_setsockopt(mSock, IPPROTO_SCTP, SCTP_ACCEPT_ZERO_CHECKSUM, &on, sizeof(on)))
throw std::runtime_error("Could set socket option SCTP_ACCEPT_ZERO_CHECKSUM, errno=" +
std::to_string(errno));
}
int edmid = SCTP_EDMID_LOWER_LAYER_DTLS;
if (usrsctp_setsockopt(mSock, IPPROTO_SCTP, SCTP_ACCEPT_ZERO_CHECKSUM, &edmid, sizeof(edmid)))
throw std::runtime_error("Could set socket option SCTP_ACCEPT_ZERO_CHECKSUM, errno=" +
std::to_string(errno));

int rcvBuf = 0;
socklen_t rcvBufLen = sizeof(rcvBuf);
Expand Down Expand Up @@ -970,13 +967,6 @@ void SctpTransport::UpcallCallback(struct socket *, void *arg, int /* flags */)
int SctpTransport::WriteCallback(void *ptr, void *data, size_t len, uint8_t tos, uint8_t set_df) {
auto *transport = static_cast<SctpTransport *>(ptr);

// Set the CRC32 ourselves as we have enabled CRC32 offloading
if (len >= 12) {
uint32_t *checksum = reinterpret_cast<uint32_t *>(data) + 2;
*checksum = 0;
*checksum = usrsctp_crc32c(data, len);
}

// Workaround for sctplab/usrsctp#405: Send callback is invoked on already closed socket
// https://github.com/sctplab/usrsctp/issues/405
if (auto locked = Instances->lock(transport))
Expand Down

0 comments on commit 8f6203f

Please sign in to comment.