...
1
2
3
4
5 package quic
6
7
8
9
10
11 type packetNumber int64
12
13 const maxPacketNumber = 1<<62 - 1
14
15
16
17
18
19
20
21
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
38
39
40
41
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
56
57
58
59
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
View as plain text