diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample index 93fb701af1..a559dfafaa 100644 --- a/configs/samples/pjsip.conf.sample +++ b/configs/samples/pjsip.conf.sample @@ -1089,6 +1089,7 @@ ; This option must also be enabled on endpoints that ; require this functionality. ; (default: no) +;disable_rport=no ; Disable the use of "rport" in outgoing requests. ;type= ; Must be of type system (default: "") ;==========================GLOBAL SECTION OPTIONS========================= diff --git a/contrib/ast-db-manage/config/versions/79290b511e4b_pjsip_add_disable_rport.py b/contrib/ast-db-manage/config/versions/79290b511e4b_pjsip_add_disable_rport.py new file mode 100644 index 0000000000..7a7fcf97c2 --- /dev/null +++ b/contrib/ast-db-manage/config/versions/79290b511e4b_pjsip_add_disable_rport.py @@ -0,0 +1,39 @@ +"""pjsip add disable_rport + +Revision ID: 79290b511e4b +Revises: fbb7766f17bc +Create Date: 2020-06-25 22:21:37.529880 + +""" + +# revision identifiers, used by Alembic. +revision = '79290b511e4b' +down_revision = 'fbb7766f17bc' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects.postgresql import ENUM + +AST_BOOL_NAME = 'ast_bool_values' +# We'll just ignore the n/y and f/t abbreviations as Asterisk does not write +# those aliases. +AST_BOOL_VALUES = [ '0', '1', + 'off', 'on', + 'false', 'true', + 'no', 'yes' ] + + +def upgrade(): + ############################# Enums ############################## + + # ast_bool_values has already been created, so use postgres enum object + # type to get around "already created" issue - works okay with mysql + ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False) + + op.add_column('ps_systems', sa.Column('disable_rport', ast_bool_values)) + + +def downgrade(): + if op.get_context().bind.dialect.name == 'mssql': + op.drop_constraint('ck_ps_systems_disable_rport_ast_bool_values','ps_systems') + op.drop_column('ps_systems', 'disable_rport') diff --git a/doc/CHANGES-staging/res_pjsip_add_disable_rport_system_config.txt b/doc/CHANGES-staging/res_pjsip_add_disable_rport_system_config.txt new file mode 100644 index 0000000000..a565e2011e --- /dev/null +++ b/doc/CHANGES-staging/res_pjsip_add_disable_rport_system_config.txt @@ -0,0 +1,9 @@ +Subject: res_pjsip + +Added a new PJSIP system setting called disable_rport. +Default is no to keep support working as before. + +If it is false (default) it adds the 'rport' parameter in the outgoing request message. +If it is true it does not add the 'rport' parameter in the outgoing request message. + +This is a system option, but working as a global option. \ No newline at end of file diff --git a/res/res_pjsip.c b/res/res_pjsip.c index a1b1e00a64..32907e307c 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -1831,6 +1831,12 @@ + + Disable the use of rport in outgoing requests. + + Remove "rport" parameter from the outgoing requests. + + Must be of type 'system' UNLESS the object name is 'system'. diff --git a/res/res_pjsip/config_system.c b/res/res_pjsip/config_system.c index 716a6da61b..e16738f610 100644 --- a/res/res_pjsip/config_system.c +++ b/res/res_pjsip/config_system.c @@ -59,6 +59,8 @@ struct system_config { */ unsigned int follow_early_media_fork; unsigned int accept_multiple_sdp_answers; + /*! Disable the use of rport in outgoing requests */ + unsigned int disable_rport; }; static struct ast_threadpool_options sip_threadpool_options = { @@ -131,6 +133,8 @@ static int system_apply(const struct ast_sorcery *sorcery, void *obj) pjsip_cfg()->endpt.disable_tcp_switch = system->disable_tcp_switch ? PJ_TRUE : PJ_FALSE; + pjsip_cfg()->endpt.disable_rport = system->disable_rport ? PJ_TRUE : PJ_FALSE; + return 0; } @@ -209,6 +213,8 @@ int ast_sip_initialize_system(void) OPT_BOOL_T, 1, FLDSET(struct system_config, follow_early_media_fork)); ast_sorcery_object_field_register(system_sorcery, "system", "accept_multiple_sdp_answers", "no", OPT_BOOL_T, 1, FLDSET(struct system_config, accept_multiple_sdp_answers)); + ast_sorcery_object_field_register(system_sorcery, "system", "disable_rport", "no", + OPT_BOOL_T, 1, FLDSET(struct system_config, disable_rport)); ast_sorcery_load(system_sorcery);