diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index 33f4e0f855..5f656b762c 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -2584,6 +2584,7 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
stream->write_function(stream, "PingState\t%d/%d/%d\n", gp->ping_min, gp->ping_count, gp->ping_max);
stream->write_function(stream, "State \t%s\n", sofia_state_names[gp->state]);
stream->write_function(stream, "Status \t%s%s\n", status_names[gp->status], gp->pinging ? " (ping)" : "");
+ stream->write_function(stream, "Uptime \t%ld\n", gp->status == SOFIA_GATEWAY_UP ? switch_time_now()-gp->uptime : 0);
stream->write_function(stream, "CallsIN \t%u\n", gp->ib_calls);
stream->write_function(stream, "CallsOUT\t%u\n", gp->ob_calls);
stream->write_function(stream, "FailedCallsIN\t%u\n", gp->ib_failed_calls);
@@ -2827,6 +2828,7 @@ static void xml_gateway_status(sofia_gateway_t *gp, switch_stream_handle_t *stre
stream->write_function(stream, " %d\n", gp->pinging);
stream->write_function(stream, " %s\n", sofia_state_names[gp->state]);
stream->write_function(stream, " %s\n", status_names[gp->status]);
+ stream->write_function(stream, " %ld\n", gp->status == SOFIA_GATEWAY_UP ? switch_time_now()-gp->uptime : 0);
stream->write_function(stream, " %u\n", gp->ib_calls);
stream->write_function(stream, " %u\n", gp->ob_calls);
stream->write_function(stream, " %u\n", gp->ib_failed_calls);
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h
index 577ff07bbc..4be1d9747a 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.h
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.h
@@ -488,6 +488,7 @@ struct sofia_gateway {
time_t reg_timeout;
int pinging;
sofia_gateway_status_t status;
+ switch_time_t uptime;
uint32_t ping_freq;
int ping_count;
int ping_max;
diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c
index edc15cf69b..390a289d94 100644
--- a/src/mod/endpoints/mod_sofia/sofia.c
+++ b/src/mod/endpoints/mod_sofia/sofia.c
@@ -3487,6 +3487,7 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
if (!switch_true(register_str)) {
gateway->state = REG_STATE_NOREG;
gateway->status = SOFIA_GATEWAY_UP;
+ gateway->uptime = switch_time_now();
}
if (zstr(auth_username)) {
@@ -5563,6 +5564,7 @@ static void sofia_handle_sip_r_options(switch_core_session_t *session, int statu
if (gateway->ping_count >= gateway->ping_min && gateway->status != SOFIA_GATEWAY_UP) {
gateway->status = SOFIA_GATEWAY_UP;
+ gateway->uptime = switch_time_now();
sofia_reg_fire_custom_gateway_state_event(gateway, status, phrase);
}
diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c
index 206b77283b..053ddd9a9e 100644
--- a/src/mod/endpoints/mod_sofia/sofia_reg.c
+++ b/src/mod/endpoints/mod_sofia/sofia_reg.c
@@ -372,8 +372,9 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now)
switch (ostate) {
case REG_STATE_NOREG:
- if (!gateway_ptr->ping && !gateway_ptr->pinging) {
+ if (!gateway_ptr->ping && !gateway_ptr->pinging && gateway_ptr->status != SOFIA_GATEWAY_UP) {
gateway_ptr->status = SOFIA_GATEWAY_UP;
+ gateway_ptr->uptime = switch_time_now();
}
break;
case REG_STATE_REGISTER:
@@ -396,7 +397,10 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now)
gateway_ptr->expires = now + delta;
gateway_ptr->state = REG_STATE_REGED;
- gateway_ptr->status = SOFIA_GATEWAY_UP;
+ if (gateway_ptr->status != SOFIA_GATEWAY_UP) {
+ gateway_ptr->status = SOFIA_GATEWAY_UP;
+ gateway_ptr->uptime = switch_time_now();
+ }
break;
case REG_STATE_UNREGISTER: