mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-10-23 08:12:01 +00:00
ASCI: Support conference briding with 1..n connections
For each RTP packet that is received from a connection, the mode is checked whether receiving is allowed or not. If not it is discarded. In case of "confecho" mode, the RTP is also sent by the receiving connection. Then a loop is used to send RTP to all sending endpoints except the one that received the packet. Because we have a loop that allows to have 1..n connections, we have no maximum number of allowed connections anymore. Change-Id: Ic99a55ab5a3a6170e940403fadd52697e99f2f3a
This commit is contained in:
@@ -173,8 +173,8 @@ struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn *conn;
|
||||
int rc;
|
||||
|
||||
/* Do not allow more then two connections */
|
||||
if (llist_count(&endp->conns) >= endp->type->max_conns)
|
||||
/* Do not allow more then the maximum number of connections */
|
||||
if (endp->type->max_conns && llist_count(&endp->conns) >= endp->type->max_conns)
|
||||
return NULL;
|
||||
|
||||
/* Create new connection and add it to the list */
|
||||
|
@@ -38,7 +38,6 @@
|
||||
const struct mgcp_endpoint_typeset ep_typeset = {
|
||||
/* Specify endpoint properties for RTP endpoint */
|
||||
.rtp = {
|
||||
.max_conns = 2,
|
||||
.dispatch_rtp_cb = mgcp_dispatch_rtp_bridge_cb,
|
||||
.cleanup_cb = mgcp_cleanup_rtp_bridge_cb,
|
||||
},
|
||||
|
@@ -1290,8 +1290,10 @@ int mgcp_dispatch_rtp_bridge_cb(struct msgb *msg)
|
||||
struct mgcp_conn_rtp *conn_src = mc->conn_src;
|
||||
struct mgcp_conn *conn = conn_src->conn;
|
||||
struct mgcp_conn *conn_dst;
|
||||
struct mgcp_endpoint *endp = conn->endp;
|
||||
struct osmo_sockaddr *from_addr = mc->from_addr;
|
||||
char ipbuf[INET6_ADDRSTRLEN];
|
||||
int rc = 0;
|
||||
|
||||
/*! NOTE: This callback function implements the endpoint specific
|
||||
* dispatch behaviour of an rtp bridge/proxy endpoint. It is assumed
|
||||
@@ -1323,36 +1325,26 @@ int mgcp_dispatch_rtp_bridge_cb(struct msgb *msg)
|
||||
return mgcp_conn_rtp_dispatch_rtp(conn_src, msg);
|
||||
}
|
||||
|
||||
/* Find a destination connection. */
|
||||
/* NOTE: This code path runs every time an RTP packet is received. The
|
||||
* function mgcp_find_dst_conn() we use to determine the detination
|
||||
* connection will iterate the connection list inside the endpoint.
|
||||
* Since list iterations are quite costly, we will figure out the
|
||||
* destination only once and use the optional private data pointer of
|
||||
* the connection to cache the destination connection pointer. */
|
||||
if (!conn->priv) {
|
||||
conn_dst = mgcp_find_dst_conn(conn);
|
||||
conn->priv = conn_dst;
|
||||
} else {
|
||||
conn_dst = (struct mgcp_conn *)conn->priv;
|
||||
}
|
||||
/* If the mode does not allow receiving RTP, we are done. */
|
||||
if (conn->mode != MGCP_CONN_RECV_ONLY &&
|
||||
conn->mode != MGCP_CONN_RECV_SEND &&
|
||||
conn->mode != MGCP_CONN_CONFECHO)
|
||||
return rc;
|
||||
|
||||
/* There is no destination conn, stop here */
|
||||
if (!conn_dst) {
|
||||
LOGPCONN(conn, DRTP, LOGL_DEBUG,
|
||||
"no connection to forward an incoming RTP packet to\n");
|
||||
return -1;
|
||||
}
|
||||
/* If the mode is "confecho", send RTP back to the sender. */
|
||||
if (conn->mode == MGCP_CONN_CONFECHO)
|
||||
rc = mgcp_conn_rtp_dispatch_rtp(conn_src, msg);
|
||||
|
||||
/* The destination conn is not an RTP connection */
|
||||
if (conn_dst->type != MGCP_CONN_TYPE_RTP) {
|
||||
LOGPCONN(conn, DRTP, LOGL_ERROR,
|
||||
"unable to find suitable destination conn\n");
|
||||
return -1;
|
||||
/* Dispatch RTP packet to all other connection(s) that send audio. */
|
||||
llist_for_each_entry(conn_dst, &endp->conns, entry) {
|
||||
if (conn_dst == conn)
|
||||
continue;
|
||||
if (conn_dst->mode == MGCP_CONN_SEND_ONLY ||
|
||||
conn_dst->mode == MGCP_CONN_RECV_SEND ||
|
||||
conn_dst->mode == MGCP_CONN_CONFECHO)
|
||||
rc = mgcp_conn_rtp_dispatch_rtp(&conn_dst->u.rtp, msg);
|
||||
}
|
||||
|
||||
/* Dispatch RTP packet to destination RTP connection */
|
||||
return mgcp_conn_rtp_dispatch_rtp(&conn_dst->u.rtp, msg);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*! dispatch incoming RTP packet to E1 subslot, handle RTCP packets locally.
|
||||
|
@@ -967,7 +967,7 @@ mgcp_header_done:
|
||||
}
|
||||
|
||||
/* Check if we are able to accept the creation of another connection */
|
||||
if (llist_count(&endp->conns) >= endp->type->max_conns) {
|
||||
if (endp->type->max_conns && llist_count(&endp->conns) >= endp->type->max_conns) {
|
||||
LOGPENDP(endp, DLMGCP, LOGL_ERROR,
|
||||
"CRCX: endpoint full, max. %i connections allowed!\n",
|
||||
endp->type->max_conns);
|
||||
|
Reference in New Issue
Block a user