blob: 73f3bbab16d198ee09c3abf0d8c961b69f59a915 [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;
Philipp Maierabe8c892018-01-20 00:15:12 +010032 char comment[MGCP_COMMENT_MAXLEN];
Philipp Maier01d24a32017-11-21 17:26:09 +010033 char conn_id[MGCP_CONN_ID_LENGTH];
Philipp Maier55295f72018-01-15 14:00:28 +010034 char endpoint[MGCP_ENDPOINT_MAXLEN];
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020035};
36
37struct mgcp_response {
38 char *body;
39 struct mgcp_response_head head;
40 uint16_t audio_port;
Philipp Maier06da85e2017-10-05 18:49:24 +020041 char audio_ip[INET_ADDRSTRLEN];
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020042};
43
Philipp Maier1dc6be62017-10-05 18:25:37 +020044enum mgcp_verb {
45 MGCP_VERB_CRCX,
46 MGCP_VERB_MDCX,
47 MGCP_VERB_DLCX,
48 MGCP_VERB_AUEP,
49 MGCP_VERB_RSIP,
50};
51
52#define MGCP_MSG_PRESENCE_ENDPOINT 0x0001
53#define MGCP_MSG_PRESENCE_CALL_ID 0x0002
54#define MGCP_MSG_PRESENCE_CONN_ID 0x0004
55#define MGCP_MSG_PRESENCE_AUDIO_IP 0x0008
56#define MGCP_MSG_PRESENCE_AUDIO_PORT 0x0010
57#define MGCP_MSG_PRESENCE_CONN_MODE 0x0020
58
Philipp Maier1dc6be62017-10-05 18:25:37 +020059struct mgcp_msg {
60 enum mgcp_verb verb;
61 /* See MGCP_MSG_PRESENCE_* constants */
62 uint32_t presence;
63 char endpoint[MGCP_ENDPOINT_MAXLEN];
64 unsigned int call_id;
Philipp Maier01d24a32017-11-21 17:26:09 +010065 char *conn_id;
Harald Welte9bf7c532017-11-17 14:14:31 +010066 uint16_t audio_port;
67 char *audio_ip;
Philipp Maier1dc6be62017-10-05 18:25:37 +020068 enum mgcp_connection_mode conn_mode;
69};
70
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020071void mgcp_client_conf_init(struct mgcp_client_conf *conf);
72void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
73int mgcp_client_config_write(struct vty *vty, const char *indent);
74struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
75
76struct mgcp_client *mgcp_client_init(void *ctx,
77 struct mgcp_client_conf *conf);
78int mgcp_client_connect(struct mgcp_client *mgcp);
79
80const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
81uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
82uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
83
84int mgcp_client_next_endpoint(struct mgcp_client *client);
85void mgcp_client_release_endpoint(uint16_t id, struct mgcp_client *client);
86
87/* Invoked when an MGCP response is received or sending failed. When the
88 * response is passed as NULL, this indicates failure during transmission. */
89typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
90int mgcp_response_parse_params(struct mgcp_response *r);
91
92int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
93 mgcp_response_cb_t response_cb, void *priv);
Neels Hofmeyrc8f37cb2017-11-30 13:43:11 +010094int mgcp_client_cancel(struct mgcp_client *mgcp, mgcp_trans_id_t trans_id);
Neels Hofmeyr3a8e7232017-09-04 01:02:56 +020095
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 Hofmeyrc8f37cb2017-11-30 13:43:11 +0100113mgcp_trans_id_t mgcp_msg_trans_id(struct msgb *msg);
Neels Hofmeyrd95ab1e2017-09-22 00:52:54 +0200114
115extern const struct value_string mgcp_client_connection_mode_strs[];
116static inline const char *mgcp_client_cmode_name(enum mgcp_connection_mode mode)
117{
118 return get_value_string(mgcp_client_connection_mode_strs, mode);
119}