static enum proto_parse_status rtp_parse(struct parser *parser, struct proto_info *parent, unsigned way, uint8_t const *packet, size_t cap_len, size_t wire_len, struct timeval const *now, size_t tot_cap_len, uint8_t const *tot_packet) { SLOG(LOG_DEBUG, "Starting RTP analysis"); /* Parse */ struct rtp_hdr *rtph = (struct rtp_hdr *)packet; if (wire_len < sizeof(*rtph)) return PROTO_PARSE_ERR; if (cap_len < sizeof(*rtph)) return PROTO_TOO_SHORT; unsigned const version = READ_U8(&rtph->flags0) >> 6U; unsigned const csrc_count = READ_U8(&rtph->flags0) & F0_CSRC_COUNT_MASK; unsigned const payload_type = READ_U8(&rtph->flags1) & F1_PLD_TYPE_MASK; SLOG(LOG_DEBUG, "RTP header, version=%u, CSRC_count=%u, payload_type=%u", version, csrc_count, payload_type); size_t head_len = sizeof(*rtph) + csrc_count * 4; if (wire_len < head_len) return PROTO_PARSE_ERR; if (cap_len < head_len) return PROTO_TOO_SHORT; struct rtp_proto_info info; rtp_proto_info_ctor(&info, parser, parent, rtph, head_len, wire_len - head_len); return proto_parse(NULL, &info.info, way, NULL, 0, 0, now, tot_cap_len, tot_packet); }
static enum proto_parse_status rtp_parse(struct parser *parser, struct proto_layer *parent, unsigned way, uint8_t const *packet, size_t cap_len, size_t wire_len, struct timeval const *now, proto_okfn_t *okfn) { SLOG(LOG_DEBUG, "Starting RTP analysis"); /* Parse */ struct rtp_header *rtph = (struct rtp_header *)packet; if (wire_len < sizeof(*rtph)) return PROTO_PARSE_ERR; if (cap_len < sizeof(*rtph)) return PROTO_TOO_SHORT; SLOG(LOG_DEBUG, "RTP header, version=%u, CSRC_count=%u, payload_type=%u", rtph->version, rtph->csrc_count, rtph->payload_type); size_t head_len = sizeof(*rtph) + rtph->csrc_count * 4; if (wire_len < head_len) return PROTO_PARSE_ERR; if (cap_len < head_len) return PROTO_TOO_SHORT; struct rtp_proto_info info; rtp_proto_info_ctor(&info, rtph, head_len, wire_len - head_len); struct proto_layer layer; proto_layer_ctor(&layer, parent, parser, &info.info); return proto_parse(NULL, &layer, way, NULL, 0, 0, now, okfn); }