Compare commits

...

2 Commits

Author SHA1 Message Date
Neels Hofmeyr
4ea81a9376 check_rtp_origin: drop special case for legacy IuUP hack
We have proper IuUP support and everything about this legacy hack should
be purged.

The purpose of this function is to validate that RTP is coming from the
expected address and port. To allow that legacy IuUP hack, which is no
longer needed, we punched a hole into this validation, by adding this
special case for loopback mode (suddenly we don't care who or what sends
RTP and bounce it back to anyone). So let's get rid of this hole that
was only needed for very early 3G voice hacking.

Instead, we permit RTP for IuUP Initialization regardless of the RTP
loopback/send/recv mode since I6c365559a7bd197349f0ea99f7a13b56a4bb580b

Related: SYS#6657
Change-Id: I158dd046fdfcb10392cde3de8cc88dd095a05b40
2023-12-04 04:40:51 +01:00
Neels Hofmeyr
2e5a169843 IuUP: always allow Initialization
Do not refuse IuUP Initialization messages coming in on an RTP port.
If an IUFP conn is not yet configured (pre-Initialization), allow rx
from any remote address.

If we refuse the IuUP Initialization, a 3G RNC may fail to set up a RAB.
We will know the remote address only *after* assigning a RAB succeeded.
So the IuUP Initialization must be allowed before knowing all addresses.

At the time of writing, CRCX for IUFP are sent to osmo-mgw in either
LOOPBACK or in RECVONLY mode:
- current osmo-msc: recvonly
- osmo-msc <= v1.10.0: loopback
- osmo-hnbgw: loopback
IuUP Initialization should work regardless of that.
See also next patch I158dd046fdfcb10392cde3de8cc88dd095a05b40

IuUP is one layer below the loopback/send/recv decision for RTP; IuUP is
always terminated at the MGW, while the AMR payload carries through.

Decided for now that it's not worth the extra effort to make this more
restrictive; ideas would be:
- actually verify the incoming packet to have a valid IuUP Init header
  before permitting it to be received.
- as soon as the remote address is known, also validate the src for IuUP
  Initialization messages.
This patch is nice and simple and does the job.

Related: alternative patch Idd833997abce46886e9664505b2776fa5dadc8db
Related: SYS#6657
Change-Id: I6c365559a7bd197349f0ea99f7a13b56a4bb580b
2023-12-04 04:35:16 +01:00

View File

@@ -834,32 +834,24 @@ static int check_rtp_origin(struct mgcp_conn_rtp *conn, struct osmo_sockaddr *ad
{
char ipbuf[INET6_ADDRSTRLEN];
if (osmo_sockaddr_is_any(&conn->end.addr) != 0) {
switch (conn->conn->mode) {
case MGCP_CONN_LOOPBACK:
/* HACK: for IuUP, we want to reply with an IuUP Initialization ACK upon the first RTP
* message received. We currently hackishly accomplish that by putting the endpoint in
* loopback mode and patching over the looped back RTP message to make it look like an
* ack. We don't know the femto cell's IP address and port until the RAB Assignment
* Response is received, but the nano3G expects an IuUP Initialization Ack before it even
* sends the RAB Assignment Response. Hence, if the remote address is 0.0.0.0 and the
* MGCP port is in loopback mode, allow looping back the packet to any source. */
LOGPCONN(conn->conn, DRTP, LOGL_ERROR,
"In loopback mode and remote address not set:"
" allowing data from address: %s\n",
osmo_sockaddr_ntop(&addr->u.sa, ipbuf));
return 0;
/* Allow IuUP Initialization to get through even if we don't have a remote address set yet. */
if (mgcp_conn_rtp_is_iuup(conn) && !conn->iuup.configured) {
/* maybe todo: also verify that it is actually a valid IuUP Initialization header in the incoming msgb?
* (though, why do we even care where the RTP is coming from) */
LOGPCONN(conn->conn, DRTP, LOGL_INFO, "Rx RTP from %s: allowing unknown src for IuUP Initialization\n",
osmo_sockaddr_to_str(addr));
return 0;
}
default:
/* Receiving early media before the endpoint is configured. Instead of logging
* this as an error that occurs on every call, keep it more low profile to not
* confuse humans with expected errors. */
LOGPCONN(conn->conn, DRTP, LOGL_INFO,
"Rx RTP from %s, but remote address not set:"
" dropping early media\n",
osmo_sockaddr_ntop(&addr->u.sa, ipbuf));
return -1;
}
if (osmo_sockaddr_is_any(&conn->end.addr) != 0) {
/* Receiving early media before the endpoint is configured. Instead of logging
* this as an error that occurs on every call, keep it more low profile to not
* confuse humans with expected errors. */
LOGPCONN(conn->conn, DRTP, LOGL_INFO,
"Rx RTP from %s, but remote address not set:"
" dropping early media\n",
osmo_sockaddr_ntop(&addr->u.sa, ipbuf));
return -1;
}
/* Note: Check if the inbound RTP data comes from the same host to