diff options
-rw-r--r-- | example/reader_util.c | 14 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 14 |
2 files changed, 26 insertions, 2 deletions
diff --git a/example/reader_util.c b/example/reader_util.c index 9ec50486c..b981d2f7a 100644 --- a/example/reader_util.c +++ b/example/reader_util.c @@ -688,7 +688,7 @@ static struct ndpi_flow_info *get_ndpi_flow_info(struct ndpi_workflow * workflow *proto = iph->protocol; l4 = ((const u_int8_t *) l3 + l4_offset); - if(iph->protocol == IPPROTO_TCP && l4_packet_len >= 20) { + if(iph->protocol == IPPROTO_TCP && l4_packet_len >= sizeof(struct ndpi_tcphdr)) { u_int tcp_len; // tcp @@ -699,7 +699,7 @@ static struct ndpi_flow_info *get_ndpi_flow_info(struct ndpi_workflow * workflow *payload = (u_int8_t*)&l4[tcp_len]; *payload_len = ndpi_max(0, l4_packet_len-4*(*tcph)->doff); l4_data_len = l4_packet_len - sizeof(struct ndpi_tcphdr); - } else if(iph->protocol == IPPROTO_UDP && l4_packet_len >= 8) { + } else if(iph->protocol == IPPROTO_UDP && l4_packet_len >= sizeof(struct ndpi_udphdr)) { // udp workflow->stats.udp_count++; @@ -708,6 +708,16 @@ static struct ndpi_flow_info *get_ndpi_flow_info(struct ndpi_workflow * workflow *payload = (u_int8_t*)&l4[sizeof(struct ndpi_udphdr)]; *payload_len = (l4_packet_len > sizeof(struct ndpi_udphdr)) ? l4_packet_len-sizeof(struct ndpi_udphdr) : 0; l4_data_len = l4_packet_len - sizeof(struct ndpi_udphdr); + } else if(iph->protocol == IPPROTO_ICMP || iph->protocol == IPPROTO_ICMPV6) { + if (iph->protocol == IPPROTO_ICMP) { + *payload = (u_int8_t*)&l4[sizeof(struct ndpi_icmphdr )]; + *payload_len = (l4_packet_len > sizeof(struct ndpi_icmphdr)) ? l4_packet_len-sizeof(struct ndpi_icmphdr) : 0; + l4_data_len = l4_packet_len - sizeof(struct ndpi_icmphdr); + } else { + *payload = (u_int8_t*)&l4[sizeof(struct ndpi_icmp6hdr)]; + *payload_len = (l4_packet_len > sizeof(struct ndpi_icmp6hdr)) ? l4_packet_len-sizeof(struct ndpi_icmp6hdr) : 0; + l4_data_len = l4_packet_len - sizeof(struct ndpi_icmp6hdr); + } } else { // non tcp/udp protocols *sport = *dport = 0; diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index b67a22a14..e817b6c84 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -348,6 +348,20 @@ struct ndpi_icmphdr { } un; } PACK_OFF; +/* +++++++++++++++++++++++ ICMP6 header +++++++++++++++++++++++ */ + +PACK_ON +struct ndpi_icmp6hdr { + uint8_t icmp6_type; /* type field */ + uint8_t icmp6_code; /* code field */ + uint16_t icmp6_cksum; /* checksum field */ + union { + uint32_t icmp6_un_data32[1]; /* type-specific field */ + uint16_t icmp6_un_data16[2]; /* type-specific field */ + uint8_t icmp6_un_data8[4]; /* type-specific field */ + } icmp6_dataun; +} PACK_OFF; + /* +++++++++++++++++++++++ VXLAN header +++++++++++++++++++++++ */ PACK_ON |