aboutsummaryrefslogtreecommitdiff
path: root/src/lib/protocols/mail_smtp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/protocols/mail_smtp.c')
-rw-r--r--src/lib/protocols/mail_smtp.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/src/lib/protocols/mail_smtp.c b/src/lib/protocols/mail_smtp.c
index 5899027b9..fcb390229 100644
--- a/src/lib/protocols/mail_smtp.c
+++ b/src/lib/protocols/mail_smtp.c
@@ -49,10 +49,20 @@
static void ndpi_int_mail_smtp_add_connection(struct ndpi_detection_module_struct
*ndpi_struct, struct ndpi_flow_struct *flow) {
+#ifdef SMTP_DEBUG
+ printf("**** %s()\n", __FUNCTION__);
+#endif
+
ndpi_set_detected_protocol(ndpi_struct, flow,
NDPI_PROTOCOL_MAIL_SMTP, NDPI_PROTOCOL_UNKNOWN);
}
+/* **************************************** */
+
+static void smtpInitExtraPacketProcessing(struct ndpi_flow_struct *flow);
+
+/* **************************************** */
+
void ndpi_search_mail_smtp_tcp(struct ndpi_detection_module_struct *ndpi_struct,
struct ndpi_flow_struct *flow) {
struct ndpi_packet_struct *packet = &flow->packet;
@@ -66,7 +76,7 @@ void ndpi_search_mail_smtp_tcp(struct ndpi_detection_module_struct *ndpi_struct,
u_int8_t a;
u_int8_t bit_count = 0;
- NDPI_PARSE_PACKET_LINE_INFO(ndpi_struct, flow,packet);
+ NDPI_PARSE_PACKET_LINE_INFO(ndpi_struct, flow, packet);
for(a = 0; a < packet->parsed_lines; a++) {
// expected server responses
@@ -225,12 +235,12 @@ void ndpi_search_mail_smtp_tcp(struct ndpi_detection_module_struct *ndpi_struct,
NDPI_LOG_INFO(ndpi_struct, "mail smtp identified\n");
#ifdef SMTP_DEBUG
- printf("%s() [bit_count: %u][%s]\n", __FUNCTION__, bit_count, flow->protos.ftp_imap_pop_smtp.password);
+ printf("%s() [bit_count: %u][%s]\n", __FUNCTION__,
+ bit_count, flow->protos.ftp_imap_pop_smtp.password);
#endif
- if(flow->protos.ftp_imap_pop_smtp.password[0] != '\0')
- ndpi_int_mail_smtp_add_connection(ndpi_struct, flow);
-
+ ndpi_int_mail_smtp_add_connection(ndpi_struct, flow);
+ smtpInitExtraPacketProcessing(flow);
return;
}
@@ -248,10 +258,42 @@ void ndpi_search_mail_smtp_tcp(struct ndpi_detection_module_struct *ndpi_struct,
return;
}
- NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+ if(!flow->check_extra_packets)
+ NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
+}
+
+/* **************************************** */
+
+int ndpi_extra_search_mail_smtp_tcp(struct ndpi_detection_module_struct *ndpi_struct,
+ struct ndpi_flow_struct *flow) {
+ int rc;
+
+ ndpi_search_mail_smtp_tcp(ndpi_struct, flow);
+ rc = (flow->protos.ftp_imap_pop_smtp.password[0] == '\0') ? 1 : 0;
+
+#ifdef SMTP_DEBUG
+ printf("**** %s() [rc: %d]\n", __FUNCTION__, rc);
+#endif
+
+ return(rc);
+}
+
+/* **************************************** */
+
+static void smtpInitExtraPacketProcessing(struct ndpi_flow_struct *flow) {
+#ifdef SMTP_DEBUG
+ printf("**** %s()\n", __FUNCTION__);
+#endif
+
+ flow->check_extra_packets = 1;
+ /* At most 7 packets should almost always be enough */
+ flow->max_extra_packets_to_check = 7;
+ flow->extra_packets_func = ndpi_extra_search_mail_smtp_tcp;
}
+/* **************************************** */
+
void init_mail_smtp_dissector(struct ndpi_detection_module_struct *ndpi_struct,
u_int32_t *id, NDPI_PROTOCOL_BITMASK *detection_bitmask) {
ndpi_set_bitmask_protocol_detection("MAIL_SMTP", ndpi_struct, detection_bitmask, *id,