From a92b4a543eea6d0dd5265396841d45b4525c5e58 Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 4 Mar 2026 22:49:25 +0300 Subject: [PATCH] nfqws: backport QUICDefragCrypto --- nfq/protocol.c | 51 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/nfq/protocol.c b/nfq/protocol.c index fd4ce038..74659ea9 100644 --- a/nfq/protocol.c +++ b/nfq/protocol.c @@ -866,7 +866,7 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz uint64_t offset,sz,szmax=0,zeropos=0,pos=0; bool found=false; struct range64 ranges[MAX_DEFRAG_PIECES]; - int i,range=0; + int i,j,range=0; while(pos zeropos) zeropos=offset+sz; + memcpy(defrag_data+offset,clean+pos,sz); if ((offset+sz) > szmax) szmax = offset+sz; found=true; pos+=sz; + // remove exact duplicates early to save cpu + for(i=0;i0) + { + for (j=0,i=1; i < range; i++) + { + uint64_t current_end = ranges[j].offset + ranges[j].len; + uint64_t next_start = ranges[i].offset; + uint64_t next_end = ranges[i].offset + ranges[i].len; + + if (next_start <= current_end) + ranges[j].len = MAX(next_end,current_end) - ranges[j].offset; + else + ranges[++j] = ranges[i]; + } + range = j+1; + } + +// for(i=0 ; i QUIC_MAX_CID_LENGTH) return false; offset += 1 + data[offset]; + if (offset>=len) return false; + // SCID if (data[offset] > QUIC_MAX_CID_LENGTH) return false; offset += 1 + data[offset];