/* * bfcp.c * * Binary Floor Control Protocol * * Copyright (C) 2024 - ntop.org * Copyright (C) 2024 - V.G * * This file is part of nDPI, an open source deep packet inspection * library based on the OpenDPI and PACE technology by ipoque GmbH * * nDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * nDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with nDPI. If not, see . * */ #include "ndpi_protocol_ids.h" #define NDPI_CURRENT_PROTO NDPI_PROTOCOL_BFCP #include "ndpi_api.h" #include "ndpi_private.h" static void ndpi_search_bfcp(struct ndpi_detection_module_struct *ndpi_struct, struct ndpi_flow_struct *flow) { struct ndpi_packet_struct const * const packet = &ndpi_struct->packet; NDPI_LOG_DBG(ndpi_struct, "search BFCP\n"); if (packet->payload_packet_len < 12) { goto not_bfcp; } u_int8_t version = (packet->payload[0] >> 5) & 0x07; u_int8_t reserved = (packet->payload[0] & 0x03); /* RFC4582: 1 RFC8855: 1 on TCP, 2 on UDP */ if (!(version == 1 || (version == 2 && flow->l4_proto == IPPROTO_UDP))) { goto not_bfcp; } if (reserved != 0) { goto not_bfcp; } u_int8_t primitive = packet->payload[1]; if (primitive < 1 || primitive > 18) { goto not_bfcp; } u_int16_t length = ntohs(get_u_int16_t(packet->payload, 2)); if (12 + length * 4 != packet->payload_packet_len) { goto not_bfcp; } NDPI_LOG_INFO(ndpi_struct, "found BFCP\n"); ndpi_set_detected_protocol(ndpi_struct, flow, NDPI_PROTOCOL_BFCP, NDPI_PROTOCOL_UNKNOWN, NDPI_CONFIDENCE_DPI); flow->protos.bfcp.conference_id = ntohl(get_u_int32_t(packet->payload, 4)); flow->protos.bfcp.user_id = ntohs(get_u_int16_t(packet->payload, 10)); return; not_bfcp: NDPI_EXCLUDE_DISSECTOR(ndpi_struct, flow); } void init_bfcp_dissector(struct ndpi_detection_module_struct *ndpi_struct) { register_dissector("BFCP", ndpi_struct, ndpi_search_bfcp, NDPI_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION, 1, NDPI_PROTOCOL_BFCP); }