1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
|
#ifndef XT_RTPPROXY_H
#define XT_RTPPROXY_H
#include "common_stats.h"
#define RTPE_NUM_PAYLOAD_TYPES 32
#define RTPE_MAX_FORWARD_DESTINATIONS 32
#define RTPE_NUM_SSRC_TRACKING 4
struct global_stats_counter;
struct xt_rtpengine_info {
unsigned int id;
};
struct re_address {
int family;
union {
unsigned char ipv6[16];
uint32_t ipv4;
unsigned char u8[16];
uint16_t u16[8];
uint32_t u32[4];
} u;
uint16_t port;
};
enum rtpengine_cipher {
REC_INVALID = 0,
REC_NULL,
REC_AES_CM_128,
REC_AES_F8,
REC_AES_CM_192,
REC_AES_CM_256,
REC_AEAD_AES_GCM_128,
REC_AEAD_AES_GCM_256,
__REC_LAST
};
enum rtpengine_hmac {
REH_INVALID = 0,
REH_NULL,
REH_HMAC_SHA1,
__REH_LAST
};
struct rtpengine_srtp {
enum rtpengine_cipher cipher;
enum rtpengine_hmac hmac;
unsigned char master_key[32];
unsigned int master_key_len;
unsigned char master_salt[14];
unsigned int master_salt_len;
unsigned int session_key_len;
unsigned int session_salt_len;
unsigned char mki[256]; /* XXX uses too much memory? */
unsigned int rtp_auth_tag_len; /* in bytes */
unsigned int rtcp_auth_tag_len; /* in bytes */
unsigned int mki_len;
};
enum rtpengine_src_mismatch {
MSM_IGNORE = 0, /* process packet as normal */
MSM_DROP, /* drop packet */
MSM_PROPAGATE, /* propagate to userspace daemon */
};
struct rtpengine_pt_output {
unsigned int min_payload_len;
char replace_pattern[16];
unsigned char replace_pattern_len;
unsigned int blackhole:1;
};
struct rtpengine_target_info {
struct re_address local;
struct re_address expected_src; /* for incoming packets */
enum rtpengine_src_mismatch src_mismatch;
unsigned int num_destinations; // total
unsigned int num_rtcp_destinations;
unsigned int intercept_stream_idx;
struct rtpengine_srtp decrypt;
uint32_t ssrc[RTPE_NUM_SSRC_TRACKING]; // Expose the SSRC to userspace when we resync.
struct ssrc_stats *ssrc_stats[RTPE_NUM_SSRC_TRACKING];
struct rtp_stats *pt_stats[RTPE_NUM_PAYLOAD_TYPES]; // must be sorted by PT
unsigned int num_payload_types;
struct interface_stats_block *iface_stats; // for ingress stats
struct stream_stats *stats; // for ingress stats
unsigned int __unused1:1,
dtls:1,
stun:1,
rtp:1,
ssrc_req:1,
rtp_only:1,
track_ssrc:1,
rtcp:1,
rtcp_fw:1,
rtcp_fb_fw:1,
do_intercept:1,
pt_filter:1,
non_forwarding:1, // empty src/dst addr
blackhole:1,
rtp_stats:1; // requires SSRC and clock_rates to be set
};
struct rtpengine_output_info {
struct re_address src_addr; /* for outgoing packets */
struct re_address dst_addr;
struct rtpengine_srtp encrypt;
uint32_t ssrc_out[RTPE_NUM_SSRC_TRACKING]; // Rewrite SSRC
uint32_t seq_offset[RTPE_NUM_SSRC_TRACKING]; // Rewrite output seq
struct rtpengine_pt_output pt_output[RTPE_NUM_PAYLOAD_TYPES]; // same indexes as pt_input
struct interface_stats_block *iface_stats; // for egress stats
struct stream_stats *stats; // for egress stats
struct ssrc_stats *ssrc_stats[RTPE_NUM_SSRC_TRACKING];
unsigned char tos;
unsigned int ssrc_subst:1;
};
struct rtpengine_destination_info {
struct re_address local;
unsigned int num;
struct rtpengine_output_info output;
};
struct rtpengine_call_info {
unsigned int call_idx;
char call_id[256];
};
struct rtpengine_stream_idx_info {
unsigned int call_idx;
unsigned int stream_idx;
};
struct rtpengine_stream_info {
struct rtpengine_stream_idx_info idx;
unsigned int max_packets;
char stream_name[256];
};
struct rtpengine_packet_info {
unsigned int call_idx;
unsigned int stream_idx;
unsigned char data[];
};
enum rtpengine_command {
REMG_INIT = 1,
REMG_ADD_TARGET,
REMG_ADD_DESTINATION,
REMG_ADD_CALL,
REMG_DEL_CALL,
REMG_ADD_STREAM,
REMG_DEL_STREAM,
REMG_PACKET,
REMG_DEL_TARGET,
REMG_INIT_PLAY_STREAMS,
REMG_GET_PACKET_STREAM,
REMG_PLAY_STREAM_PACKET,
REMG_PLAY_STREAM,
REMG_STOP_STREAM,
REMG_FREE_PACKET_STREAM,
__REMG_LAST
};
struct rtpengine_init_info {
int last_cmd;
size_t msg_size[__REMG_LAST];
struct global_stats_counter *rtpe_stats;
};
struct rtpengine_command_init {
enum rtpengine_command cmd;
struct rtpengine_init_info init;
};
struct rtpengine_play_stream_info {
struct re_address src_addr;
struct re_address dst_addr;
unsigned char pt;
uint32_t ssrc;
uint32_t ts; // start TS
uint16_t seq; // start seq
struct rtpengine_srtp encrypt;
unsigned int packet_stream_idx;
struct interface_stats_block *iface_stats; // for egress stats
struct stream_stats *stats; // for egress stats
struct ssrc_stats *ssrc_stats;
int repeat;
int remove_at_end;
};
struct rtpengine_play_stream_packet_info {
unsigned int packet_stream_idx;
unsigned long delay_ms; // first packet = 0
uint32_t delay_ts; // first packet = 0
uint32_t duration_ts;
unsigned char data[];
};
struct rtpengine_command_add_target {
enum rtpengine_command cmd;
struct rtpengine_target_info target;
};
struct rtpengine_command_del_target {
enum rtpengine_command cmd;
struct re_address local;
};
struct rtpengine_command_destination {
enum rtpengine_command cmd;
struct rtpengine_destination_info destination;
};
struct rtpengine_command_add_call {
enum rtpengine_command cmd;
struct rtpengine_call_info call;
};
struct rtpengine_command_del_call {
enum rtpengine_command cmd;
unsigned int call_idx;
};
struct rtpengine_command_add_stream {
enum rtpengine_command cmd;
struct rtpengine_stream_info stream;
};
struct rtpengine_command_del_stream {
enum rtpengine_command cmd;
struct rtpengine_stream_idx_info stream;
};
struct rtpengine_command_packet {
enum rtpengine_command cmd;
struct rtpengine_packet_info packet;
};
struct rtpengine_command_init_play_streams {
enum rtpengine_command cmd;
unsigned int num_packet_streams;
unsigned int num_play_streams;
};
struct rtpengine_command_get_packet_stream {
enum rtpengine_command cmd;
unsigned int packet_stream_idx; // output
};
struct rtpengine_command_play_stream_packet {
enum rtpengine_command cmd;
struct rtpengine_play_stream_packet_info play_stream_packet;
};
struct rtpengine_command_play_stream {
enum rtpengine_command cmd;
struct rtpengine_play_stream_info info; // input
unsigned int play_idx; // output
};
struct rtpengine_command_stop_stream {
enum rtpengine_command cmd;
unsigned int play_idx;
};
struct rtpengine_command_free_packet_stream {
enum rtpengine_command cmd;
unsigned int packet_stream_idx;
};
#endif
|