Fix tcp4 frag error caused by enabled IP fragmentation

If the packet is fragmented here is no way to deal with it, but we don't
care about DF flag in real
This commit is contained in:
Vadim Vetrov 2024-08-07 11:38:26 +03:00
parent 1b8d3a0e66
commit c9949a3605
No known key found for this signature in database
GPG Key ID: E8A308689D7A73A5
2 changed files with 10 additions and 6 deletions

View File

@ -226,7 +226,11 @@ int tcp4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
} }
if (!(ntohs(hdr->frag_off) & IP_DF)) { if (
ntohs(hdr->frag_off) & IP_MF ||
ntohs(hdr->frag_off) & IP_OFFMASK) {
printf("tcp4_frag: frag value: %d\n",
ntohs(hdr->frag_off));
lgerror("tcp4_frag: ip fragmentation is set", -EINVAL); lgerror("tcp4_frag: ip fragmentation is set", -EINVAL);
return -EINVAL; return -EINVAL;
} }

View File

@ -383,7 +383,7 @@ static int process_packet(const struct packet_data packet, struct queue_data qda
mid_offset, frag1, &f1len, frag2, &f2len)) < 0) { mid_offset, frag1, &f1len, frag2, &f2len)) < 0) {
errno = -ret; errno = -ret;
perror("tcp4_frag"); perror("tcp4_frag");
goto send_verd; goto fallback;
} }
#elif defined(USE_IP_FRAGMENTATION) #elif defined(USE_IP_FRAGMENTATION)
@ -395,7 +395,7 @@ static int process_packet(const struct packet_data packet, struct queue_data qda
mid_offset, frag1, &f1len, frag2, &f2len)) < 0) { mid_offset, frag1, &f1len, frag2, &f2len)) < 0) {
errno = -ret; errno = -ret;
perror("ip4_frag"); perror("ip4_frag");
goto send_verd; goto fallback;
} }
#else #else
@ -404,7 +404,7 @@ static int process_packet(const struct packet_data packet, struct queue_data qda
errno = -ret; errno = -ret;
perror("raw pack send"); perror("raw pack send");
} }
goto send_verd; goto fallback;
#endif #endif
ret = send_raw_socket(frag2, f2len); ret = send_raw_socket(frag2, f2len);
@ -412,7 +412,7 @@ static int process_packet(const struct packet_data packet, struct queue_data qda
errno = -ret; errno = -ret;
perror("raw frags send: frag2"); perror("raw frags send: frag2");
goto send_verd; goto fallback;
} }
#ifdef SEG2_DELAY #ifdef SEG2_DELAY
@ -430,7 +430,7 @@ static int process_packet(const struct packet_data packet, struct queue_data qda
errno = -ret; errno = -ret;
perror("raw frags send: frag1"); perror("raw frags send: frag1");
goto send_verd; goto fallback;
} }
#endif #endif