[asterisk-dev] Testers wanted - PRACK for 1.8

Olle E. Johansson oej at edvina.net
Wed Jul 4 03:09:56 CDT 2012


4 jul 2012 kl. 05:50 skrev Pavel Troller:

> Hi!
>  Is it possible to get a patch based on 1.8 branch instead of the full tree? I would like to test it on the SIP trunk against Nortel's CallServer 2000, which prefers 100rel support, but my source tree is highly customized and I cannot easily adapt another tree without spending too much time on it :-(.
You can just do a diff with 1.8 or any 1.8 release yourself with svn :-)

I just added a patch to the /patches directory in 
http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/patches/darjeeling-prack-1.8.diff

Looking forward to your feedback.

/Olle

>    Regards, Pavel
> 
>> http://svn.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8
>> 
>> As far as I can see from tests with various phones this implementation of SIP PRACK - or "100rel" seems to work now. All you have to do is to add prack=yes to sip.conf (general or per-device) and Asterisk will start playing the PRACK game.
>> 
>> Feedback from tests is always welcome!
>> 
>> Regards,
>> /Olle
>> 
>> ========== README.darjeeling ===============================
>> 
>> Edvina AB
>> Olle E. Johansson
>> 
>> 
>> Project started: 2012-06-15
>> 
>> 
>> 
>> 
>> 
>> Darjeeling-prack-1.8
>> --------------------
>> 
>> This branch will implement PRACK in the SIP stack of Asterisk.
>> 
>> PRACK stands for reliable unreliable provisional responses.
>> 
>> In SIP, the provisional responses are often sent over UDP, which means that they can
>> get lost. Some of them are retransmitted every minute (to get at least one through
>> once during a three minute period following RFC 3261). For some messages, it's 
>> important that they get through immediately. Like if you want to play a message to
>> the customer that his call will be cancelled due to lack of funds in his account.
>> 
>> PRACK adds a retransmit and ACK mechanism to the 1xx messages excluding 100 (since
>> it's transmitted hop-by-hop).
>> 
>> Configuration
>> =============
>> Add prack=yes in the [general] section of sip.conf or in device configurations. 
>> Asterisk will now add 100rel to the list of supported options. If the other device
>> supports PRACK Asterisk will activate it or support it if the other side
>> requires it.
>> There's currently no support for requiring PRACK in a call.
>> 
>> 
>> Technichal details
>> ==================
>> 
>> If the INVITE contains
>> 	Supported: 100rel
>> 
>> then the 1xx answer can add 
>> 	Require: 100rel
>> 	Rseq: 	42
>> 
>> The Rseq is the PRACK sequence number
>> The caller then needs to confirm the message with a new request, during the INVITE transaction
>> 	PRACK
>> 	RAck: 	42	<cseq #> <cseq method>
>> 
>> And the callee confirms this (and close the PRACK transaction) with a 200 OK.
>> 
>> If the PRACK is not received in time, the 1xx response will be retransmitted.
>> There can only be ONE outstanding PRACK, which makes it easier to integrate in the
>> Asterisk SIP stack that unfortunately lacks a transaction layer.
>> 
>> PRACK is documented in RFC 3262.
>> 
>> Retransmission works like the retransmission of responses to INVITE (like the 200 OK).
>> It starts with T1 and doubles for each retransmission. Unlike INVITE responses,
>> the retransmission timer does not cap at T2.
>> 
>> If retransmission times out, a 5xx message should terminate the INVITE transaction.
>> 
>> 
>> A PRACK received that does not match existing SIP_PVT is responded to with 481.
>> 
>> * When to stop?
>> ---------------
>>> From the RFC: 
>> "The UAS MAY send a final response to the initial request before having received PRACKs for all unacknowledged
>> reliable provisional responses, unless the final response is 2xx and any of the unacknowledged
>> reliable provisional responses contained a session description. In that case, it MUST NOT send a final response
>> until those provisional responses are acknowledged. If the UAS does send a final response when
>> reliable responses are still unacknowledged, it SHOULD NOT continue to retransmit the unacknowledged
>> reliable provisional responses, but it MUST be prepared to process PRACK requests for those outstanding
>> responses. A UAS MUST NOT send new reliable provisional responses (as opposed to retransmissions of
>> unacknowledged ones) after sending a final response to a request"
>> 
>> * Receive in order until final response
>> ---------------------------------------
>> "Handling of subsequent reliable provisional responses for the same initial request follows the same rules
>> as above, with the following difference: reliable provisional responses are guaranteed to be in order. As a
>> result, if the UAC receives another reliable provisional response to the same request, and its RSeq value
>> is not one higher than the value of the sequence number, that response MUST NOT be acknowledged with a
>> PRACK, and MUST NOT be processed further by the UAC. An implementation MAY discard the response,
>> or MAY cache the response in the hopes of receiving the missing responses.
>> The UAC MAY acknowledge reliable provisional responses received after the final response or MAY discard
>> them."
>> 
>> * When do the call begin?
>> -------------------------
>> A corner case that I don't know if it's implemented: If we receive and INVITE without SDP, we MUST
>> add SDP offer to the reliable answer and the caller must add an SDP answer to the PRACK. This means 
>> that the session begins in the middle of the INVITE transaction.
>> "Once an answer has been sent or received, the UA SHOULD establish the session based on the parameters of
>> the offer and answer, even if the original INVITE itself has not been responded to." (section 5)
>> 
>> * Security
>> ----------
>> "The PRACK request can be injected by attackers to force retransmissions of reliable provisional responses to
>> cease. As these responses can convey important information, PRACK messages SHOULD be authenticated
>> as any other request." (section 9)
>> 
>> Todo
>> ----
>> * Add PRACK to the list of supported headers
>> 	- done
>> * Should we be able to REQUIRE prack? Based on what? _SIPREQUIREPRACK ?
>> 	- not now
>> * PRACK enabled globally and per device - user and peer
>> 	- done
>> * PRACK working when Asterisk is the UAS
>> 	- done
>> * PRACK working when Asterisk is the UAC
>> 	- done
>> * PRACK with authentication
>> 	- not done
>> * Requesting auth for PRACK
>> 	- not done
>> * PRACK in "sip show settings"
>> 	- done
>> * PRACK in "sip show peer xxx"
>> 	- done
>> * PRACK in "sip show channel xxx"
>> 	- done
>> 
>> ---------------------
>> The patch is (C) Copyright by Edvina AB, Sollentuna, Sweden. 
>> Developed by Olle E. Johansson, oej at edvina.net
>> --
>> _____________________________________________________________________
>> -- Bandwidth and Colocation Provided by http://www.api-digital.com --
>> 
>> asterisk-dev mailing list
>> To UNSUBSCRIBE or update options visit:
>>   http://lists.digium.com/mailman/listinfo/asterisk-dev
> 
> --
> _____________________________________________________________________
> -- Bandwidth and Colocation Provided by http://www.api-digital.com --
> 
> asterisk-dev mailing list
> To UNSUBSCRIBE or update options visit:
>   http://lists.digium.com/mailman/listinfo/asterisk-dev

---
* Olle E Johansson - oej at edvina.net
* Cell phone +46 70 593 68 51, Office +46 8 96 40 20, Sweden






More information about the asterisk-dev mailing list