| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build go1.21 |
| |
| package quic |
| |
| // A packetNumber is a QUIC packet number. |
| // Packet numbers are integers in the range [0, 2^62-1]. |
| // |
| // https://www.rfc-editor.org/rfc/rfc9000.html#section-12.3 |
| type packetNumber int64 |
| |
| const maxPacketNumber = 1<<62 - 1 // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1-1 |
| |
| // decodePacketNumber decodes a truncated packet number, given |
| // the largest acknowledged packet number in this number space, |
| // the truncated number received in a packet, and the size of the |
| // number received in bytes. |
| // |
| // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1 |
| // https://www.rfc-editor.org/rfc/rfc9000.html#section-a.3 |
| func decodePacketNumber(largest, truncated packetNumber, numLenInBytes int) packetNumber { |
| expected := largest + 1 |
| win := packetNumber(1) << (uint(numLenInBytes) * 8) |
| hwin := win / 2 |
| mask := win - 1 |
| candidate := (expected &^ mask) | truncated |
| if candidate <= expected-hwin && candidate < (1<<62)-win { |
| return candidate + win |
| } |
| if candidate > expected+hwin && candidate >= win { |
| return candidate - win |
| } |
| return candidate |
| } |
| |
| // appendPacketNumber appends an encoded packet number to b. |
| // The packet number must be larger than the largest acknowledged packet number. |
| // When no packets have been acknowledged yet, largestAck is -1. |
| // |
| // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1-5 |
| func appendPacketNumber(b []byte, pnum, largestAck packetNumber) []byte { |
| switch packetNumberLength(pnum, largestAck) { |
| case 1: |
| return append(b, byte(pnum)) |
| case 2: |
| return append(b, byte(pnum>>8), byte(pnum)) |
| case 3: |
| return append(b, byte(pnum>>16), byte(pnum>>8), byte(pnum)) |
| default: |
| return append(b, byte(pnum>>24), byte(pnum>>16), byte(pnum>>8), byte(pnum)) |
| } |
| } |
| |
| // packetNumberLength returns the minimum length, in bytes, needed to encode |
| // a packet number given the largest acknowledged packet number. |
| // The packet number must be larger than the largest acknowledged packet number. |
| // |
| // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1-5 |
| func packetNumberLength(pnum, largestAck packetNumber) int { |
| d := pnum - largestAck |
| switch { |
| case d < 0x80: |
| return 1 |
| case d < 0x8000: |
| return 2 |
| case d < 0x800000: |
| return 3 |
| default: |
| return 4 |
| } |
| } |