aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/reader_util.c14
-rw-r--r--src/include/ndpi_typedefs.h14
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