aboutsummaryrefslogtreecommitdiff
path: root/src/lib/protocols/mgcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/protocols/mgcp.c')
-rw-r--r--src/lib/protocols/mgcp.c71
1 files changed, 38 insertions, 33 deletions
diff --git a/src/lib/protocols/mgcp.c b/src/lib/protocols/mgcp.c
index e16091642..69fe33fac 100644
--- a/src/lib/protocols/mgcp.c
+++ b/src/lib/protocols/mgcp.c
@@ -20,10 +20,16 @@
* along with nDPI. If not, see <http://www.gnu.org/licenses/>.
*
*/
-#include "ndpi_protocols.h"
+
+#include "ndpi_protocol_ids.h"
#ifdef NDPI_PROTOCOL_MGCP
+#define NDPI_CURRENT_PROTO NDPI_PROTOCOL_MGCP
+
+#include "ndpi_api.h"
+
+
static void ndpi_int_mgcp_add_connection(struct ndpi_detection_module_struct
*ndpi_struct, struct ndpi_flow_struct *flow)
@@ -39,40 +45,39 @@ void ndpi_search_mgcp(struct ndpi_detection_module_struct *ndpi_struct, struct n
u_int16_t pos = 5;
- if (packet->payload_packet_len < 8) {
- goto mgcp_excluded;
- }
-
- /* packet must end with 0x0d0a or with 0x0a */
- if (packet->payload[packet->payload_packet_len - 1] != 0x0a) {
- goto mgcp_excluded;
- }
-
- if (packet->payload[0] != 'A' && packet->payload[0] != 'C' && packet->payload[0] != 'D' &&
- packet->payload[0] != 'E' && packet->payload[0] != 'M' && packet->payload[0] != 'N' &&
- packet->payload[0] != 'R') {
- goto mgcp_excluded;
- }
- if (memcmp(packet->payload, "AUEP ", 5) != 0 && memcmp(packet->payload, "AUCX ", 5) != 0 &&
- memcmp(packet->payload, "CRCX ", 5) != 0 && memcmp(packet->payload, "DLCX ", 5) != 0 &&
- memcmp(packet->payload, "EPCF ", 5) != 0 && memcmp(packet->payload, "MDCX ", 5) != 0 &&
- memcmp(packet->payload, "NTFY ", 5) != 0 && memcmp(packet->payload, "RQNT ", 5) != 0 &&
- memcmp(packet->payload, "RSIP ", 5) != 0) {
- goto mgcp_excluded;
- }
- // now search for string "MGCP " in the rest of the message
- while ((pos + 4) < packet->payload_packet_len) {
- if (memcmp(&packet->payload[pos], "MGCP ", 5) == 0) {
- NDPI_LOG(NDPI_PROTOCOL_MGCP, ndpi_struct, NDPI_LOG_DEBUG, "MGCP match.\n");
- ndpi_int_mgcp_add_connection(ndpi_struct, flow);
- return;
+ NDPI_LOG_DBG(ndpi_struct, "search MGCP\n");
+
+ do {
+ if (packet->payload_packet_len < 8) break;
+
+ /* packet must end with 0x0d0a or with 0x0a */
+ if (packet->payload[packet->payload_packet_len - 1] != 0x0a) break;
+
+ if (packet->payload[0] != 'A' && packet->payload[0] != 'C' && packet->payload[0] != 'D' &&
+ packet->payload[0] != 'E' && packet->payload[0] != 'M' && packet->payload[0] != 'N' &&
+ packet->payload[0] != 'R')
+ break;
+
+ if (memcmp(packet->payload, "AUEP ", 5) != 0 && memcmp(packet->payload, "AUCX ", 5) != 0 &&
+ memcmp(packet->payload, "CRCX ", 5) != 0 && memcmp(packet->payload, "DLCX ", 5) != 0 &&
+ memcmp(packet->payload, "EPCF ", 5) != 0 && memcmp(packet->payload, "MDCX ", 5) != 0 &&
+ memcmp(packet->payload, "NTFY ", 5) != 0 && memcmp(packet->payload, "RQNT ", 5) != 0 &&
+ memcmp(packet->payload, "RSIP ", 5) != 0)
+ break;
+
+ // now search for string "MGCP " in the rest of the message
+ while ((pos + 4) < packet->payload_packet_len) {
+ if (memcmp(&packet->payload[pos], "MGCP ", 5) == 0) {
+ NDPI_LOG_INFO(ndpi_struct, "found MGCP\n");
+ ndpi_int_mgcp_add_connection(ndpi_struct, flow);
+ return;
+ }
+ pos++;
}
- pos++;
- }
- mgcp_excluded:
- NDPI_LOG(NDPI_PROTOCOL_MGCP, ndpi_struct, NDPI_LOG_DEBUG, "exclude MGCP.\n");
- NDPI_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NDPI_PROTOCOL_MGCP);
+ } while(0);
+
+ NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
}