int ast_sip_location_delete_contact(struct ast_sip_contact *contact)
{
- void *contact_status_obj;
-
- contact_status_obj = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), CONTACT_STATUS, ast_sorcery_object_get_id(contact));
- if (contact_status_obj) {
- ast_sorcery_delete(ast_sip_get_sorcery(), contact_status_obj);
- ao2_ref(contact_status_obj, -1);
- }
-
return ast_sorcery_delete(ast_sip_get_sorcery(), contact);
}
struct ast_sip_contact *contact;
struct ast_sip_contact_status *status;
char hash[33];
- char contact_id[strlen(aor_id) + sizeof(hash) + 2 + 1];
+ char contact_id[strlen(aor_id) + sizeof(hash) + 2];
if (!aor->permanent_contacts) {
aor->permanent_contacts = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
return -1;
}
+ ast_string_field_set(contact, uri, contact_uri);
+
status = ast_res_pjsip_find_or_create_contact_status(contact);
if (!status) {
ao2_ref(contact, -1);
}
ao2_ref(status, -1);
- ast_string_field_set(contact, uri, contact_uri);
ao2_link(aor->permanent_contacts, contact);
ao2_ref(contact, -1);
}
* Note that this must done here, as contacts will create the contact_status
* object before PJSIP options handling is initialized.
*/
- for (i = 0; i < REMOVED; i++) {
+ for (i = 0; i <= REMOVED; i++) {
ast_statsd_log_full_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE, 0, 1.0, ast_sip_get_contact_status_label(i));
}
#include "asterisk/sorcery.h"
#include "asterisk/callerid.h"
#include "asterisk/test.h"
+#include "asterisk/statsd.h"
/*! \brief Number of buckets for persistent endpoint information */
#define PERSISTENT_BUCKETS 53
const struct ast_sip_contact *contact = object;
struct ast_sip_contact_status *contact_status;
- contact_status = ast_sorcery_alloc(ast_sip_get_sorcery(), CONTACT_STATUS,
- ast_sorcery_object_get_id(contact));
+ contact_status = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), CONTACT_STATUS, ast_sorcery_object_get_id(contact));
if (!contact_status) {
ast_log(LOG_ERROR, "Unable to create ast_sip_contact_status for contact %s/%s\n",
contact->aor, contact->uri);
return;
}
- contact_status->uri = ast_strdup(contact->uri);
- if (!contact_status->uri) {
- ao2_cleanup(contact_status);
- return;
- }
- contact_status->status = REMOVED;
ast_verb(1, "Contact %s/%s has been deleted\n", contact->aor, contact->uri);
+ ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
+ "-1", 1.0, ast_sip_get_contact_status_label(contact_status->status));
+ ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
+ "+1", 1.0, ast_sip_get_contact_status_label(REMOVED));
ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
+ ast_sorcery_delete(ast_sip_get_sorcery(), contact_status);
ao2_cleanup(contact_status);
}
return;
}
- if (contact_status->status == contact_status->last_status) {
- ast_debug(3, "Contact %s/%s status didn't change: %s, RTT: %.3f msec\n",
- contact_status->aor, contact_status->uri, ast_sip_get_contact_status_label(contact_status->status),
- contact_status->rtt / 1000.0);
- return;
- } else {
+ if (contact_status->status != contact_status->last_status) {
ast_verb(1, "Contact %s/%s is now %s. RTT: %.3f msec\n", contact_status->aor, contact_status->uri,
ast_sip_get_contact_status_label(contact_status->status),
contact_status->rtt / 1000.0);
- }
- ast_test_suite_event_notify("AOR_CONTACT_UPDATE",
- "Contact: %s\r\n"
- "Status: %s",
- ast_sorcery_object_get_id(contact_status),
- ast_sip_get_contact_status_label(contact_status->status));
+ ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
+ "-1", 1.0, ast_sip_get_contact_status_label(contact_status->last_status));
+ ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
+ "+1", 1.0, ast_sip_get_contact_status_label(contact_status->status));
- ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
+ ast_test_suite_event_notify("AOR_CONTACT_UPDATE",
+ "Contact: %s\r\n"
+ "Status: %s",
+ ast_sorcery_object_get_id(contact_status),
+ ast_sip_get_contact_status_label(contact_status->status));
+
+ ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
+ } else {
+ ast_debug(3, "Contact %s/%s status didn't change: %s, RTT: %.3f msec\n",
+ contact_status->aor, contact_status->uri, ast_sip_get_contact_status_label(contact_status->status),
+ contact_status->rtt / 1000.0);
+ }
+
+ ast_statsd_log_full_va("PJSIP.contacts.%s.rtt", AST_STATSD_TIMER,
+ contact_status->status != AVAILABLE ? -1 : contact_status->rtt / 1000, 1.0, ast_sorcery_object_get_id(contact_status));
}
/*! \brief Observer for contacts so state can be updated on respective endpoints */
update->last_status = status->status;
update->status = value;
- if (update->last_status != update->status) {
- ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
- "-1", 1.0, ast_sip_get_contact_status_label(update->last_status));
- ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
- "+1", 1.0, ast_sip_get_contact_status_label(update->status));
- }
/* if the contact is available calculate the rtt as
the diff between the last start time and "now" */
update->rtt = update->status == AVAILABLE && status->rtt_start.tv_sec > 0 ?
ast_tvdiff_us(ast_tvnow(), status->rtt_start) : 0;
-
update->rtt_start = ast_tv(0, 0);
- ast_statsd_log_full_va("PJSIP.contacts.%s.rtt", AST_STATSD_TIMER,
- update->rtt / 1000, 1.0, ast_sorcery_object_get_id(update));
ast_test_suite_event_notify("AOR_CONTACT_QUALIFY_RESULT",
"Contact: %s\r\n"
"Status: %s\r\n"