The STIR_SHAKEN_ATTESTATION dialplan function has been added which will allow suppressing attestation on a call-by-call basis regardless of the profile attached to the outgoing endpoint.
CHANNEL(adsicpe) can now be read or written to change the channels' ADSI CPE capability setting.
Added a new option to HANGUPCAUSE to access additional information about hangup reason. Reason headers from pjsip could be read using 'tech_extended' cause type.
The DIGIT_SUM function can be used to return the digit sum of a number.
The 't' option for ReceiveSF now allows for a timer since the last digit received, in addition to the number-wide timeout.
The answer and progress dial timeouts now have millisecond precision, instead of having to be whole numbers.
The DAHDI_CHANNEL function allows for getting/setting certain properties about DAHDI channels from the dialplan.
The threadpool_* options in pjsip.conf have now been deprecated though they continue to be read and used. They have been replaced with taskpool options that give greater control over the underlying taskpool used for PJSIP. An alembic upgrade script has been added to add these options to realtime as well.
As part of Asterisk 21, macros were removed from Asterisk. This resulted in argument order changing for the Queue dialplan application since the macro argument was removed. Upgrade notice was missed when this was done, so this upgrade note has been added to provide a record of such and a notice to users who may have not upgraded yet.
New audiosocket message types 0x11 - 0x18 has been added for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and slin192 audio. External applications using audiosocket may need to be updated to support these message types if the audiosocket channel is created with one of these audio formats.
The threadpool_* options in stasis.conf have now been deprecated though they continue to be read and used. They have been replaced with taskpool options that give greater control over the underlying taskpool used for stasis.
A "tech_cause" parameter has been added to the ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause" parameter has been added to the HangupRequest, SoftHangupRequest and Hangup AMI event messages. For chan_pjsip, these will be set to the last SIP response status code for off-nominally terminated calls. The parameter is suppressed for nominal termination.
The ARI /bridges/play and /bridges/record REST APIs have new parameters that allow the caller to specify the format to be used on the "Announcer" and "Recorder" channels respecitvely.
The taskpool API has been added for common usage of a pool of taskprocessors. It is suggested to use this API instead of the threadpool+taskprocessor approach.
channelstorage_cpp fast lookup without lock (get_by_name_exact/get_by_uniqueid) leads to UAF during hangupUpdate contact information for anthm
Fix some doxygen, typos and whitespace
app_queue.c: Fix error in Queue parameter documentation.
Fix Endianness detection in utils.h for non-Linux
res_stir_shaken: Add STIR_SHAKEN_ATTESTATION dialplan function.
func_hangupcause.c: Add access to Reason headers via HANGUPCAUSE()
Revert "pjsip: Move from threadpool to taskpool"
res_pjsip_geolocation: Add support for Geolocation loc-src parameter
manager.c: Fix presencestate object leak
func_callerid: Document limitation of DNID fields.
res_audiosocket: fix temporarily unavailable
safe_asterisk: Resolve a POSIX sh problem and restore globbing behavior.
res_audiosocket: add message types for all slin sample rates
iostream.c: Handle TLS handshake attacks in order to resolve the issue of exce..
chan_websocket: Add channel_id to MEDIA_START, DRIVER_STATUS and DTMF_END even..
Author: Roman Pertsev Date: 2025-10-07
Operations on non-blocking sockets may return a resource temporarily unavailable error (EAGAIN or EWOULDBLOCK). This is not a fatal error but a normal condition indicating that the operation would block.
This patch corrects the handling of this case. Instead of incorrectly treating it as a reason to terminate the connection, the code now waits for data to arrive on the socket.
Author: Sean Bright Date: 2025-10-22
== with the POSIX sh test utility is UB.$(find … | sort).Resolves: #1554
Author: George Joseph Date: 2025-10-24
Also...
Refactored the verification datastore process so instead of having a separate channel datastore for each verification result, there's only one channel datastore with a vector of results.
Refactored some log messages to include channel name and removed some that would be redundant if a memory allocation failed.
Resolves: #781
UserNote: The STIR_SHAKEN_ATTESTATION dialplan function has been added which will allow suppressing attestation on a call-by-call basis regardless of the profile attached to the outgoing endpoint.
Author: Joshua C. Colp Date: 2025-10-27
This reverts commit bb6b76c2d8239b2665223dcbf6d507aa9aa4534e.
Author: Tinet-mucw Date: 2025-10-26
The TCP three-way handshake completes, but if the server is under a TLS handshake attack, asterisk will get stuck at SSL_do_handshake(). In this case, a timeout mechanism should be set for the SSL/TLS handshake process to prevent indefinite waiting during the SSL handshake.
Resolves: #1559
Author: George Joseph Date: 2025-10-21
Commit b333ee3b introduced a fix to chan_pjsip that addressed RTP issues with blind transfers and some SBCs. Unfortunately, the fix broke some WebRTC clients that are sensitive to SSRC changes and non-monotonic timestamps so the fix is now disabled for endpoints with the "bundle" parameter set to true.
Resolves: #1535
Author: gauravs456 Date: 2025-10-21
Resolves: #1544
Author: Joshua C. Colp Date: 2025-09-23
This change moves the PJSIP module from the threadpool API to the taskpool API. PJSIP-specific implementations for task usage have been removed and replaced with calls to the optimized taskpool implementations instead. The need for a pool of serializers has also been removed as taskpool inherently provides this. The default settings have also been changed to be more realistic for common usage.
UpgradeNote: The threadpool_* options in pjsip.conf have now been deprecated though they continue to be read and used. They have been replaced with taskpool options that give greater control over the underlying taskpool used for PJSIP. An alembic upgrade script has been added to add these options to realtime as well.
Author: George Joseph Date: 2025-10-17
Re-enabled "TTY=9" which was erroneously disabled as part of a recent security fix and removed another logging "fix" that was added.
Also added a sort to the "find" that enumerates the scripts to be sourced so they're sourced in the correct order.
Resolves: #1539
Author: Christoph Moench-Tegeder Date: 2025-10-19
Commit 43bf8a4ded7a65203b766b91eaf8331a600e9d8d introduced endian dependend byte-swapping code in include/asterisk/utils.h, where the endianness was detected using the __BYTE_ORDER macro. This macro lives in endian.h, which on Linux is included implicitely (by the network-related headers, I think), but on FreeBSD the headers are laid out differently and we do not get __BYTE_ORDER the implicit way.
Instead, this makes the usage of endian.h explicit by including it where we need it, and switches the BYTE_ORDER/*ENDIAN macros to the POSIX-defined ones (see https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html for standard compliance). Additionally, this adds a compile-time check for the endianness-logic: compilation will fail if neither big nor little endian can be detected.
Fixes: #1536
Author: Ben Ford Date: 2025-10-20
When macro was removed in Asterisk 21, the parameter documentation in code was not updated to reflect the correct numerization for gosub. It still stated that it was the seventh parameter, but got shifted to the sixth due to the removal of macro. This has been updated to correctly reflect the parameter order, and a note has been added to the XML that states this was done after the initial commit.
Fixes: #1534
UpgradeNote: As part of Asterisk 21, macros were removed from Asterisk. This resulted in argument order changing for the Queue dialplan application since the macro argument was removed. Upgrade notice was missed when this was done, so this upgrade note has been added to provide a record of such and a notice to users who may have not upgraded yet.
Author: Joshua C. Colp Date: 2025-10-17
When publishing device state check the local cache for the existing device state. If the new device state is unchanged from the prior one, don't bother publishing the update. This can reduce the work done by consumers of device state, such as hints and app_queue, by not publishing a message to them.
These messages would most often occur with devices that are seeing numerous simultaneous channels. The underlying device state would remain as in use throughout, but an update would be published as channels are created and hung up.
Author: George Joseph Date: 2025-10-14
Although the ISDN/Q.850/Q.931 hangup cause code is already part of the ARI and AMI hangup and channel destroyed events, it can be helpful to know what the actual channel technology code was if the call was unsuccessful. For PJSIP, it's the SIP response code.
A new "tech_hangupcause" field was added to the ast_channel structure along with ast_channel_tech_hangupcause() and ast_channel_tech_hangupcause_set() functions. It should only be set for off-nominal terminations.
chan_pjsip was modified to set the tech hangup cause in the chan_pjsip_hangup() and chan_pjsip_session_end() functions. This is a bit tricky because these two functions aren't always called in the same order. The channel that hangs up first will get chan_pjsip_session_end() called first which will trigger the core to call chan_pjsip_hangup() on itself, then call chan_pjsip_hangup() on the other channel. The other channel's chan_pjsip_session_end() function will get called last. Unfortunately, the other channel's HangupRequest events are sent before chan_pjsip has had a chance to set the tech hangupcause code so the HangupRequest events for that channel won't have the cause code set. The ChannelDestroyed and Hangup events however will have the code set for both channels.
A new "tech_cause" field was added to the ast_channel_snapshot_hangup structure. This is a public structure so a bit of refactoring was needed to preserve ABI compatibility.
The ARI ChannelHangupRequest and ChannelDestroyed events were modified to include the "tech_cause" parameter in the JSON for off-nominal terminations. The parameter is suppressed for nominal termination.
The AMI SoftHangupRequest, HangupRequest and Hangup events were modified to include the "TechCause" parameter for off-nominal terminations. Like their ARI counterparts, the parameter is suppressed for nominal termination.
DeveloperNote: A "tech_cause" parameter has been added to the ChannelHangupRequest and ChannelDestroyed ARI event messages and a "TechCause" parameter has been added to the HangupRequest, SoftHangupRequest and Hangup AMI event messages. For chan_pjsip, these will be set to the last SIP response status code for off-nominally terminated calls. The parameter is suppressed for nominal termination.
Author: Sven Kube Date: 2025-10-10
Extend audiosocket messages with types 0x11 - 0x18 to create asterisk frames in slin12, slin16, slin24, slin32, slin44, slin48, slin96, and slin192 format, enabling the transmission of audio at a higher sample rates. For audiosocket messages sent by Asterisk, the message kind is determined by the format of the originating asterisk frame.
UpgradeNote: New audiosocket message types 0x11 - 0x18 has been added for slin12, slin16, slin24, slin32, slin44, slin48, slin96, and slin192 audio. External applications using audiosocket may need to be updated to support these message types if the audiosocket channel is created with one of these audio formats.
Author: phoneben Date: 2025-10-03
Reading ${FAXOPT()} before a fax session is common in dialplans to check fax state. Currently this logs an error even when no fax datastore exists, creating excessive noise. Change these messages to ast_debug(3, …) so they appear only with debug enabled.
Resolves: #1509
Author: Joshua C. Colp Date: 2025-10-10
When an endpoint is created in the core of Asterisk a subscription was previously created alongside it to monitor any channels being destroyed that were related to it. This was done by receiving all channel snapshot updates for every channel and only reacting when it was indicated that the channel was dead.
This change removes this logic and instead provides an API call for directly removing a channel from an endpoint. This is called when channels are destroyed. This operation is fast, so blocking the calling thread for a short period of time doesn't have any noticeable impact.
Author: Joshua C. Colp Date: 2025-10-10
The app_queue module subscribes on a per-dialed agent basis to both the bridge all and channel all topics to keep apprised of things going on involving them. This subscription has associated state that must be cleaned up when the subscription ends. This was done by setting a default router callback that only had logic to handle the case where the subscription ends. By using the default router callback all filtering for the subscription was disabled, causing unrelated messages to get published and handled by it.
This change makes it so that an explicit route is added for the message type used for the message indicating the subscription has ended and removes the default router callback. This allows message filtering to occur on publishing reducing the messages to app_queue to only those it is interested in.
Author: George Joseph Date: 2025-10-10
Resolves: #1478
Author: Anthony Minessale Date: 2025-10-10
Author: George Joseph Date: 2025-10-08
Some of the tests in process_text_message() were still comparing to the websocket message payload instead of the "command" string.
Resolves: #1525
Author: Naveen Albert Date: 2025-10-06
The Dial() application does not propagate DNID fields, which is counter to the behavior of the other Caller ID fields. This behavior is likely intentional since the use of Dial theoretically suggests a new dialed number, but document this caveat to inform users of it.
Resolves: #1519
Author: Naveen Albert Date: 2025-10-06
Allow retrieving and setting the channel's ADSI capability from the dialplan.
Resolves: #1514
UserNote: CHANNEL(adsicpe) can now be read or written to change the channels' ADSI CPE capability setting.
Author: Naveen Albert Date: 2025-10-06
Dial() already preserves the ADSI capability by copying it to the new channel, but since Local channel pairs consist of two channels, we also need to copy the capability to the second channel.
Resolves: #1517
Author: Igor Goncharovsky Date: 2025-09-04
As soon as SIP call may end with several Reason headers, we want to make all of them available through the HAGUPCAUSE() function. This implementation uses the same ao2 hash for cause codes storage and adds a flag to make difference between last processed sip message and content of reason headers.
UserNote: Added a new option to HANGUPCAUSE to access additional information about hangup reason. Reason headers from pjsip could be read using 'tech_extended' cause type.
Author: Naveen Albert Date: 2025-10-03
It is customary to allow # to terminate digit collection immediately when there would normally be a timeout. However, currently, users are forced to wait for the timeout to expire when dialing numbers that are prefixes of other valid matches, and there is no way to end the timeout early. Customarily, # terminates the timeout, but at the moment, this is just rejected unless there happens to be a matching extension ending in #.
Allow # to terminate the timeout in cases where there is no dialplan match. This ensures that the dialplan is always respected, but if a valid extension has been dialed that happens to prefix other valid matches, # can be used to dial it immediately.
Resolves: #1510
Author: Naveen Albert Date: 2025-10-01
Add a function (DIGIT_SUM) which returns the digit sum of a number.
Resolves: #1499
UserNote: The DIGIT_SUM function can be used to return the digit sum of a number.
Author: Naveen Albert Date: 2025-10-01
Add a sorely needed option to set a timeout between digits, rather than for receiving the entire number. This is needed if the number of digits being sent is unknown by the receiver in advance. Previously, we had to wait for the entire timer to expire.
Resolves: #1493
UserNote: The 't' option for ReceiveSF now allows for a timer since the last digit received, in addition to the number-wide timeout.
Author: Naveen Albert Date: 2025-10-02
Among the lower-quality voice codecs, some of the quality scores did not make sense relative to each other.
For instance, quality-wise, G.729 > G.723 > PLC10. However, current scores do not uphold these relationships.
Tweak the scores slightly to reflect more accurate relationships.
Resolves: #1501
Author: Naveen Albert Date: 2025-10-02
Fix the indentation in the documentation for the variable list.
Resolves: #1507
Author: Naveen Albert Date: 2025-10-02
Document the channel variables currently set by SendFAX and ReceiveFAX.
Resolves: #1505
Author: George Joseph Date: 2025-10-01
When we retrieve a channel from a C++ map, we actually get back a wrapper object that points to the channel then right after we retrieve it, we bump its reference count. There's a tiny chance however that between those two statements a delete and/or unref might happen which would cause the wrapper object or the channel itself to become invalid resulting in a SEGV. To avoid this we now perform a read lock on the driver around those statements.
Resolves: #1491
Author: Naveen Albert Date: 2025-09-30
Even though Dial() internally uses milliseconds for its dial timeouts, this capability has been mostly obscured from users as the argument is only parsed as an integer, thus forcing the use of whole seconds for timeouts.
Parse it as a decimal instead so that timeouts can now truly have millisecond precision.
Resolves: #1487
UserNote: The answer and progress dial timeouts now have millisecond precision, instead of having to be whole numbers.
Author: Naveen Albert Date: 2025-10-01
Commit dc8e3eeaaf094a3d16991289934093d5e7127680 improved the debug log messages in dsp.c. This makes two minor corrections to it:
Resolves: #1496
Author: Naveen Albert Date: 2025-09-30
When running "config show help 
Resolves: #1489
Author: Naveen Albert Date: 2025-09-29
The previous lack of an example made it ambiguous if the arguments went inside the function arguments or were part of the right-hand value.
Resolves: #1485
Author: Naveen Albert Date: 2025-09-29
If Last Number Redial is used to redial, ensure that we do not wait for further digits. This was possible if the number that was last dialed is a prefix of another possible dialplan match. Since all we did is copy the number into the extension buffer, if other matches are now possible, there would thus be a timeout before the call went through. We now complete redialed calls immediaetly in all cases.
Resolves: #1483
Author: George Joseph Date: 2025-09-25
The bridge play and record APIs were forcing the Announcer/Recorder channel to slin8 which meant that if you played or recorded audio with a sample rate > 8K, it was downsampled to 8K limiting the bandwidth.
The /bridges/play REST APIs have a new "announcer_format" parameter that allows the caller to explicitly set the format on the "Announcer" channel through which the audio is played into the bridge. If not specified, the default depends on how many channels are currently in the bridge. If a single channel is in the bridge, then the Announcer channel's format will be set to the same as that channel's. If multiple channels are in the bridge, the channels will be scanned to find the one with the highest sample rate and the Announcer channel's format will be set to the slin format that has an equal to or greater than sample rate.
The /bridges/record REST API has a new "recorder_format" parameter that allows the caller to explicitly set the format on the "Recorder" channel from which audio is retrieved to write to the file. If not specified, the Recorder channel's format will be set to the format that was requested to save the audio in.
Resolves: #1479
DeveloperNote: The ARI /bridges/play and /bridges/record REST APIs have new parameters that allow the caller to specify the format to be used on the "Announcer" and "Recorder" channels respecitvely.
Author: Max Grobecker Date: 2025-09-21
This adds support for the Geolocation 'loc-src' parameter to res_pjsip_geolocation. The already existing config option 'location_source` in res_geolocation is documented to add a 'loc-src' parameter containing a user-defined FQDN to the 'Geolocation:' header, but that option had no effect as it was not implemented by res_pjsip_geolocation.
If the location_source configuration option is not set or invalid, that parameter will not be added (this is already checked by res_geolocation).
This commits adds already documented functionality.
Author: Joshua C. Colp Date: 2025-09-23
This change moves observer invocation from the use of a threadpool to a taskpool. The taskpool options have also been adjusted to ensure that at least one taskprocessor remains available at all times.
Author: Sven Kube Date: 2025-09-22
When handling SIP transfers via ARI, there is no protocol_id in case of a blind transfer.
Resolves: #1467
Author: Bastian Triller Date: 2025-09-21
Author: Sven Kube Date: 2025-09-18
When handling SIP transfers via ARI, the referred_by field in
  transfer_ari_state may be null, since SIP REFER requests are not
  required to include a Referred-By header. Without this check, a null
  value caused the transfer to fail and triggered a NOTIFY with a 500
  Internal Server Error.
Author: phoneben Date: 2025-09-11
Add NULL check for word_list before calling word_in_list() Add NULL checks for channel snapshots from ast_multi_channel_blob_get_channel()
Resolves: #1425
Author: Sean Bright Date: 2025-09-17
Resolves: #1422
Author: Naveen Albert Date: 2025-09-11
Add a dialplan function that can be used to get/set properties of DAHDI channels (as opposed to Asterisk channels). This exposes properties that were not previously available, allowing for certain operations to now be performed in the dialplan.
Resolves: #1455
UserNote: The DAHDI_CHANNEL function allows for getting/setting certain properties about DAHDI channels from the dialplan.
Author: Joshua C. Colp Date: 2025-09-16
Author: Joshua C. Colp Date: 2025-08-06
This change introduces a new API called taskpool. This is a pool of taskprocessors. It provides the following functionality:
This functionality already exists through the combination of threadpool+taskprocessors but through investigating I determined that this carries substantial overhead for short to medium duration tasks. The threadpool uses a single queue of work, and for management of threads it involves additional tasks.
I wrote taskpool to eliminate the extra overhead and management as much as possible. Instead of a single queue of work each taskprocessor has its own queue and at push time a selector chooses the taskprocessor to queue the task to. Each taskprocessor also has its own thread like normal. This spreads out the tasks immediately and reduces contention on shared resources.
Using the included efficiency tests the number of tasks that can be executed per second in a taskpool is 6-12 times more than an equivalent threadpool+taskprocessor setup.
Stasis has been moved over to using this new API as it is a heavy consumer of threadpool+taskprocessors and produces a lot of tasks.
UpgradeNote: The threadpool_* options in stasis.conf have now been deprecated though they continue to be read and used. They have been replaced with taskpool options that give greater control over the underlying taskpool used for stasis.
DeveloperNote: The taskpool API has been added for common usage of a pool of taskprocessors. It is suggested to use this API instead of the threadpool+taskprocessor approach.
Author: Naveen Albert Date: 2025-09-10
get_token can return NULL, but process_token uses this result without checking for NULL; as elsewhere, check for a NULL result to avoid possible NULL dereference.
Resolves: #1419
Author: Nathan Monfils Date: 2025-09-08
ast_presence_state allocates subtype and message. We straightforwardly need to clean those up.
Author: Sean Bright Date: 2025-09-10
Part of #1440.
Author: Naveen Albert Date: 2025-09-09
Resolves: #1436
Author: Ben Ford Date: 2025-09-09
In a previous commit, a change was made to ast_rtp_codecs_payload_code_tx_sample_rate to check for differing sample rates. This ended up returning an invalid payload int for comfort noise. A check has been added that returns early if the payload is in fact supposed to be comfort noise.
Fixes: #1340
Author: Naveen Albert Date: 2025-09-09
"dialplan eval function" has been using a dummy channel for function evaluation, much like many of the unit tests. However, sometimes, this can cause issues for functions that are not expecting dummy channels. As an example, ast_channel_tech(chan) is NULL on such channels, and ast_channel_tech(chan)->type consequently results in a NULL dereference. Normally, functions do not worry about this since channels executing dialplan aren't dummy channels.
While some functions are better about checking for these sorts of edge cases, use a real channel with a dummy technology to make this CLI command inherently safe for any dialplan function that could be evaluated from the CLI.
Resolves: #1434