1/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */ 2#include <stdint.h> 3#include <stdlib.h> 4 5#include "lsquic_packet_common.h" 6#include "lsquic_packet_gquic.h" 7 8 9 10lsquic_packno_t 11lsquic_restore_packno (lsquic_packno_t cur_packno, 12 unsigned len, 13 lsquic_packno_t max_packno) 14{ 15 lsquic_packno_t candidates[3], epoch_delta; 16 int64_t diffs[3]; 17 unsigned min; 18 19 epoch_delta = 1ULL << (len << 3); 20 candidates[1] = (max_packno & ~(epoch_delta - 1)) + cur_packno; 21 candidates[0] = candidates[1] - epoch_delta; 22 candidates[2] = candidates[1] + epoch_delta; 23 24 diffs[0] = llabs((int64_t) candidates[0] - (int64_t) max_packno); 25 diffs[1] = llabs((int64_t) candidates[1] - (int64_t) max_packno); 26 diffs[2] = llabs((int64_t) candidates[2] - (int64_t) max_packno); 27 28 min = diffs[1] < diffs[0]; 29 if (diffs[2] < diffs[min]) 30 min = 2; 31 32 return candidates[min]; 33} 34