[Asterisk-code-review] res pjsip registrar: AMI Add RegistrationInboundContactStatu... (asterisk[master])
Joshua Colp
asteriskteam at digium.com
Fri Dec 9 05:30:02 CST 2016
Joshua Colp has submitted this change and it was merged. ( https://gerrit.asterisk.org/4572 )
Change subject: res_pjsip_registrar: AMI Add RegistrationInboundContactStatuses command
......................................................................
res_pjsip_registrar: AMI Add RegistrationInboundContactStatuses command
The PJSIPShowRegistrationsInbound AMI command was just dumping out
all AORs which was pretty useless and resource heavy since it had
to get all endpoints, then all aors for each endpoint, then all
contacts for each aor.
PJSIPShowRegistrationInboundContactStatuses sends ContactStatusDetail
events which meets the intended purpose of the other command and has
significantly less overhead. Also, some additional fields that were
added to Contact since the original creation of the ContactStatusDetail
event have been added to the end of the event.
For compatibility purposes, PJSIPShowRegistrationsInbound is left
intact.
ASTERISK-26644 #close
Change-Id: I326f12c9ecb52bf37ba03f0748749de4da01490a
---
M CHANGES
M include/asterisk/res_pjsip.h
M res/res_pjsip.c
M res/res_pjsip/pjsip_options.c
M res/res_pjsip_registrar.c
5 files changed, 122 insertions(+), 10 deletions(-)
Approvals:
Richard Mudgett: Looks good to me, but someone else must approve
Anonymous Coward #1000019: Verified
Joshua Colp: Looks good to me, approved
diff --git a/CHANGES b/CHANGES
index df0834d..4c3d8db 100644
--- a/CHANGES
+++ b/CHANGES
@@ -91,6 +91,19 @@
for internal state transitions that don't change the reported public status
state.
+res_pjsip_registrar
+------------------
+ * The PJSIPShowRegistrationInboundContactStatuses AMI command has been added
+ to return ContactStatusDetail events as opposed to
+ PJSIPShowRegistrationsInbound which just a dumps every defined AOR.
+
+res_pjsip
+------------------
+ * Six existing contact fields have been added to the end of the
+ ContactStatusDetail AMI event:
+ ID, AuthenticateQualify, OutboundProxy, Path, QualifyFrequency and
+ QualifyTimeout. Existing fields have not been disturbed.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 14.1.0 to Asterisk 14.2.0 ------------
------------------------------------------------------------------------------
diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h
index 894ea76..09ace07 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -2277,6 +2277,16 @@
struct ast_sip_ami *ami, int *count);
/*!
+ * \brief Formats the contact and sends over AMI.
+ *
+ * \param obj a pointer an ast_sip_contact_wrapper structure
+ * \param arg a pointer to an ast_sip_ami structure
+ * \param flags ignored
+ * \retval 0 Success, otherwise non-zero on error
+ */
+int ast_sip_format_contact_ami(void *obj, void *arg, int flags);
+
+/*!
* \brief Format auth details for AMI.
*
* \param auths an auth array
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index 8c2d371..144621f 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -2102,10 +2102,31 @@
<para>Absolute time that this contact is no longer valid after</para>
</parameter>
<parameter name="ViaAddress">
- <para>IP address:port of the last Via header in REGISTER request</para>
+ <para>IP address:port of the last Via header in REGISTER request.
+ Will only appear in the event if available.</para>
</parameter>
<parameter name="CallID">
- <para>Content of the Call-ID header in REGISTER request</para>
+ <para>Content of the Call-ID header in REGISTER request.
+ Will only appear in the event if available.</para>
+ </parameter>
+ <parameter name="ID">
+ <para>The sorcery ID of the contact.</para>
+ </parameter>
+ <parameter name="AuthenticateQualify">
+ <para>A boolean indicating whether a qualify should be authenticated.</para>
+ </parameter>
+ <parameter name="OutboundProxy">
+ <para>The contact's outbound proxy.</para>
+ </parameter>
+ <parameter name="Path">
+ <para>The Path header received on the REGISTER.</para>
+ </parameter>
+ <parameter name="QualifyFrequency">
+ <para>The interval in seconds at which the contact will be qualified.</para>
+ </parameter>
+ <parameter name="QualifyTimeout">
+ <para>The elapsed time in decimal seconds after which an OPTIONS
+ message is sent before the contact is considered unavailable.</para>
</parameter>
</syntax>
</managerEventInstance>
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c
index 09fe155..d2b812d 100644
--- a/res/res_pjsip/pjsip_options.c
+++ b/res/res_pjsip/pjsip_options.c
@@ -1217,7 +1217,7 @@
}
-static int format_contact_status(void *obj, void *arg, int flags)
+int ast_sip_format_contact_ami(void *obj, void *arg, int flags)
{
struct ast_sip_contact_wrapper *wrapper = obj;
struct ast_sip_contact *contact = wrapper->contact;
@@ -1256,7 +1256,15 @@
ast_str_append(&buf, 0, "RoundtripUsec: %" PRId64 "\r\n", status->rtt);
}
ast_str_append(&buf, 0, "EndpointName: %s\r\n",
- ast_sorcery_object_get_id(endpoint));
+ endpoint ? ast_sorcery_object_get_id(endpoint) : S_OR(contact->endpoint_name, ""));
+
+ ast_str_append(&buf, 0, "ID: %s\r\n", ast_sorcery_object_get_id(contact));
+ ast_str_append(&buf, 0, "AuthenticateQualify: %d\r\n", contact->authenticate_qualify);
+ ast_str_append(&buf, 0, "OutboundProxy: %s\r\n", contact->outbound_proxy);
+ ast_str_append(&buf, 0, "Path: %s\r\n", contact->path);
+ ast_str_append(&buf, 0, "QualifyFrequency: %u\r\n", contact->qualify_frequency);
+ ast_str_append(&buf, 0, "QualifyTimeout: %.3f\r\n", contact->qualify_timeout);
+
astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
ami->count++;
@@ -1269,7 +1277,7 @@
{
struct ast_sip_aor *aor = obj;
- return ast_sip_for_each_contact(aor, format_contact_status, arg);
+ return ast_sip_for_each_contact(aor, ast_sip_format_contact_ami, arg);
}
static int format_ami_contact_status(const struct ast_sip_endpoint *endpoint,
diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c
index a8d2bdc..2db7538 100644
--- a/res/res_pjsip_registrar.c
+++ b/res/res_pjsip_registrar.c
@@ -46,11 +46,32 @@
<syntax />
<description>
<para>
- In response <literal>InboundRegistrationDetail</literal> events showing configuration and status
- information are raised for each inbound registration object. As well as <literal>AuthDetail</literal>
- events for each associated auth object. Once all events are completed an
- <literal>InboundRegistrationDetailComplete</literal> is issued.
- </para>
+ In response, <literal>InboundRegistrationDetail</literal> events showing configuration
+ and status information are raised for all contacts, static or dynamic. Once all events
+ are completed an <literal>InboundRegistrationDetailComplete</literal> is issued.
+ </para>
+ <warning><para>
+ This command just dumps all coonfigured AORs with contacts, even if the contact
+ is a permanent one. To really get just inbound registrations, use
+ <literal>PJSIPShowRegistrationInboundContactStatuses</literal>.
+ </para>
+ </warning>
+ </description>
+ <see-also>
+ <ref type="manager" module="res_pjsip_registrar">PJSIPShowRegistrationInboundContactStatuses</ref>
+ </see-also>
+ </manager>
+ <manager name="PJSIPShowRegistrationInboundContactStatuses" language="en_US">
+ <synopsis>
+ Lists ContactStatuses for PJSIP inbound registrations.
+ </synopsis>
+ <syntax />
+ <description>
+ <para>
+ In response, <literal>ContactStatusDetail</literal> events showing status information
+ are raised for each inbound registration (dynamic contact) object. Once all events
+ are completed a <literal>ContactStatusDetailComplete</literal> event is issued.
+ </para>
</description>
</manager>
***/
@@ -785,6 +806,42 @@
return 0;
}
+static int ami_show_registration_contact_statuses(struct mansession *s, const struct message *m)
+{
+ int count = 0;
+ struct ast_sip_ami ami = { .s = s, .m = m, .arg = NULL, .action_id = astman_get_header(m, "ActionID"), };
+ struct ao2_container *contacts = ast_sorcery_retrieve_by_fields(
+ ast_sip_get_sorcery(), "contact", AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL);
+ struct ao2_iterator i;
+ struct ast_sip_contact *contact;
+
+ astman_send_listack(s, m, "Following are ContactStatusEvents for each Inbound "
+ "registration", "start");
+
+ if (contacts) {
+ i = ao2_iterator_init(contacts, 0);
+ while ((contact = ao2_iterator_next(&i))) {
+ struct ast_sip_contact_wrapper wrapper;
+
+ wrapper.aor_id = (char *)contact->aor;
+ wrapper.contact = contact;
+ wrapper.contact_id = (char *)ast_sorcery_object_get_id(contact);
+
+ ast_sip_format_contact_ami(&wrapper, &ami, 0);
+ count++;
+
+ ao2_ref(contact, -1);
+ }
+ ao2_iterator_destroy(&i);
+ ao2_ref(contacts, -1);
+ }
+
+ astman_send_list_complete_start(s, m, "ContactStatusDetailComplete", count);
+ astman_send_list_complete_end(s);
+ return 0;
+}
+
+#define AMI_SHOW_REGISTRATION_CONTACT_STATUSES "PJSIPShowRegistrationInboundContactStatuses"
#define AMI_SHOW_REGISTRATIONS "PJSIPShowRegistrationsInbound"
static pjsip_module registrar_module = {
@@ -817,6 +874,8 @@
ast_manager_register_xml(AMI_SHOW_REGISTRATIONS, EVENT_FLAG_SYSTEM,
ami_show_registrations);
+ ast_manager_register_xml(AMI_SHOW_REGISTRATION_CONTACT_STATUSES, EVENT_FLAG_SYSTEM,
+ ami_show_registration_contact_statuses);
return AST_MODULE_LOAD_SUCCESS;
}
@@ -824,6 +883,7 @@
static int unload_module(void)
{
ast_manager_unregister(AMI_SHOW_REGISTRATIONS);
+ ast_manager_unregister(AMI_SHOW_REGISTRATION_CONTACT_STATUSES);
ast_sip_unregister_service(®istrar_module);
return 0;
}
--
To view, visit https://gerrit.asterisk.org/4572
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I326f12c9ecb52bf37ba03f0748749de4da01490a
Gerrit-PatchSet: 3
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Mark Michelson <mmichelson at digium.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett at digium.com>
More information about the asterisk-code-review
mailing list