aboutsummaryrefslogtreecommitdiff
path: root/example
diff options
context:
space:
mode:
authorNardi Ivan <nardi.ivan@gmail.com>2021-09-18 10:37:01 +0200
committerNardi Ivan <nardi.ivan@gmail.com>2021-09-19 17:29:22 +0200
commit03d3e1bafcc2cd966e6590f26de53a3b70901425 (patch)
treefca1cbf4a22ad3435ec00561df6a88746fc981bd /example
parent994bd0696b348adbdd29ede905a53d548c2a2cff (diff)
Fix parsing of ipv6 packets with extension headers
Decoding of ipv6 traffic with extension headers was completely broken, since the beginning of the L4 header was always set to a wrong value. Handle the ipv6 fragments in the same way as the ipv4 ones: keep the first one and drop the others.
Diffstat (limited to 'example')
-rw-r--r--example/reader_util.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/example/reader_util.c b/example/reader_util.c
index 9a96810b6..453660ce7 100644
--- a/example/reader_util.c
+++ b/example/reader_util.c
@@ -669,6 +669,7 @@ static struct ndpi_flow_info *get_ndpi_flow_info(struct ndpi_workflow * workflow
u_int16_t ip_offset,
u_int16_t ipsize,
u_int16_t l4_packet_len,
+ u_int16_t l4_offset,
struct ndpi_tcphdr **tcph,
struct ndpi_udphdr **udph,
u_int16_t *sport, u_int16_t *dport,
@@ -679,7 +680,7 @@ static struct ndpi_flow_info *get_ndpi_flow_info(struct ndpi_workflow * workflow
u_int16_t *payload_len,
u_int8_t *src_to_dst_direction,
pkt_timeval when) {
- u_int32_t idx, l4_offset, hashval;
+ u_int32_t idx, hashval;
struct ndpi_flow_info flow;
void *ret;
const u_int8_t *l3, *l4;
@@ -697,11 +698,9 @@ static struct ndpi_flow_info *get_ndpi_flow_info(struct ndpi_workflow * workflow
/* || (iph->frag_off & htons(0x1FFF)) != 0 */)
return NULL;
- l4_offset = iph->ihl * 4;
l3 = (const u_int8_t*)iph;
} else {
- l4_offset = sizeof(struct ndpi_ipv6hdr);
- if(sizeof(struct ndpi_ipv6hdr) > ipsize)
+ if(l4_offset > ipsize)
return NULL;
l3 = (const u_int8_t*)iph6;
@@ -988,7 +987,7 @@ static struct ndpi_flow_info *get_ndpi_flow_info6(struct ndpi_workflow * workflo
return(get_ndpi_flow_info(workflow, 6, vlan_id, tunnel_type,
&iph, iph6, ip_offset, ipsize,
- ntohs(iph6->ip6_hdr.ip6_un1_plen),
+ ip_len, l4ptr - (const u_int8_t *)iph6,
tcph, udph, sport, dport,
src, dst, proto, payload,
payload_len, src_to_dst_direction, when));
@@ -1325,6 +1324,7 @@ static struct ndpi_proto packet_processing(struct ndpi_workflow * workflow,
tunnel_type, iph, NULL,
ip_offset, ipsize,
ntohs(iph->tot_len) - (iph->ihl * 4),
+ iph->ihl * 4,
&tcph, &udph, &sport, &dport,
&src, &dst, &proto,
&payload, &payload_len, &src_to_dst_direction, when);