Skip to content

Commit 40811ef

Browse files
committed
Fixed equal starting seq / ack case, added more tests
1 parent 04f486c commit 40811ef

2 files changed

Lines changed: 32 additions & 14 deletions

File tree

  • src

src/main/kotlin/com/jasonernst/knet/transport/tcp/TcpHeader.kt

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,10 @@ data class TcpHeader(
355355

356356
override fun toString(): String =
357357
"TcpHeader{" +
358-
"sourcePort=" + Integer.toUnsignedString(sourcePort.toInt() and 0xFFFF) +
359-
", destinationPort=" + Integer.toUnsignedString(destinationPort.toInt() and 0xFFFF) +
360-
", sequenceNumber=" + sequenceNumber +
361-
", acknowledgementNumber=" + acknowledgementNumber +
358+
"srcPort=" + Integer.toUnsignedString(sourcePort.toInt() and 0xFFFF) +
359+
", dstPort=" + Integer.toUnsignedString(destinationPort.toInt() and 0xFFFF) +
360+
", seq=" + sequenceNumber +
361+
", ack=" + acknowledgementNumber +
362362
", dataOffset=" + Integer.toUnsignedString(getDataOffset().toInt()) +
363363
", cwr=" + cwr +
364364
", ece=" + ece +
@@ -379,25 +379,27 @@ data class TcpHeader(
379379
startingAcknowledgement: UInt,
380380
): String {
381381
val seq =
382-
if (sequenceNumber > startingSequenceNumber) {
382+
if (sequenceNumber >= startingSequenceNumber) {
383383
sequenceNumber - startingSequenceNumber
384384
} else {
385385
UInt.MAX_VALUE - startingSequenceNumber + sequenceNumber
386386
}
387387
val ack =
388-
if (acknowledgementNumber > startingAcknowledgement) {
388+
if (acknowledgementNumber >= startingAcknowledgement) {
389389
acknowledgementNumber - startingAcknowledgement
390390
} else {
391391
UInt.MAX_VALUE - startingAcknowledgement + acknowledgementNumber
392392
}
393393

394394
return "TcpHeader{" +
395-
"sourcePort=" + Integer.toUnsignedString(sourcePort.toInt() and 0xFFFF) +
396-
", destinationPort=" + Integer.toUnsignedString(destinationPort.toInt() and 0xFFFF) +
397-
", sequenceNumber=" + seq +
398-
", acknowledgementNumber=" + ack +
399-
", rawSequenceNumber=" + sequenceNumber +
400-
", rawAcknowledgementNumber=" + acknowledgementNumber +
395+
"srcPort=" + Integer.toUnsignedString(sourcePort.toInt() and 0xFFFF) +
396+
", dstPort=" + Integer.toUnsignedString(destinationPort.toInt() and 0xFFFF) +
397+
", seq=" + seq +
398+
", ack=" + ack +
399+
", rawSeq=" + sequenceNumber +
400+
", rawAck=" + acknowledgementNumber +
401+
", rawStartSeq=" + startingSequenceNumber +
402+
", rawStartAck=" + startingAcknowledgement +
401403
", dataOffset=" + Integer.toUnsignedString(getDataOffset().toInt()) +
402404
", cwr=" + cwr +
403405
", ece=" + ece +

src/test/kotlin/com/jasonernst/knet/transport/tcp/TcpTests.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,25 @@ class TcpTests {
7676
@Test fun toStringWithSequenceAndAck() {
7777
val tcpHeader = TcpHeader(sequenceNumber = 1000u, acknowledgementNumber = 2000u)
7878

79+
// ensure the sequence is correct in the good case without wraparound
7980
val headerString = tcpHeader.toString(startingSequenceNumber = 10u, startingAcknowledgement = 1500u)
8081
println(headerString)
81-
assertTrue(headerString.contains("sequenceNumber=990"))
82-
assertTrue(headerString.contains("acknowledgementNumber=500"))
82+
assertTrue(headerString.contains("seq=990"))
83+
assertTrue(headerString.contains("ack=500"))
84+
85+
// make sure when we have the same starting seq and ack to the header, we get 0s
86+
val headerString2 = tcpHeader.toString(startingSequenceNumber = 1000u, startingAcknowledgement = 2000u)
87+
println(headerString2)
88+
assertTrue(headerString2.contains("seq=0"))
89+
assertTrue(headerString2.contains("ack=0"))
90+
91+
// make sure the wraparound case works
92+
val headerString3 = tcpHeader.toString(startingSequenceNumber = 1001u, startingAcknowledgement = 2002u)
93+
println(headerString3)
94+
val expectedSeq = UInt.MAX_VALUE - 1001u + tcpHeader.sequenceNumber
95+
println(expectedSeq)
96+
assertTrue(headerString3.contains("seq=$expectedSeq"))
97+
val expectedAck = UInt.MAX_VALUE - 2002u + tcpHeader.acknowledgementNumber
98+
assertTrue(headerString3.contains("ack=$expectedAck"))
8399
}
84100
}

0 commit comments

Comments
 (0)