File: xt_RTPENGINE.h

package info (click to toggle)
rtpengine 13.5.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,676 kB
  • sloc: ansic: 86,764; perl: 59,422; python: 3,193; sh: 1,030; makefile: 693; asm: 211
file content (292 lines) | stat: -rw-r--r-- 6,583 bytes parent folder | download
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