]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_session: Add overlap_context option.
authorNaveen Albert <asterisk@phreaknet.org>
Thu, 13 Oct 2022 13:45:26 +0000 (13:45 +0000)
committerGeorge Joseph <gjoseph@digium.com>
Mon, 30 Jan 2023 14:45:57 +0000 (08:45 -0600)
Adds the overlap_context option, which can be used
to explicitly specify a context to use for overlap
dialing extension matches, rather than forcibly
using the context configured for the endpoint.

ASTERISK-30262 #close

Change-Id: Ibbcd4a8b11402428a187fb56b8d4e7408774a0db

configs/samples/pjsip.conf.sample
contrib/ast-db-manage/config/versions/f261363a857f_add_overlap_context.py [new file with mode: 0644]
doc/CHANGES-staging/res_pjsip_session_overlap.txt [new file with mode: 0644]
include/asterisk/res_pjsip.h
res/res_pjsip/pjsip_config.xml
res/res_pjsip/pjsip_configuration.c
res/res_pjsip/pjsip_manager.xml
res/res_pjsip_session.c

index 0a93cbe9e2fe1a9cf45b89e5e312c667e731ebe6..572cf08e344f15a35a04aac4f647a5c6259dbddb 100644 (file)
 ;aggregate_mwi=yes      ;  (default: "yes")
 ;allow= ; Media Codec s to allow (default: "")
 ;allow_overlap=yes ; Enable RFC3578 overlap dialing support. (default: "yes")
+;overlap_context=default ; Context to used for overlap dialing matches
+                         ; (default: same as context option)
 ;aors=  ; AoR s to be used with the endpoint (default: "")
 ;auth=  ; Authentication Object s associated with the endpoint (default: "")
 ;callerid=      ; CallerID information for the endpoint (default: "")
diff --git a/contrib/ast-db-manage/config/versions/f261363a857f_add_overlap_context.py b/contrib/ast-db-manage/config/versions/f261363a857f_add_overlap_context.py
new file mode 100644 (file)
index 0000000..e0ea297
--- /dev/null
@@ -0,0 +1,21 @@
+"""add overlap_context
+
+Revision ID: f261363a857f
+Revises: 5a2247c957d2
+Create Date: 2022-12-09 13:58:48.622000
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'f261363a857f'
+down_revision = '5a2247c957d2'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+    op.add_column('ps_endpoints', sa.Column('overlap_context', sa.String(80)))
+
+def downgrade():
+    op.drop_column('ps_endpoints', 'overlap_context')
diff --git a/doc/CHANGES-staging/res_pjsip_session_overlap.txt b/doc/CHANGES-staging/res_pjsip_session_overlap.txt
new file mode 100644 (file)
index 0000000..5523f3c
--- /dev/null
@@ -0,0 +1,4 @@
+Subject: res_pjsip_session
+
+The overlap_context option now allows explicitly
+specifying a context to use for overlap dialing matches.
index a49a56e10dbc0adbf0ca42fea5b7ea142ea1cb7c..5b86d0f339b2b736a5c66f5701c29ae806af0b0f 100644 (file)
@@ -1065,6 +1065,8 @@ struct ast_sip_endpoint {
        AST_STRING_FIELD_EXTENDED(geoloc_incoming_call_profile);
        /*! The name of the geoloc profile to apply when Asterisk sends a call to this endpoint */
        AST_STRING_FIELD_EXTENDED(geoloc_outgoing_call_profile);
+       /*! The context to use for overlap dialing, if different from the endpoint's context */
+       AST_STRING_FIELD_EXTENDED(overlap_context);
        /*! 100rel mode to use with this endpoint */
        enum ast_sip_100rel_mode rel100;
        /*! Send Advice-of-Charge messages */
index 99ca64571e77f2d144e00098703ec2af77811e22..bbbdd126702b504e2bfe0f1db9e445b8ab52db4a 100644 (file)
                                <configOption name="allow_overlap" default="yes">
                                        <synopsis>Enable RFC3578 overlap dialing support.</synopsis>
                                </configOption>
+                               <configOption name="overlap_context">
+                                       <synopsis>Dialplan context to use for RFC3578 overlap dialing.</synopsis>
+                                       <description>
+                                               <para>Dialplan context to use for overlap dialing extension matching.
+                                               If not specified, the context configured for the endpoint will be used.
+                                               If specified, the extensions/patterns in the specified context will be used
+                                               for determining if a full number has been received from the endpoint.
+                                               </para>
+                                       </description>
+                               </configOption>
                                <configOption name="aors">
                                        <synopsis>AoR(s) to be used with the endpoint</synopsis>
                                        <description><para>
index bb015d0a45a3971a5989e91625dcd575df51ff4a..e10148884989749fabe7a11f5211e8c7db66eac5 100644 (file)
@@ -2229,6 +2229,7 @@ int ast_res_pjsip_initialize_configuration(void)
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "asymmetric_rtp_codec", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, asymmetric_rtp_codec));
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtcp_mux", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtcp_mux));
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_overlap", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_overlap));
+       ast_sorcery_object_field_register(sip_sorcery, "endpoint", "overlap_context", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, overlap_context));
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "refer_blind_progress", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, refer_blind_progress));
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "notify_early_inuse_ringing", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, notify_early_inuse_ringing));
        ast_sorcery_object_field_register(sip_sorcery, "endpoint", "max_audio_streams", "1", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.max_audio_streams));
@@ -2427,6 +2428,10 @@ void *ast_sip_endpoint_alloc(const char *name)
                ao2_cleanup(endpoint);
                return NULL;
        }
+       if (ast_string_field_init_extended(endpoint, overlap_context)) {
+               ao2_cleanup(endpoint);
+               return NULL;
+       }
 
        if (!(endpoint->media.codecs = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
                ao2_cleanup(endpoint);
index 810a5e3ec455d3a34fe2bc4e1aba2900ea0cff42..475da8b7431aefba922ddcae4cc2067365813905 100644 (file)
                                <parameter name="Allowoverlap">
                                        <para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow_overlap']/synopsis/node())"/></para>
                                </parameter>
+                               <parameter name="OverlapContext">
+                                       <para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='overlap_context']/synopsis/node())"/></para>
+                               </parameter>
                        </syntax>
                </managerEventInstance>
        </managerEvent>
index e7ba3ed920e09c7eb21139bf1243ab92e797a390..ae2e0e4005d0d2f63726140d091851b85b202608 100644 (file)
@@ -3713,8 +3713,10 @@ static enum sip_get_destination_result get_destination(struct ast_sip_session *s
 
        fetch_callerid_num(session, rdata, cid_num, sizeof(cid_num));
 
+       /* If there's an overlap_context override specified, use that; otherwise, just use the endpoint's context */
+
        if (!strcmp(session->exten, pickupexten) ||
-               ast_exists_extension(NULL, session->endpoint->context, session->exten, 1, S_OR(cid_num, NULL))) {
+               ast_exists_extension(NULL, S_OR(session->endpoint->overlap_context, session->endpoint->context), session->exten, 1, S_OR(cid_num, NULL))) {
                /*
                 * Save off the INVITE Request-URI in case it is
                 * needed: CHANNEL(pjsip,request_uri)
@@ -3729,7 +3731,7 @@ static enum sip_get_destination_result get_destination(struct ast_sip_session *s
         */
        if (session->endpoint->allow_overlap && (
                !strncmp(session->exten, pickupexten, strlen(session->exten)) ||
-               ast_canmatch_extension(NULL, session->endpoint->context, session->exten, 1, S_OR(cid_num, NULL)))) {
+               ast_canmatch_extension(NULL, S_OR(session->endpoint->overlap_context, session->endpoint->context), session->exten, 1, S_OR(cid_num, NULL)))) {
                /* Overlap partial match */
                return SIP_GET_DEST_EXTEN_PARTIAL;
        }