aboutsummaryrefslogtreecommitdiffstats
path: root/include/mgcp/mgcp_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/mgcp/mgcp_internal.h')
-rw-r--r--include/mgcp/mgcp_internal.h111
1 files changed, 83 insertions, 28 deletions
diff --git a/include/mgcp/mgcp_internal.h b/include/mgcp/mgcp_internal.h
index b156aea..3197543 100644
--- a/include/mgcp/mgcp_internal.h
+++ b/include/mgcp/mgcp_internal.h
@@ -1,13 +1,13 @@
/* MGCP Private Data */
/*
- * (C) 2009-2010 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2010 by On-Waves
+ * (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
+ * (C) 2009-2011 by On-Waves
* All Rights Reserved
*
- * This program is free software: you can redistribute it and/or modify
+ * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
@@ -35,6 +35,11 @@ enum mgcp_connection_mode {
MGCP_CONN_LOOPBACK = 4,
};
+enum mgcp_trunk_type {
+ MGCP_TRUNK_VIRTUAL,
+ MGCP_TRUNK_E1,
+};
+
struct mgcp_rtp_state {
int initialized;
int patch;
@@ -48,47 +53,82 @@ struct mgcp_rtp_state {
int32_t timestamp_offset;
};
-struct mgcp_endpoint {
- uint32_t ci;
- char *callid;
- char *local_options;
- int conn_mode;
- int orig_mode;
+struct mgcp_rtp_end {
+ /* statistics */
+ unsigned int packets;
+ struct in_addr addr;
- int bts_payload_type;
- int net_payload_type;
+ /* in network byte order */
+ int rtp_port, rtcp_port;
- /* the local rtp port we are binding to */
- int rtp_port;
+ int payload_type;
/*
- * RTP mangling:
- * - we get RTP and RTCP to us and need to forward to the BTS
- * - we get RTP and RTCP from the BTS and forward to the network
+ * Each end has a socket...
*/
- struct bsc_fd local_rtp;
- struct bsc_fd local_rtcp;
+ struct bsc_fd rtp;
+ struct bsc_fd rtcp;
+
+ int local_port;
+ int local_alloc;
+};
- struct in_addr remote;
- struct in_addr bts;
+enum {
+ MGCP_TAP_BTS_IN,
+ MGCP_TAP_BTS_OUT,
+ MGCP_TAP_NET_IN,
+ MGCP_TAP_NET_OUT,
- /* in network byte order */
- int net_rtp, net_rtcp;
- int bts_rtp, bts_rtcp;
+ /* last element */
+ MGCP_TAP_COUNT
+};
+
+struct mgcp_rtp_tap {
+ int enabled;
+ struct sockaddr_in forward;
+};
+
+struct mgcp_endpoint {
+ int allocated;
+ uint32_t ci;
+ char *callid;
+ char *local_options;
+ int conn_mode;
+ int orig_mode;
/* backpointer */
struct mgcp_config *cfg;
+ struct mgcp_trunk_config *tcfg;
- /* statistics */
- unsigned int in_bts;
- unsigned int in_remote;
+ /* port status for bts/net */
+ struct mgcp_rtp_end bts_end;
+ struct mgcp_rtp_end net_end;
+
+ /*
+ * For transcoding we will send from the local_port
+ * of trans_bts and it will arrive at trans_net from
+ * where we will forward it to the network.
+ */
+ struct mgcp_rtp_end trans_bts;
+ struct mgcp_rtp_end trans_net;
+ int is_transcoded;
/* sequence bits */
struct mgcp_rtp_state net_state;
struct mgcp_rtp_state bts_state;
+
+ /* SSRC/seq/ts patching for loop */
+ int allow_patch;
+
+ /* tap for the endpoint */
+ struct mgcp_rtp_tap taps[MGCP_TAP_COUNT];
+
+ /* Special MGW handling */
+ unsigned int audio_port;
+ int block_processing;
};
-#define ENDPOINT_NUMBER(endp) abs(endp - endp->cfg->endpoints)
+#define ENDPOINT_NUMBER(endp) abs(endp - endp->tcfg->endpoints)
struct mgcp_msg_ptr {
unsigned int start;
@@ -99,5 +139,20 @@ int mgcp_analyze_header(struct mgcp_config *cfg, struct msgb *msg,
struct mgcp_msg_ptr *ptr, int size,
const char **transaction_id, struct mgcp_endpoint **endp);
int mgcp_send_dummy(struct mgcp_endpoint *endp);
+int mgcp_bind_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
+int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
+int mgcp_bind_trans_bts_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
+int mgcp_bind_trans_net_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
+int mgcp_free_rtp_port(struct mgcp_rtp_end *end);
+
+/* For transcoding we need to manage an in and an output that are connected */
+static inline int endp_back_channel(int endpoint)
+{
+ return endpoint + 60;
+}
+
+struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
+struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
+
#endif