blob: a9ae33c73a8c93f31e7ea8aa749fd022c28fedc7 [file] [log] [blame]
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001/* MGCP Private Data */
2
3/*
Holger Hans Peter Freyther38e02c52012-10-22 18:09:35 +02004 * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
5 * (C) 2009-2012 by On-Waves
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01006 * All Rights Reserved
7 *
8 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +01009 * it under the terms of the GNU Affero General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010011 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010016 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010017 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010018 * You should have received a copy of the GNU Affero General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010020 *
21 */
22
23#ifndef OPENBSC_MGCP_DATA_H
24#define OPENBSC_MGCP_DATA_H
25
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010026#include <osmocom/core/select.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010027
28#define CI_UNUSED 0
29
Holger Hans Peter Freyther98a38772010-08-03 02:27:21 +080030enum mgcp_connection_mode {
31 MGCP_CONN_NONE = 0,
32 MGCP_CONN_RECV_ONLY = 1,
33 MGCP_CONN_SEND_ONLY = 2,
34 MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
35 MGCP_CONN_LOOPBACK = 4,
36};
37
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010038enum mgcp_trunk_type {
39 MGCP_TRUNK_VIRTUAL,
40 MGCP_TRUNK_E1,
41};
42
Jacob Erlbeck50079a12013-11-25 12:53:28 +010043struct mgcp_rtp_stream_state {
44 uint32_t ssrc;
45 uint16_t last_seq;
46 uint32_t last_timestamp;
47 uint32_t err_ts_counter;
48 int32_t last_tsdelta;
49};
50
Holger Hans Peter Freyther31868922010-08-03 11:59:04 +000051struct mgcp_rtp_state {
52 int initialized;
Jacob Erlbeck58340e52013-11-29 11:20:06 +010053 int patch_ssrc;
Holger Hans Peter Freyther31868922010-08-03 11:59:04 +000054
Holger Hans Peter Freyther6aa882b2010-08-03 14:35:50 +000055 uint32_t orig_ssrc;
Holger Hans Peter Freythered3a6612012-10-22 17:08:48 +020056
57 uint16_t base_seq;
Holger Hans Peter Freyther6aa882b2010-08-03 14:35:50 +000058 int seq_offset;
Holger Hans Peter Freyther769912c2012-10-22 17:30:12 +020059 int cycles;
Holger Hans Peter Freythered3a6612012-10-22 17:08:48 +020060
Holger Hans Peter Freyther6aa882b2010-08-03 14:35:50 +000061 int32_t timestamp_offset;
Jacob Erlbeck30ce4222013-12-05 12:02:15 +010062 uint32_t packet_duration;
Holger Hans Peter Freyther30690ad2012-10-24 20:31:25 +020063 uint32_t jitter;
64 int32_t transit;
Jacob Erlbeck50079a12013-11-25 12:53:28 +010065
66 struct mgcp_rtp_stream_state in_stream;
67 struct mgcp_rtp_stream_state out_stream;
Holger Hans Peter Freyther31868922010-08-03 11:59:04 +000068};
Holger Hans Peter Freyther98a38772010-08-03 02:27:21 +080069
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +080070struct mgcp_rtp_end {
71 /* statistics */
72 unsigned int packets;
Holger Hans Peter Freyther952f7522012-09-12 11:38:37 +020073 unsigned int octets;
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +080074 struct in_addr addr;
75
76 /* in network byte order */
77 int rtp_port, rtcp_port;
78
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +020079 /* per endpoint data */
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +080080 int payload_type;
Jacob Erlbeck72c30902013-11-25 15:23:35 +010081 uint32_t rate;
82 uint32_t frame_duration_num;
83 uint32_t frame_duration_den;
84 int frames_per_packet;
Jacob Erlbeckf6ec0e92013-12-04 10:30:11 +010085 uint32_t packet_duration_ms;
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +020086 char *fmtp_extra;
Holger Hans Peter Freyther58ff2192010-08-05 03:08:35 +080087
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010088 /* RTP patching */
Jacob Erlbecke2292f32013-12-03 15:13:12 +010089 int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +010090 int force_aligned_timing;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010091
Holger Hans Peter Freytherc4921272010-08-05 03:37:22 +080092 /*
93 * Each end has a socket...
94 */
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +020095 struct osmo_fd rtp;
96 struct osmo_fd rtcp;
Holger Hans Peter Freytherc4921272010-08-05 03:37:22 +080097
Holger Hans Peter Freyther58ff2192010-08-05 03:08:35 +080098 int local_port;
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +080099 int local_alloc;
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800100};
101
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800102enum {
103 MGCP_TAP_BTS_IN,
104 MGCP_TAP_BTS_OUT,
105 MGCP_TAP_NET_IN,
106 MGCP_TAP_NET_OUT,
107
108 /* last element */
109 MGCP_TAP_COUNT
110};
111
112struct mgcp_rtp_tap {
113 int enabled;
114 struct sockaddr_in forward;
115};
116
Jacob Erlbeck2c2ca4d2013-12-09 14:32:03 +0100117struct mgcp_lco {
118 char *string;
119 int pkt_period_min; /* time in ms */
120 int pkt_period_max; /* time in ms */
121};
122
Pablo Neira Ayuso46bd4242013-07-08 05:09:46 +0200123enum mgcp_type {
124 MGCP_RTP_DEFAULT = 0,
125 MGCP_RTP_TRANSCODED,
126};
127
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100128struct mgcp_endpoint {
Holger Hans Peter Freyther39a97e22010-08-06 18:03:11 +0800129 int allocated;
Holger Hans Peter Freyther46340132010-08-06 08:26:54 +0800130 uint32_t ci;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100131 char *callid;
Jacob Erlbeck2c2ca4d2013-12-09 14:32:03 +0100132 struct mgcp_lco local_options;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100133 int conn_mode;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800134 int orig_mode;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100135
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100136 /* backpointer */
137 struct mgcp_config *cfg;
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100138 struct mgcp_trunk_config *tcfg;
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200139
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800140 /* port status for bts/net */
141 struct mgcp_rtp_end bts_end;
142 struct mgcp_rtp_end net_end;
Holger Hans Peter Freyther21262332010-11-01 20:53:31 +0100143
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100144 /*
145 * For transcoding we will send from the local_port
146 * of trans_bts and it will arrive at trans_net from
147 * where we will forward it to the network.
148 */
149 struct mgcp_rtp_end trans_bts;
Holger Hans Peter Freyther21262332010-11-01 20:53:31 +0100150 struct mgcp_rtp_end trans_net;
Pablo Neira Ayuso46bd4242013-07-08 05:09:46 +0200151 enum mgcp_type type;
Holger Hans Peter Freyther380b8712010-07-29 02:38:39 +0800152
153 /* sequence bits */
Holger Hans Peter Freyther31868922010-08-03 11:59:04 +0000154 struct mgcp_rtp_state net_state;
155 struct mgcp_rtp_state bts_state;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000156
Holger Hans Peter Freytherce553612012-12-07 15:04:07 +0100157 /* fields for re-transmission */
158 char *last_trans;
159 char *last_response;
160
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800161 /* tap for the endpoint */
162 struct mgcp_rtp_tap taps[MGCP_TAP_COUNT];
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100163};
164
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100165#define ENDPOINT_NUMBER(endp) abs(endp - endp->tcfg->endpoints)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100166
Holger Hans Peter Freytherf2f15912010-04-01 03:27:04 +0200167struct mgcp_msg_ptr {
168 unsigned int start;
169 unsigned int length;
170};
171
Holger Hans Peter Freytherb844b872010-04-21 21:25:13 +0800172int mgcp_send_dummy(struct mgcp_endpoint *endp);
Holger Hans Peter Freytherbb89aa12010-08-05 03:29:33 +0800173int mgcp_bind_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800174int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100175int mgcp_bind_trans_bts_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
176int mgcp_bind_trans_net_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800177int mgcp_free_rtp_port(struct mgcp_rtp_end *end);
Holger Hans Peter Freytherf2f15912010-04-01 03:27:04 +0200178
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100179/* For transcoding we need to manage an in and an output that are connected */
180static inline int endp_back_channel(int endpoint)
181{
182 return endpoint + 60;
183}
184
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100185struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
186struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
187
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100188void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
189 struct mgcp_rtp_end *rtp);
Jacob Erlbeckf6ec0e92013-12-04 10:30:11 +0100190uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
191 struct mgcp_rtp_end *rtp);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100192
Holger Hans Peter Freyther38e02c52012-10-22 18:09:35 +0200193void mgcp_state_calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *,
194 uint32_t *expected, int *loss);
Holger Hans Peter Freythercb306a62012-10-24 21:22:47 +0200195uint32_t mgcp_state_calc_jitter(struct mgcp_rtp_state *);
Holger Hans Peter Freyther38e02c52012-10-22 18:09:35 +0200196
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100197
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100198#endif