[asterisk-dev] Transfer cmd (PJSIP not sending Referred-By but chan_sip does)

Mark Michelson mmichelson at digium.com
Tue Aug 25 13:17:10 CDT 2015


That code gets you about 95% of the way there.

The biggest difference would be that the pjsip_msg_add_hdr() call may 
need to be broken up based on whether the SIPREFERREDBYHDR channel 
variable is set or not. To determine that, you can use the 
pbx_builtin_getvar_helper() function call declared in 
include/asterisk/pbx.h to retrieve the variable value, and the 
ast_strlen_zero() function to determine if the channel variable value is 
zero-length or not.

Other than that, you should be able to omit the call to 
pjsua_process_msg_data() since Asterisk doesn't use pjsua.

On 08/25/2015 12:35 PM, Dan Cropp wrote:
>
> In doing a little research, it seems the Referred-By header could be 
> added after the pjsip_xfer_initiate.
>
> This is the approach PJSIP did for some code as far back as PJSIP 1.6.
>
>     /*
>
>      * Create REFER request.
>
>      */
>
>     status = pjsip_xfer_initiate(sub, dest, &tdata);
>
>     if (status != PJ_SUCCESS) {
>
>                 pjsua_perror(THIS_FILE, "Unable to create REFER 
> request", status);
>
>                 pjsip_dlg_dec_lock(dlg);
>
>                 return status;
>
>     }
>
>     /* Add Referred-By header */
>
>     gs_hdr = pjsip_generic_string_hdr_create(tdata->pool, &str_ref_by,
>
>      &dlg->local.info_str);
>
>     pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)gs_hdr);
>
>     /* Add additional headers etc */
>
>     pjsua_process_msg_data( tdata, msg_data);
>
>     /* Send. */
>
>     status = pjsip_xfer_send_request(sub, tdata);
>
>     if (status != PJ_SUCCESS) {
>
>                 pjsua_perror(THIS_FILE, "Unable to send REFER 
> request", status);
>
>                 pjsip_dlg_dec_lock(dlg);
>
>                 return status;
>
>     }
>
> Could anyone provider some insight into how difficult this might be 
> for me to add and submit for approval?  Depending on the answer, my 
> manager may be willing to let me work on this.
>
> I've developed in C/C++ for over 25 years so I'm plenty familiar with 
> the language.
>
> I'm less familiar with the syntax and coding standards of Asterisk.  I 
> know the group is very good at letting people know about their 
> mistakes and how to fix them.
>
> Have a great day!
>
> Dan
>
> *From:*asterisk-dev-bounces at lists.digium.com 
> [mailto:asterisk-dev-bounces at lists.digium.com] *On Behalf Of *Dan Cropp
> *Sent:* Tuesday, August 25, 2015 10:50 AM
> *To:* Asterisk Developers Mailing List
> *Subject:* Re: [asterisk-dev] Transfer cmd (PJSIP not sending 
> Referred-By but chan_sip does)
>
> Thank you Mark
>
> *From:*asterisk-dev-bounces at lists.digium.com 
> <mailto:asterisk-dev-bounces at lists.digium.com> 
> [mailto:asterisk-dev-bounces at lists.digium.com] *On Behalf Of *Mark 
> Michelson
> *Sent:* Tuesday, August 25, 2015 10:30 AM
> *To:* Asterisk Developers Mailing List
> *Subject:* Re: [asterisk-dev] Transfer cmd (PJSIP not sending 
> Referred-By but chan_sip does)
>
> The answer to this is actually pretty simple: adding Referred-By in 
> outgoing SIP REFERs is simply not implemented in chan_pjsip's 
> chan_pjsip_transfer() function.
>
> As far as the syntax required for the Transfer() application, that's 
> probably a case where that needs to be clarified in documentation. 
> There are lots of places in PJSIP configuration where we require full 
> SIP URIs rather than just IP addresses or bare URIs (user at domain).
>
> On 08/25/2015 10:00 AM, Dan Cropp wrote:
>
>     I asked the question on asterisk–users but did not receive a
>     response, so I am sending the question here.
>
>     I am running Asterisk 13.5.0.
>
>     A call comes in, Asterisk answers it. After some actions, the call
>     needs to be Transferred (SIP REFER) to another number.  The other
>     switch is responsible for accepting the Transfer and tromboning
>     the lines internally.  It will also send a BYE so Asterisk no
>     longer has the call.
>
>     The behavior works when I have the endpoint configured at
>     chan_sip.  It does not work when the endpoint is configured as
>     PJSIP.  I worked with the other switch vendor and he determined
>     chan_sip includes the Referred-By header.  PJSIP does not include
>     the Referred-By header.  The other switch requires the Referred-By
>     header to be present.
>
>     I tried setting the channel’s SIPREFERREDBYHDR variable before the
>     Transfer command and that still did not force the Referred-By
>     header to be part of the REFER packet.
>
>     I tried the PJSIP_HEADER add and it still did not add the
>     Referred-By header to the REFER packet.
>
>     Is there a PJSIP setting to force the Referred-By to be part of
>     the REFER packet?
>
>     chan_sip (succeeds)
>
>     19:27:32.512123 IP (tos 0x0, ttl 64, id 11492, offset 0, flags
>     [none], proto UDP (17), length 630)
>
>         192.168.xxx.xxx.sip > 192.168.yyy.yyy.sip: SIP, length: 602
>
>             REFER sip:3400 at 192.168.yyy.yyy:5060 SIP/2.0
>
>             Via: SIP/2.0/UDP 192.168.xxx.xxx:5060;branch=z9hG4bK58f4bd1d
>
>             Max-Forwards: 70
>
>             From: <sip:3344 at 192.168.xxx.xxx>;tag=as44000cf4
>
>             To: <sip:3400 at 192.168.yyy.yyy>;tag=7Iy0JkwDC
>
>             Contact: <sip:3344 at 192.168.xxx.xxx:5060>
>
>             Call-ID: jdEuqpAK-0002- at 192.168.yyy.yyy
>     <mailto:jdEuqpAK-0002- at 192.168.yyy.yyy>
>
>             CSeq: 102 REFER
>
>             User-Agent: Asterisk PBX 13.5.0
>
>             Date: Thu, 20 Aug 2015 19:27:32 GMT
>
>             Refer-To: <sip:370 at 192.168.yyy.yyy>
>
>             Referred-By: <sip:3344 at 192.168.xxx.xxx:5060>
>
>             Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER,
>     SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
>
>             Supported: replaces, timer
>
>             Content-Length: 0
>
>     Pjsip
>
>     18:46:58.386372 IP (tos 0x0, ttl 64, id 38690, offset 0, flags
>     [DF], proto UDP (17), length 654)
>
>         192.168.xxx.xxx.sip > 192.168.yyy.yyy.sip: SIP, length: 626
>
>             REFER sip:3400 at 192.168.yyy.yyy:5060 SIP/2.0
>
>             Via: SIP/2.0/UDP
>     192.168.xxx.xxx:5060;rport;branch=z9hG4bKPjec41c3b9-d734-482d-82c1-2a6f8d9452a3
>
>             From:
>     <sip:3344 at 192.168.xxx.xxx>;tag=3c10f423-e468-42ea-87a1-658ae106581c
>
>             To: <sip:3400 at 192.168.yyy.yyy>;tag=WITKDakt
>
>             Contact: <sip:192.168.xxx.xxx:5060>
>
>             Call-ID: s6Wk6l6Q-0001- at 192.168.yyy.yyy
>     <mailto:s6Wk6l6Q-0001- at 192.168.yyy.yyy>
>
>             CSeq: 981 REFER
>
>             Event: refer
>
>             Expires: 600
>
>             Supported: 100rel, timer, replaces, norefersub
>
>             Accept: message/sipfrag;version=2.0
>
>             Allow-Events: message-summary, presence, dialog, refer
>
>             Refer-To: <sip:370 at 192.168.yyy.yyy>
>
>             Max-Forwards: 70
>
>             User-Agent: Asterisk PBX 13.5.0
>
>             Content-Length:  0
>
>     One other slight oddity.
>
>     To get chan_sip to Transfer
>
>     370 at 192.168.yyy.yyy <mailto:370 at 192.168.yyy.yyy>
>
>     To get PJSIP to Transfer with the correct Refer-To header, I had
>     to include the <> and sip:
>
>     <_sip:370 at 192.168.yyy.__yyy_>
>
>     Have a great day!
>
>     Dan
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20150825/e03ebee3/attachment-0001.html>


More information about the asterisk-dev mailing list