Browse Source

nfqws: backport QUICDefragCrypto

pull/2130/head
bol-van 3 months ago
parent
commit
a92b4a543e
  1. 49
      nfq/protocol.c

49
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; uint64_t offset,sz,szmax=0,zeropos=0,pos=0;
bool found=false; bool found=false;
struct range64 ranges[MAX_DEFRAG_PIECES]; struct range64 ranges[MAX_DEFRAG_PIECES];
int i,range=0; int i,j,range=0;
while(pos<clean_len) while(pos<clean_len)
{ {
@ -893,42 +893,59 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
memset(defrag_data+zeropos,0,offset-zeropos); memset(defrag_data+zeropos,0,offset-zeropos);
if ((offset+sz) > zeropos) if ((offset+sz) > zeropos)
zeropos=offset+sz; zeropos=offset+sz;
memcpy(defrag_data+offset,clean+pos,sz); memcpy(defrag_data+offset,clean+pos,sz);
if ((offset+sz) > szmax) szmax = offset+sz; if ((offset+sz) > szmax) szmax = offset+sz;
found=true; found=true;
pos+=sz; pos+=sz;
// remove exact duplicates early to save cpu
for(i=0;i<range;i++)
if (ranges[i].offset==offset && ranges[i].len==sz)
goto endloop;
ranges[range].offset = offset; ranges[range].offset = offset;
ranges[range].len = sz; ranges[range].len = sz;
range++; range++;
} }
endloop:
} }
if (found) if (found)
{ {
defrag[0] = 6;
defrag[1] = 0; // offset
// 2..9 - length 64 bit
// +10 - data start
phton64(defrag+2,szmax);
defrag[2] |= 0xC0; // 64 bit value
*defrag_len = (size_t)(szmax+10);
qsort(ranges, range, sizeof(*ranges), cmp_range64); qsort(ranges, range, sizeof(*ranges), cmp_range64);
// for(i=0 ; i<range ; i++) // for(i=0 ; i<range ; i++)
// printf("RANGE %zu len %zu\n",ranges[i].offset,ranges[i].len); // printf("range1 %llu-%llu\n",ranges[i].offset,ranges[i].offset+ranges[i].len);
for(i=0,offset=0,*bFull=true ; i<range ; i++) if (range>0)
{ {
if (ranges[i].offset!=offset) for (j=0,i=1; i < range; i++)
{ {
*bFull = false; uint64_t current_end = ranges[j].offset + ranges[j].len;
break; 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];
} }
offset += ranges[i].len; range = j+1;
} }
// for(i=0 ; i<range ; i++)
// printf("range2 %llu-%llu\n",ranges[i].offset,ranges[i].offset+ranges[i].len);
defrag[0] = 6;
defrag[1] = 0; // offset
// 2..9 - length 64 bit
// +10 - data start
phton64(defrag+2,szmax);
defrag[2] |= 0xC0; // 64 bit value
*defrag_len = (size_t)(szmax+10);
*bFull = range==1 && !ranges[0].offset;
//printf("bFull=%u\n",*bFull); //printf("bFull=%u\n",*bFull);
} }
return found; return found;
@ -975,6 +992,8 @@ bool IsQUICInitial(const uint8_t *data, size_t len)
if (data[offset] > QUIC_MAX_CID_LENGTH) return false; if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
offset += 1 + data[offset]; offset += 1 + data[offset];
if (offset>=len) return false;
// SCID // SCID
if (data[offset] > QUIC_MAX_CID_LENGTH) return false; if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
offset += 1 + data[offset]; offset += 1 + data[offset];

Loading…
Cancel
Save