Skip to content
This repository has been archived by the owner on Aug 17, 2023. It is now read-only.

Commit

Permalink
WIP: fixed ACK frame, add more tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
zensh committed Jul 16, 2017
1 parent f29679c commit 6fc94bb
Show file tree
Hide file tree
Showing 3 changed files with 619 additions and 70 deletions.
60 changes: 30 additions & 30 deletions lib/frame.js
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,8 @@ class AckFrame extends Frame {
constructor () {
super(0b01000000, 'ACK')

this.largestAcked = null // largestPacketNumber
this.lowestAcked = null // lowestPacketNumber
this.largestAcked = 0 // largestPacketNumber
this.lowestAcked = 0 // lowestPacketNumber
// has to be ordered. The ACK range with the highest firstNum goes first, the ACK range with the lowest firstNum goes last
this.ackRanges = []
this.delayTime = 0 // microseconds
Expand All @@ -274,7 +274,7 @@ class AckFrame extends Frame {
return false
}

if (this.ackRanges[0].lastNum !== this.largestAcked.value) {
if (this.ackRanges[0].lastNum !== this.largestAcked) {
return false
}

Expand Down Expand Up @@ -308,8 +308,8 @@ class AckFrame extends Frame {
let numRanges = 0
for (let i = 1, l = this.ackRanges.length; i < l; i++) {
let lastAckRange = this.ackRanges[i - 1]
let gap = lastAckRange.firstNum - this.ackRanges[i] - 1
let rangeLength = 1 + gap / 0xff
let gap = lastAckRange.firstNum - this.ackRanges[i].lastNum - 1
let rangeLength = 1 + Math.floor(gap / 0xff)

if (gap % 0xff === 0) rangeLength--
if (numRanges + rangeLength < 0xff) numRanges += rangeLength
Expand All @@ -330,7 +330,7 @@ class AckFrame extends Frame {
}
}
} else {
maxRangeLength = this.largestAcked.delta(this.lowestAcked) + 1
maxRangeLength = this.largestAcked - this.lowestAcked + 1
}

if (maxRangeLength <= 0xff) return 0
Expand All @@ -340,9 +340,8 @@ class AckFrame extends Frame {
}

// AcksPacket determines if this ACK frame acks a certain packet number
acksPacket (packetNumber) {
let val = packetNumber.value
if (val < this.lowestAcked.value || val > this.largestAcked.value) {
acksPacket (val) {
if (val < this.lowestAcked || val > this.largestAcked) {
return false
}

Expand All @@ -356,19 +355,21 @@ class AckFrame extends Frame {
return false
}
// if packet doesn't have missing ranges
return (val >= this.lowestAcked.value && val <= this.largestAcked.value)
return (val >= this.lowestAcked && val <= this.largestAcked)
}

toBuffer () {
if (this._buf) return this._buf

let hasMissingRanges = this.hasMissingRanges()
if (hasMissingRanges) this.type |= 0b100000
this.type |= this.largestAcked.flagBits << 2

let largestAckedNum = PacketNumber.fromValue(this.largestAcked)
this.type |= largestAckedNum.flagBits << 2
let flagBits = this.getMissingNumberDeltaFlagBits()
this.type |= flagBits

let largestAckedLen = this.largestAcked.byteLen
let largestAckedLen = largestAckedNum.byteLen
let missingNumberDeltaLen = PacketNumber.flagToByteLen(flagBits)
let frameLen = 1 + largestAckedLen + 2
let numRanges = 0
Expand All @@ -387,7 +388,7 @@ class AckFrame extends Frame {
let v = new Visitor(0, 1)
this._buf.writeUInt8(this.type)
v.walk(largestAckedLen)
this.largestAcked.toBuffer().copy(this._buf, v.start, 0, largestAckedLen)
largestAckedNum.toBuffer().copy(this._buf, v.start, 0, largestAckedLen)

v.walk(2)
if (!this.delayTime && this.packetReceivedTime) {
Expand All @@ -404,15 +405,15 @@ class AckFrame extends Frame {

let firstAckBlockLength = 0
if (!hasMissingRanges) {
firstAckBlockLength = this.largestAcked.value - this.lowestAcked.value + 1
firstAckBlockLength = this.largestAcked - this.lowestAcked + 1
} else {
if (this.largestAcked.value !== this.ackRanges[0].lastNum) {
if (this.largestAcked !== this.ackRanges[0].lastNum) {
throw new Error('largestAcked does not match ACK ranges')
}
if (this.lowestAcked.value !== this.ackRanges[this.ackRanges.length - 1].firstNum) {
if (this.lowestAcked !== this.ackRanges[this.ackRanges.length - 1].firstNum) {
throw new Error('lowestAcked does not match ACK ranges')
}
firstAckBlockLength = this.largestAcked.value - this.ackRanges[0].firstNum + 1
firstAckBlockLength = this.largestAcked - this.ackRanges[0].firstNum + 1
numRangesWritten++
}

Expand All @@ -423,7 +424,7 @@ class AckFrame extends Frame {
let length = this.ackRanges[i].lastNum - this.ackRanges[i].firstNum + 1
let gap = this.ackRanges[i - 1].firstNum - this.ackRanges[i].lastNum - 1

let num = gap / 0xff + 1
let num = Math.floor(gap / 0xff) + 1
if (gap % 0xff === 0) {
num--
}
Expand Down Expand Up @@ -480,7 +481,7 @@ class AckFrame extends Frame {
let v = new Visitor(pos + 1)
v.walk(largestAckedLen)
if (buf.length < v.end) throw new QuicError('QUIC_INVALID_FRAME_DATA')
frame.largestAcked = new PacketNumber(buf.slice(v.start, v.end))
frame.largestAcked = new PacketNumber(buf.slice(v.start, v.end)).value

v.walk(2)
if (buf.length < v.end) throw new QuicError('QUIC_INVALID_FRAME_DATA')
Expand All @@ -498,7 +499,7 @@ class AckFrame extends Frame {
v.walk(missingNumberDeltaLen)
if (buf.length < v.end) throw new QuicError('QUIC_INVALID_FRAME_DATA')
let ackBlockLength = buf.readUIntLE(v.start, missingNumberDeltaLen, true)
let largestAcked = frame.largestAcked.value
let largestAcked = frame.largestAcked
if ((largestAcked > 0 && ackBlockLength < 1) || ackBlockLength > largestAcked) {
throw new QuicError('QUIC_INVALID_FRAME_DATA')
}
Expand Down Expand Up @@ -545,13 +546,12 @@ class AckFrame extends Frame {
if (!lastRangeComplete) {
frame.ackRanges = frame.ackRanges.slice(0, -1)
}
frame.lowestAcked = PacketNumber.fromValue(
frame.ackRanges[frame.ackRanges.length - 1].firstNum)
frame.lowestAcked = frame.ackRanges[frame.ackRanges.length - 1].firstNum
} else {
if (frame.largestAcked.value === 0) {
frame.lowestAcked = PacketNumber.fromValue(0)
if (frame.largestAcked === 0) {
frame.lowestAcked = 0
} else {
frame.lowestAcked = PacketNumber.fromValue(largestAcked - ackBlockLength + 1)
frame.lowestAcked = largestAcked - ackBlockLength + 1
}
}

Expand Down Expand Up @@ -619,26 +619,26 @@ class AckRange {
class StopWaitingFrame extends Frame {
constructor (packetNumber, leastUnacked) {
super(0x06, 'STOP_WAITING')
this.packetNumber = packetNumber
this.packetNumber = packetNumber // packetNumber > leastUnacked
this.leastUnacked = leastUnacked
}

toBuffer () {
if (this._buf) return this._buf
let len = this.packetNumber.byteLen
let len = PacketNumber.fromValue(this.packetNumber).byteLen
this._buf = Buffer.alloc(1 + len)
this._buf.writeUInt8(this.type)
this._buf.writeUIntLE(this.packetNumber.delta(this.leastUnacked), 1, len)
this._buf.writeUIntLE(this.packetNumber - this.leastUnacked, 1, len)
return this._buf
}

static fromBuffer (buf, pos, packetNumber) {
let len = packetNumber.byteLen
let len = PacketNumber.fromValue(packetNumber).byteLen
let v = new Visitor(pos, pos + 1 + len)
if (buf[v.start] !== 6 || buf.length < v.end) throw new QuicError('QUIC_INVALID_STOP_WAITING_DATA')

let delta = buf.readIntLE(1, len, false)
let frame = new StopWaitingFrame(packetNumber, PacketNumber.fromValue(packetNumber.value - delta))
let frame = new StopWaitingFrame(packetNumber, packetNumber - delta)
frame._len = v.end - pos
return frame
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"authors": [
"Yan Qing <[email protected]>"
],
"version": "0.0.2",
"version": "0.0.3",
"main": "lib/index.js",
"license": "MIT",
"repository": {
Expand Down
Loading

0 comments on commit 6fc94bb

Please sign in to comment.