Source file src/vendor/golang.org/x/net/quic/packet_number.go
1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package quic 6 7 // A packetNumber is a QUIC packet number. 8 // Packet numbers are integers in the range [0, 2^62-1]. 9 // 10 // https://www.rfc-editor.org/rfc/rfc9000.html#section-12.3 11 type packetNumber int64 12 13 const maxPacketNumber = 1<<62 - 1 // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1-1 14 15 // decodePacketNumber decodes a truncated packet number, given 16 // the largest acknowledged packet number in this number space, 17 // the truncated number received in a packet, and the size of the 18 // number received in bytes. 19 // 20 // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1 21 // https://www.rfc-editor.org/rfc/rfc9000.html#section-a.3 22 func decodePacketNumber(largest, truncated packetNumber, numLenInBytes int) packetNumber { 23 expected := largest + 1 24 win := packetNumber(1) << (uint(numLenInBytes) * 8) 25 hwin := win / 2 26 mask := win - 1 27 candidate := (expected &^ mask) | truncated 28 if candidate <= expected-hwin && candidate < (1<<62)-win { 29 return candidate + win 30 } 31 if candidate > expected+hwin && candidate >= win { 32 return candidate - win 33 } 34 return candidate 35 } 36 37 // appendPacketNumber appends an encoded packet number to b. 38 // The packet number must be larger than the largest acknowledged packet number. 39 // When no packets have been acknowledged yet, largestAck is -1. 40 // 41 // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1-5 42 func appendPacketNumber(b []byte, pnum, largestAck packetNumber) []byte { 43 switch packetNumberLength(pnum, largestAck) { 44 case 1: 45 return append(b, byte(pnum)) 46 case 2: 47 return append(b, byte(pnum>>8), byte(pnum)) 48 case 3: 49 return append(b, byte(pnum>>16), byte(pnum>>8), byte(pnum)) 50 default: 51 return append(b, byte(pnum>>24), byte(pnum>>16), byte(pnum>>8), byte(pnum)) 52 } 53 } 54 55 // packetNumberLength returns the minimum length, in bytes, needed to encode 56 // a packet number given the largest acknowledged packet number. 57 // The packet number must be larger than the largest acknowledged packet number. 58 // 59 // https://www.rfc-editor.org/rfc/rfc9000.html#section-17.1-5 60 func packetNumberLength(pnum, largestAck packetNumber) int { 61 d := pnum - largestAck 62 switch { 63 case d < 0x80: 64 return 1 65 case d < 0x8000: 66 return 2 67 case d < 0x800000: 68 return 3 69 default: 70 return 4 71 } 72 } 73