module Network.QUIC.Packet.Number (
encodePacketNumber
, decodePacketNumber
) where
import Network.QUIC.Imports
import Network.QUIC.Types
encodePacketNumber :: PacketNumber -> PacketNumber -> (EncodedPacketNumber, Int)
encodePacketNumber :: PacketNumber -> PacketNumber -> (EncodedPacketNumber, PacketNumber)
encodePacketNumber PacketNumber
largestPN PacketNumber
pn = (EncodedPacketNumber
diff, PacketNumber
bytes)
where
enoughRange :: PacketNumber
enoughRange = (PacketNumber
pn PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
- PacketNumber
largestPN) PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
* PacketNumber
2
(PacketNumber
pnMask, PacketNumber
bytes)
| PacketNumber
enoughRange PacketNumber -> PacketNumber -> Bool
forall a. Ord a => a -> a -> Bool
< PacketNumber
65536 = (PacketNumber
0x0000ffff, PacketNumber
2)
| PacketNumber
enoughRange PacketNumber -> PacketNumber -> Bool
forall a. Ord a => a -> a -> Bool
< PacketNumber
16777216 = (PacketNumber
0x00ffffff, PacketNumber
3)
| Bool
otherwise = (PacketNumber
0xffffffff, PacketNumber
4)
diff :: EncodedPacketNumber
diff = PacketNumber -> EncodedPacketNumber
forall a b. (Integral a, Num b) => a -> b
fromIntegral (PacketNumber
pn PacketNumber -> PacketNumber -> PacketNumber
forall a. Bits a => a -> a -> a
.&. PacketNumber
pnMask)
decodePacketNumber :: PacketNumber -> EncodedPacketNumber -> Int -> PacketNumber
decodePacketNumber :: PacketNumber -> EncodedPacketNumber -> PacketNumber -> PacketNumber
decodePacketNumber PacketNumber
largestPN EncodedPacketNumber
truncatedPN PacketNumber
bytes
| PacketNumber
candidatePN PacketNumber -> PacketNumber -> Bool
forall a. Ord a => a -> a -> Bool
<= PacketNumber
expectedPN PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
- PacketNumber
pnHwin
Bool -> Bool -> Bool
&& PacketNumber
candidatePN PacketNumber -> PacketNumber -> Bool
forall a. Ord a => a -> a -> Bool
< PacketNumber
mx PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
- PacketNumber
pnWin = PacketNumber
candidatePN PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
+ PacketNumber
pnWin
| PacketNumber
candidatePN PacketNumber -> PacketNumber -> Bool
forall a. Ord a => a -> a -> Bool
> PacketNumber
expectedPN PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
+ PacketNumber
pnHwin
Bool -> Bool -> Bool
&& PacketNumber
candidatePN PacketNumber -> PacketNumber -> Bool
forall a. Ord a => a -> a -> Bool
>= PacketNumber
pnWin = PacketNumber
candidatePN PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
- PacketNumber
pnWin
| Bool
otherwise = PacketNumber
candidatePN
where
mx :: PacketNumber
mx = PacketNumber
1 PacketNumber -> PacketNumber -> PacketNumber
forall a. Bits a => a -> PacketNumber -> a
.<<. PacketNumber
62
pnNbits :: PacketNumber
pnNbits = PacketNumber
bytes PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
* PacketNumber
8
expectedPN :: PacketNumber
expectedPN = PacketNumber
largestPN PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
+ PacketNumber
1
pnWin :: PacketNumber
pnWin = PacketNumber
1 PacketNumber -> PacketNumber -> PacketNumber
forall a. Bits a => a -> PacketNumber -> a
.<<. PacketNumber
pnNbits
pnHwin :: PacketNumber
pnHwin = PacketNumber
pnWin PacketNumber -> PacketNumber -> PacketNumber
forall a. Bits a => a -> PacketNumber -> a
.>>. PacketNumber
1
pnMask :: PacketNumber
pnMask = PacketNumber
pnWin PacketNumber -> PacketNumber -> PacketNumber
forall a. Num a => a -> a -> a
- PacketNumber
1
candidatePN :: PacketNumber
candidatePN = (PacketNumber
expectedPN PacketNumber -> PacketNumber -> PacketNumber
forall a. Bits a => a -> a -> a
.&. PacketNumber -> PacketNumber
forall a. Bits a => a -> a
complement PacketNumber
pnMask)
PacketNumber -> PacketNumber -> PacketNumber
forall a. Bits a => a -> a -> a
.|. EncodedPacketNumber -> PacketNumber
forall a b. (Integral a, Num b) => a -> b
fromIntegral EncodedPacketNumber
truncatedPN