blob: b649abdcfb9b550ee87c0bc2cb7c639960c1e6c0 [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 Hofmeyr3a8e7232017-09-04 01:02:56 +020024};
25
26typedef unsigned int mgcp_trans_id_t;
27
28struct mgcp_response_head {
29 int response_code;
30 mgcp_trans_id_t trans_id;
31 const char *comment;
Philipp Maier01d24a32017-11-21 17:26:09 +010032 char conn_id[MGCP_CONN_ID_LENGTH];
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020033};
34
35struct mgcp_response {
36 char *body;
37 struct mgcp_response_head head;
38 uint16_t audio_port;
Philipp Maier06da85e2017-10-05 18:49:24 +020039 char audio_ip[INET_ADDRSTRLEN];
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020040};
41
Philipp Maier1dc6be62017-10-05 18:25:37 +020042enum mgcp_verb {
43 MGCP_VERB_CRCX,
44 MGCP_VERB_MDCX,
45 MGCP_VERB_DLCX,
46 MGCP_VERB_AUEP,
47 MGCP_VERB_RSIP,
48};
49
50#define MGCP_MSG_PRESENCE_ENDPOINT 0x0001
51#define MGCP_MSG_PRESENCE_CALL_ID 0x0002
52#define MGCP_MSG_PRESENCE_CONN_ID 0x0004
53#define MGCP_MSG_PRESENCE_AUDIO_IP 0x0008
54#define MGCP_MSG_PRESENCE_AUDIO_PORT 0x0010
55#define MGCP_MSG_PRESENCE_CONN_MODE 0x0020
56
57/* See also RFC3435 section 3.2.1.3 */
58#define MGCP_ENDPOINT_MAXLEN (255*2+1+1)
59
60struct mgcp_msg {
61 enum mgcp_verb verb;
62 /* See MGCP_MSG_PRESENCE_* constants */
63 uint32_t presence;
64 char endpoint[MGCP_ENDPOINT_MAXLEN];
65 unsigned int call_id;
Philipp Maier01d24a32017-11-21 17:26:09 +010066 char *conn_id;
Harald Welte9bf7c532017-11-17 14:14:31 +010067 uint16_t audio_port;
68 char *audio_ip;
Philipp Maier1dc6be62017-10-05 18:25:37 +020069 enum mgcp_connection_mode conn_mode;
70};
71
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020072void mgcp_client_conf_init(struct mgcp_client_conf *conf);
73void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
74int mgcp_client_config_write(struct vty *vty, const char *indent);
75struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
76
77struct mgcp_client *mgcp_client_init(void *ctx,
78 struct mgcp_client_conf *conf);
79int mgcp_client_connect(struct mgcp_client *mgcp);
80
81const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
82uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
83uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
84
85int mgcp_client_next_endpoint(struct mgcp_client *client);
86void mgcp_client_release_endpoint(uint16_t id, struct mgcp_client *client);
87
88/* Invoked when an MGCP response is received or sending failed. When the
89 * response is passed as NULL, this indicates failure during transmission. */
90typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
91int mgcp_response_parse_params(struct mgcp_response *r);
92
93int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
94 mgcp_response_cb_t response_cb, void *priv);
95
96enum mgcp_connection_mode;
97
98struct msgb *mgcp_msg_crcx(struct mgcp_client *mgcp,
99 uint16_t rtp_endpoint, unsigned int call_id,
Philipp Maier1dc6be62017-10-05 18:25:37 +0200100 enum mgcp_connection_mode mode)
101OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +0200102
103struct msgb *mgcp_msg_mdcx(struct mgcp_client *mgcp,
104 uint16_t rtp_endpoint, const char *rtp_conn_addr,
Philipp Maier1dc6be62017-10-05 18:25:37 +0200105 uint16_t rtp_port, enum mgcp_connection_mode mode)
106OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +0200107
108struct msgb *mgcp_msg_dlcx(struct mgcp_client *mgcp, uint16_t rtp_endpoint,
Philipp Maier1dc6be62017-10-05 18:25:37 +0200109 unsigned int call_id)
110OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
111
112struct msgb *mgcp_msg_gen(struct mgcp_client *mgcp, struct mgcp_msg *mgcp_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}