blob: 9b356c3d0f316b110153fcb8c6a5669e6ddeeff9 [file] [log] [blame]
Neels Hofmeyre9920f22017-07-10 15:07:22 +02001/*
2 * (C) 2016 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
3 * All Rights Reserved
4 *
5 * Author: Neels Hofmeyr
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
Neels Hofmeyrbd86f942018-02-21 16:45:38 +010021#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
22
Neels Hofmeyre9920f22017-07-10 15:07:22 +020023#include <string.h>
24
25#include <osmocom/core/msgb.h>
26#include <osmocom/core/application.h>
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020027#include <osmocom/mgcp_client/mgcp_client.h>
28#include <osmocom/mgcp_client/mgcp_client_internal.h>
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +010029#include <errno.h>
Neels Hofmeyre9920f22017-07-10 15:07:22 +020030
31void *ctx;
32
33#define buf_len 4096
34
35#if 0
36static struct msgb *from_hex(const char *hex)
37{
38 struct msgb *msg = msgb_alloc(buf_len, "mgcpgw_test_from_hex");
39 unsigned int l = osmo_hexparse(hex, msg->data, buf_len);
40 msg->l2h = msgb_put(msg, l);
41 return msg;
42}
43
44static struct msgb *mgcp_from_str(const char *head, const char *params)
45{
46 struct msgb *msg = msgb_alloc(buf_len, "mgcp_from_str");
47 unsigned int l;
48 char *data;
49 l = strlen(head);
50 msg->l2h = msgb_put(msg, l);
51 data = (char*)msgb_l2(msg);
Philipp Maierf8bfbe82017-11-23 19:32:31 +010052 osmo_strlcpy(data, head, l);
Neels Hofmeyre9920f22017-07-10 15:07:22 +020053
54 data = (char*)msgb_put(msg, 1);
55 *data = '\n';
56
57 l = strlen(params);
58 data = (char*)msgb_put(msg, l);
Philipp Maierf8bfbe82017-11-23 19:32:31 +010059 osmo_strlcpy(data, params, l);
Neels Hofmeyre9920f22017-07-10 15:07:22 +020060
61 return msg;
62}
63#endif
64
65static struct msgb *from_str(const char *str)
66{
67 struct msgb *msg = msgb_alloc(buf_len, "from_str");
68 unsigned int l = strlen(str);
69 char *data;
70 msg->l2h = msgb_put(msg, l);
71 data = (char*)msgb_l2(msg);
Philipp Maierf8bfbe82017-11-23 19:32:31 +010072 osmo_strlcpy(data, str, l);
Neels Hofmeyre9920f22017-07-10 15:07:22 +020073 return msg;
74}
75
Pau Espin Pedrol8e8d59f2023-06-13 19:41:44 +020076static struct mgcp_client_conf *conf;
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020077struct mgcp_client *mgcp = NULL;
Neels Hofmeyre9920f22017-07-10 15:07:22 +020078
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +010079static int reply_to(mgcp_trans_id_t trans_id, int code, const char *comment,
Neels Hofmeyr1d121482018-09-03 21:05:13 +020080 const char *params)
Neels Hofmeyre9920f22017-07-10 15:07:22 +020081{
82 static char compose[4096 - 128];
83 int len;
84
85 len = snprintf(compose, sizeof(compose),
Neels Hofmeyr1d121482018-09-03 21:05:13 +020086 "%d %u %s\r\n%s",
87 code, trans_id, comment, params);
Neels Hofmeyre9920f22017-07-10 15:07:22 +020088 OSMO_ASSERT(len < sizeof(compose));
89 OSMO_ASSERT(len > 0);
90
91 printf("composed response:\n-----\n%s\n-----\n",
92 compose);
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +010093 return mgcp_client_rx(mgcp, from_str(compose));
Neels Hofmeyre9920f22017-07-10 15:07:22 +020094}
95
96void test_response_cb(struct mgcp_response *response, void *priv)
97{
Philipp Maier704c4f02018-06-07 18:51:31 +020098 unsigned int i;
Neels Hofmeyre9920f22017-07-10 15:07:22 +020099 OSMO_ASSERT(priv == mgcp);
100 mgcp_response_parse_params(response);
101
Philipp Maier704c4f02018-06-07 18:51:31 +0200102 printf("response cb received:\n");
103 printf(" head.response_code = %d\n", response->head.response_code);
104 printf(" head.trans_id = %u\n", response->head.trans_id);
Neels Hofmeyr40f50332018-09-03 21:12:48 +0200105 printf(" head.conn_id = %s\n", response->head.conn_id);
Philipp Maier704c4f02018-06-07 18:51:31 +0200106 printf(" head.comment = %s\n", response->head.comment);
107 printf(" audio_port = %u\n", response->audio_port);
108 printf(" audio_ip = %s\n", response->audio_ip);
109 printf(" ptime = %u\n", response->ptime);
Philipp Maier704c4f02018-06-07 18:51:31 +0200110 printf(" ptmap_len = %u\n", response->ptmap_len);
111 for(i=0;i<response->ptmap_len;i++) {
112 printf(" ptmap[%u].codec = %u\n", i, response->ptmap[i].codec);
Pau Espin Pedrol21cdbfc2019-04-23 12:36:32 +0200113 printf(" ptmap[%u].pt = %u\n", i, response->ptmap[i].pt);
Philipp Maier704c4f02018-06-07 18:51:31 +0200114 }
Pau Espin Pedrol21cdbfc2019-04-23 12:36:32 +0200115
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200116}
117
118mgcp_trans_id_t dummy_mgcp_send(struct msgb *msg)
119{
120 mgcp_trans_id_t trans_id;
121 trans_id = msg->cb[MSGB_CB_MGCP_TRANS_ID];
122 char *end;
123
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +0200124 OSMO_ASSERT(mgcp_client_pending_add(mgcp, trans_id, test_response_cb, mgcp));
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200125
126 end = (char*)msgb_put(msg, 1);
127 *end = '\0';
128 printf("composed:\n-----\n%s\n-----\n",
129 (char*)msgb_l2(msg));
130
131 talloc_free(msg);
132 return trans_id;
133}
134
Philipp Maier1dc6be62017-10-05 18:25:37 +0200135void test_mgcp_msg(void)
136{
137 struct msgb *msg;
138 char audio_ip_overflow[5000];
139
140 /* A message struct prefilled with some arbitary values */
141 struct mgcp_msg mgcp_msg = {
142 .audio_ip = "192.168.100.23",
143 .endpoint = "23@mgw",
144 .audio_port = 1234,
145 .call_id = 47,
Philipp Maier01d24a32017-11-21 17:26:09 +0100146 .conn_id = "11",
Philipp Maier704c4f02018-06-07 18:51:31 +0200147 .conn_mode = MGCP_CONN_RECV_SEND,
148 .ptime = 20,
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100149 .ptmap = {
150 { .codec = CODEC_GSM_8000_1, .pt = CODEC_GSM_8000_1 },
151 { .codec = CODEC_AMR_8000_1, .pt = CODEC_AMR_8000_1 },
152 { .codec = CODEC_GSMEFR_8000_1, .pt = 96 },
153 },
Neels Hofmeyre6d8e912018-08-23 16:36:48 +0200154 .ptmap_len = 1,
155 .x_osmo_ign = MGCP_X_OSMO_IGN_CALLID,
Pau Espin Pedrol900cd652019-04-24 22:06:22 +0200156 .x_osmo_osmux_cid = -1, /* wildcard */
Philipp Maier1dc6be62017-10-05 18:25:37 +0200157 };
158
159 if (mgcp)
160 talloc_free(mgcp);
Pau Espin Pedrol8e8d59f2023-06-13 19:41:44 +0200161 mgcp = mgcp_client_init(ctx, conf);
Philipp Maier1dc6be62017-10-05 18:25:37 +0200162
163 printf("\n");
164
165 printf("Generated CRCX message:\n");
166 mgcp_msg.verb = MGCP_VERB_CRCX;
167 mgcp_msg.presence =
168 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
169 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE);
170 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
171 printf("%s\n", (char *)msg->data);
172
Philipp Maier704c4f02018-06-07 18:51:31 +0200173 printf("Generated CRCX message (two codecs):\n");
174 mgcp_msg.verb = MGCP_VERB_CRCX;
175 mgcp_msg.presence =
176 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
177 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100178 mgcp_msg.ptmap_len = 2;
Philipp Maier704c4f02018-06-07 18:51:31 +0200179 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100180 mgcp_msg.ptmap_len = 1;
Philipp Maier704c4f02018-06-07 18:51:31 +0200181 printf("%s\n", (char *)msg->data);
182
183 printf("Generated CRCX message (three codecs, one with custom pt):\n");
184 mgcp_msg.verb = MGCP_VERB_CRCX;
185 mgcp_msg.presence =
186 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
187 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100188 mgcp_msg.ptmap_len = 3;
Philipp Maier704c4f02018-06-07 18:51:31 +0200189 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100190 mgcp_msg.ptmap_len = 1;
Pau Espin Pedrol21cdbfc2019-04-23 12:36:32 +0200191 printf("%s\n", (char *)msg->data);
Philipp Maier704c4f02018-06-07 18:51:31 +0200192
Philipp Maier1dc6be62017-10-05 18:25:37 +0200193 printf("Generated MDCX message:\n");
194 mgcp_msg.verb = MGCP_VERB_MDCX;
195 mgcp_msg.presence =
196 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
197 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
198 MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
199 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
200 printf("%s\n", (char *)msg->data);
201
Philipp Maier704c4f02018-06-07 18:51:31 +0200202 printf("Generated MDCX message (two codecs):\n");
203 mgcp_msg.verb = MGCP_VERB_MDCX;
204 mgcp_msg.presence =
205 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
206 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
207 MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100208 mgcp_msg.ptmap_len = 2;
Philipp Maier704c4f02018-06-07 18:51:31 +0200209 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100210 mgcp_msg.ptmap_len = 1;
Philipp Maier704c4f02018-06-07 18:51:31 +0200211 printf("%s\n", (char *)msg->data);
212
213 printf("Generated MDCX message (three codecs, one with custom pt):\n");
214 mgcp_msg.verb = MGCP_VERB_MDCX;
215 mgcp_msg.presence =
216 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
217 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
218 MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100219 mgcp_msg.ptmap_len = 3;
Philipp Maier704c4f02018-06-07 18:51:31 +0200220 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100221 mgcp_msg.ptmap_len = 1;
Pau Espin Pedrol21cdbfc2019-04-23 12:36:32 +0200222 printf("%s\n", (char *)msg->data);
Philipp Maier704c4f02018-06-07 18:51:31 +0200223
Philipp Maier1dc6be62017-10-05 18:25:37 +0200224 printf("Generated DLCX message:\n");
225 mgcp_msg.verb = MGCP_VERB_DLCX;
226 mgcp_msg.presence =
227 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
228 MGCP_MSG_PRESENCE_CONN_ID);
229 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
230 printf("%s\n", (char *)msg->data);
231
232 printf("Generated AUEP message:\n");
233 mgcp_msg.verb = MGCP_VERB_AUEP;
234 mgcp_msg.presence = (MGCP_MSG_PRESENCE_ENDPOINT);
235 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
236 printf("%s\n", msg->data);
237
238 printf("Generated RSIP message:\n");
239 mgcp_msg.verb = MGCP_VERB_RSIP;
240 mgcp_msg.presence = (MGCP_MSG_PRESENCE_ENDPOINT);
241 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
242 printf("%s\n", (char *)msg->data);
243
Neels Hofmeyre6d8e912018-08-23 16:36:48 +0200244 printf("Generate X-Osmo-IGN message:\n");
245 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
246 mgcp_msg.verb = MGCP_VERB_CRCX;
247 mgcp_msg.presence =
248 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
249 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
250 | MGCP_MSG_PRESENCE_X_OSMO_IGN);
251 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
252 printf("%s\n", (char *)msg->data);
253
Pau Espin Pedrol900cd652019-04-24 22:06:22 +0200254 printf("Generate X-Osmo-Osmux message:\n");
255 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
256 mgcp_msg.verb = MGCP_VERB_CRCX;
257 mgcp_msg.presence =
258 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
259 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
260 | MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID);
261 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
262 printf("%s\n", (char *)msg->data);
263
264 printf("Generate X-Osmo-Osmux message (fixed CID 2):\n");
265 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
266 mgcp_msg.verb = MGCP_VERB_CRCX;
267 mgcp_msg.x_osmo_osmux_cid = 2;
268 mgcp_msg.presence =
269 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
270 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
271 | MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID);
272 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
273 printf("%s\n", (char *)msg->data);
274
Pau Espin Pedrolca538fc2019-05-10 16:49:59 +0200275 printf("Generate X-Osmo-Osmux message (MDCX):\n");
276 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
277 mgcp_msg.verb = MGCP_VERB_MDCX;
278 mgcp_msg.x_osmo_osmux_cid = 2;
279 mgcp_msg.presence =
280 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
281 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
282 | MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID);
283 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
284 printf("%s\n", (char *)msg->data);
285
Philipp Maier1dc6be62017-10-05 18:25:37 +0200286 printf("Overfolow test:\n");
287 mgcp_msg.verb = MGCP_VERB_MDCX;
288 mgcp_msg.presence =
289 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
290 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
291 MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
292 memset(audio_ip_overflow, 'X', sizeof(audio_ip_overflow));
Pau Espin Pedrol9dc73592020-08-28 20:21:55 +0200293 audio_ip_overflow[1] = '.';
Philipp Maier1dc6be62017-10-05 18:25:37 +0200294 audio_ip_overflow[sizeof(audio_ip_overflow) - 1] = '\0';
295 mgcp_msg.audio_ip = audio_ip_overflow;
296 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
297 OSMO_ASSERT(msg == NULL);
298
Pau Espin Pedrol9dc73592020-08-28 20:21:55 +0200299 printf("IPv6 test:\n");
300 mgcp_msg.verb = MGCP_VERB_MDCX;
301 mgcp_msg.presence =
302 (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
303 MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
304 MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
305 mgcp_msg.audio_ip = "2001:db8:1::ab9:c0a8:102";
306 mgcp->actual.remote_addr = "::1";
307 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
308 printf("%s\n", (char *)msg->data);
309
Philipp Maier1dc6be62017-10-05 18:25:37 +0200310 printf("\n");
311 msgb_free(msg);
312}
313
Harald Welte9befdeb2022-11-03 11:41:05 +0100314void test_mgcp_client_cancel(void)
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100315{
316 mgcp_trans_id_t trans_id;
317 struct msgb *msg;
318 struct mgcp_msg mgcp_msg = {
319 .verb = MGCP_VERB_CRCX,
320 .audio_ip = "192.168.100.23",
321 .endpoint = "23@mgw",
322 .audio_port = 1234,
323 .call_id = 47,
Philipp Maier922ae9a2017-12-04 15:53:37 +0100324 .conn_id = "11",
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100325 .conn_mode = MGCP_CONN_RECV_SEND,
326 .presence = (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID
327 | MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE),
Philipp Maier704c4f02018-06-07 18:51:31 +0200328 .ptime = 20,
Neels Hofmeyrcc2f7932023-12-07 03:46:46 +0100329 .ptmap = {
330 { .codec = CODEC_AMR_8000_1, .pt = CODEC_AMR_8000_1 },
331 },
332 .ptmap_len = 1
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100333 };
334
335 printf("\n%s():\n", __func__);
336 fprintf(stderr, "\n%s():\n", __func__);
337
338 if (mgcp)
339 talloc_free(mgcp);
Pau Espin Pedrol8e8d59f2023-06-13 19:41:44 +0200340 mgcp = mgcp_client_init(ctx, conf);
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100341
342 msg = mgcp_msg_gen(mgcp, &mgcp_msg);
343 trans_id = mgcp_msg_trans_id(msg);
344 fprintf(stderr, "- composed msg with trans_id=%u\n", trans_id);
345
346 fprintf(stderr, "- not in queue yet, cannot cancel yet\n");
347 OSMO_ASSERT(mgcp_client_cancel(mgcp, trans_id) == -ENOENT);
348
349 fprintf(stderr, "- enqueue\n");
350 dummy_mgcp_send(msg);
351
352 fprintf(stderr, "- cancel succeeds\n");
353 OSMO_ASSERT(mgcp_client_cancel(mgcp, trans_id) == 0);
354
355 fprintf(stderr, "- late response gets discarded\n");
Neels Hofmeyrb1bb1fa2018-09-03 21:07:26 +0200356 OSMO_ASSERT(reply_to(trans_id, 200, "OK", "I: 1\r\n\r\nv=0\r\n") == -ENOENT);
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100357
358 fprintf(stderr, "- canceling again does nothing\n");
359 OSMO_ASSERT(mgcp_client_cancel(mgcp, trans_id) == -ENOENT);
360
361 fprintf(stderr, "%s() done\n", __func__);
362}
363
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100364struct sdp_section_start_test {
365 const char *body;
366 int expect_rc;
367 struct mgcp_response expect_params;
368};
369
370static struct sdp_section_start_test sdp_section_start_tests[] = {
371 {
372 .body = "",
Neels Hofmeyre8278312019-09-19 03:06:46 +0200373 .expect_rc = 0,
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100374 },
375 {
376 .body = "\n\n",
377 },
378 {
379 .body = "\r\n\r\n",
380 },
381 {
382 .body = "\n\r\n\r",
383 },
384 {
385 .body = "some mgcp header data\r\nand header params"
386 "\n\n"
387 "m=audio 23\r\n",
388 .expect_params = {
389 .audio_port = 23,
390 },
391 },
392 {
393 .body = "some mgcp header data\r\nand header params"
394 "\r\n\r\n"
395 "m=audio 23\r\n",
396 .expect_params = {
397 .audio_port = 23,
398 },
399 },
400 {
401 .body = "some mgcp header data\r\nand header params"
402 "\n\r\n\r"
403 "m=audio 23\r\n",
404 .expect_params = {
405 .audio_port = 23,
406 },
407 },
408 {
409 .body = "some mgcp header data\r\nand header params"
410 "\n\r\n"
411 "m=audio 23\r\n",
Neels Hofmeyre8278312019-09-19 03:06:46 +0200412 .expect_rc = 0,
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100413 },
414 {
415 .body = "some mgcp header data\r\nand header params"
416 "\r\n\r"
417 "m=audio 23\r\n",
Neels Hofmeyre8278312019-09-19 03:06:46 +0200418 .expect_rc = 0,
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100419 },
420 {
421 .body = "some mgcp header data\r\nand header params"
422 "\n\r\r"
423 "m=audio 23\r\n",
Neels Hofmeyre8278312019-09-19 03:06:46 +0200424 .expect_rc = 0,
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100425 },
Pau Espin Pedrol9dc73592020-08-28 20:21:55 +0200426 {
427 .body = "some mgcp header data\r\nand header params"
428 "\r\n\r\n"
429 "c=IN IP4 1.2.3.4\r\n",
430 .expect_params = {
431 .audio_ip = "1.2.3.4",
432 },
433 .expect_rc = 0,
434 },
435 {
436 .body = "some mgcp header data\r\nand header params"
437 "\r\n\r\n"
438 "c=IN IP6 2001:db8:1::ab9:c0a8:102\r\n",
439 .expect_params = {
440 .audio_ip = "2001:db8:1::ab9:c0a8:102",
441 },
442 .expect_rc = 0,
443 },
444 {
445 .body = "some mgcp header data\r\nand header params"
446 "\r\n\r\n"
447 "c=IN IP6 1.2.3.4\r\n",
448 .expect_rc = -22,
449 },
450 {
451 .body = "some mgcp header data\r\nand header params"
452 "\r\n\r\n"
453 "c=IN IP4 ::1\r\n",
454 .expect_rc = -22,
455 },
456 {
457 .body = "some mgcp header data\r\nand header params"
458 "\r\n\r\n"
459 "c=IN IP4 notanip\r\n",
460 .expect_rc = -22,
461 },
462 {
463 .body = "some mgcp header data\r\nand header params"
464 "\r\n\r\n"
465 "c=IN IP4 1.2.3.4.5.6\r\n",
466 .expect_rc = -22,
467 },
468 {
469 .body = "some mgcp header data\r\nand header params"
470 "\r\n\r\n"
471 "c=IN IP4 1.2 .3\r\n",
472 .expect_rc = -22,
473 },
474 {
475 .body = "some mgcp header data\r\nand header params"
476 "\r\n\r\n"
477 "c=IN IP4 1.2 .3\r\n",
478 .expect_rc = -22,
479 },
480 {
481 .body = "some mgcp header data\r\nand header params"
482 "\r\n\r\n"
483 "c=IN IP4 \r\n",
484 .expect_rc = -22,
485 },
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100486};
487
Harald Welte9befdeb2022-11-03 11:41:05 +0100488void test_sdp_section_start(void)
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100489{
490 int i;
491 int failures = 0;
492
493 for (i = 0; i < ARRAY_SIZE(sdp_section_start_tests); i++) {
494 int rc;
495 struct sdp_section_start_test *t = &sdp_section_start_tests[i];
496 struct mgcp_response *r = talloc_zero(ctx, struct mgcp_response);
497
498 r->body = talloc_strdup(r, t->body);
499
500 printf("\n%s() test [%d]:\n", __func__, i);
501 fprintf(stderr, "\n%s() test [%d]:\n", __func__, i);
502 fprintf(stderr, "body: \"%s\"\n", osmo_escape_str(r->body, -1));
503
504 rc = mgcp_response_parse_params(r);
505
506 fprintf(stderr, "got rc=%d\n", rc);
507 if (rc != t->expect_rc) {
508 fprintf(stderr, "FAIL: Expected rc=%d\n", t->expect_rc);
509 failures++;
510 }
511 if (rc) {
512 talloc_free(r);
513 continue;
514 }
515
Pau Espin Pedrol9dc73592020-08-28 20:21:55 +0200516 fprintf(stderr, "got audio_ip=\"%s\"\n", r->audio_ip);
517 if (strcmp(r->audio_ip, t->expect_params.audio_ip)) {
518 fprintf(stderr, "FAIL: Expected audio_ip=\"%s\"\n", t->expect_params.audio_ip);
519 failures++;
520 }
521 fprintf(stderr, "got audio_port=%u\n", r->audio_port);
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100522 if (r->audio_port != t->expect_params.audio_port) {
523 fprintf(stderr, "FAIL: Expected audio_port=%u\n", t->expect_params.audio_port);
524 failures++;
525 }
526 talloc_free(r);
527 }
528
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100529 OSMO_ASSERT(!failures);
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100530}
531
Neels Hofmeyr5d0e0712023-12-07 03:41:52 +0100532static void test_map_str_to_codec(void)
Philipp Maier704c4f02018-06-07 18:51:31 +0200533{
534 /* Full form */
535 OSMO_ASSERT(map_str_to_codec("PCMU/8000/1") == CODEC_PCMU_8000_1);
536 OSMO_ASSERT(map_str_to_codec("GSM/8000/1") == CODEC_GSM_8000_1);
537 OSMO_ASSERT(map_str_to_codec("PCMA/8000/1") == CODEC_PCMA_8000_1);
538 OSMO_ASSERT(map_str_to_codec("G729/8000/1") == CODEC_G729_8000_1);
539 OSMO_ASSERT(map_str_to_codec("GSM-EFR/8000/1") == CODEC_GSMEFR_8000_1);
540 OSMO_ASSERT(map_str_to_codec("GSM-HR-08/8000/1") == CODEC_GSMHR_8000_1);
541 OSMO_ASSERT(map_str_to_codec("AMR/8000/1") == CODEC_AMR_8000_1);
542 OSMO_ASSERT(map_str_to_codec("AMR-WB/16000/1") == CODEC_AMRWB_16000_1);
543
544 /* Short form */
545 OSMO_ASSERT(map_str_to_codec("GSM-EFR") == CODEC_GSMEFR_8000_1);
546 OSMO_ASSERT(map_str_to_codec("G729") == CODEC_G729_8000_1);
547 OSMO_ASSERT(map_str_to_codec("GSM-HR-08") == CODEC_GSMHR_8000_1);
548
549 /* We do not care about what is after the first delimiter */
550 OSMO_ASSERT(map_str_to_codec("AMR-WB/123///456") == CODEC_AMRWB_16000_1);
551 OSMO_ASSERT(map_str_to_codec("PCMA/asdf") == CODEC_PCMA_8000_1);
552 OSMO_ASSERT(map_str_to_codec("GSM/qwertz") == CODEC_GSM_8000_1);
553
554 /* A trailing delimiter should not hurt */
555 OSMO_ASSERT(map_str_to_codec("AMR/") == CODEC_AMR_8000_1);
556 OSMO_ASSERT(map_str_to_codec("G729/") == CODEC_G729_8000_1);
557 OSMO_ASSERT(map_str_to_codec("GSM/") == CODEC_GSM_8000_1);
558
559 /* This is expected to fail */
560 OSMO_ASSERT(map_str_to_codec("INVALID/1234/7") == -1);
561 OSMO_ASSERT(map_str_to_codec(NULL) == -1);
562 OSMO_ASSERT(map_str_to_codec("") == -1);
563 OSMO_ASSERT(map_str_to_codec("/////") == -1);
564
565 /* The buffers are 64 bytes long, check what happens with overlong
566 * strings as input (This schould still work.) */
567 OSMO_ASSERT(map_str_to_codec("AMR-WB/16000/1############################################################################################################") == CODEC_AMRWB_16000_1);
568
569 /* This should not work, as there is no delimiter after the codec
570 * name */
571 OSMO_ASSERT(map_str_to_codec("AMR-WB####################################################################################################################") == -1);
572}
573
neelsc053e072024-01-11 19:40:27 +0000574static void test_map_codec_to_pt_and_map_pt_to_codec(void)
575{
576 struct ptmap ptmap[10];
577 unsigned int ptmap_len;
578 unsigned int i;
579
580 ptmap[0].codec = CODEC_GSMEFR_8000_1;
581 ptmap[0].pt = 96;
582 ptmap[1].codec = CODEC_GSMHR_8000_1;
583 ptmap[1].pt = 97;
584 ptmap[2].codec = CODEC_AMR_8000_1;
585 ptmap[2].pt = 98;
586 ptmap[3].codec = CODEC_AMRWB_16000_1;
587 ptmap[3].pt = 99;
588 ptmap_len = 4;
589
590 /* Mappings that are covered by the table */
591 for (i = 0; i < ptmap_len; i++)
592 printf(" %u => %u\n", ptmap[i].codec, map_codec_to_pt(ptmap, ptmap_len, ptmap[i].codec));
593 for (i = 0; i < ptmap_len; i++)
594 printf(" %u <= %u\n", ptmap[i].pt, map_pt_to_codec(ptmap, ptmap_len, ptmap[i].pt));
595 printf("\n");
596
597 /* Map some codecs/payload types from the static range, result must
598 * always be a 1:1 mapping */
599 printf(" %u => %u\n", CODEC_PCMU_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_PCMU_8000_1));
600 printf(" %u => %u\n", CODEC_GSM_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_GSM_8000_1));
601 printf(" %u => %u\n", CODEC_PCMA_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_PCMA_8000_1));
602 printf(" %u => %u\n", CODEC_G729_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_G729_8000_1));
603 printf(" %u <= %u\n", CODEC_PCMU_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_PCMU_8000_1));
604 printf(" %u <= %u\n", CODEC_GSM_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_GSM_8000_1));
605 printf(" %u <= %u\n", CODEC_PCMA_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_PCMA_8000_1));
606 printf(" %u <= %u\n", CODEC_G729_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_G729_8000_1));
607 printf("\n");
608
609 /* Try to do mappings from statically defined range to danymic range and vice versa. This
610 * is illegal and should result into a 1:1 mapping */
611 ptmap[3].codec = CODEC_AMRWB_16000_1;
612 ptmap[3].pt = 2;
613 ptmap[4].codec = CODEC_PCMU_8000_1;
614 ptmap[4].pt = 100;
615 ptmap_len = 5;
616
617 /* Apply all mappings again, the illegal ones we defined should result into 1:1 mappings */
618 for (i = 0; i < ptmap_len; i++)
619 printf(" %u => %u\n", ptmap[i].codec, map_codec_to_pt(ptmap, ptmap_len, ptmap[i].codec));
620 for (i = 0; i < ptmap_len; i++)
621 printf(" %u <= %u\n", ptmap[i].pt, map_pt_to_codec(ptmap, ptmap_len, ptmap[i].pt));
622 printf("\n");
623}
624
Philipp Maier48635912020-06-25 20:16:22 +0200625void test_mgcp_client_e1_epname(void)
626{
627 char *epname;
628
629 if (mgcp)
630 talloc_free(mgcp);
Pau Espin Pedrol8e8d59f2023-06-13 19:41:44 +0200631 mgcp = mgcp_client_init(ctx, conf);
Philipp Maier48635912020-06-25 20:16:22 +0200632
633 /* Valid endpoint names */
634 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 1, 15, 64, 0);
635 printf("%s\n", epname);
636 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 2, 14, 32, 0);
637 printf("%s\n", epname);
638 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 3, 13, 32, 4);
639 printf("%s\n", epname);
640 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 4, 12, 16, 0);
641 printf("%s\n", epname);
642 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 5, 11, 16, 2);
643 printf("%s\n", epname);
644 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 6, 10, 16, 4);
645 printf("%s\n", epname);
646 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 7, 9, 16, 6);
647 printf("%s\n", epname);
648 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 8, 8, 8, 0);
649 printf("%s\n", epname);
650 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 9, 7, 8, 1);
651 printf("%s\n", epname);
652 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 10, 6, 8, 2);
653 printf("%s\n", epname);
654 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 11, 5, 8, 3);
655 printf("%s\n", epname);
656 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 12, 4, 8, 4);
657 printf("%s\n", epname);
658 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 13, 3, 8, 5);
659 printf("%s\n", epname);
660 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 14, 2, 8, 6);
661 printf("%s\n", epname);
662 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 8, 7);
663 printf("%s\n", epname);
664
665 /* A few invalid enpoint names */
666 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 128, 0);
667 OSMO_ASSERT(epname == NULL);
668 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 8, 16);
669 OSMO_ASSERT(epname == NULL);
670 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 0, 8, 2);
671 OSMO_ASSERT(epname == NULL);
672 epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 64, 8, 2);
673 OSMO_ASSERT(epname == NULL);
674}
675
Neels Hofmeyrc9df0102023-12-22 02:48:04 +0100676struct parse_response_test {
677 const char *body;
678 int expect_rc;
679 struct mgcp_response expect_params;
680};
681
682static struct parse_response_test parse_response_tests[] = {
683 {
684 .body = "200 2 OK\r\n"
685 "I: foo\r\n"
686 "\r\n"
687 "v=0\r\n"
688 "o=- name 23 IN IP4 0.0.0.0\r\n"
689 "s=-\r\n"
690 "c=IN IP4 1.2.3.4\r\n"
691 "t=0 0\r\n"
692 "m=audio 23 RTP/AVP 112 3\r\n" /* <-- implicit: 3 = GSM-FR */
693 "a=rtpmap:112 AMR/8000\r\n"
694 "a=ptime:20\r\n",
695 .expect_rc = 0,
696 .expect_params = {
697 .audio_port = 23,
698 .audio_ip = "1.2.3.4",
699 .ptmap = {
700 { .codec = CODEC_AMR_8000_1, .pt = 112 },
701 { .codec = CODEC_GSM_8000_1, .pt = 3 },
702 },
703 .ptmap_len = 2,
704 },
705 },
706 {
707 .body = "200 2 OK\r\n"
708 "I: foo\r\n"
709 "\r\n"
710 "v=0\r\n"
711 "o=- name 23 IN IP4 0.0.0.0\r\n"
712 "s=-\r\n"
713 "c=IN IP4 1.2.3.4\r\n"
714 "t=0 0\r\n"
715 "m=audio 23 RTP/AVP 112 3\r\n"
716 "a=rtpmap:112 AMR/8000\r\n"
717 "a=rtpmap:3 GSM/8000\r\n" /* 3 == GSM-FR implicitly, is an explicit entry a problem? */
718 "a=ptime:20\r\n",
719 .expect_rc = 0,
720 .expect_params = {
721 .audio_port = 23,
722 .audio_ip = "1.2.3.4",
723 .ptmap = {
724 { .codec = CODEC_AMR_8000_1, .pt = 112 },
725 { .codec = CODEC_GSM_8000_1, .pt = 3 }, /* no, not a problem */
726 },
727 .ptmap_len = 2,
728 },
729 },
730 {
731 .body = "200 2 OK\r\n"
732 "I: foo\r\n"
733 "\r\n"
734 "v=0\r\n"
735 "o=- name 23 IN IP4 0.0.0.0\r\n"
736 "s=-\r\n"
737 "c=IN IP4 1.2.3.4\r\n"
738 "t=0 0\r\n"
739 "m=audio 23 RTP/AVP 3\r\n" /* <-- 112 is missing here. Will it still appear? */
740 "a=rtpmap:112 AMR/8000\r\n"
741 "a=ptime:20\r\n",
742 .expect_rc = 0,
743 .expect_params = {
744 .audio_port = 23,
745 .audio_ip = "1.2.3.4",
746 .ptmap = {
747 { .codec = CODEC_GSM_8000_1, .pt = 3 },
748 { .codec = CODEC_AMR_8000_1, .pt = 112 }, /* <-- yes, it was added to the end. */
749 },
750 .ptmap_len = 2,
751 },
752 },
753 {
754 /* test MGCP_MAX_CODECS */
755 .body = "200 2 OK\r\n"
756 "I: foo\r\n"
757 "\r\n"
758 "v=0\r\n"
759 "o=- name 23 IN IP4 0.0.0.0\r\n"
760 "s=-\r\n"
761 "c=IN IP4 1.2.3.4\r\n"
762 "t=0 0\r\n"
763 "m=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110\r\n" /* <-- 10 codecs max */
764 "a=rtpmap:101 AMR/8000\r\n"
765 "a=rtpmap:102 AMR/8000\r\n"
766 "a=rtpmap:103 AMR/8000\r\n"
767 "a=rtpmap:104 AMR/8000\r\n"
768 "a=rtpmap:105 AMR/8000\r\n"
769 "a=rtpmap:106 AMR/8000\r\n"
770 "a=rtpmap:107 AMR/8000\r\n"
771 "a=rtpmap:108 AMR/8000\r\n"
772 "a=rtpmap:109 AMR/8000\r\n"
773 "a=rtpmap:110 AMR/8000\r\n"
774 "a=ptime:20\r\n",
775 .expect_rc = 0,
776 .expect_params = {
777 .audio_port = 23,
778 .audio_ip = "1.2.3.4",
779 .ptmap = {
780 { .codec = CODEC_AMR_8000_1, .pt = 101 },
781 { .codec = CODEC_AMR_8000_1, .pt = 102 },
782 { .codec = CODEC_AMR_8000_1, .pt = 103 },
783 { .codec = CODEC_AMR_8000_1, .pt = 104 },
784 { .codec = CODEC_AMR_8000_1, .pt = 105 },
785 { .codec = CODEC_AMR_8000_1, .pt = 106 },
786 { .codec = CODEC_AMR_8000_1, .pt = 107 },
787 { .codec = CODEC_AMR_8000_1, .pt = 108 },
788 { .codec = CODEC_AMR_8000_1, .pt = 109 },
789 { .codec = CODEC_AMR_8000_1, .pt = 110 },
790 },
791 .ptmap_len = 10,
792 },
793 },
794 {
795 /* test MGCP_MAX_CODECS */
796 .body = "200 2 OK\r\n"
797 "I: foo\r\n"
798 "\r\n"
799 "v=0\r\n"
800 "o=- name 23 IN IP4 0.0.0.0\r\n"
801 "s=-\r\n"
802 "c=IN IP4 1.2.3.4\r\n"
803 "t=0 0\r\n"
804 "m=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110 3\r\n" /* <-- 11 > MGCP_MAX_CODECS */
805 "a=rtpmap:101 AMR/8000\r\n"
806 "a=rtpmap:102 AMR/8000\r\n"
807 "a=rtpmap:103 AMR/8000\r\n"
808 "a=rtpmap:104 AMR/8000\r\n"
809 "a=rtpmap:105 AMR/8000\r\n"
810 "a=rtpmap:106 AMR/8000\r\n"
811 "a=rtpmap:107 AMR/8000\r\n"
812 "a=rtpmap:108 AMR/8000\r\n"
813 "a=rtpmap:109 AMR/8000\r\n"
814 "a=rtpmap:110 AMR/8000\r\n"
815 "a=ptime:20\r\n",
816 .expect_rc = -EINVAL,
817 },
818};
819
820static void test_parse_response(void)
821{
822 int i;
823 int failures = 0;
824
825 for (i = 0; i < ARRAY_SIZE(parse_response_tests); i++) {
826 int rc;
827 struct parse_response_test *t = &parse_response_tests[i];
828 struct mgcp_response *r = talloc_zero(ctx, struct mgcp_response);
829 int p;
830
831 r->body = talloc_strdup(r, t->body);
832
833 //printf("\n%s() test [%d]:\n", __func__, i);
834 fprintf(stderr, "\n%s() test [%d]:\n", __func__, i);
835 fprintf(stderr, "body: \"%s\"\n", osmo_escape_str(r->body, -1));
836
837 rc = mgcp_response_parse_params(r);
838
839 fprintf(stderr, "got rc=%d\n", rc);
840 if (rc != t->expect_rc) {
841 fprintf(stderr, "FAIL: Expected rc=%d\n", t->expect_rc);
842 failures++;
843 }
844 if (rc) {
845 talloc_free(r);
846 continue;
847 }
848
849 fprintf(stderr, "got audio_ip=\"%s\"\n", r->audio_ip);
850 if (strcmp(r->audio_ip, t->expect_params.audio_ip)) {
851 fprintf(stderr, "FAIL: Expected audio_ip=\"%s\"\n", t->expect_params.audio_ip);
852 failures++;
853 }
854 fprintf(stderr, "got audio_port=%u\n", r->audio_port);
855 if (r->audio_port != t->expect_params.audio_port) {
856 fprintf(stderr, "FAIL: Expected audio_port=%u\n", t->expect_params.audio_port);
857 failures++;
858 }
859
860 for (p = 0; p < r->ptmap_len; p++) {
861 struct ptmap *got = &r->ptmap[p];
862 struct ptmap *expect = NULL;
863 fprintf(stderr, " %d %s\n", got->pt, osmo_mgcpc_codec_name(got->codec));
864 if (p >= t->expect_params.ptmap_len) {
865 fprintf(stderr, " - ERROR: too many codec entries\n");
866 failures++;
867 continue;
868 }
869 expect = &t->expect_params.ptmap[p];
870 if (ptmap_cmp(got, expect)) {
871 fprintf(stderr, " - ERROR: expected: %d %s\n",
872 expect->pt, osmo_mgcpc_codec_name(expect->codec));
873 failures++;
874 }
875 }
876
877 talloc_free(r);
878 }
879
880 OSMO_ASSERT(!failures);
881}
882
883
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200884static const struct log_info_cat log_categories[] = {
885};
886
887const struct log_info log_info = {
888 .cat = log_categories,
889 .num_cat = ARRAY_SIZE(log_categories),
890};
891
892
893int main(int argc, char **argv)
894{
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +0200895 ctx = talloc_named_const(NULL, 1, "mgcp_client_test");
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200896 msgb_talloc_ctx_init(ctx, 0);
Neels Hofmeyr60f8e312018-03-30 23:01:07 +0200897 osmo_init_logging2(ctx, &log_info);
Pau Espin Pedrolace0b942021-02-19 13:33:52 +0100898 log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
Philipp Maier8348abb2017-10-25 12:14:13 +0200899 log_set_print_timestamp(osmo_stderr_target, 0);
900 log_set_use_color(osmo_stderr_target, 0);
Pau Espin Pedrolace0b942021-02-19 13:33:52 +0100901 log_set_print_category_hex(osmo_stderr_target, 0);
Philipp Maier8348abb2017-10-25 12:14:13 +0200902 log_set_print_category(osmo_stderr_target, 1);
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200903
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100904 log_set_category_filter(osmo_stderr_target, DLMGCP, 1, LOGL_DEBUG);
905
Pau Espin Pedrol8e8d59f2023-06-13 19:41:44 +0200906 conf = mgcp_client_conf_alloc(ctx);
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200907
Philipp Maier1dc6be62017-10-05 18:25:37 +0200908 test_mgcp_msg();
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100909 test_mgcp_client_cancel();
Neels Hofmeyra8c6a9c2018-02-21 15:36:45 +0100910 test_sdp_section_start();
neelsc053e072024-01-11 19:40:27 +0000911 test_map_codec_to_pt_and_map_pt_to_codec();
Neels Hofmeyr5d0e0712023-12-07 03:41:52 +0100912 test_map_str_to_codec();
Philipp Maier48635912020-06-25 20:16:22 +0200913 test_mgcp_client_e1_epname();
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200914
Neels Hofmeyrc9df0102023-12-22 02:48:04 +0100915 test_parse_response();
916
Neels Hofmeyre9920f22017-07-10 15:07:22 +0200917 printf("Done\n");
918 fprintf(stderr, "Done\n");
919 return EXIT_SUCCESS;
920}