/*
 * rtp_decoder.h
 *
 * decoder structures and functions for SRTP pcap decoder
 *
 * Bernardo Torres <bernardo@torresautomacao.com.br>
 *
 * Some structure and code from https://github.com/gteissier/srtp-decrypt
 *
 */
/*
 *
 * Copyright (c) 2001-2017 Cisco Systems, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 *   Redistributions in binary form must reproduce the above
 *   copyright notice, this list of conditions and the following
 *   disclaimer in the documentation and/or other materials provided
 *   with the distribution.
 *
 *   Neither the name of the Cisco Systems, Inc. nor the names of its
 *   contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef RTP_DECODER_H
#define RTP_DECODER_H

#include "srtp_priv.h"
#include "rtp.h"

#define DEFAULT_RTP_OFFSET 42

typedef enum {
    mode_rtp = 0,
    mode_rtcp,
    mode_rtcp_mux,
} rtp_decoder_mode_t;

typedef struct rtp_decoder_ctx_t {
    srtp_policy_t policy;
    srtp_ctx_t *srtp_ctx;
    rtp_decoder_mode_t mode;
    int rtp_offset;
    struct timeval start_tv;
    int frame_nr;
    int error_cnt;
    int rtp_cnt;
    int rtcp_cnt;
} rtp_decoder_ctx_t;

typedef struct rtp_decoder_ctx_t *rtp_decoder_t;

/*
 * error to string
 */
void rtp_print_error(srtp_err_status_t status, char *message);

/*
 * prints the output of a random buffer in hexadecimal
 */
void hexdump(const void *ptr, size_t size);

/*
 * the function usage() prints an error message describing how this
 * program should be called, then calls exit()
 */
void usage(char *prog_name);

/*
 * transforms base64 key into octet
 */
char *decode_sdes(char *in, char *out);

/*
 * pcap handling
 */
void rtp_decoder_handle_pkt(u_char *arg,
                            const struct pcap_pkthdr *hdr,
                            const u_char *bytes);

rtp_decoder_t rtp_decoder_alloc(void);

void rtp_decoder_dealloc(rtp_decoder_t rtp_ctx);

int rtp_decoder_init(rtp_decoder_t dcdr,
                     srtp_policy_t policy,
                     rtp_decoder_mode_t mode);

int rtp_decoder_deinit(rtp_decoder_t decoder);

void rtp_decoder_srtp_log_handler(srtp_log_level_t level,
                                  const char *msg,
                                  void *data);

void rtp_decoder_srtp_log_handler(srtp_log_level_t level,
                                  const char *msg,
                                  void *data);

#endif /* RTP_DECODER_H */
