blob: 882c9081319945746592d432c927ed66c2886fec [file] [log] [blame]
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +02001#pragma once
2
3#include <stdint.h>
Philipp Maier1dc6be62017-10-05 18:25:37 +02004#include <arpa/inet.h>
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +02005
Neels Hofmeyrd95ab1e2017-09-22 00:52:54 +02006#include <osmocom/mgcp_client/mgcp_common.h>
7
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +02008#define MGCP_CLIENT_LOCAL_ADDR_DEFAULT "0.0.0.0"
9#define MGCP_CLIENT_LOCAL_PORT_DEFAULT 0
10#define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
11#define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427
12
13struct msgb;
14struct vty;
15struct mgcp_client;
16
17struct mgcp_client_conf {
18 const char *local_addr;
19 int local_port;
20 const char *remote_addr;
21 int remote_port;
22 uint16_t first_endpoint;
23 uint16_t last_endpoint;
Neels Hofmeyrc0dcc3c2017-12-02 18:31:34 +000024 uint16_t bts_base;
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020025};
26
27typedef unsigned int mgcp_trans_id_t;
28
29struct mgcp_response_head {
Philipp Maieread2f602017-11-27 12:06:29 +010030 int response_code;
31 mgcp_trans_id_t trans_id;
32 const char *comment;
Philipp Maier01d24a32017-11-21 17:26:09 +010033 char conn_id[MGCP_CONN_ID_LENGTH];
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020034};
35
36struct mgcp_response {
37 char *body;
38 struct mgcp_response_head head;
39 uint16_t audio_port;
Philipp Maier06da85e2017-10-05 18:49:24 +020040 char audio_ip[INET_ADDRSTRLEN];
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020041};
42
Philipp Maier1dc6be62017-10-05 18:25:37 +020043enum mgcp_verb {
44 MGCP_VERB_CRCX,
45 MGCP_VERB_MDCX,
46 MGCP_VERB_DLCX,
47 MGCP_VERB_AUEP,
48 MGCP_VERB_RSIP,
49};
50
51#define MGCP_MSG_PRESENCE_ENDPOINT 0x0001
52#define MGCP_MSG_PRESENCE_CALL_ID 0x0002
53#define MGCP_MSG_PRESENCE_CONN_ID 0x0004
54#define MGCP_MSG_PRESENCE_AUDIO_IP 0x0008
55#define MGCP_MSG_PRESENCE_AUDIO_PORT 0x0010
56#define MGCP_MSG_PRESENCE_CONN_MODE 0x0020
57
Philipp Maier1dc6be62017-10-05 18:25:37 +020058struct mgcp_msg {
59 enum mgcp_verb verb;
60 /* See MGCP_MSG_PRESENCE_* constants */
61 uint32_t presence;
62 char endpoint[MGCP_ENDPOINT_MAXLEN];
63 unsigned int call_id;
Philipp Maier01d24a32017-11-21 17:26:09 +010064 char *conn_id;
Harald Welte9bf7c532017-11-17 14:14:31 +010065 uint16_t audio_port;
66 char *audio_ip;
Philipp Maier1dc6be62017-10-05 18:25:37 +020067 enum mgcp_connection_mode conn_mode;
68};
69
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020070void mgcp_client_conf_init(struct mgcp_client_conf *conf);
71void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
72int mgcp_client_config_write(struct vty *vty, const char *indent);
73struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
74
75struct mgcp_client *mgcp_client_init(void *ctx,
76 struct mgcp_client_conf *conf);
77int mgcp_client_connect(struct mgcp_client *mgcp);
78
79const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
80uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
81uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
82
83int mgcp_client_next_endpoint(struct mgcp_client *client);
84void mgcp_client_release_endpoint(uint16_t id, struct mgcp_client *client);
85
86/* Invoked when an MGCP response is received or sending failed. When the
87 * response is passed as NULL, this indicates failure during transmission. */
88typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
89int mgcp_response_parse_params(struct mgcp_response *r);
90
91int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
92 mgcp_response_cb_t response_cb, void *priv);
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +010093int mgcp_client_cancel(struct mgcp_client *mgcp, mgcp_trans_id_t trans_id);
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020094
95enum mgcp_connection_mode;
96
97struct msgb *mgcp_msg_crcx(struct mgcp_client *mgcp,
98 uint16_t rtp_endpoint, unsigned int call_id,
Philipp Maier1dc6be62017-10-05 18:25:37 +020099 enum mgcp_connection_mode mode)
100OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +0200101
102struct msgb *mgcp_msg_mdcx(struct mgcp_client *mgcp,
103 uint16_t rtp_endpoint, const char *rtp_conn_addr,
Philipp Maier1dc6be62017-10-05 18:25:37 +0200104 uint16_t rtp_port, enum mgcp_connection_mode mode)
105OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +0200106
107struct msgb *mgcp_msg_dlcx(struct mgcp_client *mgcp, uint16_t rtp_endpoint,
Philipp Maier1dc6be62017-10-05 18:25:37 +0200108 unsigned int call_id)
109OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
110
111struct msgb *mgcp_msg_gen(struct mgcp_client *mgcp, struct mgcp_msg *mgcp_msg);
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +0100112mgcp_trans_id_t mgcp_msg_trans_id(struct msgb *msg);
Neels Hofmeyrd95ab1e2017-09-22 00:52:54 +0200113
114extern const struct value_string mgcp_client_connection_mode_strs[];
115static inline const char *mgcp_client_cmode_name(enum mgcp_connection_mode mode)
116{
117 return get_value_string(mgcp_client_connection_mode_strs, mode);
118}