Variable renames + check for SOCKOPT_PARAMS

This commit is contained in:
Joshua Elson 2024-03-19 10:27:04 -04:00
parent 3a684af69e
commit 0629fc80e1
No known key found for this signature in database
GPG Key ID: E58A168392A2536D
5 changed files with 52 additions and 70 deletions

View File

@ -175,12 +175,12 @@
;
;[transport-tcp]
;type=transport
;protocol=tcp ; Specify the protocol
;bind=0.0.0.0 ; Listen on all interfaces
;tcp_keepalive_enable=yes ; Enable TCP keepalive (yes/no)
;tcp_keepidle_time=30 ; Time in seconds the connection needs to remain idle before TCP starts sending keepalive probes
;tcp_keepintvl_time=10 ; The time in seconds between individual keepalive probes
;tcp_keepcnt=5 ; The maximum number of keepalive probes TCP should send before dropping the connection
;protocol=tcp
;bind=0.0.0.0
;tcp_keepalive_enable=yes ; Enable TCP keepalive (yes/no)
;tcp_keepalive_idle_time=30 ; Time in seconds the connection needs to remain idle before TCP starts sending keepalive probes
;tcp_keepalive_interval_time=10 ; The time in seconds between individual keepalive probes
;tcp_keepalive_probe_count=5 ; The maximum number of keepalive probes TCP should send before dropping the connection
; Example IPv4 TLS transport with Keepalive options
;
@ -192,10 +192,10 @@
;priv_key_file=/path/to/mykey.key
;cipher=ADH-AES256-SHA,ADH-AES128-SHA
;method=tlsv1
;tcp_keepalive_enable=yes ; Enable TCP keepalive (yes/no)
;tcp_keepidle_time=30 ; Time in seconds the connection needs to remain idle before TCP starts sending keepalive probes
;tcp_keepintvl_time=10 ; The time in seconds between individual keepalive probes
;tcp_keepcnt=5 ; The maximum number of keepalive probes TCP should send before dropping the connection
;tcp_keepalive_enable=yes ; Enable TCP keepalive (yes/no)
;tcp_keepalive_idle_time=30 ; Time in seconds the connection needs to remain idle before TCP starts sending keepalive probes
;tcp_keepalive_interval_time=10 ; The time in seconds between individual keepalive probes
;tcp_keepalive_probe_count=5 ; The maximum number of keepalive probes TCP should send before dropping the connection
;===============OUTBOUND REGISTRATION WITH OUTBOUND AUTHENTICATION============
;

View File

@ -15,12 +15,12 @@ import sqlalchemy as sa
def upgrade():
op.add_column('ps_transports', sa.Column('tcp_keepalive_enable', sa.Boolean(), nullable=True))
op.add_column('ps_transports', sa.Column('tcp_keepidle_time', sa.Integer(), nullable=True))
op.add_column('ps_transports', sa.Column('tcp_keepintvl_time', sa.Integer(), nullable=True))
op.add_column('ps_transports', sa.Column('tcp_keepcnt', sa.Integer(), nullable=True))
op.add_column('ps_transports', sa.Column('tcp_keepalive_idle_time', sa.Integer(), nullable=True))
op.add_column('ps_transports', sa.Column('tcp_keepalive_interval_time', sa.Integer(), nullable=True))
op.add_column('ps_transports', sa.Column('tcp_keepalive_probe_count', sa.Integer(), nullable=True))
def downgrade():
op.drop_column('ps_transports', 'tcp_keepalive_enable')
op.drop_column('ps_transports', 'tcp_keepidle_time')
op.drop_column('ps_transports', 'tcp_keepintvl_time')
op.drop_column('ps_transports', 'tcp_keepcnt')
op.drop_column('ps_transports', 'tcp_keepalive_idle_time')
op.drop_column('ps_transports', 'tcp_keepalive_interval_time')
op.drop_column('ps_transports', 'tcp_keepalive_probe_count')

View File

@ -302,11 +302,11 @@ struct ast_sip_transport {
/*! Enable TCP keepalive */
int tcp_keepalive_enable;
/*! Time in seconds the connection needs to remain idle before TCP starts sending keepalive probes */
int tcp_keepidle_time;
int tcp_keepalive_idle_time;
/*! The time in seconds between individual keepalive probes */
int tcp_keepintvl_time;
int tcp_keepalive_interval_time;
/*! The maximum number of keepalive probes TCP should send before dropping the connection */
int tcp_keepcnt;
int tcp_keepalive_probe_count;
};
#define SIP_SORCERY_DOMAIN_ALIAS_TYPE "domain_alias"

View File

@ -842,9 +842,10 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(option);
sockopt_count++;
#if defined(PJ_MAX_SOCKOPT_PARAMS) && PJ_MAX_SOCKOPT_PARAMS >= 5
if (transport->tcp_keepalive_enable) {
ast_log(LOG_DEBUG, "TCP Keepalive enabled for transport '%s'. Idle Time: %d, Interval: %d, Count: %d\n",
ast_sorcery_object_get_id(obj), transport->tcp_keepidle_time, transport->tcp_keepintvl_time, transport->tcp_keepcnt);
ast_sorcery_object_get_id(obj), transport->tcp_keepalive_idle_time, transport->tcp_keepalive_interval_time, transport->tcp_keepalive_probe_count);
cfg.sockopt_params.options[sockopt_count].level = pj_SOL_SOCKET();
cfg.sockopt_params.options[sockopt_count].optname = SO_KEEPALIVE;
@ -854,22 +855,25 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
cfg.sockopt_params.options[sockopt_count].level = pj_SOL_TCP();
cfg.sockopt_params.options[sockopt_count].optname = TCP_KEEPIDLE;
cfg.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepidle_time;
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepidle_time);
cfg.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepalive_idle_time;
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepalive_idle_time);
sockopt_count++;
cfg.sockopt_params.options[sockopt_count].level = pj_SOL_TCP();
cfg.sockopt_params.options[sockopt_count].optname = TCP_KEEPINTVL;
cfg.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepintvl_time;
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepintvl_time);
cfg.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepalive_interval_time;
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepalive_interval_time);
sockopt_count++;
cfg.sockopt_params.options[sockopt_count].level = pj_SOL_TCP();
cfg.sockopt_params.options[sockopt_count].optname = TCP_KEEPCNT;
cfg.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepcnt;
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepcnt);
cfg.sockopt_params.options[sockopt_count].optname = tcp_keepalive_probe_count;
cfg.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepalive_probe_count;
cfg.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepalive_probe_count);
sockopt_count++;
}
#else
ast_log(LOG_WARNING, "TCP keepalive settings are disabled because PJ_MAX_SOCKOPT_PARAMS is less than 5.\n");
#endif
cfg.sockopt_params.cnt = sockopt_count;
@ -904,9 +908,10 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(option);
sockopt_count++;
#if defined(PJ_MAX_SOCKOPT_PARAMS) && PJ_MAX_SOCKOPT_PARAMS >= 5
if (transport->tcp_keepalive_enable) {
ast_log(LOG_DEBUG, "TCP Keepalive enabled for transport '%s'. Idle Time: %d, Interval: %d, Count: %d\n",
ast_sorcery_object_get_id(obj), transport->tcp_keepidle_time, transport->tcp_keepintvl_time, transport->tcp_keepcnt);
ast_sorcery_object_get_id(obj), transport->tcp_keepalive_idle_time, transport->tcp_keepalive_interval_time, transport->tcp_keepalive_probe_count);
temp_state->state->tls.sockopt_params.options[sockopt_count].level = pj_SOL_SOCKET();
temp_state->state->tls.sockopt_params.options[sockopt_count].optname = SO_KEEPALIVE;
@ -916,22 +921,25 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
temp_state->state->tls.sockopt_params.options[sockopt_count].level = pj_SOL_TCP();
temp_state->state->tls.sockopt_params.options[sockopt_count].optname = TCP_KEEPIDLE;
temp_state->state->tls.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepidle_time;
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepidle_time);
temp_state->state->tls.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepalive_idle_time;
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepalive_idle_time);
sockopt_count++;
temp_state->state->tls.sockopt_params.options[sockopt_count].level = pj_SOL_TCP();
temp_state->state->tls.sockopt_params.options[sockopt_count].optname = TCP_KEEPINTVL;
temp_state->state->tls.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepintvl_time;
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepintvl_time);
temp_state->state->tls.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepalive_interval_time;
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepalive_interval_time);
sockopt_count++;
temp_state->state->tls.sockopt_params.options[sockopt_count].level = pj_SOL_TCP();
temp_state->state->tls.sockopt_params.options[sockopt_count].optname = TCP_KEEPCNT;
temp_state->state->tls.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepcnt;
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepcnt);
temp_state->state->tls.sockopt_params.options[sockopt_count].optname = tcp_keepalive_probe_count;
temp_state->state->tls.sockopt_params.options[sockopt_count].optval = &transport->tcp_keepalive_probe_count;
temp_state->state->tls.sockopt_params.options[sockopt_count].optlen = sizeof(transport->tcp_keepalive_probe_count);
sockopt_count++;
}
#else
ast_log(LOG_WARNING, "TCP keepalive settings are disabled because PJ_MAX_SOCKOPT_PARAMS is less than 5.\n");
#endif
temp_state->state->tls.sockopt_params.cnt = sockopt_count;
@ -1311,34 +1319,6 @@ static int transport_tls_method_handler(const struct aco_option *opt, struct ast
return 0;
}
static int transport_tcp_keepalive_bool_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) {
struct ast_sip_transport *transport = obj;
if (!strcasecmp(var->name, "tcp_keepalive_enable")) {
transport->tcp_keepalive_enable = ast_true(var->value) ? 1 : 0;
} else {
return -1;
}
return 0;
}
static int transport_tcp_keepalive_int_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) {
struct ast_sip_transport *transport = obj;
if (!strcasecmp(var->name, "tcp_keepidle_time")) {
transport->tcp_keepidle_time = atoi(var->value);
} else if (!strcasecmp(var->name, "tcp_keepintvl_time")) {
transport->tcp_keepintvl_time = atoi(var->value);
} else if (!strcasecmp(var->name, "tcp_keepcnt")) {
transport->tcp_keepcnt = atoi(var->value);
} else {
return -1;
}
return 0;
}
static const char *tls_method_map[] = {
[PJSIP_SSL_UNSPECIFIED_METHOD] = "unspecified",
[PJSIP_TLSV1_METHOD] = "tlsv1",
@ -1853,10 +1833,12 @@ int ast_sip_initialize_sorcery_transport(void)
ast_sorcery_object_field_register_custom(sorcery, "transport", "require_client_cert", "", transport_tls_bool_handler, require_client_cert_to_str, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sorcery, "transport", "allow_wildcard_certs", "", transport_tls_bool_handler, allow_wildcard_certs_to_str, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sorcery, "transport", "method", "", transport_tls_method_handler, tls_method_to_str, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sorcery, "transport", "tcp_keepalive_enable", "no", transport_tcp_keepalive_bool_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sorcery, "transport", "tcp_keepidle_time", "30", transport_tcp_keepalive_int_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sorcery, "transport", "tcp_keepintvl_time", "1", transport_tcp_keepalive_int_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sorcery, "transport", "tcp_keepcnt", "5", transport_tcp_keepalive_int_handler, NULL, NULL, 0, 0);
#if defined(PJ_MAX_SOCKOPT_PARAMS) && PJ_MAX_SOCKOPT_PARAMS >= 5
ast_sorcery_object_field_register(sorcery, "transport", "tcp_keepalive_enable", "no", OPT_BOOL_T, 0, FLDSET(struct ast_sip_transport, tcp_keepalive_enable));
ast_sorcery_object_field_register(sorcery, "transport", "tcp_keepalive_idle_time", "30", OPT_INT_T, 0, FLDSET(struct ast_sip_transport, tcp_keepalive_idle_time));
ast_sorcery_object_field_register(sorcery, "transport", "tcp_keepalive_interval_time", "1", OPT_INT_T, 0, FLDSET(struct ast_sip_transport, tcp_keepalive_interval_time));
ast_sorcery_object_field_register(sorcery, "transport", "tcp_keepalive_probe_count", "5", OPT_INT_T, 0, FLDSET(struct ast_sip_transport, tcp_keepalive_probe_count));
#endif
#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK != 0
ast_sorcery_object_field_register_custom(sorcery, "transport", "cipher", "", transport_tls_cipher_handler, transport_tls_cipher_to_str, NULL, 0, 0);
#endif

View File

@ -1804,19 +1804,19 @@
When set to 'yes', TCP keepalive messages are sent to verify that the endpoint is still reachable. This can help detect dead TCP connections in environments where connections may be silently dropped (e.g., NAT timeouts).
</para></description>
</configOption>
<configOption name="tcp_keepidle_time" default="30">
<configOption name="tcp_keepalive_idle_time" default="30">
<synopsis>Idle time before the first TCP keepalive probe is sent</synopsis>
<description><para>
Specifies the amount of time in seconds that the connection must be idle before the first TCP keepalive probe is sent. An idle connection is defined as a connection in which no data has been sent or received by the application.
</para></description>
</configOption>
<configOption name="tcp_keepintvl_time" default="10">
<configOption name="tcp_keepalive_interval_time" default="10">
<synopsis>Interval between TCP keepalive probes</synopsis>
<description><para>
Specifies the interval in seconds between individual TCP keepalive probes, once the first probe is sent. This interval is used for subsequent probes if the peer does not respond to the previous probe.
</para></description>
</configOption>
<configOption name="tcp_keepcnt" default="5">
<configOption name="tcp_keepalive_probe_count" default="5">
<synopsis>Maximum number of TCP keepalive probes</synopsis>
<description><para>
Specifies the maximum number of TCP keepalive probes to send before considering the connection dead and notifying the application. If the peer does not respond after this many probes, the connection is considered broken.