gcc <12 propagates the const-ness of the given value to the newly
declared variable with __auto_type, leading to silly "can't assign to
const variable" errors. Work around this with an ugly macro.
Change-Id: Ic952c094c24bd802379fc10ad19d559613b2c1d0
There's two flavours of this struct being in use, even though the
structs' signatures are the same. One contains socket_t objects, the
other contains stream_fd objects. Separate them out and be explicit
about which is which.
Change-Id: I5ef1d154cc442528149f69be2e6a02625a6c650d
Stop handling redundant media subscribing in the:
- `call_get_monologue_new()`
- `call_get_dialogue()`
and leave this work only for the offer/answer model:
- `monologue_offer_answer()`
In the meanwhile the subscribe request/answer model
keeps on using directly the:
- `__add_media_subscription()`
Change-Id: I6cfaef634b8b9e5e805df25f1c6f80225648b75a
Allow codec_tracker_update to reference an existing codec_store. Then
when a supplemental codec type needs to be generated, make it look up
the type in the existing codec_store and re-use the existing payload
type if present instead of creating a new one. This allows payload type
numbers to remain unchanged during a re-invite.
Change-Id: I9e5edd897515a5e3eb5033aa6bbf21c8667d6133
During an offer, we update the codecs from the given list not only on
the side of the offerer, but also on the answerer's side, in order to
perform the codec answer routine during the answer phase. While doing
this, we empty out the existing list of codecs (on both sides) and
repopulate it fresh from the given list.
This can cause problems during a reverse re-invite, when the list of
codecs on the answerer's side already contained the codecs that had been
offered before. When setting up the new re-invite offer, we want to
retain codecs (and their payload types and format parameters) that were
already in place, instead of recreating a new list from scratch.
Improve this by adding a `merge_cs` option to the populating functions,
which points back to the stream_params codec_store. Codecs that would
have been removed from the codec_store during the repopulation are then
moved back into the stream_params codec_store instead. This then allows
the functions adding new codecs to the list (offer/transcode) to
reference these codecs that were previously in place, and so they can be
added back with the same options as they had existed before, instead of
recreating them from scratch.
Change-Id: I53e7ab10e9144a308a5c36be5ebfddd73c212f06
In case of repeated answers without additional offer in between, we
shouldn't reset the codec tracker status at the end of the codec answer
routine, so that we end up with the same state during the next answer.
Change-Id: I54f6136cc5684473553b4862c13ea9f4a3dcfe99
*** CID 1570963: Null pointer dereferences (REVERSE_INULL)
/daemon/call.c: 3553 in monologue_subscribe_answer()
3547 /* set src_media based on subscription (assuming it is one-to-one) */
3548 struct call_media * dst_media = __get_media(dst_ml, sp, flags, 0);
3549 GList * src_ml_media_it = dst_media->media_subscriptions.head;
3550 struct media_subscription * ms = src_ml_media_it->data;
3551 struct call_media * src_media = ms->media;
3552
>>> CID 1570963: Null pointer dereferences (REVERSE_INULL)
>>> Null-checking "dst_media" suggests that it may be null, but it has already been dereferenced on all paths leading to the check.
3553 if (!dst_media || !src_media)
3554 continue;
3555
3556 /* additional attributes to be carried for `sdp_create()` */
3557 if (print_extra_sess_attrs && !g_queue_find(&attr_mls, ms->monologue)) {
3558 sdp_copy_session_attributes(ms->monologue, dst_ml);
Change-Id: I391b95f61237e5a7af206b0568a1cf421dcbb8f8
From now on the `call_subscription` concept gets
deprecated, and instead of it the `media_subscriptions`
concept gets applied.
Benefits of this change is:
- ability to subscribe one-to-multiple medias (different monologues)
- media level manipulations, without affecting whole SDP session
- no need to use medias offset, to detect proper subscription's media
- there is no need of particular medias order, they can be
subscribed to each other in any possible way
(even though RFC still requires to always have proper ordering)
Deprecated objects:
- `struct call_subscription`
- `GQueue subscriptions`
- `GQueue subscribers`
- `GHashTable * subscriptions_ht`
- `GHashTable * subscribers_ht`
Deprecated functionality:
- `__unsubscribe_one()`
- `__unsubscribe_all_offer_answer_subscribers()`
- `__unsubscribe_from_all()`
- `__subscribe_offer_answer_both_ways()`
- `__add_subscription()`
- `__unsubscribe_one_link()`
- `call_get_call_subscription()`
- `call_subscriptions_clear()`
- `call_subscriptions_free()`
Offtopic: additionally this commit adds helper func:
- `call_media_subscribed_to_monologue()`
Change-Id: Ifb44f7a1ba5b483b1472882b1b8d06444dba1727
Rework the `set_monologue_flags_per_subscribers()` to work on medias
instead of working on monologues and refactor according code
appealing to this func.
Also to reflect the sense of this function better, change naming
from: `set_monologue_flags_per_subscribers()`
to: `media_update_transcoding_flag()`
Change-Id: I517ea13c91240d8fb9d3608edee16f132f4f61e1
Rework the `__update_init_subscribers()` so, that it takes:
- `call_media`
- `stream_params`
directly for processing, instead of operating on the whole ml.
Therefore also refactored code that appeals to the concerned func.
Change-Id: I56a9c6aa54b17d8c8dede2181414c481ca0cf2ca
During the `monologues_intact` stage of the `call_get_monologue_new()`
use media subscription in order to:
- update `os` ml, if still not set before
- update subscription ml's tag with totag, if not set before
After the first possible subscription's `offer/answer` ml
has been found and all work done, break cycling expecting
that this is one-to-one (so offer/answer) model, where only
medias of two monologues are involved.
Change-Id: I8b06cee2090563da4ce4c290ab3c0b9ce8c7ab3f
Rework the logic of fromtag monologue detection in the
`call_get_dialogue()`.
Fristly, try to match using given from tag (if there is one).
Secondly, try to match using given viabranch.
Thirdly, try to use top-most subscription of the top-most
media related to the totag monologue (newer behavior).
Fourthly, if still not found just create a brand-new one.
This change relates to the fact, that we stop using call monologue
subscriptions model and switch to the media based one.
Change-Id: I106bdd79f5e4754f76bd048f51c8fc211ee57410
Due to introduction of media subscriptions model.
Rely on subscription monologue's empty tag,
while trying to detect, whether or not to destroy given monologue
but with a clause that:
- this ml is subscribed to medias of other signle ml
It's important to keep this check because
if the `delete` is done with from-tag and to-tag,
just right away after an `offer` without the to-tag
and without use of via-branch, then the call's data
can potentially remain dangling without being deleted completely.
So looking up the offer side of the call through the from-tag
and then checking, if the call has not been answered
(answer side has an empty to-tag), gives a clue whether
to delete an entire call.
Additionally, introduce a helper function:
- `ml_medias_subscribed_to_single_ml()`
which checks, whether this monologue medias are subscribed
to a single other monologue medias.
Change-Id: I2474d24ac66ce2cb12bd282f2c0df809fce7880c
From now on, the newer media subscriptions based concept has been
introduced, which means the call monologue is able to have:
- medias, which have non-even amount of subscribers and subscriptions
- medias of different monologues in the media's subscriptions list
- medias of different monologues in the media's subscribers list
Further, improve the `call_get_dialogue()` accordingly so,
that a detection, whether or not a from-monologue has already seen
before given to-monologue, will be based on from-monologue's media subscriptions.
Absent to-monologue medias in from-monologue subscriptions list means —
to-monologue has been never seen before, and we have to update tags accordingly
as well as subscribe matched medias of to/from-monologue to each other.
Change-Id: Icef81d06ac2ee6e150ecdea7133547166290b015
Moving from call subscriptions to media subscriptions.
Add a possibility to run `media_stop()` and `__monologue_stop()`
for all related to this monologue media subscribers.
This is an improvement, which gives the following benefits:
- all subscribers are handled inside of the func, less code out of it
- the function gets in sync with new media subscriptions concept
Change-Id: Ia0b897f53438559a68c8b469c71fec72f0d562af
Use media subscriptions model in the `kill_calls_timer()`
to find subscribers and related monologues in order
the to update the `xmlrpc_helper` data.
Change-Id: I4e7e8586a701eeb135c34138ba5a9dc288817c8d
In the `dialogue_unconfirm()` (previously `dialogue_unkernelize()`)
use media subscriptions to find subscribers/subscriptions
and correlated to them medias to unconfirm them.
This change is bound to the switch from monologue
subscriptions to media subscriptions.
Additionally: Refactor unkernelize/unconfirm in `call.c`
To provide a sense of the functions clearer,
the namings of the following function singatures
have been changed:
- `dialogue_unkernelize()` -> `dialogue_unconfirm()`
- `__monologue_unkernelize()` -> `__monologue_unconfirm()`
Change-Id: If8cc2515eb26dcc4ffed02a420514f98d43cc5c6
Report to whom a `call_monologue` is subscribed and
who is subscribed to it using media level subscriptions
instead of using monologues one.
Change-Id: I07a7353d5682b9346d1ade25d11b902ee927d4ac
Add handling of SDP session level attributes for:
- `monologue_subscribe_request()`
- `monologue_subscribe_answer()`
This will be used by `janus.c` related functionality.
Change-Id: I1c50b5b9da08e7d8cb2c98eb6995d8610386d6ed
Move `a=extmap:` attribute to the `call_media`'s
`sdp_attributes` using `stream_params`.
Required by the `insert_sdp_attributes()` used in `sdp_create()`.
Additionally revert `extmap` unit test checks in the
`testVideoroomWebRTCVideo`.
Change-Id: If63e4e8733ea0899f34fae1f1d38997e9e2c081c
Move `a=ssrc-group:` attribute to the `call_media`'s
`sdp_attributes` using `stream_params`.
Required by the `insert_sdp_attributes()` used in `sdp_create()`.
Change-Id: I67025dc83dd8e5e46422b6dc1bc54aa9c838dfea
We have to move the list of attributes with following types
to the `call_media`'s `sdp_attributes` using `stream_params`:
ATTR_SSRC
ATTR_MSID
ATTR_OTHER
This is then required by the `insert_sdp_attributes()`
used by:
- `sdp_replace()` -> `replace_sdp_media_section()`
- `sdp_create()`
Additionally: move the `insert_sdp_attributes()`
to the usage of the `append_attr_to_gstring()`, which
gives SDP attrs manipulations control over attributes
being inserted into SDP. Previously not supported.
Additionally: `process_media_attributes()` takes new
argument `bool strip_attr_other`, in order to control
whether or not to strip `ATTR_OTHER/ATTR_SSRC/ATTR_MSID`.
For now there is only one user of it `replace_sdp_media_section()`,
but for later on, we can control this using this bool.
Additionally: `print_sdp_media_section()` takes new
argument `bool print_other_attrs`, in order to control
whether or not to strip `ATTR_OTHER/ATTR_SSRC/ATTR_MSID`.
This is required, because the sdp replacing/creating mechanism
needs a controllable way of adding them, users are:
- `janus_videoroom_join()`
`janus_videoroom_configure()` - always need them
- `call_publish_ng` - always needs them
- `call_subscribe_request_ng` - never needs them
(otherwise leads to a duplication of such attributes)
- `call_offer_answer_ng()` - requires them always
- `call_subscribe_request_ng()` - never needs them
(otherwise leads to a duplication of such attributes)
Change-Id: I9c83d99da1603acb55443c462797b2cd1e72477d
Stop using the call subscriptions model in the
subscribe request/answer functionality and move to
the media subscriptions.
Change-Id: I8aab2b1b4cdf9a3c5a04172c395ca509295ce0a3
The global list of monologues is populated in reverse order from the
list of medias. Iterate the list backwards so that the resulting medias
are in ascending order.
Change-Id: Icadca7a6cecb636ca6e021c0286b44e5cd3cdc84
The index j we get is not the position in the output array/list, but
rather the index into the source array. Simply append each new element
to the array in order.
Also make sure we don't skip over empty elements in the array when
building the JSON list, so that the order is preserved.
Change-Id: Id6577410e114f0ddbea745977118f1bab2e38fa9
For the use case with a separate base chain, we want to preempt other
firewall rules by default and insert our immediate jump rule at the
beginning, rather than at the end. Add an option to provide the other
behaviour.
Change-Id: I16171f7c028c89b94823ecc99387771be3ba9443
If we're not using a separate base chain, create the target rule with
the UDP filter in place, same as the "immediate" rule in the case with a
base chain.
Reported in #1732
Change-Id: I0e67a88f5f51e21ba9537c87e2955f910dd6ec2c
If we're updating the handlers for one particular source -> sink flow,
only stop/reset the handlers matching this flow.
Change-Id: I1d046f47f8d26cac47c5d0f4318498eacb6c5677
Fix all instances of argument-less function signatures.
Fix all instances of auto-cleanup variables declared after they need to
be in scope.
Change-Id: I3a005df03ede971e08d4f62d7c7711a1913fda5e
This is a fix for the following found defect:
*** CID 1568540: Null pointer dereferences (REVERSE_INULL)
/daemon/sdp.c: 2065 in insert_codec_parameters()
2059 pt->payload_type,
2060 STR_FMT(&pt->format_parameters));
2061 }
2062 if (s_dst->len) {
2063 /* append to the chop->output */
2064 append_attr_to_gstring(s, s_dst->str, NULL, flags,
>>> CID 1568540: Null pointer dereferences (REVERSE_INULL)
>>> Null-checking "cm" suggests that it may be null, but it has already been dereferenced on all paths leading to the check.
2065 (cm ? cm->type_id : MT_UNKNOWN));
2066 }
2067 g_string_free(s_dst, TRUE);
2068 }
2069
2070 /* rtcp-fb */
Change-Id: I309fd6268b889ceaf32a58d2fbe17a8c891a95d6
Move processing of removal and substitution
attribute manipulations to the bottom,
after all fixed (well known to rtpengine)
attributes are skipped already.
This is done for media and session level attributes:
- `process_media_attributes()`
- `process_session_attributes()`
This is to add an efficiency to the current processing,
and not do double work.
Change-Id: Idd933f9d85aef5e9a5d597f8825d21e45f43ef37
Add media attributes substitution support to
the following functions:
- `append_attr_to_gstring()`
- `append_attr_int_to_gstring()`
First functions check, if the attribute has to be
removed (by the manipulations profile), if not
then it checks out whether we have to substitute it.
If neither of manipulations have to be applied,
then the given attribute gets attached to the chopper.
This gives support of substitution for
such media level attributes like:
- `mid`
- `label`
- `ptime`
- `ice-ufrag`
- `ice-pwd`
- `ice-options`
etc.
Change-Id: I35a1ad71f1031d986a79446522da2a557c09ddcc
Setting the target info of an `expr` object doesn't result on the data
being copied by libnftnl (unlike other objects). Use static storage to
fix invalid pointer usage.
Reported in #984Closes#1731
Change-Id: Ic5c156a83504a24fb618d770ba53cd1ec4fb2435
Because the attribute parts variables are declared in
one signle row, these (popping up) commentaries in other
code parts, show only the first code comment for all of the
variables, which makes the code reading confusing.
In order to fix that, declare each one separately, that
gives own code (popping up) commentary per variable.
Change-Id: Iddb94b989844b997055be70a526cca59ab2fddf3
Ignore `a=` during sdp attribute level manipulations
during lookups with the `sdp_manipulate_remove()` and
`sdp_manipulations_subst()`. This is only in:
- `append_attr_int_to_gstring()`
- `append_attr_to_gstring()`
This is required for a proper `str` matching in ht.
Then explicitely add `a=` to the resulting `GString *s`.
Change-Id: I569a356e9a01cffb0068a87a9c6d5a568fe85ecc
In order to be able to remove or substitute `fmtp` parameters,
we have to take care of that in `insert_codec_parameters()`,
since `fmtp` are additionally being printed already after
execution of `process_media_attributes()`.
Change-Id: I78547be13939e161b193beecd8693e22c534fd18
With the "foreign" flag now stored in call_flags, restoring a call from
Redis restores this flag as well, overwriting the desired flag as we had
set it through call_get_or_create().
Reverse the flag setting by taking it out of call_get_or_create() (where
it's always false anyway, except when coming from Redis) and setting it
explicitly with call_make_own_foreign() after restorting call and its
flags.
Change-Id: Ib68be2aeedfa988b7555e426fa337657e1062245
Start using media subscriptions instead of call subscriptions
in the `call_block_silence_media()`, because older concept
gets deprecated.
Change-Id: I0ac0378a99d69017d34f8f949d7f3228bfa5b07a
Start using media subscriptions instead of call subscriptions
in the `codec_update_all_handlers()`, because older concept
gets deprecated.
Change-Id: I1cbd5379855e557099894f4b9a508a65ca78214c
Stop using call subscriptions for lookups based on
the `__sub_is_transcoding()` and use media subscriptions instead.
Change-Id: I545daca19f5ce433fd660a5a7d60181ac4ed1d8b
Part 1.
Deprecate usage of the call subscriptions for updating
transcoding attributes, use media subscriptions instead.
Change-Id: Iadde906189c9634d7691d823556f2c0dfd61a655
Stop using call subscription in the `monologue_offer_answer()`,
which is used here to update transcoding related attributes and
use media subscriptions model instead.
Change-Id: I27abfe23ed2f3f532c3899e5d483cb302e43a142
Move linking of the media to its monologue, from the `json_link_medias()`
to the `json_medias()`. This is required, becase the `json_link_medias()`
already needs to operate on medias list, which is fully linked
to their monologues. Otherwise it can happen, that during the
linking of media to media in `json_link_medias()` (subscribing them)
the monologue for the other media is still not linked.
Change-Id: Ifc4dd8dff27f65e664b4fd21332a1d296d07759b
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of:
- `redis_encode_json()`
- `json_link_medias()`
- `rbl_subs_cb()`
Change-Id: I3f7267ab156b361d7e7bec4ff91a8976a7be02ee
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `__find_subscriber()`
Change-Id: Ief3e9d0785ad53884be347ca21d6766c3ad2b275
previously, dtmf_inject wouldn't add the events as the dtmf_payload_type
was set to -1 as part of the delay buffer handling. However, as we
know we want this DTMF, this change updates the function to check for
and use the real_dtmf_payload_type value
Then, in codec_add_dtmf_event, we can check the injected bool and
if set, use the real_dtmf_payload_type again to decide whether to
push the event onto the queue
closes#1722
Change-Id: I34e35f92e014f4aed9e045737df7400155b86602
Janus reports inactive and disabled streams only as being disabled and
doesn't report the codec in use. Mirror this behaviour.
Change-Id: Icf193f60a054b803afea02f048dcd8d26632bc47
UDP packets sent in response to a UDP request should have the same
source address as the request's destination address.
This can be achieved with sockets bound to a specific address, but in
the case of ANY-bound sockets, we can use the PKTINFO mechanism to do
this.
Extend control_ng_process() to accept an extra socket address
corresponding to the local address to use. Extend the signature of the
callback function (to do the actual sending) accordingly.
Extend socket_sendiov() to be able to set the PKTINFO cmsg when sending
a packet.
Add socket_sendto_from() as a convenience wrapper.
Extend control_udp_incoming() to pass the address from
udp_buf->local_addr back to socket_sendiov().
Change-Id: Idd019fdcfd796098e7807427e6686d4b05de35d1
Convert each listener entity into a list.
Support a list of values for each option so that multiple
ports/addresses can be listed.
Keep previous behaviour unchanged: If ANY address is given, open
listeners for IPv4 and IPv6.
Change-Id: Ic54f28d1262f60d5e5c9d824a95e7c33ebc2aba9
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of:
- `ng_stats_monologue()`
- `ng_call_stats()`
Change-Id: I158aedd1fae9d65135144b3331089bfc11020f13
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `cdr_update_entry()`.
Change-Id: I0618a1ee51ec8ea208839da2de46781242287a12
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `cli_list_tag_info()`.
Change-Id: Ia1a464b3597d65390258df5e421e2c61dd84b0af
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `codec_update_all_source_handlers()`.
Change-Id: I29da49cdd2b5de8c6e6f9a6629f5b1f3867596ba
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `stream_packet()`.
Change-Id: Ia8d9442810c4afc12b00cad8b1a354d66bb5051c
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `hunt_ssrc()`.
Change-Id: I08c7292e0d73a486e25004358de91a3414ce886a
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `call_get_dialogue()`.
Change-Id: Id7b8f84354bcc0525ff180d94cedfc6dc29a7c63
The following functions have been deprecated
due to no use:
- `__offer_answer_get_subscriptions()`
- `__tags_get_subscriptions()`
Change-Id: Id71dcd1a5573720299711b369410cd7fcd9de476
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `__update_init_subscribers()`.
Change-Id: I45446239384cf2813d9ae6ecadb2499eefa86ca8
Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
parallel to existing model, which is based on
the `call_subscription`.
Change-Id: I1f111ef181b2d698609c0b28dd72431bb3f2cf0a
Introduce `media_unconfirm()` to do a selective handling
of medias to unkernelize the correlated to it streams.
This is analogue of the of the `__monologue_unconfirm()`
but for medias.
Change-Id: Id8ede0fc56412021c301e97764fd5dd070b7d484
Previous implementation assumes that we use the `call_subscription`
objects in:
- `call_offer_answer_ng()`
- `call_update_lookup_udp()`
- `call_request_lookup_tcp()`
when appealing to the `call_get_mono_dialogue()`, in order to
get the `call_subscription` objects, in order to then pass it
for usage in the `monologue_offer_answer()`, where the most important
again is to use monologue references stored inside
the given `call_subscription` objects.
Instead of using the `call_subscription`, just use `call_monologue`
objects as a base data objects for this work,
which will allow us in the coming commits to deprecate
the `call_subscriptions` based model and
get to the subscription model based on medias.
Change-Id: Ia9ee5ba66522929acbceca28854ebccd3705635a
Introduction of the basic functions required for
a handling of the media subscriptions:
- `__unsubscribe_media_link()`
- `__unsubscribe_media()`
- `__unsubscribe_all_medias()`
- `__add_media_subscription()`
- `__subscribe_medias_both_ways()`
- `__subscribe_matched_medias()`
- `call_get_media_subscription()`
- `call_totag_subscribed_to_monologue()`
- `call_viabranch_intact_monologue()`
Change-Id: Iad2af5323b2ea8a10a83064d9ee72106c1d8f9c0
We always need to (re)set the ssrc_map_out SSRC, even for the input
context, as this SSRC is used to look up the receiving SSRC context,
where the appropriate RX stats are stored, including the payload type in
use.
Change-Id: I434c6df4761bf56e36c7267dd3a44b0bb9c9b852
All functions that create listener objects take a read-only endpoint, so
make them as const.
Remove the extra TOS argument to make all signatures the same.
Change-Id: I722c7665b192476d90dbf0ece200d0bfd34cb9eb
Forking to background kills already created threads, so forking must
happen first and thread creation after.
closes#1695
Change-Id: I743b890b83903d9e0b3248b032844e7e357d2307
It actually uses a shared config setting from the lib (stack size) so
the function itself also belongs in the lib.
Change an argument type to bool.
Change-Id: I8be68008fcfc058cb29069102eb00497b66897a5
We have long switched to having a single primary global poller, so
there's no point in passing the poller pointer around and storing it in
associated objects. Remove all remnants of non-global pollers.
Change-Id: I5a3fd217d5de51e839e2b04fec7e23643ee83631
This is a dependency of the poller and so is needed in lib/ as well to
make it usable.
Also consolidate the type.
Change-Id: I70ec8a200d6cd65710ac93636a9495cf24c35ef4
All timers have been moved to their dedicated timer threads, making this
mechanism obsolete.
The only victim is the timeout handling for TCP control streams. Since
other TCP streams aren't using timeout handling either, and the TCP
control socket is barely used by anyone, we can live with not having a
dedicated timeout for these streams for now.
Change-Id: I83d9b9a844f4f494ad37b44f5d1312f272beff3f
To be able to use this feature from controlling agents which don't
directly support the new dictionary keys, add an alternative syntax via
the `flags` list. This is in line with all other similar dictionary keys
(e.g. `codec-` etc)
Change-Id: I7210c74c9cd3b31338052efa1c3504fe775c1c46
Similar to the other list building helper functions, add one that builds
a key/value table. The benefit is that this can then be used as a
callback in a different context.
Change-Id: If639543eaa3d67153c4cc9656d715a0c0aba3887
These functions iterate over lists, building hash tables or queues
respectively. Eliminate code duplication.
Change-Id: I375a72cc6a4d30044678e6d4abab148880713fe3
The original sdp_manipulate_check's only purpose left is to check for an
attribute removal. Refactor accordingly.
Change-Id: I3be28e0a2c04461a60766afe7096ad3fb8bbe998
In order to perform a substitution we must do a lookup to the hash table
anyway. We can eliminate an extra lookup for the same key to check
whether a substitution exists by combining the two operations into one.
Change-Id: Ife8f1fbfd77ade1986a303a3a5503f4142f7de01
Operating on an empty queue is essentially a no-op, so there's no point
in doing an extra check first to see if the queue is empty. Remove this
extra check for the CMD_ADD case.
Change-Id: I3c7524cd407fb350a46bdf8d3a91014158c6bf44
Use an indexed array to generically support all possible media types
instead of hard-coding a few possible types. This makes lookup faster
and is also future-proof.
Add helper functions to allocate and lookup the appropriate object.
Change-Id: I28406b2c5a6829330f41601fa52e738d9a8ee315
Make sure we don't try to send on closed sockets or to endpoints which
haven't been initialised.
Fixes unexpected fallout from 83c7336e
Change-Id: If73d61e52edeb72257515adab7428ecef82c2797
Media types must be given explicitly anyway, so we don't need to warn
when we encounter a different one, as it's entirely expected that we
won't operate on it.
Change-Id: Ic6b808422ceb5ae857a4d0a99379a1c858bb6fd8
This HT is needed when updating UDPTL/T.38 handlers, on both sides of
the call. Make sure the HT exists.
Change-Id: Ic85684bbd2a746ff490d06008eadfae664e9f8a9
Add second callback function to be able to handle lists that not just
contain strings, but also arbitrary other elements.
Rename the old call_ng_flags_list to call_ng_flags_str_list to reflect
this.
Unused at this point.
Change-Id: I49b46acf3ba53172b68998a93523d2d7eca1bd0b
We don't have functioning thread cancellation under ASAN. Make sure our
timer threads don't sleep too long so that the tests don't time out.
Change-Id: Iced6396fc500942ae64dfe8d8a5fb81c6a5e9619
When we're duplicating the packet contents, we must also update the RTP
header pointer accordingly.
Fixup for fa819e3a73
Change-Id: I66117b2ad15a9adfaabaa1dbc67179bb1817f5e9
Don't explicitly set the "non forwarding" flag just because an RTCP
stream is being kernelised. The distinction between RTP and RTCP,
together with zero-length outputs setting "non forwarding" automatically
takes care of it.
Change-Id: Ie363fc369b7ace21ed172a0ec141c83afd1ba21b
Transcoding is flow-specific, so it doesn't make sense to have a flag
for it in a call_media section. Instead we use the transcoding flag set
on the call_subscription objects (on subscribers), and set/unset a flag
on the monologue struct, depending on whether any media flows (going to
subscribers) have transcoding enabled.
Change-Id: Id671d56e56a22eaa8e56f6d449770b0c7b086cea
Pass the subscription object to codec_handlers_update to eliminate the
need for a return type and the subsequent if/else.
Change-Id: I311b3e8ca14ee5090cf329163975354385cee800
Do a direct lookup of the call subscription object and set the
transcoding flag directly. Remove obsolete function.
Change-Id: I8b8329e53afb641fad80d38b45120efd46c408db
This is a convenience function that does an unnecessary loop iteration.
We have a hash table to perform the exact lookup needed. Turn the
function into a simple wrapper which uses the hash table.
Change-Id: If91976a955dea80e882656849b0b13d426e5748f
We have the subscription objects available now, so we can directly set
the transcoding flag without having to do a hash table lookup.
Change-Id: I2b85f34ca4d03dfaf81d92ea252902d1ee194efd
Instead of just return the monologues involved in an offer/answer,
return the respective subscription objects that have the monologues
pointing to each other. This makes it possible to set flags within these
objects.
Change-Id: Id88e56e1bf164a75e2172d0df04316cde5d8a955
Make it possible for a looper thread function to break out of the loop
by returning an appropriate status code.
Change-Id: I22e7789270eed4bf3340e7dae941929de58700ea
This is pointless at this stage, but makes it possible to pass
additional information to the thread in the future.
Change-Id: I9999f522e52ffd86753b291fd61e8ff8ea3e5899
Perform endpoint address check before doing ingress SSRC handling. We
don't want to act on an apparent SSRC change if the endpoint address
doesn't match and the packet should have been ignored.
Closes#1655
Change-Id: I251e23b1583b1916c7c4904cf40d3b37b3533117
Make it possible to set output-destination immediately when starting the
reording, not only afterwards.
Closes#1667
Change-Id: Idb7de770ad5a41d6ae6055784213e7983df9bfec
Deprecate increasing/decreasing functionality of
the call timer run duration, because it's not needed anymore,
most of the unnecessary functionality has been moved lately
to separate dedicated threads and the `call_timer`
is simply unloaded for now.
Additionally: remove logging with timestamps, because
we do not need to monitor it anymore.
Change-Id: I8d1fd260472528fcee6a12f48b9a92f195893787
As this is running in a separate thread now, rtpe_now needs to be set
excplicitly in each iteration.
Fix-up for 6fe9cc9
Change-Id: Icb1ec8a27389bb48ee893a9a29e4e1c11447d61c
Move the `ice_slow_timer()` functionality to a separate thread,
so that we do the work more efficiently, and not be dependent
on the call_timer runs by poller.
Furthermore it makes more sense to keep in the `ice.c`,
since it obviously has to do with ice timing.
Additionally:
Update the test-stats due to these changes in the `call_timer()`
We have to call the `ice_slow_timer()` now explicitely from
the test-stats.c, because the `call_timer()` is not anymore
responsible for providing stats counters rate calculations.
Change-Id: I03377dd59ea71c27497e1f4d30164075f05165cd
Similarly as for the `stats_rate_min_max()`,
move the `stats_counters_calc_rate()` functionality
to the same separate thread, so that we do the work
more efficiently and not be dependent on the call_timer
runs by poller.
Furthermore it makes more sense to keep in the `statistics.c`,
since it obviously has to do with statistics.
Additionally:
Update the test-stats due to these changes in the `call_timer()`
We have to call the `stats_counters_calc_rate()` now explicitely from
the test-stats.c, because the `call_timer()` is not anymore
responsible for providing stats counters rate calculations.
Change-Id: I1682eb76e3057f0f431c27b9633717d965313a1a
Support the "id" parameter for the "join" as "publisher" message.
Preempts choosing a random feed ID.
Add a test case for this.
Change-Id: Iae8c2f50864adf913b288085aa70d5427e0a4456
Simply stripping a supplemental codec doesn't actually affect the
remaining real codecs. Add a special-cased version of codec_touched() to
ignore such a manipulation.
Add a matching test case.
Change-Id: I4a91292dd38e1114837c2dc841afe07d87cff6cb
To do the work more efficiently,
and not be dependent on the call_timer runs by poller,
we should move the ports iterations (stats update from the kernel)
functionality to a separate thread, to make it faster and
not be dependent on what happens in the `call_timer` at all.
Since it has nothing to do with the call timers.
As an additional benefit: we unload the `call_timer` runner.
Change-Id: I511529ce504ef3d29f4e9d6d731ffd470d78d27a
Due to multiple threads polling all sockets for read events, it's
possible for one socket to receive a read event in one thread, then
immediately receive another read event in another thread, resulting in
two threads reading packets from the same socket at the same time.
While this is perfectly valid and correctly handled by mutex etc, it can
result in packets being processed out of order. In media passthrough
scenarios which don't do sequencing this can result in packets being
reordered.
Using a simple atomic counter we can ensure that only one thread is
reading from any one socket at a time.
Relevant to #1638
Change-Id: I406491d6ae5e13e618e153ba5463fd9169636016
Don't try to interpret or schedule DTMF packets if we're just doing RTP
passthrough.
Without tracking the seqencing and timestamping of the primary media
stream, we cannot actually schedule DTMF packets properly. Use the
presence of a defined output sequence number to make this determination.
The other case that uses a predefined output sequence number is when
media is coming from a pre-coded media player stream. The same thing
applies: These packets are already scheduled, so we can skip trying to
schedule them again.
closes#1638
Change-Id: I2d2c20e731f20a3136ca3eee37f0b521062cdb11
To do the work more efficiently,
and not be dependent on the call_timer runs by poller,
we should move the `stats_rate_min_max()` to a separate thread,
to make it faster and not be dependent on what happens in the `call_timer` at all.
Since it has nothing to do with the call timers.
Change-Id: I9a39e1b63cb8741377f5af5b2d52d4f8b428a0ad
Pandoc is available even on stretch, and unlike ronn is
actively maintained.
Fix -- markdown escaping.
Use __x__ for bold, and *x* for italics.
Remove .8.ronn symlinks.
Change-Id: Iff70e2b405f3b9ede856abf94d42fc51afb9f809
To do the work more efficiently and not be dependent on
the `call_timer` runs by poller, we should move
the releasing of sockets to a separate thread, to make it
faster and not be dependent on what happens in the `call_timer`
at all. Since it has nothing to do with the call timers.
Since now we have two queues:
- thread scope (local): ports_to_release
- global one: ports_to_release_glob
`sockets_releaser()` uses the ports_to_release_glob,
meanwhile appending in the `call_timer()` happens using the
ports_to_release.
Change-Id: Iadd966ac895b2dd64f81269d4fdf5d83747fe0b7
Deprecate usage of the bit flags for return.
And instead do:
- only return true/false for the redis update
- check if we have to destroy the whole call using the
`call_monologues_associations_left()` only
Additionally remove unused variables.
Change-Id: Ie858c533d1aa4b74024d65c7064aa56437389882
Check globally left monologues (with associations left) after
the `monologue_delete_iter()` has already done its job.
This is needed to prevent cases, when a recursive call of the
`monologue_delete_iter()` leads to blocking of the whole call
destorying, meanwhile it's required, e.g.:
- A is in progress of destorying
- B gets recursive call of `monologue_delete_iter()` and sees
that A has still one association left with C, which A simply
hasn't manage to remove yet.
This commit introduces new function: `call_monologues_associations_left()`
Change-Id: I0941c18a76fa8c2a78d3864aee9e6433283bec88
For a compatibility reasons (with other doc files and with RTD)
the `rtpengine.pod` and `rtpengine-recording.pod` file get
converted to the Markdown syntax.
The compilation of MD syntax synopsis files will work
using `ronn` application, which converts them to man pages.
Change-Id: I75b54a712786a0a237c51c702ed1a2cc09e3a033
Due to a unification of the way we store documentation files,
the 'rtpengine.pod' has been moved to the 'docs/' folder.
This 'docs/rtpengine.pod' will be later used for the RTD a source.
Change-Id: Iba9d77e397c042f7d84e8e51d2367b42ecb5b07c
Avoid trying to acquire a recursive lock by making sure the response is
always generated in a different thread.
Fixes#1656
Change-Id: I6c4c5bb52cb95a204823848bb427ab24f42dcccd
This commit: 6f0ad0db0f
introduced an improved behavior of the call deconstruction
when dealing with multiple forked legs. But it also
introduced a regression related to TPCC related calls.
This is because it takes into consideration existing
`->viabranches`, which is not efficient in certain cases.
Instead, we just have to ensure, whether there are
other monologues of the call object, which are not directly
"visible" for this branch being cancelled (so they are not directly
associated to that), but they might have own associations
present, which means the call mustn't be globally destoroyed.
Change-Id: I630f2d88ef3b557af3a95816fc2703daccaff374
Upon calling the `monologue_delete_iter()`, we have to take into account
an amount of forked legs we have now entirely in the call.
If there's more than 1 forked leg, don't mark the whole call for a full destruction,
since other forks might be successful (and they are not in a scope of processing now).
Only destroy this branch and associated to it monologue(s).
Change-Id: I6fdb4ba33ae7582578d84d57d91f9536d932ca47
For efficiency reasons `substitute` kind of SDP manipulations
commands have been moved to the `GHashTable` instead of the `GQueue`.
Change-Id: Iec6c44109ae912ba0de440bbed6ecaee6a238b97
This replicates the code to replace audio packets with injected DTMF
events. Unfortunately the code paths between forwarding audio and
processing/forwarding DTMF events is quite different, so some slight
duplication is needed.
Additionally the case of blocked DTMF + injected DTMF must be handled.
Change-Id: Ieb576b4b6644c9b154ba4c6ebd48fe12ff08e1de
DTMF injection must use the codec handler of the primary payload (audio
stream), not the handler of the DTMF PT itself.
Change-Id: Ied2d1f969bfc76ef7af0ada063b90a47c4633557
Add special return value to indicate that an event was a duplicate and
should be discarded.
Functional no-op.
Change-Id: I5d40bcc4a0bc45ba7875f4132873e7b8d747e132
Add a flag to inhibit kernel mode while DTMF injection is active. Tie in
DTMF playback trigger function: Remove stream from kernel, set inhibit
flag, play DTMF, then unset inhibit flag when all events have been
injected.
Change-Id: I533ec95a676bc7edf4dd973217f8d9499f1e22b6
DTMF requires the "end" event to be sent multiple times, requiring
sequence number adjustments after DTMF injection has finished. Add
support for this to the kernel module.
Change-Id: Ie5c8f18eda39553a6ebbdd35ef2341be01f2a59f
Support using the SSRC TS derived from received RTP packets as "encoder"
TS (the "next" expected TS) for passthrough RTP in addition to the FIFO
TS of an actual encoder.
Change-Id: I7c49c27651eb89c5349bbf290b1c0ad160f77e3b
The "duration" is not valid for events which are not end events as
there's no previous event to derive a duration from.
Change-Id: I3f9dad536b168cce24d1a58c5bcf25e5cacfe7a8
Make the decision whether or not to use SSRC passthrough handlers in the
upper level calling function, instead of implicitly in
__make_passthrough_gsl()
Change-Id: Ied88120ea4f12d50e3c5afb96023bdd86c42c6e1
__make_passthrough_ssrc() is only used after a passthrough handler has
already been created via __make_passthrough(), and the two functions do
exactly the same thing other than using a different handler functions.
So we can skip completely shutting down the handler and creating a new
one, and only update the handler function instead.
Change-Id: I5acdb5f5508b385320dda6b8bbb18cccd315f99d
Instead of just setting the "force transcoding" flag when DTMF injection
is required, check it on a per-codec basis, so we can be more granular
with this decision.
Functional no-op.
Change-Id: I496f3d1fba5840e7870c373f94190243392db438
Instead of doing two calls to the kernel every time a forwarding stream
is deleted (one to update the stats and one to delete), combine these
two into a single call using REMG_DEL_TARGET_STATS.
Change-Id: I9fcb148930c24bc866f842a50edd613fb6296de0
Separate out the call to kernel_update_stats() from the function
actually consuming the stats and updating the userspace internal
counters.
Functional no-op.
Change-Id: I4d357e2649c31db7839d8f1369bca9750ef7eae2
This combines the REMG_DEL_TARGET method with REMG_GET_STATS. It
retrieves the stats of an existing target, returns them to userspace,
then proceeds to delete the target.
Change-Id: Ibd715c176f0415c49ac94b9e3c8d8cafdd829e1a
When the `discard-recording` flag is given in one of the commands to
rtpengine (e.g. in the `delete` command), the metafile is renamed to a
.DISCARD suffix and then deleted.
The recording daemon then, seeing the .DISCARD suffix, proceeds to
immediately close all recordings, delete the files if any, and delete
the entries from the DB.
Change-Id: I3f0cac129f2d56cbccd770d43bf434dea6c0a0db
Rename the original call_delete_branch() to call_delete_branch_by_id()
and provide a new call_delete_branch() which takes a reference to a call
object instead of a call ID.
Change-Id: Ie549e7f550fab5edc6e81472e78565e1925fae67
These are two different file paths and each belongs to its respective
recording method. Move them into the appropriate struct. Also use
g_clear_pointer() for memory bookkeeping.
Change-Id: I25a897636d4f6e8fea3c533f9ca39c90f81390f8
Check all the struct sizes as part of the startup NOOP command, to try
to catch incompatible kernel module versions.
Change-Id: Ib617878e1e5a813de199c5405db3680c1e4d3351
The unified `rtpengine_message` struct has become quite large, and most
fields are not used for most of the messages sent to the kernel module.
Use command-specific structures that only contain the required
information. Adapt the I/O code and the size checks to use the correct
sizes.
Do special handling for GET_*_STATS as these commands do both input and
output at the same time. Copy in only the input portion of the struct.
(Copy-out still copies the entire struct at this point.)
Change-Id: Ia8aec6135fd7de42ae4e62e7f2dc23804e1f0914