<p>George Joseph has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/9200">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res_pjsip_session: Add ability to follow media forking during an INVITE<br><br>pjproject by default currently will follow media forked during an INVITE<br>on outbound calls if the To tag is different on a subsequent response as<br>that on an earlier response. We handle this correctly. There have<br>been reported cases where the To tag is the same but we still need to<br>follow the forked media. The pjproject patch in this commit adds the<br>capability to sip_inv and also adds the capability to control it at<br>runtime. The original "different tag" behavior was always controllable<br>at runtime but we never did anythign with it and left it to default to<br>TRUE.<br><br>So, along with the pjproject patch, this commit adds options to both the<br>system and endpoint objects to control the two behaviors, and a small<br>logic change to session_inv_on_media_update in res_pjsip_session to<br>control the behavior at the endpoint level.<br><br>The default behavior for "different tags" remains the same at TRUE and<br>the default for "same tag" is FALSE.<br><br>Change-Id: I64d071942b79adb2f0a4e13137389b19404fe3d6<br>Reported-by: Ross Beer<br>---<br>M CHANGES<br>M configs/samples/pjsip.conf.sample<br>A contrib/ast-db-manage/config/versions/0be05c3a8225_add_early_media_options.py<br>M include/asterisk/res_pjsip.h<br>M res/res_pjsip.c<br>M res/res_pjsip/config_system.c<br>M res/res_pjsip/pjsip_configuration.c<br>M res/res_pjsip_session.c<br>A third-party/pjproject/patches/0100-sip_inv-Add-ability-to-accept-updated-media-on-same-.patch<br>9 files changed, 313 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/00/9200/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/CHANGES b/CHANGES<br>index a02cd8a..c830566 100644<br>--- a/CHANGES<br>+++ b/CHANGES<br>@@ -34,6 +34,21 @@<br> detection as the ConfbridgeTalking event, so bridges must be configured<br> with "talk_detection_events=yes" for this flag to have meaning.<br> <br>+res_pjsip<br>+------------------<br>+ * Two new options have been added to the system and endpoint objects to<br>+ control whether, on outbound calls, Asterisk will follow media forked<br>+ during the initial INVITE transaction. For instance, the media port in<br>+ a 200 OK's SDP is different than that in a previous 183 Session Progress.<br>+ follow_early_media_forked sets whether Asterisk will follow when the<br>+ To tag on the subsequent response is different that on the the previous<br>+ response. The default behavior of "yes" is unchanged.<br>+ follow_early_media_forked_same_tag sets whether Asterisk will follow when<br>+ the To tag on the subsequent response is the same as that on the previous<br>+ response. The default behavior of "no" is unchanged.<br>+ These options have to be enabled system-wide in the system config section<br>+ as well as on individual endpoints that require the functionality.<br>+<br> ------------------------------------------------------------------------------<br> --- Functionality changes from Asterisk 13.20.0 to Asterisk 13.21.0 ----------<br> ------------------------------------------------------------------------------<br>diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample<br>index e172908..2c39dd1 100644<br>--- a/configs/samples/pjsip.conf.sample<br>+++ b/configs/samples/pjsip.conf.sample<br>@@ -790,6 +790,26 @@<br> ; of MWI status changes. If not set, incoming MWI<br> ; NOTIFYs are ignored.<br> <br>+;follow_early_media_fork = ; Follow SDP forked media when To tag is different.<br>+ ; On outgoing calls, if the UAS responds with<br>+ ; different SDP attributes on subsequent 18X or 2XX<br>+ ; responses (such as a port update) AND the To tag<br>+ ; on the subsequent response is different that the<br>+ ; previous one, follow it.<br>+ ; This option must also be enabled in the system<br>+ ; section for it to take effect here.<br>+ ; (default: yes)<br>+;follow_early_media_fork_same_tag =<br>+ ; Follow SDP forked media when To tag is the same.<br>+ ; On outgoing calls, if the UAS responds with<br>+ ; different SDP attributes on subsequent 18X or 2XX<br>+ ; responses (such as a port update) AND the To tag on<br>+ ; the subsequent response is the same as that the<br>+ ; previous one, follow it.<br>+ ; This option must also be enabled in the system<br>+ ; section for it to take effect here.<br>+ ; (default: no)<br>+<br> ;==========================AUTH SECTION OPTIONS=========================<br> ;[auth]<br> ; SYNOPSIS: Authentication type<br>@@ -935,6 +955,25 @@<br> ; Disabling this option has been known to cause interoperability<br> ; issues, so disable at your own risk.<br> ; (default: "yes")<br>+;follow_early_media_fork = ; Follow SDP forked media when To tag is different.<br>+ ; On outgoing calls, if the UAS responds with<br>+ ; different SDP attributes on subsequent 18X or 2XX<br>+ ; responses (such as a port update) AND the To tag<br>+ ; on the subsequent response is different that the<br>+ ; previous one, follow it.<br>+ ; This option must also be enabled on endpoints that<br>+ ; require this functionality.<br>+ ; (default: yes)<br>+;follow_early_media_fork_same_tag =<br>+ ; Follow SDP forked media when To tag is the same.<br>+ ; On outgoing calls, if the UAS responds with<br>+ ; different SDP attributes on subsequent 18X or 2XX<br>+ ; responses (such as a port update) AND the To tag on<br>+ ; the subsequent response is the same as that the<br>+ ; previous one, follow it.<br>+ ; This option must also be enabled on endpoints that<br>+ ; require this functionality.<br>+ ; (default: no)<br> ;type= ; Must be of type system (default: "")<br> <br> ;==========================GLOBAL SECTION OPTIONS=========================<br>diff --git a/contrib/ast-db-manage/config/versions/0be05c3a8225_add_early_media_options.py b/contrib/ast-db-manage/config/versions/0be05c3a8225_add_early_media_options.py<br>new file mode 100644<br>index 0000000..a2b1fef<br>--- /dev/null<br>+++ b/contrib/ast-db-manage/config/versions/0be05c3a8225_add_early_media_options.py<br>@@ -0,0 +1,31 @@<br>+"""Add early media options<br>+<br>+Revision ID: 0be05c3a8225<br>+Revises: d3e4284f8707<br>+Create Date: 2018-06-18 17:26:16.737692<br>+<br>+"""<br>+<br>+# revision identifiers, used by Alembic.<br>+revision = '0be05c3a8225'<br>+down_revision = 'd3e4284f8707'<br>+<br>+from alembic import op<br>+import sqlalchemy as sa<br>+from sqlalchemy.dialects.postgresql import ENUM<br>+<br>+YESNO_NAME = 'yesno_values'<br>+YESNO_VALUES = ['yes', 'no']<br>+<br>+def upgrade():<br>+ yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)<br>+<br>+ op.add_column('ps_systems', sa.Column('follow_early_media_fork', yesno_values))<br>+ op.add_column('ps_systems', sa.Column('follow_early_media_fork_same_tag', yesno_values))<br>+<br>+def downgrade():<br>+ if op.get_context().bind.dialect.name == 'mssql':<br>+ op.drop_constraint('ck_ps_systems_follow_early_media_fork_yesno_values','ps_systems')<br>+ op.drop_constraint('ck_ps_systems_follow_early_media_fork_any_tag_yesno_values','ps_systems')<br>+ op.drop_column('ps_systems', 'follow_early_media_fork')<br>+ op.drop_column('ps_systems', 'follow_early_media_fork_same_tag')<br>diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h<br>index 7177ceb..7dc790f 100644<br>--- a/include/asterisk/res_pjsip.h<br>+++ b/include/asterisk/res_pjsip.h<br>@@ -637,6 +637,10 @@<br> unsigned int timeout;<br> /*! Number of seconds before terminating channel due to lack of RTP (when on hold) */<br> unsigned int timeout_hold;<br>+ /*! Follow forked media with a different To tag */<br>+ unsigned int follow_early_media_fork;<br>+ /*! Follow forked media with the same To tag */<br>+ unsigned int follow_early_media_fork_same_tag;<br> };<br> <br> /*!<br>diff --git a/res/res_pjsip.c b/res/res_pjsip.c<br>index b5f8cbd..d0cb5d5 100644<br>--- a/res/res_pjsip.c<br>+++ b/res/res_pjsip.c<br>@@ -1027,6 +1027,34 @@<br> changes. If not set, incoming MWI NOTIFYs are ignored.<br> </para></description><br> </configOption><br>+ <configOption name="follow_early_media_fork" default="no"><br>+ <synopsis>Follow SDP forked media when To tag is different</synopsis><br>+ <description><para><br>+ On outgoing calls, if the UAS responds with different SDP attributes<br>+ on subsequent 18X or 2XX responses (such as a port update) AND the<br>+ To tag on the subsequent response is different that the previous one,<br>+ follow it.<br>+ </para><br>+ <para><br>+ This option must also be enabled in the <literal>system</literal><br>+ section for it to take effect here.<br>+ </para><br>+ </description><br>+ </configOption><br>+ <configOption name="follow_early_media_fork_same_tag" default="no"><br>+ <synopsis>Follow SDP forked media when To tag is the same</synopsis><br>+ <description><para><br>+ On outgoing calls, if the UAS responds with different SDP attributes<br>+ on subsequent 18X or 2XX responses (such as a port update) AND the<br>+ To tag on the subsequent response is the same as that the previous one,<br>+ follow it.<br>+ </para><br>+ <para><br>+ This option must also be enabled in the <literal>system</literal><br>+ section for it to take effect here.<br>+ </para><br>+ </description><br>+ </configOption><br> </configObject><br> <configObject name="auth"><br> <synopsis>Authentication type</synopsis><br>@@ -1594,6 +1622,34 @@<br> request is too large. See RFC 3261 section 18.1.1.<br> </para></description><br> </configOption><br>+ <configOption name="follow_early_media_fork" default="no"><br>+ <synopsis>Follow SDP forked media when To tag is different</synopsis><br>+ <description><para><br>+ On outgoing calls, if the UAS responds with different SDP attributes<br>+ on subsequent 18X or 2XX responses (such as a port update) AND the<br>+ To tag on the subsequent response is different that the previous one,<br>+ follow it.<br>+ </para><br>+ <para><br>+ This option must also be enabled on endpoints that require<br>+ this functionality.<br>+ </para><br>+ </description><br>+ </configOption><br>+ <configOption name="follow_early_media_fork_same_tag" default="no"><br>+ <synopsis>Follow SDP forked media when To tag is the same</synopsis><br>+ <description><para><br>+ On outgoing calls, if the UAS responds with different SDP attributes<br>+ on subsequent 18X or 2XX responses (such as a port update) AND the<br>+ To tag on the subsequent response is the same as that the previous one,<br>+ follow it.<br>+ </para><br>+ <para><br>+ This option must also be enabled on endpoints that require<br>+ this functionality.<br>+ </para><br>+ </description><br>+ </configOption><br> <configOption name="type"><br> <synopsis>Must be of type 'system'.</synopsis><br> </configOption><br>diff --git a/res/res_pjsip/config_system.c b/res/res_pjsip/config_system.c<br>index ed2b5d2..1e4a730 100644<br>--- a/res/res_pjsip/config_system.c<br>+++ b/res/res_pjsip/config_system.c<br>@@ -52,6 +52,13 @@<br> } threadpool;<br> /*! Nonzero to disable switching from UDP to TCP transport */<br> unsigned int disable_tcp_switch;<br>+ /*!<br>+ * Although early media is enabled in pjproject by default, it's only<br>+ * enabled when the To tags are different. These options allow turning<br>+ * onm or off the feature for different tags and same tags.<br>+ */<br>+ unsigned int follow_early_media_fork;<br>+ unsigned int follow_early_media_fork_same_tag;<br> };<br> <br> static struct ast_threadpool_options sip_threadpool_options = {<br>@@ -95,6 +102,9 @@<br> <br> pjsip_cfg()->tsx.t1 = system->timert1;<br> pjsip_cfg()->tsx.td = system->timerb;<br>+<br>+ pjsip_cfg()->endpt.follow_early_media_fork = system->follow_early_media_fork;<br>+ pjsip_cfg()->endpt.follow_early_media_fork_same_tag = system->follow_early_media_fork_same_tag;<br> <br> if (system->compactheaders) {<br> extern pj_bool_t pjsip_use_compact_form;<br>@@ -184,6 +194,10 @@<br> OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.max_size));<br> ast_sorcery_object_field_register(system_sorcery, "system", "disable_tcp_switch", "yes",<br> OPT_BOOL_T, 1, FLDSET(struct system_config, disable_tcp_switch));<br>+ ast_sorcery_object_field_register(system_sorcery, "system", "follow_early_media_fork", "no",<br>+ OPT_BOOL_T, 1, FLDSET(struct system_config, follow_early_media_fork));<br>+ ast_sorcery_object_field_register(system_sorcery, "system", "follow_early_media_fork_same_tag", "no",<br>+ OPT_BOOL_T, 1, FLDSET(struct system_config, follow_early_media_fork_same_tag));<br> <br> ast_sorcery_load(system_sorcery);<br> <br>diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c<br>index 9426e92..e8c9d0d 100644<br>--- a/res/res_pjsip/pjsip_configuration.c<br>+++ b/res/res_pjsip/pjsip_configuration.c<br>@@ -1854,6 +1854,8 @@<br> ast_sorcery_object_field_register(sip_sorcery, "endpoint", "refer_blind_progress", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, refer_blind_progress));<br> ast_sorcery_object_field_register(sip_sorcery, "endpoint", "notify_early_inuse_ringing", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, notify_early_inuse_ringing));<br> ast_sorcery_object_field_register(sip_sorcery, "endpoint", "incoming_mwi_mailbox", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, incoming_mwi_mailbox));<br>+ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "follow_early_media_fork", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.follow_early_media_fork));<br>+ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "follow_early_media_fork_same_tag", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.follow_early_media_fork_same_tag));<br> <br> if (ast_sip_initialize_sorcery_transport()) {<br> ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");<br>diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c<br>index 26e5c39..590125a 100644<br>--- a/res/res_pjsip_session.c<br>+++ b/res/res_pjsip_session.c<br>@@ -3065,6 +3065,26 @@<br> return;<br> }<br> <br>+ if (session->endpoint && (inv->following_fork || inv->following_fork_same_tag)) {<br>+ int bail = 0;<br>+ if ((inv->following_fork && session->endpoint->media.rtp.follow_early_media_fork)) {<br>+ ast_debug(3, "Following early media fork with different To tags\n");<br>+ } else {<br>+ ast_debug(3, "Not following early media fork with different To tags\n");<br>+ bail = 1;<br>+ }<br>+ if ((inv->following_fork_same_tag && session->endpoint->media.rtp.follow_early_media_fork_same_tag)) {<br>+ ast_debug(3, "Following early media fork with same To tag\n");<br>+ bail = 0;<br>+ } else {<br>+ ast_debug(3, "Not following early media fork with same To tag\n");<br>+ bail = 1;<br>+ }<br>+ if (bail) {<br>+ return;<br>+ }<br>+ }<br>+<br> if ((status != PJ_SUCCESS) || (pjmedia_sdp_neg_get_active_local(inv->neg, &local) != PJ_SUCCESS) ||<br> (pjmedia_sdp_neg_get_active_remote(inv->neg, &remote) != PJ_SUCCESS)) {<br> ast_channel_hangupcause_set(session->channel, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);<br>diff --git a/third-party/pjproject/patches/0100-sip_inv-Add-ability-to-accept-updated-media-on-same-.patch b/third-party/pjproject/patches/0100-sip_inv-Add-ability-to-accept-updated-media-on-same-.patch<br>new file mode 100644<br>index 0000000..8a75751<br>--- /dev/null<br>+++ b/third-party/pjproject/patches/0100-sip_inv-Add-ability-to-accept-updated-media-on-same-.patch<br>@@ -0,0 +1,132 @@<br>+From c57874baacd2b41cd42cd93e784cfb96ac9a6012 Mon Sep 17 00:00:00 2001<br>+From: George Joseph <gjoseph@digium.com><br>+Date: Mon, 18 Jun 2018 20:16:54 -0600<br>+Subject: [PATCH] sip_inv: Add ability to accept updated media on same To tag<br>+<br>+Currently, setting pjsip_cfg()->endpt.follow_early_media_fork allows<br>+sip_inv to process media updates when the To tag is different. There<br>+are some cases where media updates need to be processed when the tags<br>+are the same. Since removing the requirement for different tags would<br>+change default behavior, a new option "follow_early_media_fork_same_tag"<br>+has been added along with a new pjsip_inv_session flag<br>+"following_fork_same_tag" to indicate under which condition we're<br>+following.<br>+---<br>+ pjsip/include/pjsip-ua/sip_inv.h | 3 +++<br>+ pjsip/include/pjsip/sip_config.h | 23 +++++++++++++++++++++++<br>+ pjsip/src/pjsip-ua/sip_inv.c | 15 ++++++++-------<br>+ pjsip/src/pjsip/sip_config.c | 3 ++-<br>+ 4 files changed, 36 insertions(+), 8 deletions(-)<br>+<br>+diff --git a/pjsip/include/pjsip-ua/sip_inv.h b/pjsip/include/pjsip-ua/sip_inv.h<br>+index 1bb7b8adc..1509831d8 100644<br>+--- a/pjsip/include/pjsip-ua/sip_inv.h<br>++++ b/pjsip/include/pjsip-ua/sip_inv.h<br>+@@ -442,6 +442,9 @@ struct pjsip_inv_session<br>+ pj_bool_t following_fork; /**< Internal, following<br>+ forked media? */<br>+ pj_atomic_t *ref_cnt; /**< Reference counter. */<br>++ pj_bool_t following_fork_same_tag; /**< Internal, following<br>++ forked media same<br>++ tag? */<br>+ };<br>+ <br>+ <br>+diff --git a/pjsip/include/pjsip/sip_config.h b/pjsip/include/pjsip/sip_config.h<br>+index 04871c98a..777d73279 100644<br>+--- a/pjsip/include/pjsip/sip_config.h<br>++++ b/pjsip/include/pjsip/sip_config.h<br>+@@ -170,6 +170,14 @@ typedef struct pjsip_cfg_t<br>+ */<br>+ pj_bool_t use_compact_form;<br>+ <br>++ /**<br>++ * Enable call media session to always be updated to the latest<br>++ * received early media SDP when receiving forked early media<br>++ * (multiple 183 responses with SAME To tag).<br>++ *<br>++ * Default is PJSIP_FOLLOW_EARLY_MEDIA_FORK_SAME_TAG.<br>++ */<br>++ pj_bool_t follow_early_media_fork_same_tag;<br>+ } endpt;<br>+ <br>+ /** Transaction layer settings. */<br>+@@ -415,6 +423,21 @@ PJ_INLINE(pjsip_cfg_t*) pjsip_cfg(void)<br>+ #endif<br>+ <br>+ <br>++/**<br>++ * Specify whether the call media session should be updated to the latest<br>++ * received early media SDP when receiving forked early media (multiple 183<br>++ * responses with the SAME To tag).<br>++ *<br>++ * This option can also be controlled at run-time by the<br>++ * \a follow_early_media_fork_same_tag setting in pjsip_cfg_t.<br>++ *<br>++ * Default is PJ_FALSE.<br>++ */<br>++#ifndef PJSIP_FOLLOW_EARLY_MEDIA_FORK_SAME_TAG<br>++# define PJSIP_FOLLOW_EARLY_MEDIA_FORK_SAME_TAG PJ_FALSE<br>++#endif<br>++<br>++<br>+ /**<br>+ * Specify whether "alias" param should be added to the Via header<br>+ * in any outgoing request with connection oriented transport.<br>+diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c<br>+index 0173cb4cb..332147a62 100644<br>+--- a/pjsip/src/pjsip-ua/sip_inv.c<br>++++ b/pjsip/src/pjsip-ua/sip_inv.c<br>+@@ -2000,6 +2000,7 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,<br>+ <br>+ /* Initialize info that we are following forked media */<br>+ inv->following_fork = PJ_FALSE;<br>++ inv->following_fork_same_tag = PJ_FALSE;<br>+ <br>+ /* MUST NOT do multiple SDP offer/answer in a single transaction,<br>+ * EXCEPT if:<br>+@@ -2025,12 +2026,11 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,<br>+ * tag.<br>+ * See ticket #1644 and #1764 for forked early media case.<br>+ */<br>+- if (tsx->role == PJSIP_ROLE_UAC &&<br>+- (st_code/100 == 2 ||<br>+- (st_code/10 == 18 /* st_code == 18x */<br>+- && pjsip_cfg()->endpt.follow_early_media_fork)) &&<br>+- tsx_inv_data->done_early &&<br>+- pj_stricmp(&tsx_inv_data->done_tag, &res_tag))<br>++ if (tsx->role == PJSIP_ROLE_UAC && tsx_inv_data->done_early &&<br>++ (st_code/100 == 2 || st_code/10 == 18) && /* st_code == 18x */<br>++ pjsip_cfg()->endpt.follow_early_media_fork &&<br>++ (pj_stricmp(&tsx_inv_data->done_tag, &res_tag) ||<br>++ pjsip_cfg()->endpt.follow_early_media_fork_same_tag))<br>+ {<br>+ const pjmedia_sdp_session *reoffer_sdp = NULL;<br>+ <br>+@@ -2054,7 +2054,8 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,<br>+ return status;<br>+ }<br>+ <br>+- inv->following_fork = PJ_TRUE;<br>++ inv->following_fork = !!pj_stricmp(&tsx_inv_data->done_tag, &res_tag);<br>++ inv->following_fork_same_tag = !pj_stricmp(&tsx_inv_data->done_tag, &res_tag);<br>+ <br>+ } else {<br>+ <br>+diff --git a/pjsip/src/pjsip/sip_config.c b/pjsip/src/pjsip/sip_config.c<br>+index fdeec2f6b..e29c341c5 100644<br>+--- a/pjsip/src/pjsip/sip_config.c<br>++++ b/pjsip/src/pjsip/sip_config.c<br>+@@ -35,7 +35,8 @@ pjsip_cfg_t pjsip_sip_cfg_var =<br>+ PJSIP_REQ_HAS_VIA_ALIAS,<br>+ PJSIP_RESOLVE_HOSTNAME_TO_GET_INTERFACE,<br>+ 0,<br>+- PJSIP_ENCODE_SHORT_HNAME<br>++ PJSIP_ENCODE_SHORT_HNAME,<br>++ PJSIP_FOLLOW_EARLY_MEDIA_FORK_SAME_TAG<br>+ },<br>+ <br>+ /* Transaction settings */<br>+-- <br>+2.14.4<br>+<br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/9200">change 9200</a>. To unsubscribe, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/9200"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I64d071942b79adb2f0a4e13137389b19404fe3d6 </div>
<div style="display:none"> Gerrit-Change-Number: 9200 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>