|
|
|
|
@ -43,7 +43,7 @@ the following additional features are available:
|
|
|
|
|
- RTP/RTCP multiplexing (RFC 5761) and demultiplexing
|
|
|
|
|
- Breaking of BUNDLE'd media streams (draft-ietf-mmusic-sdp-bundle-negotiation)
|
|
|
|
|
|
|
|
|
|
Mediaproxy-ng does not (yet) support:
|
|
|
|
|
Rtpengine does not (yet) support:
|
|
|
|
|
|
|
|
|
|
* Repacketization or transcoding
|
|
|
|
|
* Playback of pre-recorded streams/announcements
|
|
|
|
|
@ -174,6 +174,7 @@ option and which are reproduced below:
|
|
|
|
|
-r, --redis=IP:PORT Connect to Redis database
|
|
|
|
|
-R, --redis-db=INT Which Redis DB to use
|
|
|
|
|
-b, --b2b-url=STRING XMLRPC URL of B2B UA
|
|
|
|
|
-L, --log-level=INT Mask log priorities above this level
|
|
|
|
|
|
|
|
|
|
Most of these options are indeed optional, with two exceptions. It's mandatory to specify a local
|
|
|
|
|
IPv4 address through `--ip`, and at least one of the `--listen-...` options must be given.
|
|
|
|
|
@ -257,7 +258,13 @@ The options are described in more detail below.
|
|
|
|
|
Both take an integer as argument and together define the local port range from which *rtpengine*
|
|
|
|
|
will allocate UDP ports for media traffic relay. Default to 30000 and 40000 respectively.
|
|
|
|
|
|
|
|
|
|
* -r, --redis, -R, --redis-db, -b, --b2b-url
|
|
|
|
|
* -L, --log-level
|
|
|
|
|
|
|
|
|
|
Takes an integer as argument and controls the highest log level which will be sent to syslog.
|
|
|
|
|
The log levels correspond to the ones found in the syslog(3) man page. The default value is
|
|
|
|
|
6, equivalent to LOG_INFO. The highest possible value is 7 (LOG_DEBUG) which will log everything.
|
|
|
|
|
|
|
|
|
|
* -r, --redis, -R, --redis-db, -b, --b2b-url
|
|
|
|
|
|
|
|
|
|
NGCP-specific options
|
|
|
|
|
|
|
|
|
|
@ -524,11 +531,32 @@ Optionally included keys are:
|
|
|
|
|
|
|
|
|
|
- `symmetric`
|
|
|
|
|
|
|
|
|
|
Corresponds to the *rtpproxy* `w` flag. Not used by *rtpengine*.
|
|
|
|
|
Corresponds to the *rtpproxy* `w` flag. Not used by *rtpengine* as this is the default,
|
|
|
|
|
unless `asymmetric` is specified.
|
|
|
|
|
|
|
|
|
|
- `asymmetric`
|
|
|
|
|
|
|
|
|
|
Corresponds to the *rtpproxy* `a` flag. Not used by *rtpengine*.
|
|
|
|
|
Corresponds to the *rtpproxy* `a` flag. Advertises an RTP endpoint which uses asymmetric
|
|
|
|
|
RTP, which disables learning of endpoint addresses (see below).
|
|
|
|
|
|
|
|
|
|
- `strict source`
|
|
|
|
|
|
|
|
|
|
Normally, *rtpengine* attempts to learn the correct endpoint address for every stream during
|
|
|
|
|
the first few seconds after signalling by observing the source address and port of incoming
|
|
|
|
|
packets (unless `asymmetric` is specified). Afterwards, source address and port of incoming
|
|
|
|
|
packets are normally ignored and packets are forwarded regardless of where they're coming from.
|
|
|
|
|
With the `strict source` option set, *rtpengine* will continue to inspect the source address
|
|
|
|
|
and port of incoming packets after the learning phase and compare them with the endpoint
|
|
|
|
|
address that has been learned before. If there's a mismatch, the packet will be dropped and
|
|
|
|
|
not forwarded.
|
|
|
|
|
|
|
|
|
|
- `media handover`
|
|
|
|
|
|
|
|
|
|
Similar to the `strict source` option, but instead of dropping packets when the source address
|
|
|
|
|
or port don't match, the endpoint address will be re-learned and moved to the new address. This
|
|
|
|
|
allows endpoint addresses to change on the fly without going through signalling again. Note that
|
|
|
|
|
this opens a security hole and potentially allows RTP streams to be hijacked, either partly or
|
|
|
|
|
in whole.
|
|
|
|
|
|
|
|
|
|
* `replace`
|
|
|
|
|
|
|
|
|
|
@ -554,8 +582,9 @@ Optionally included keys are:
|
|
|
|
|
|
|
|
|
|
{ ..., "direction": [ "external", "internal" ], ... }
|
|
|
|
|
|
|
|
|
|
*Mediaproxy-ng* uses the direction to implement bridging between IPv4 and IPv6: internal is seen as
|
|
|
|
|
IPv4 and external as IPv6.
|
|
|
|
|
*Rtpengine* uses the direction to implement bridging between IPv4 and IPv6: internal is seen as
|
|
|
|
|
IPv4 and external as IPv6. However, this mechanism for selecting the address family is now obsolete
|
|
|
|
|
and the `address family` dictionary key should be used instead.
|
|
|
|
|
|
|
|
|
|
* `received from`
|
|
|
|
|
|
|
|
|
|
@ -565,13 +594,18 @@ Optionally included keys are:
|
|
|
|
|
|
|
|
|
|
* `ICE`
|
|
|
|
|
|
|
|
|
|
Contains a string, valid values are either `remove` or `force`. With `remove`, any ICE attributes are
|
|
|
|
|
Contains a string, valid values are `remove`, `force` or `force_relay`.
|
|
|
|
|
With `remove`, any ICE attributes are
|
|
|
|
|
stripped from the SDP body. With `force`, ICE attributes are first stripped, then new attributes are
|
|
|
|
|
generated and inserted, which leaves the media proxy as the only ICE candidate. The default behavior
|
|
|
|
|
(no `ICE` key present at all) is: if no ICE attributes are present, a new set is generated and the
|
|
|
|
|
media proxy lists itself as ICE candidate; otherwise, the media proxy inserts itself as a
|
|
|
|
|
low-priority candidate.
|
|
|
|
|
|
|
|
|
|
With `force_relay`, existing ICE candidates are left in place except `relay`
|
|
|
|
|
type candidates, and *rtpengine* inserts itself as a `relay` candidate. It will also leave SDP
|
|
|
|
|
c= and m= lines unchanged.
|
|
|
|
|
|
|
|
|
|
This flag operates independently of the `replace` flags.
|
|
|
|
|
|
|
|
|
|
* `transport protocol`
|
|
|
|
|
@ -590,12 +624,43 @@ Optionally included keys are:
|
|
|
|
|
string. The format must be dotted-quad notation for IPv4 or RFC 5952 notation for IPv6.
|
|
|
|
|
It's up to the RTP proxy to determine the address family type.
|
|
|
|
|
|
|
|
|
|
* `address family`
|
|
|
|
|
|
|
|
|
|
A string value of either `IP4` or `IP6` to select the primary address family in the substituted SDP
|
|
|
|
|
body. The default is to auto-detect the address family if possible (if the recieving end is known
|
|
|
|
|
already) or otherwise to leave it unchanged.
|
|
|
|
|
|
|
|
|
|
* `rtcp-mux`
|
|
|
|
|
|
|
|
|
|
A list of strings controlling the behaviour regarding rtcp-mux (multiplexing RTP and RTCP on a single
|
|
|
|
|
port, RFC 5761). The default behaviour is to go along with the client's preference. The list can contain
|
|
|
|
|
zero of more of the following strings. Note that some of them are mutually exclusive.
|
|
|
|
|
|
|
|
|
|
- `offer`
|
|
|
|
|
|
|
|
|
|
Instructs *rtpengine* to always offer rtcp-mux, even if the client itself doesn't offer it.
|
|
|
|
|
|
|
|
|
|
- `demux`
|
|
|
|
|
|
|
|
|
|
If the client is offering rtcp-mux, don't offer it to the other side, but accept it back to
|
|
|
|
|
the offering client.
|
|
|
|
|
|
|
|
|
|
- `accept`
|
|
|
|
|
|
|
|
|
|
Instructs *rtpengine* to accept rtcp-mux and also offer it to the other side if it has been
|
|
|
|
|
offered.
|
|
|
|
|
|
|
|
|
|
- `reject`
|
|
|
|
|
|
|
|
|
|
Reject rtcp-mux if it has been offered. Can be used together with `offer` to achieve the opposite
|
|
|
|
|
effect of `demux`.
|
|
|
|
|
|
|
|
|
|
An example of a complete `offer` request dictionary could be (SDP body abbreviated):
|
|
|
|
|
|
|
|
|
|
{ "command": "offer", "call-id": "cfBXzDSZqhYNcXM", "from-tag": "mS9rSAn0Cr",
|
|
|
|
|
"sdp": "v=0\r\no=...", "via-branch": "5KiTRPZHH1nL6",
|
|
|
|
|
"flags": [ "trust address" ], "replace": [ "origin", "session connection" ],
|
|
|
|
|
"direction": [ "external", "external" ], "received-from": [ "IP4", "10.65.31.43" ],
|
|
|
|
|
"address family": "IP6", "received-from": [ "IP4", "10.65.31.43" ],
|
|
|
|
|
"ICE": "force", "transport protocol": "RTP/SAVPF", "media address": "2001:d8::6f24:65b" }
|
|
|
|
|
|
|
|
|
|
The response message only contains the key `sdp` in addition to `result`, which contains the re-written
|
|
|
|
|
|