2017-09-07 17:18:40 +00:00
|
|
|
#pragma once
|
|
|
|
|
Initially implement the new osmo-mgw and libosmo-mgcp
Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.
Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.
The main differences:
*) use a list to manage rtp connections.
Aggregate all rtp related information inside a single struct.
Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.
Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.
*) remove external transcoder feature
Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.
*) vty: get rid of CONN_BTS and CONN_NET
Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.
- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections
Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:
- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()
*) mgcp_protocol.c fixes:
- check ci string before it is converted:
In case of missing ci, a nullpointer is delivered to strtoul().
Add a function that takes ci, checks it and converts it to an
uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.
*) mgcp_test
- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
- Add 'I: 1' parameters.
- Use proper port numbers:
from m=audio 0 RTP/AVP 126
to m=audio 16002 RTP/AVP 128
- Change ptime to 'a=ptime:40' because this is what the MGW currently
returns. CRCX generally feed a ptime:40 and this is expected to be
returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
endpoints anymore.
Hence remove one column from tests[].
- test_messages():
- Enable: remove '#if 0'
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway.
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_retransmission():
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_packet_error_detection():
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- remove endpoint init, now done internally.
- add false assert in error case.
- Assert that a conn really vanishes on DLCX, previously the conn would
remain and just be unused, now it is actually discarded.
- test_no_cycle()
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
- Enable: remove '#if 0'.
- remove endpoint init, now done internally.
- add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
- We now see two dummy packets instead of one, now sent to both sides because
we don't know of BTS or NET side. (maybe drop dummy packets later...)
- packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.
Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
2017-08-22 14:35:41 +00:00
|
|
|
#include <inttypes.h>
|
2020-08-04 16:26:50 +00:00
|
|
|
#include <stdbool.h>
|
2020-08-31 11:29:11 +00:00
|
|
|
|
|
|
|
#include <osmocom/core/socket.h>
|
|
|
|
|
Initially implement the new osmo-mgw and libosmo-mgcp
Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.
Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.
The main differences:
*) use a list to manage rtp connections.
Aggregate all rtp related information inside a single struct.
Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.
Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.
*) remove external transcoder feature
Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.
*) vty: get rid of CONN_BTS and CONN_NET
Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.
- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections
Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:
- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()
*) mgcp_protocol.c fixes:
- check ci string before it is converted:
In case of missing ci, a nullpointer is delivered to strtoul().
Add a function that takes ci, checks it and converts it to an
uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.
*) mgcp_test
- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
- Add 'I: 1' parameters.
- Use proper port numbers:
from m=audio 0 RTP/AVP 126
to m=audio 16002 RTP/AVP 128
- Change ptime to 'a=ptime:40' because this is what the MGW currently
returns. CRCX generally feed a ptime:40 and this is expected to be
returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
endpoints anymore.
Hence remove one column from tests[].
- test_messages():
- Enable: remove '#if 0'
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway.
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_retransmission():
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_packet_error_detection():
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- remove endpoint init, now done internally.
- add false assert in error case.
- Assert that a conn really vanishes on DLCX, previously the conn would
remain and just be unused, now it is actually discarded.
- test_no_cycle()
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
- Enable: remove '#if 0'.
- remove endpoint init, now done internally.
- add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
- We now see two dummy packets instead of one, now sent to both sides because
we don't know of BTS or NET side. (maybe drop dummy packets later...)
- packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.
Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
2017-08-22 14:35:41 +00:00
|
|
|
#include <osmocom/mgcp/mgcp.h>
|
2020-06-18 23:34:42 +00:00
|
|
|
|
2021-05-20 12:18:52 +00:00
|
|
|
/* The following constant defines an RTP dummy payload that is used for
|
|
|
|
* "UDP Hole Punching" (NAT) */
|
2022-10-04 09:58:56 +00:00
|
|
|
#define MGCP_DUMMY_LOAD 0x23
|
|
|
|
static const char rtp_dummy_payload[] = { MGCP_DUMMY_LOAD };
|
2021-05-20 12:18:52 +00:00
|
|
|
|
|
|
|
/* Check if the data in a given message buffer matches the rtp dummy payload
|
|
|
|
* defined above */
|
|
|
|
#define mgcp_is_rtp_dummy_payload(msg) \
|
|
|
|
(msgb_length(msg) == sizeof(rtp_dummy_payload) && \
|
|
|
|
memcmp(msgb_data(msg), rtp_dummy_payload, sizeof(rtp_dummy_payload)) == 0)
|
|
|
|
|
2020-08-04 16:26:50 +00:00
|
|
|
#define RTP_BUF_SIZE 4096
|
2020-06-18 23:34:42 +00:00
|
|
|
|
2017-09-07 17:18:40 +00:00
|
|
|
struct mgcp_rtp_stream_state {
|
|
|
|
uint32_t ssrc;
|
|
|
|
uint16_t last_seq;
|
|
|
|
uint32_t last_timestamp;
|
2018-05-09 14:26:34 +00:00
|
|
|
struct rate_ctr *err_ts_ctr;
|
2017-09-07 17:18:40 +00:00
|
|
|
int32_t last_tsdelta;
|
|
|
|
uint32_t last_arrival_time;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mgcp_rtp_state {
|
2017-12-25 08:44:26 +00:00
|
|
|
/* has this state structure been initialized? */
|
2017-09-07 17:18:40 +00:00
|
|
|
int initialized;
|
|
|
|
|
2017-12-25 08:44:26 +00:00
|
|
|
struct {
|
|
|
|
/* are we patching the SSRC value? */
|
2021-07-07 10:12:58 +00:00
|
|
|
bool patch_ssrc;
|
2017-12-25 08:44:26 +00:00
|
|
|
/* original SSRC (to which we shall patch any different SSRC) */
|
|
|
|
uint32_t orig_ssrc;
|
|
|
|
/* offset to apply on the sequence number */
|
|
|
|
int seq_offset;
|
|
|
|
/* offset to apply on the timestamp number */
|
|
|
|
int32_t timestamp_offset;
|
|
|
|
} patch;
|
2017-09-07 17:18:40 +00:00
|
|
|
|
2017-12-25 08:44:26 +00:00
|
|
|
/* duration of a packet (FIXME: in which unit?) */
|
2017-09-07 17:18:40 +00:00
|
|
|
uint32_t packet_duration;
|
|
|
|
|
2020-07-06 15:44:12 +00:00
|
|
|
/* Note: These states are not continuously updated, they serve as an
|
|
|
|
* information source to patch certain values in the RTP header. Do
|
|
|
|
* not use this state if constantly updated data about the RTP stream
|
|
|
|
* is needed. (see also mgcp_patch_and_count() */
|
2017-09-07 17:18:40 +00:00
|
|
|
struct mgcp_rtp_stream_state in_stream;
|
|
|
|
struct mgcp_rtp_stream_state out_stream;
|
|
|
|
|
|
|
|
/* jitter and packet loss calculation */
|
2017-12-25 08:47:57 +00:00
|
|
|
struct {
|
|
|
|
int initialized;
|
|
|
|
uint16_t base_seq;
|
|
|
|
uint16_t max_seq;
|
|
|
|
uint32_t ssrc;
|
|
|
|
uint32_t jitter;
|
|
|
|
int32_t transit;
|
|
|
|
int cycles;
|
|
|
|
} stats;
|
|
|
|
|
2020-07-06 15:44:12 +00:00
|
|
|
/* Alternative values for RTP tx, in case no sufficient header
|
|
|
|
* information is available so the header needs to be generated
|
|
|
|
* locally (when just forwarding packets, the header of incoming
|
|
|
|
* data is just re-used) */
|
|
|
|
uint16_t alt_rtp_tx_sequence;
|
|
|
|
uint32_t alt_rtp_tx_ssrc;
|
2017-09-07 17:18:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct mgcp_rtp_codec {
|
|
|
|
uint32_t rate;
|
|
|
|
int channels;
|
|
|
|
uint32_t frame_duration_num;
|
|
|
|
uint32_t frame_duration_den;
|
|
|
|
|
|
|
|
int payload_type;
|
2021-08-09 21:26:48 +00:00
|
|
|
char audio_name[64];
|
|
|
|
char subtype_name[64];
|
2019-03-05 12:56:59 +00:00
|
|
|
|
|
|
|
bool param_present;
|
|
|
|
struct mgcp_codec_param param;
|
2017-09-07 17:18:40 +00:00
|
|
|
};
|
|
|
|
|
2017-12-26 14:48:46 +00:00
|
|
|
/* 'mgcp_rtp_end': basically a wrapper around the RTP+RTCP ports */
|
2017-09-07 17:18:40 +00:00
|
|
|
struct mgcp_rtp_end {
|
2020-09-03 12:08:04 +00:00
|
|
|
/* remote IP address of the RTP socket */
|
2020-08-31 11:29:11 +00:00
|
|
|
struct osmo_sockaddr addr;
|
2017-09-07 17:18:40 +00:00
|
|
|
|
|
|
|
/* in network byte order */
|
2022-10-04 11:45:48 +00:00
|
|
|
int rtcp_port;
|
2017-09-07 17:18:40 +00:00
|
|
|
|
2018-06-07 07:52:16 +00:00
|
|
|
/* currently selected audio codec */
|
|
|
|
struct mgcp_rtp_codec *codec;
|
|
|
|
|
|
|
|
/* array with assigned audio codecs to choose from (SDP) */
|
|
|
|
struct mgcp_rtp_codec codecs[MGCP_MAX_CODECS];
|
|
|
|
|
|
|
|
/* number of assigned audio codecs (SDP) */
|
|
|
|
unsigned int codecs_assigned;
|
2017-09-07 17:18:40 +00:00
|
|
|
|
|
|
|
/* per endpoint data */
|
|
|
|
int frames_per_packet;
|
|
|
|
uint32_t packet_duration_ms;
|
2018-06-07 07:52:16 +00:00
|
|
|
int maximum_packet_time; /* -1: not set */
|
2017-09-07 17:18:40 +00:00
|
|
|
char *fmtp_extra;
|
2021-12-24 13:48:26 +00:00
|
|
|
/* are we transmitting packets (true) or dropping (false) outbound packets */
|
|
|
|
bool output_enabled;
|
2017-12-26 14:48:46 +00:00
|
|
|
/* FIXME: This parameter can be set + printed, but is nowhere used! */
|
2017-09-07 17:18:40 +00:00
|
|
|
int force_output_ptime;
|
|
|
|
|
|
|
|
/* RTP patching */
|
|
|
|
int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
|
2017-12-26 14:48:46 +00:00
|
|
|
/* should we perform align_rtp_timestamp_offset() (1) or not (0) */
|
2017-09-07 17:18:40 +00:00
|
|
|
int force_aligned_timing;
|
2019-02-20 11:26:52 +00:00
|
|
|
bool rfc5993_hr_convert;
|
2017-09-07 17:18:40 +00:00
|
|
|
|
Initially implement the new osmo-mgw and libosmo-mgcp
Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.
Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.
The main differences:
*) use a list to manage rtp connections.
Aggregate all rtp related information inside a single struct.
Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.
Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.
*) remove external transcoder feature
Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.
*) vty: get rid of CONN_BTS and CONN_NET
Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.
- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections
Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:
- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()
*) mgcp_protocol.c fixes:
- check ci string before it is converted:
In case of missing ci, a nullpointer is delivered to strtoul().
Add a function that takes ci, checks it and converts it to an
uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.
*) mgcp_test
- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
- Add 'I: 1' parameters.
- Use proper port numbers:
from m=audio 0 RTP/AVP 126
to m=audio 16002 RTP/AVP 128
- Change ptime to 'a=ptime:40' because this is what the MGW currently
returns. CRCX generally feed a ptime:40 and this is expected to be
returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
endpoints anymore.
Hence remove one column from tests[].
- test_messages():
- Enable: remove '#if 0'
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway.
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_retransmission():
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_packet_error_detection():
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- remove endpoint init, now done internally.
- add false assert in error case.
- Assert that a conn really vanishes on DLCX, previously the conn would
remain and just be unused, now it is actually discarded.
- test_no_cycle()
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
- Enable: remove '#if 0'.
- remove endpoint init, now done internally.
- add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
- We now see two dummy packets instead of one, now sent to both sides because
we don't know of BTS or NET side. (maybe drop dummy packets later...)
- packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.
Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
2017-08-22 14:35:41 +00:00
|
|
|
/* Each end has a separate socket for RTP and RTCP */
|
2017-09-07 17:18:40 +00:00
|
|
|
struct osmo_fd rtp;
|
|
|
|
struct osmo_fd rtcp;
|
|
|
|
|
2017-12-26 14:48:46 +00:00
|
|
|
/* local UDP port number of the RTP socket; RTCP is +1 */
|
2017-09-07 17:18:40 +00:00
|
|
|
int local_port;
|
2020-09-03 12:20:07 +00:00
|
|
|
/* where the endpoint RTP connection binds to, set during CRCX and
|
|
|
|
* possibly updated during MDCX */
|
|
|
|
char local_addr[INET6_ADDRSTRLEN];
|
2017-09-07 17:18:40 +00:00
|
|
|
};
|
|
|
|
|
mgw: rx CRCX: Avoid sending dummy rtp if remote address not provided
The following sequence of events was seen frequently in a osmo-mgw
instance running on the field with heavy traffic:
"""
endpoint:rtpbridge/1@mgw CRCX: creating new connection ...
mgcp_network.c:236 endpoint:rtpbridge/1@mgw CI:1C8CCFA9 Failed to send dummy RTP packet.
"""
Allegedly, that happens because at CRCX time the remote address may
still not be known, hence we end up trying to send a dummy rtp packet
to, for instance, host 0.0.0.0 port 0, which will of course fail.
Let's avoid sending it if the address is not yet known.
Similary, same issue could be seen during MDCX, since at MDCX we don't
necessarily need to have a valid addr+port (there could be several MDCX
and only last one set it).
Finally, the keepalive timer also needs the check, since it iterates
over all connections, and it could be that some is still not fully
configured.
Related: SYS#5498
Change-Id: I8ceafda691146823b12232b4a804b4ce74acbdc8
2021-07-06 16:15:35 +00:00
|
|
|
bool mgcp_rtp_end_remote_addr_available(const struct mgcp_rtp_end *rtp_end);
|
|
|
|
|
2017-09-07 17:18:40 +00:00
|
|
|
struct mgcp_rtp_tap {
|
2017-12-26 14:48:46 +00:00
|
|
|
/* is this tap active (1) or not (0) */
|
2017-09-07 17:18:40 +00:00
|
|
|
int enabled;
|
2017-12-26 14:48:46 +00:00
|
|
|
/* IP/port to which we're forwarding the tapped data */
|
2020-08-31 11:29:11 +00:00
|
|
|
struct osmo_sockaddr forward;
|
2017-09-07 17:18:40 +00:00
|
|
|
};
|
|
|
|
|
2020-08-04 16:26:50 +00:00
|
|
|
struct mgcp_conn;
|
2017-09-07 17:18:40 +00:00
|
|
|
|
2020-08-31 11:29:11 +00:00
|
|
|
int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct osmo_sockaddr *addr,
|
2020-06-18 23:34:42 +00:00
|
|
|
struct msgb *msg, struct mgcp_conn_rtp *conn_src,
|
Initially implement the new osmo-mgw and libosmo-mgcp
Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.
Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.
The main differences:
*) use a list to manage rtp connections.
Aggregate all rtp related information inside a single struct.
Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.
Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.
*) remove external transcoder feature
Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.
*) vty: get rid of CONN_BTS and CONN_NET
Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.
- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections
Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:
- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()
*) mgcp_protocol.c fixes:
- check ci string before it is converted:
In case of missing ci, a nullpointer is delivered to strtoul().
Add a function that takes ci, checks it and converts it to an
uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.
*) mgcp_test
- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
- Add 'I: 1' parameters.
- Use proper port numbers:
from m=audio 0 RTP/AVP 126
to m=audio 16002 RTP/AVP 128
- Change ptime to 'a=ptime:40' because this is what the MGW currently
returns. CRCX generally feed a ptime:40 and this is expected to be
returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
endpoints anymore.
Hence remove one column from tests[].
- test_messages():
- Enable: remove '#if 0'
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway.
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_retransmission():
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_packet_error_detection():
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- remove endpoint init, now done internally.
- add false assert in error case.
- Assert that a conn really vanishes on DLCX, previously the conn would
remain and just be unused, now it is actually discarded.
- test_no_cycle()
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
- Enable: remove '#if 0'.
- remove endpoint init, now done internally.
- add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
- We now see two dummy packets instead of one, now sent to both sides because
we don't know of BTS or NET side. (maybe drop dummy packets later...)
- packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.
Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
2017-08-22 14:35:41 +00:00
|
|
|
struct mgcp_conn_rtp *conn_dst);
|
|
|
|
int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
|
2020-06-18 23:34:42 +00:00
|
|
|
int mgcp_dispatch_rtp_bridge_cb(struct msgb *msg);
|
2018-01-24 10:39:32 +00:00
|
|
|
void mgcp_cleanup_rtp_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
|
2020-06-18 23:34:42 +00:00
|
|
|
int mgcp_dispatch_e1_bridge_cb(struct msgb *msg);
|
2020-06-10 13:27:14 +00:00
|
|
|
void mgcp_cleanup_e1_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
|
Initially implement the new osmo-mgw and libosmo-mgcp
Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.
Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.
The main differences:
*) use a list to manage rtp connections.
Aggregate all rtp related information inside a single struct.
Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.
Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.
*) remove external transcoder feature
Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.
*) vty: get rid of CONN_BTS and CONN_NET
Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.
- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections
Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:
- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()
*) mgcp_protocol.c fixes:
- check ci string before it is converted:
In case of missing ci, a nullpointer is delivered to strtoul().
Add a function that takes ci, checks it and converts it to an
uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.
*) mgcp_test
- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
- Add 'I: 1' parameters.
- Use proper port numbers:
from m=audio 0 RTP/AVP 126
to m=audio 16002 RTP/AVP 128
- Change ptime to 'a=ptime:40' because this is what the MGW currently
returns. CRCX generally feed a ptime:40 and this is expected to be
returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
endpoints anymore.
Hence remove one column from tests[].
- test_messages():
- Enable: remove '#if 0'
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway.
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_retransmission():
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_packet_error_detection():
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- remove endpoint init, now done internally.
- add false assert in error case.
- Assert that a conn really vanishes on DLCX, previously the conn would
remain and just be unused, now it is actually discarded.
- test_no_cycle()
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
- Enable: remove '#if 0'.
- remove endpoint init, now done internally.
- add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
- We now see two dummy packets instead of one, now sent to both sides because
we don't know of BTS or NET side. (maybe drop dummy packets later...)
- packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.
Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
2017-08-22 14:35:41 +00:00
|
|
|
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port,
|
|
|
|
struct mgcp_conn_rtp *conn);
|
|
|
|
void mgcp_free_rtp_port(struct mgcp_rtp_end *end);
|
2021-07-07 10:41:38 +00:00
|
|
|
void mgcp_patch_and_count(const struct mgcp_endpoint *endp,
|
2020-08-04 16:26:50 +00:00
|
|
|
struct mgcp_rtp_state *state,
|
|
|
|
struct mgcp_rtp_end *rtp_end,
|
2020-08-31 11:29:11 +00:00
|
|
|
struct osmo_sockaddr *addr, struct msgb *msg);
|
2022-10-04 14:49:41 +00:00
|
|
|
int mgcp_get_local_addr(char *addr, struct mgcp_conn_rtp *conn);
|
2017-09-07 17:18:40 +00:00
|
|
|
|
|
|
|
/* payload processing default functions */
|
|
|
|
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
|
|
|
|
char *data, int *len, int buf_size);
|
|
|
|
|
|
|
|
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
|
2018-07-19 16:07:57 +00:00
|
|
|
struct mgcp_conn_rtp *conn_dst,
|
|
|
|
struct mgcp_conn_rtp *conn_src);
|
2017-09-07 17:18:40 +00:00
|
|
|
|
|
|
|
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
|
2019-03-06 10:28:18 +00:00
|
|
|
const struct mgcp_rtp_codec **codec,
|
|
|
|
const char **fmtp_extra,
|
Initially implement the new osmo-mgw and libosmo-mgcp
Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.
Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.
The main differences:
*) use a list to manage rtp connections.
Aggregate all rtp related information inside a single struct.
Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.
Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.
*) remove external transcoder feature
Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.
*) vty: get rid of CONN_BTS and CONN_NET
Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.
- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections
Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:
- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()
*) mgcp_protocol.c fixes:
- check ci string before it is converted:
In case of missing ci, a nullpointer is delivered to strtoul().
Add a function that takes ci, checks it and converts it to an
uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.
*) mgcp_test
- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
- Add 'I: 1' parameters.
- Use proper port numbers:
from m=audio 0 RTP/AVP 126
to m=audio 16002 RTP/AVP 128
- Change ptime to 'a=ptime:40' because this is what the MGW currently
returns. CRCX generally feed a ptime:40 and this is expected to be
returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
endpoints anymore.
Hence remove one column from tests[].
- test_messages():
- Enable: remove '#if 0'
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway.
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_retransmission():
- remove endpoint init, now done internally.
- add false asserts in error cases.
- test_packet_error_detection():
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- remove endpoint init, now done internally.
- add false assert in error case.
- Assert that a conn really vanishes on DLCX, previously the conn would
remain and just be unused, now it is actually discarded.
- test_no_cycle()
- Remove concept of BTS and NET endpoints: test only one conn, as they are
now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
- Enable: remove '#if 0'.
- remove endpoint init, now done internally.
- add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
- We now see two dummy packets instead of one, now sent to both sides because
we don't know of BTS or NET side. (maybe drop dummy packets later...)
- packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.
Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
2017-08-22 14:35:41 +00:00
|
|
|
struct mgcp_conn_rtp *conn);
|
2017-09-07 17:18:40 +00:00
|
|
|
|
|
|
|
/* internal RTP Annex A counting */
|
2021-07-07 10:41:38 +00:00
|
|
|
void mgcp_rtp_annex_count(const struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
|
2017-09-07 17:18:40 +00:00
|
|
|
const uint16_t seq, const int32_t transit,
|
2021-07-07 11:41:19 +00:00
|
|
|
const uint32_t ssrc, const bool marker_bit);
|
2021-12-23 18:49:26 +00:00
|
|
|
|
|
|
|
void rtpconn_rate_ctr_add(struct mgcp_conn_rtp *conn_rtp, struct mgcp_endpoint *endp,
|
|
|
|
int id, int inc);
|
2022-09-22 15:53:44 +00:00
|
|
|
void rtpconn_rate_ctr_inc(struct mgcp_conn_rtp *conn_rtp, struct mgcp_endpoint *endp,
|
|
|
|
int id);
|
2021-12-23 18:49:26 +00:00
|
|
|
void forward_data_tap(int fd, struct mgcp_rtp_tap *tap, struct msgb *msg);
|
|
|
|
uint32_t mgcp_get_current_ts(unsigned codec_rate);
|