<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.3//EN" "document-v13.dtd">
<document xmlns:xi="http://www.w3.org/2001/XInclude"> 
  <header> 
    <title>SIPp</title>
    <subtitle>SIPp reference documentation</subtitle>
    <authors>
        <person name="Richard GAYRAUD [initial code]" email="richard_gayraud@users.sourceforge.net"/>
        <person name="Olivier JACQUES [code/documentation]" email="ojacques@users.sourceforge.net"/>
        <person name="Robert Day [code/documentation]" email="rkd@rkd.me.uk"/>
        <person name="Charles P. Wright [code]" email="charlespwright@users.sourceforge.net"/>
        <person name="Many contributors [code]" email="none@email.com"/>
    </authors>
  </header> 
  <body> 
    <section>
      <title>Foreword</title>
      <warning>This version of the documentation is for SIPp 3.3 branch and describes some features not present in earlier versions. See the sidebar to access documentation for previous versions.</warning>        
      <p>SIPp is a performance testing tool for the SIP protocol. It includes a
      few basic SipStone user agent scenarios (UAC and UAS) and establishes and
      releases multiple calls with the INVITE and BYE methods. It can also reads
      XML scenario files describing any performance testing configuration. It
      features the dynamic display of statistics about running tests (call rate,
      round trip delay, and message statistics), periodic CSV statistics dumps,
      TCP and UDP over multiple sockets or multiplexed with retransmission
      management, regular expressions and variables in scenario files, and
      dynamically adjustable call rates.</p>
      <p>SIPp can be used to test many real SIP equipements like SIP proxies,
      B2BUAs, SIP media servers, SIP/x gateways, SIP PBX, ... It is also very
      useful to emulate thousands of user agents calling your SIP system. </p>
      <p><strong>Want to see it?</strong></p>
      <p>Here is a screenshot</p>
      <p><img src="images/sipp-01.jpg" alt="SIPp screenshot"/></p>
      <p>And here is a video (Windows Media Player 9 codec or above required) of
      SIPp in action:</p>
      <p><icon src="images/wmv.gif" alt="wmv"/><link href="images/sipp-01.wmv">sipp-01.wmv</link></p>
    </section>
    <section><title>Installation</title>
        <section>
          <title>Getting SIPp</title>
           <p>SIPp is released under the
           <link href="http://www.gnu.org/copyleft/gpl.html">GNU GPL license</link>.
           All the terms of the license apply. It was originally created and provided to the SIP
           community by <link href="http://www.hp.com">Hewlett-Packard</link>
           engineers in hope it can be useful, but <strong>HP does not
           provide any support nor warranty concerning SIPp.</strong></p>
            </section>
        <section><title>Stable release</title>
            <p>Like many other "open source" projects, there are two versions of
            SIPp: a stable and unstable release. Stable release: before being
            labelled as "stable", a SIPp release is thoroughly tested. So you
            can be confident that all mentioned features will work :) </p>
            <note>Use the stable release for your everyday use and if you are
            not blocked by a specific feature present in the "unstable release"
            (see below).</note> <p><link href="http://sourceforge.net/project/showfiles.php?group_id=104305">SIPp
            stable download page</link></p>
            </section>
        <section><title>Unstable release</title>
            <p>Unstable release: all new features and bug fixes are checked in
            <link href="http://sipp.svn.sourceforge.net/viewvc/sipp/sipp/trunk/">SIPp's
            SVN</link> repository as soon as they are available.</p>
            <note> Use the unstable release if you absolutely need a bug fix or
            a feature that is not in the stable release. </note>
        </section>
        <section><title>Available platforms</title>
            <p>SIPp is available on almost all UNIX platforms: HPUX, Tru64,
            Linux (RedHat, Debian, FreeBSD), Solaris/SunOS.</p>
            <p>A Windows port has been contributed. You can now compile SIPp under
            Cygwin.</p>
            <note>SIPp works only on Windows XP and later versions and will not
            work on Win2000. This is because of IPv6 support.</note>
            </section> 
        <anchor id="installing"/><section><title>Installing SIPp</title>
          <ul>
          <li>On Linux, SIPp is provided in the form of source code. You will need to
            compile SIPp to actually use it.</li>
        <li>Pre-requisites to compile SIPp are <!--(see <a href="http://sipp.sourceforge.net/wiki/index.php/Compilation" >Compilation tips</a>)-->:
            <ul>
              <li>C++ Compiler</li>
              <li>curses or ncurses library</li>
              <li>For TLS support: OpenSSL &gt;= 0.9.8</li>
              <li>For pcap play support: libpcap and libnet</li>
              <li>For SCTP support: lksctp-tools</li>
              <li>For distributed pauses: <link href="http://www.gnu.org/software/gsl/">Gnu Scientific Libraries</link></li>
            </ul>
          </li>
          <li>You have four options to compile SIPp:
            <ul>
              <li><strong>Without TLS (Transport Layer Security), SCTP or PCAP support</strong>:
              This is the recommended setup if you don't need to handle SCTP, TLS or PCAP. In this case, there are <strong>no dependencies to install</strong> before building SIPp. It is straightforward:
<source xml:space="preserve"><![CDATA[# tar -xvzf sipp-xxx.tar
# cd sipp
# autoreconf -ivf
# ./configure
# make
]]></source></li>
              <li><strong>With TLS support</strong>, you must have
              installed <link href="http://www.openssl.org/">OpenSSL library</link> (&gt;=0.9.8) 
              (which may come with your system). Building SIPp consists only in adding
              the "--with-openssl" option to the configure command:
<source xml:space="preserve"><![CDATA[# tar -xvzf sipp-xxx.tar.gz
# cd sipp
# autoreconf -ivf
# ./configure --with-openssl
# make
]]></source></li>
              <li><strong>With <link href="#pcapplay">PCAP play</link> support</strong>:
 <source xml:space="preserve"><![CDATA[# tar -xvzf sipp-xxx.tar.gz
# cd sipp
# autoreconf -ivf
# ./configure --with-pcap
# make
]]></source></li>
               <li><strong>With <link href="#sctp">SCTP</link> support</strong>:
 <source xml:space="preserve"><![CDATA[# tar -xvzf sipp-xxx.tar.gz
# cd sipp
# autoreconf -ivf
# ./configure --with-sctp
# make
]]></source></li>                
               <li><strong>You can also combine these various options, e.g.:</strong>:
 <source xml:space="preserve"><![CDATA[# tar -xvzf sipp-xxx.tar.gz
# cd sipp
# autoreconf -ivf
# ./configure --with-sctp --with-pcap --with-openssl
# make
]]></source></li>           
            </ul>
            <anchor id="gsl"/><note>To enable <link href="http://www.gnu.org/software/gsl/">GSL</link> at compile time, 
            you must install GSL and its include files, as well as un-comment 
            the lines in the local.mk file of SIPp distribution. Then, re-compile SIPp.</note>
          </li>
          <li>
          <warning>SIPp compiles under CYGWIN on Windows, provided that you installed IPv6
          extension for CYGWIN (<link href="http://win6.jp/Cygwin/">http://win6.jp/Cygwin/</link>),
          as well as libncurses and (optionally OpenSSL and WinPcap). SCTP is not currently supported.</warning></li>
          <li>To compile SIPp on Windows with pcap (media support), you must:
          <ul>
            <li>Copy the <link href="http://www.winpcap.org/devel.htm">WinPcap developer package</link> to "C:\cygwin\lib\WpdPack"</li>
            <li>Remove or rename "pthread.h" in "C:\cygwin\lib\WpdPack\Include", as it interfers with pthread.h from cygwin</li>
            <li>Compile according to the instructions above.</li>
          </ul>
          </li>
          </ul>
        </section>     
        <anchor id="filedesc"/><section><title>Increasing File Descriptors Limit</title>
        <p>If your system does not supports enough file descriptors, 
        you may experience problems when using the TCP/TLS mode with many simultaneous calls.</p>
        <p>You have two ways to overcome this limit: either use the <link href="#maxsocket"><code>-max_socket</code></link>
        command line option or change the limits of your system.</p> 
        <p>Depending on the operating system you use, different procedures 
        allow you to increase the maximum number of file descriptors:</p>
        <ul>
            <li><p>On Linux 2.4 kernels the default number of file descriptors can 
            be increased by modifying the <code>/etc/security/limits.conf</code> 
            and the <code>/etc/pam.d/login</code> file. </p>
            <p>Open the <code>/etc/security/limits.conf</code> file and add the following lines:</p>
<source xml:space="preserve"><![CDATA[soft nofile 1024
hard nofile 65535]]></source>
            <p>Open the <code>/etc/pam.d/login</code> and add the following line</p>
<source xml:space="preserve"><![CDATA[session required /lib/security/pam_limits.so]]></source>
            <p>The system file descriptor limit is set in the <code>/proc/sys/fs/file-max</code> file. 
            The following command will increase the file descriptor limit:</p>
<source xml:space="preserve"><![CDATA[echo 65535> /proc/sys/fs/file-max]]></source>
            <p>To increase the number of file descriptors to its maximum limit 
            (65535) set in the <code>/etc/security/limits.conf</code> file, type:</p>
<source xml:space="preserve"><![CDATA[ulimit -n unlimited]]></source>
            <p>Logout then login again to make the changes effective.</p>
            </li>
            <li><p>On HP-UX systems the default number of file descriptors 
            can be increased by modifying the system configuration with the sam utility. 
            In the Kernel Configuration menu, select Configurable parameters, 
            and change the following attributes:</p> 
<source xml:space="preserve"><![CDATA[maxfiles : 4096
maxfiles_lim : 4096
nfiles : 4096
ninode : 4096
max_thread_proc : 4096
nkthread : 4096]]></source>
            </li>
          </ul>
        </section>
    </section>
   <section><title>Using SIPp</title>
        <section>
          <title>Main features</title>
            <p>SIPp allows to generate one or many SIP calls to one remote
            system. The tool is started from the command line. In this example,
            two SIPp are started in front of each other to demonstrate SIPp
            capabilities.</p>
            <p>Run sipp with embedded server (uas) scenario:</p>
            <source xml:space="preserve"><![CDATA[# ./sipp -sn uas]]></source>
            <p>On the same host, run sipp with embedded client (uac) scenario</p>
            <source xml:space="preserve"><![CDATA[# ./sipp -sn uac 127.0.0.1]]></source>
        </section>     
        <section>
          <title>Integrated scenarios</title>
            <p>Integrated scenarios? Yes, there are scenarios that are embedded
            in SIPp executable. While you can create your own custom SIP
            scenarios (see <link href="#xmlsyntax">how to create your own XML
            scenarios</link>), a few basic (yet useful) scenarios are available
            in SIPp executable.</p>
            <section>
              <title>UAC</title>
                <p>Scenario file: <link href="uac.xml.html">uac.xml</link> (<link href="uac.xml">original XML file</link>)</p>
                <source xml:space="preserve"><![CDATA[SIPp UAC            Remote
    |(1) INVITE         |
    |------------------>|
    |(2) 100 (optional) |
    |<------------------|
    |(3) 180 (optional) |
    |<------------------|
    |(4) 200            |
    |<------------------|
    |(5) ACK            |
    |------------------>|
    |                   |
    |(6) PAUSE          |
    |                   |
    |(7) BYE            |
    |------------------>|
    |(8) 200            |
    |<------------------|
]]></source>
            </section>
            <anchor id="uac_with_media"/><section>
              <title>UAC with media</title>
                <p>Scenario file: <link href="uac_pcap.xml.html">uac_pcap.xml</link> (<link href="uac_pcap.xml">original XML file</link>)</p>
                <source xml:space="preserve"><![CDATA[SIPp UAC            Remote
    |(1) INVITE         |
    |------------------>|
    |(2) 100 (optional) |
    |<------------------|
    |(3) 180 (optional) |
    |<------------------|
    |(4) 200            |
    |<------------------|
    |(5) ACK            |
    |------------------>|
    |                   |
    |(6) RTP send (8s)  |
    |==================>|
    |                   |
    |(7) RFC2833 DIGIT 1|
    |==================>|
    |                   |
    |(8) BYE            |
    |------------------>|
    |(9) 200            |
    |<------------------|
]]></source>
            </section>
            <section>
              <title>UAS</title>
                <p>Scenario file: <link href="uas.xml.html">uas.xml</link> (<link href="uas.xml">original XML file</link>)</p>
                <source xml:space="preserve"><![CDATA[Remote              SIPp UAS
    |(1) INVITE         |
    |------------------>|
    |(2) 180            |
    |<------------------|
    |(3) 200            |
    |<------------------|
    |(4) ACK            |
    |------------------>|
    |                   |
    |(5) PAUSE          |
    |                   |
    |(6) BYE            |
    |------------------>|
    |(7) 200            |
    |<------------------|
]]></source>
            </section>
            <section>
              <title>regexp</title>
                <p>Scenario file: <link href="regexp.xml.html">regexp.xml</link> (<link href="regexp.xml">original XML file</link>)</p>
                <p>This scenario, which behaves as an UAC is explained in greater details in <link href="#action_regexp">this section</link>.</p>
                <source xml:space="preserve"><![CDATA[SIPp regexp         Remote
    |(1) INVITE         |
    |------------------>|
    |(2) 100 (optional) |
    |<------------------|
    |(3) 180 (optional) |
    |<------------------|
    |(4) 200            |
    |<------------------|
    |(5) ACK            |
    |------------------>|
    |                   |
    |(6) PAUSE          |
    |                   |
    |(7) BYE            |
    |------------------>|
    |(8) 200            |
    |<------------------|
]]></source>
            </section>
            <anchor id="scenario_branch"/><section>
              <title>branch</title>
                <p>Scenario files: <link href="branchc.xml.html">branchc.xml</link> (<link href="branchc.xml">original XML file</link>) and
                <link href="branchs.xml.html">branchs.xml</link> (<link href="branchs.xml">original XML file</link>)</p>
                <p>Those scenarios, which work against each other (branchc for client side and 
                branchs for server side) are explained in greater details in <link href="#branching">this section</link>.</p>
                <source xml:space="preserve"><![CDATA[    REGISTER ---------->
         200 <----------
         200 <----------
      INVITE ---------->
         100 <----------
         180 <----------
         403 <----------
         200 <----------
         ACK ---------->
             [  5000 ms]
         BYE ---------->
         200 <----------]]></source>
            </section>
	    <anchor id="scenario_ooc"/><section>
              <title>UAC Out-of-call Messages</title>
                <p>Scenario file: <link href="ooc_default.xml.html">ooc_default.xml</link> (<link href="ooc_default.xml">original XML file</link>)</p>
		<p>When a SIPp UAC receives an out-of-call request, it instantiates an out-of-call scenario.  By default this scenario simply replies with a 200 OK response.  This scenario can be overridden by passing the <code>-oocsf</code> or <code>-oocsn</code> command line options.</p>
                <source xml:space="preserve"><![CDATA[SIPp UAC            Remote
    |(1) .*             |
    |<------------------|
    |(2) 200            |
    |------------------>|
]]></source>
            </section>
            <anchor id="ThreePCC"/><section>
              <title>3PCC</title>
                <p>3PCC stands for 3rd Party Call Control. 3PCC is described in 
                <link href="http://www.ietf.org/rfc/rfc3725.txt">RFC 3725</link>.
                While this feature was first developped to allow 3PCC like scenarios, 
                it can also be used for every case where you would need one SIPp to talk
                to several remotes.</p>
                <p>In order to keep SIPp simple (remember, it's a test tool!),
                one SIPp instance can only talk to one remote. Which is an issue
                in 3PCC call flows, like call flow I (SIPp beeing a controller):</p>
                <source xml:space="preserve"><![CDATA[             A              Controller               B
             |(1) INVITE no SDP  |                   |
             |<------------------|                   |
             |(2) 200 offer1     |                   |
             |------------------>|                   |
             |                   |(3) INVITE offer1  |
             |                   |------------------>|
             |                   |(4) 200 OK answer1 |
             |                   |<------------------|
             |                   |(5) ACK            |
             |                   |------------------>|
             |(6) ACK answer1    |                   |
             |<------------------|                   |
             |(7) RTP            |                   |
             |.......................................|
]]></source>
                <p>Scenario file: <link href="3pcc-A.xml.html">3pcc-A.xml</link> (<link href="3pcc-A.xml">original XML file</link>)</p>
                <p>Scenario file: <link href="3pcc-B.xml.html">3pcc-B.xml</link> (<link href="3pcc-B.xml">original XML file</link>)</p>
                <p>Scenario file: <link href="3pcc-C-A.xml.html">3pcc-C-A.xml</link> (<link href="3pcc-C-A.xml">original XML file</link>)</p>
                <p>Scenario file: <link href="3pcc-C-B.xml.html">3pcc-C-B.xml</link> (<link href="3pcc-C-B.xml">original XML file</link>)</p>
                <p>The 3PCC feature in SIPp allows to have two SIPp instances
                launched and synchronised together. If we take the example of 
                call flow I, one SIPp instance will take care of the dialog with
                remote A (this instance is called 3PCC-C-A for 3PCC-Controller-A-Side) 
                and another SIPp instance will take care of the dialog with remote B 
                (this instance is called 3PCC-C-B for 3PCC-Controller-B-Side).</p>
                <p>The 3PCC call flow I will, in reality, look like this
                (Controller has been divided in two SIPp instances):</p>
                <source xml:space="preserve"><![CDATA[
             A             Controller A         Controller B            B
             |(1) INVITE no SDP  |                  |                   |
             |<------------------|                  |                   |
             |(2) 200 offer1     |                  |                   |
             |------------------>|                  |                   |
             |                sendCmd  (offer1)     |                   |
             |                   |----------------->|                   |
             |                   |               recvCmd                |
             |                   |                  |(3) INVITE offer1  |
             |                   |                  |------------------>|
             |                   |                  |(4) 200 OK answer1 |
             |                   |                  |<------------------|
             |                   |               sendCmd                |
             |                   |     (answer1)    |                   |
             |                   |<-----------------|                   |
             |                 recvCmd              |(5) ACK            |
             |                   |                  |------------------>|
             |(6) ACK answer1    |                  |                   |
             |<------------------|                  |                   |
             |(7) RTP            |                  |                   |
             |..........................................................|
]]></source>
                <p>As you can see, we need to pass information
                between both sides of the controller. SDP "offer1" is provided
                by A in message (2) and needs to be sent to B side in message (3). 
                This mechanism is implemented 
                in the scenarios through the &lt;<link href="#sendCmd">sendCmd</link>&gt; command. This:</p>
<source xml:space="preserve"><![CDATA[<sendCmd>
  <![CDATA[
    Call-ID: [call_id]
    [$1]

   ]]]]><![CDATA[>
</sendCmd>
]]></source>
                <p>Will send a "command" to the twin SIPp instance. Note that including
                the Call-ID is mandatory in order to correlate the commands to
                actual calls. In the same manner, this:</p>
<source xml:space="preserve"><![CDATA[<recvCmd>
  <action
     <ereg regexp="Content-Type:.*"
           search_in="msg"
           assign_to="2"/>
  </action>
</recvCmd>
]]></source>
                <p>Will receive a "command" from the twin SIPp instance. 
                Using the <link href="#action_regexp">regular expression</link> mechanism, 
                the content is retrieved
                and stored in a call variable ($2 in this case), ready to be
                reinjected</p>
<source xml:space="preserve"><![CDATA[  <send>
    <![CDATA[

      ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port]
      From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
      To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
      Call-ID: [call_id]
      CSeq: 1 ACK
      Contact: sip:sipp@[local_ip]:[local_port]
      Max-Forwards: 70
      Subject: Performance Test
      [$2]

    ]]]]><![CDATA[>
  </send>
]]></source>                
                <p>In other words, <link href="#sendCmd">sendCmd</link> and <link href="#recvCmd">recvCmd</link> can be seen as synchronization points
                between two SIPp instances, with the ability to pass parameters
                between each other.</p>
                <p>Another scenario that has been reported to be do-able with the
                3PCC feature is the following:</p>
                <ul>
                  <li>A calls B. B answers. B and A converse</li>
                  <li>B calls C. C answers. C and B converse</li>
                  <li>B "REFER"s A to C and asks to replace A-B call with B-C call.</li>
                  <li>A accepts. A and C talk. B drops out of the calls.</li>
                </ul>
            </section>
        </section>
        <anchor id="ThreePCCExtended"/><section>
              <title>3PCC Extended</title>
              <p>An extension of the 3pcc mode is implemented in sipp.
               This feature allows n twin sipp instances to communicate each other,
               each one of them being connected to a remote host.</p>
               <p>The sipp instance which initiates the call is launched in "master" mode. 
               The others are launched in "slave" mode. Twin sipp instances have names,
               given in the command line (for example, s1, s2...sn for the slaves and m for the master) 
               Correspondances between instances names and their addresses must be stored in a file (provided by -slave_cfg command line
	       argument), in the following format:</p> 
<source xml:space="preserve"><![CDATA[
  s1;127.0.0.1:8080
  s2;127.0.0.1:7080
  m;127.0.0.1:6080
]]></source> 
               <p>Each twin sipp instance must access a different copy of this file.</p>
               <p><link href="#sendCmd">sendCmd</link> and <link href="#recvCmd">recvCmd</link> have additional attributes:</p>
<source xml:space="preserve"><![CDATA[<sendCmd dest="s1">
  <![CDATA[
    Call-ID: [call_id]
    From: m
    [$1]

   ]]]]><![CDATA[>
</sendCmd>
]]></source>
                 <p>Will send a command to the "s1" peer instance, which can be either master or slave,
                    depending on the command line argument, which must be consistent with the scenario:
                    a slave instance cannot have a sendCmd action before having any recvCmd.
                    Note that the message must contain a "From" field, filled with the name of the sender. </p>
<source xml:space="preserve"><![CDATA[<recvCmd src="m">
  <action
     <ereg regexp="Content-Type:.*"
           search_in="msg"
           assign_to="2"/>
  </action>
</recvCmd>
]]></source>
                <p>Indicates that the twin command is expected to be received from the "m" peer instance.</p>
                <p>Note that the master must be the launched at last.</p>
                <p>There is no integrated scenarios for the 3pcc extended mode, but you can easily adapt those from 3pcc.</p>
		<p><b>Example:</b> the following drawing illustrate the entire procedure. The arrows that are
		shown between SIPp master and slaves depict only the synchronization commands exchanged between
		the different SIPp instances. The SIP message exchange takes place as usual.<br/><br/>
		<img alt="Master / slave feature" src="images/master_slave.png"/>
		</p>
                </section>
	<anchor id="commands"/><section><title>Controlling SIPp</title>

	<p>SIPp can be controlled interactively through the keyboard or via a
	UDP socket.  SIPp supports both 'hot' keys that can be entered at any time
	and also a simple command mode.  The hot keys are:</p>
	<table>
	<tr><th colspan="1" rowspan="1">Key</th><th colspan="1" rowspan="1">Action</th></tr>
	<tr><td colspan="1" rowspan="1">+</td><td colspan="1" rowspan="1">Increase the call rate by 1 * rate_scale</td></tr>
	<tr><td colspan="1" rowspan="1">*</td><td colspan="1" rowspan="1">Increase the call rate by 10 * rate_scale</td></tr>
	<tr><td colspan="1" rowspan="1">-</td><td colspan="1" rowspan="1">Decrease the call rate by 1 * rate_scale</td></tr>
	<tr><td colspan="1" rowspan="1">/</td><td colspan="1" rowspan="1">Decrease the call rate by 10 * rate_scale</td></tr>
	<tr><td colspan="1" rowspan="1">c</td><td colspan="1" rowspan="1">Enter command mode</td></tr>
	<tr><td colspan="1" rowspan="1">q</td><td colspan="1" rowspan="1">Quit SIPp (after all calls complete, enter a second time to quit immediately)</td></tr>
	<tr><td colspan="1" rowspan="1">Q</td><td colspan="1" rowspan="1">Quit SIPp immediately</td></tr>
	<tr><td colspan="1" rowspan="1">s</td><td colspan="1" rowspan="1">Dump screens to the log file (if -trace_screen is passed)</td></tr>
	<tr><td colspan="1" rowspan="1">p</td><td colspan="1" rowspan="1">Pause traffic</td></tr>
	<tr><td colspan="1" rowspan="1">1</td><td colspan="1" rowspan="1">Display the scenario screen</td></tr>
	<tr><td colspan="1" rowspan="1">2</td><td colspan="1" rowspan="1">Display the statistics screen</td></tr>
	<tr><td colspan="1" rowspan="1">3</td><td colspan="1" rowspan="1">Display the repartition screen</td></tr>
	<tr><td colspan="1" rowspan="1">4</td><td colspan="1" rowspan="1">Display the variable screen</td></tr>
	<tr><td colspan="1" rowspan="1">5</td><td colspan="1" rowspan="1">Display the TDM screen</td></tr>
	<tr><td colspan="1" rowspan="1">6-9</td><td colspan="1" rowspan="1">Display the second through fifth repartition screen.</td></tr>
	</table>

	<p>In command mode, you can type a single line command that instructs
	SIPp to take some action.  Command mode is more versatile than the hot keys,
	but takes more time to input some common actions.  The following commands
	are available:</p>
	<table>
	<caption>List of Interactive Commands</caption>
	<tr><th colspan="1" rowspan="1">Command</th><th colspan="1" rowspan="1">Description</th><th colspan="1" rowspan="1">Example</th></tr>
	<tr><td colspan="1" rowspan="1">dump tasks</td><td colspan="1" rowspan="1">Prints a list of active tasks (most tasks are calls) to the error log.</td><td colspan="1" rowspan="1"><code>dump tasks</code></td></tr>
	<tr><td colspan="1" rowspan="1">set rate X</td><td colspan="1" rowspan="1">Sets the call rate.</td><td colspan="1" rowspan="1"><code>set rate 10</code></td></tr>
	<tr><td colspan="1" rowspan="1">set rate-scale X</td><td colspan="1" rowspan="1">Sets the rate scale, which adjusts the speed of '+', '-', '*', and '/'.</td><td colspan="1" rowspan="1"><code>set rate-scale 10</code></td></tr>
	<tr><td colspan="1" rowspan="1">set users X</td><td colspan="1" rowspan="1">Sets the number of users (only valid when <code>-users</code> is specified).</td><td colspan="1" rowspan="1"><code>set rate 10</code></td></tr>
	<tr><td colspan="1" rowspan="1">set limit X</td><td colspan="1" rowspan="1">Sets the open call limit (equivalent to <code>-l</code> option)</td><td colspan="1" rowspan="1"><code>set limit 100</code></td></tr>
	<tr><td colspan="1" rowspan="1">set hide &lt;true|false&gt;</td><td colspan="1" rowspan="1">Should the hide XML attribute be respected?</td><td colspan="1" rowspan="1"><code>set hide false</code></td></tr>
	<tr><td colspan="1" rowspan="1">set index &lt;true|false&gt;</td><td colspan="1" rowspan="1">Display message indexes in the scenario screen.</td><td colspan="1" rowspan="1"><code>set index true</code></td></tr>
	<tr><td colspan="1" rowspan="1">set display &lt;main|ooc&gt;</td><td colspan="1" rowspan="1">Changes the scenario that is displayed to either the main or the out-of-call scenario.</td><td colspan="1" rowspan="1"><code>set display main</code><br/><code>set display ooc</code></td></tr>
	<tr><td colspan="1" rowspan="1">trace &lt;log&gt; &lt;on|off&gt;</td><td colspan="1" rowspan="1">Turns <emph>log</emph> on or off at run time.  Valid values for log are "error", "logs", "messages", and "shortmessages".</td><td colspan="1" rowspan="1"><code>trace error on</code></td></tr>
	</table>

        <anchor id="traffic_control"/><section><title>Traffic control</title>
        <p>SIPp generates SIP traffic according to the scenario specified. You
	can control the number of calls (scenario) that are started per second.
	If you pass the <code>-users</code> option, then you need to control
	the number of instantiated users.  You can control the rate through:</p>
	<ul>
	<li>Interactive hot keys (described in the previous section)</li>
	<li>Interactive Commands</li>
	<li>Startup Parameters</li>
	</ul>

	<p>There are two
	commands that control rates: <code>set rate X</code> sets the current
	call rate to X.  Additionally, <code>set rate-scale X</code> sets the
	rate_scale parameter to X.  This enables you to use the '+', '-', '*',
	and '/' keys to set the rate more quickly.  For example, if you do
	<code>set rate-scale 100</code>, then each time you press '+', the call
	rate is increased by 100 calls and each time you press '*', the call
	rate is increased by 1000 calls.  Similarly, for a user based benchmark
	you can run <code>set users X</code>.</p>

	<p>At starting time, you can control the rate by specifying parameters
        on the command line: <ul>
	<li>"-r" to specify the call rate in number of calls per seconds</li>
	<li>"-rp" to specify the "<strong>r</strong>ate <strong>p</strong>eriod" 
	in milliseconds for the call rate (default is 1000ms/1sec). 
	This allows you to have n calls every m milliseconds (by using <code>-r n -rp m</code>).
	<note>Example: run SIPp at 7 calls every 2 seconds (3.5 calls per second)</note>
	<source xml:space="preserve"><![CDATA[./sipp -sn uac -r 7 -rp 2000 127.0.0.1]]></source>
	</li>
	</ul>
        </p>

        <p>You can also <strong>pause</strong> the traffic by pressing the 'p' key. 
        SIPp will stop placing new calls and wait until all current calls go to their end. 
        You can <strong>resume</strong> the traffic by pressing 'p' again.</p>
        <p>To <strong>quit</strong> SIPp, press the 'q' key. 
        SIPp will stop placing new calls and wait until all current calls go to their end.
        SIPp will then exit.</p>
        <p>You can also force SIPp to <strong>quit</strong> immediatly by pressing the 'Q' key. 
        Current calls will be terminated by sending a BYE or CANCEL message (depending if the calls have been established or not).
        The same behaviour is obtained by pressing 'q' twice.</p>
        <note><strong>TIP:</strong> you can place a defined number of calls and
        have SIPp exit when this is done. Use the <code>-m</code> option on the
        command line.</note>
        </section>
        <anchor id="remote_control"/><section><title>Remote control</title>
          <p>SIPp can be "remote-controlled" through a UDP socket. This allows for example</p>
          <ul>
            <li>To automate a series of actions, like increasing the call rate smoothly, 
            wait for 10 seconds, increase more, wait for 1 minute and loop</li>
            <li>Have a feedback loop so that an application under test can
            remote control SIPp to lower the load, pause the traffic, ...</li>
          </ul>
          <p>Each SIPp instance is listening to a UDP socket. It 
          starts to listen to port 8888 and each following SIPp instance (up to 60)
          will listen to base_port + 1 (8889, 8890, ...).</p>
          <p>It is then possible to control SIPp like this:</p>
          <source xml:space="preserve"><![CDATA[echo p >/dev/udp/x.y.z.t/8888 -> put SIPp in pause state (p key)
echo q >/dev/udp/x.y.z.t/8888 -> quit SIPp (q key)]]></source>
          <note>All keys available through keyboard are also available in 
          the remote control interface</note>
          <p>You could also have a small shell script to automate a serie of action. 
          For example, this script will 
          increase the call rate by 10 more new calls/s every 5 seconds, wait at this call rate
          for one minute and exit SIPp:</p>
          <source xml:space="preserve"><![CDATA[#!/bin/sh
echo "*" >/dev/udp/127.0.0.1/8889
sleep 5
echo "*" >/dev/udp/127.0.0.1/8889
sleep 5
echo "*" >/dev/udp/127.0.0.1/8889
sleep 5
echo "*" >/dev/udp/127.0.0.1/8889
sleep 60
echo "q" >/dev/udp/127.0.0.1/8889
]]></source>
	<p>To send a command to SIPp, preface it with 'c'.  For example: <code>echo "cset rate 100" &gt;/dev/udp/127.0.0.1/8888</code> sets the call rate to 100.</p>
        </section>
	</section>
        <section><title>Running SIPp in background</title>
          <p>SIPp can be launched in background mode (<code>-bg</code> command
          line option).</p>
          <p>By doing so, SIPp will be detached from the current terminal and run
          in the background. The PID of the SIPp process is provided. If you didn't specify a number of calls to execute
          with the <code>-m</code> option, SIPp will run forever.</p>
          <p>There is a mechanism implemented to stop SIPp smoothly. The command
          <code>kill -SIGUSR1 [SIPp_PID]</code> will instruct SIPp to stop placing
          any new calls and finish all ongoing calls before exiting.</p>
          <p>When using the background mode, the main sipp instance stops and a child process will continue the job. Therefore,
           the log files names will contain another PID than the actual sipp instance PID. </p>
        </section>
        <anchor id="xmlsyntax"/><section><title>Create your own XML scenarios</title>
            <p>Of course embedded scenarios will not be enough. So it's time to
            create your own scenarios. A SIPp scenario is written in XML
            (a DTD that may help you write SIPp
            scenarios does exist and has been tested with jEdit - this is described in a later section).
            A scenario will always start with:</p>
            <source xml:space="preserve"><![CDATA[<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="Basic Sipstone UAC">
]]></source>
            <p>And end with:</p>
<source xml:space="preserve"><![CDATA[</scenario>]]></source>
            <p>Easy, huh? Ok, now let's see what can be put inside. You are not
            obliged to read the whole table now! Just go in the next section for
            an example.</p>
	    <p>There are many common attributes used for flow control and
	    statistics, that can be used for all of the message commands (i.e.,
	    <strong>&lt;send&gt;</strong>, <strong>&lt;recv&gt;</strong>,
	    <strong>&lt;nop&gt;</strong>, <strong>&lt;pause&gt;</strong>,
	    <strong>&lt;sendCmd&gt;</strong>, and <strong>&lt;recvCmd&gt;</strong>).</p>

            <table>
                <caption>List of attributes common to all commands</caption>
                <tr>
                    <th colspan="1" rowspan="1">Attribute(s)</th>
                    <th colspan="1" rowspan="1">Description</th>
                    <th colspan="1" rowspan="1">Example</th>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="start_rtd"/>start_rtd</td>
                    <td colspan="1" rowspan="1">Starts one of the "<strong>R</strong>esponse <strong>T</strong>ime <strong>D</strong>uration" timer.
                    (see <link href="#Response+times">statistics section</link>).</td>
                    <td colspan="1" rowspan="1"><code>&lt;send start_rtd="invite"&gt;</code>: the timer named "invite" will start when the message is sent.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="rtd"/>rtd</td>
                    <td colspan="1" rowspan="1">Stops one of the 5 "<strong>R</strong>esponse <strong>T</strong>ime <strong>D</strong>uration" timer.</td>
                    <td colspan="1" rowspan="1"><code>&lt;send rtd="2"&gt;</code>: the timer number 2 will stop when the message is sent.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1">repeat_rtd</td>
                    <td colspan="1" rowspan="1">Used with a rtd attribute, it allows the corresponding "<strong>R</strong>esponse <strong>T</strong>ime <strong>D</strong>uration" timer
                    to be counted more than once per call (useful for loop call flows). </td>
                    <td colspan="1" rowspan="1"><code>&lt;send rtd="1" repeat_rtd="true"&gt;</code>: the timer number 1 value will be printed but the timer won't stop.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1">crlf</td>
                    <td colspan="1" rowspan="1">Displays an empty line <strong>after</strong> the arrow for the message in main SIPp screen.</td>
                    <td colspan="1" rowspan="1"><code>&lt;send crlf="true"&gt;</code></td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1">next</td>
                    <td colspan="1" rowspan="1">You can put a "next" in any command element to go to another part of the script when you are done with sending the message.  For optional receives, the next is only taken if that message was received.  See <link href="#branching">conditional branching</link> section for more info.</td>
                    <td colspan="1" rowspan="1"><p>Example to jump to label "12" after sending an ACK:</p><source xml:space="preserve"><![CDATA[  <send next="12">
    <![CDATA[

      ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: ...
      From: ...
      To: ...
      Call-ID: ...
      Cseq: ...
      Contact: ...
      Max-Forwards: ...
      Subject: ...
      Content-Length: 0

    ]]]]><![CDATA[>
  </send>
]]></source>

                    <p>Example to jump to label "5" when receiving a 403 message:</p><source xml:space="preserve"><![CDATA[  <recv response="100"
        optional="true">
  </recv>
  <recv response="180" optional="true">
  </recv>
  <recv response="403" optional="true" next="5">
  </recv>
  <recv response="200">
  </recv>
]]></source></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1">test</td>
                    <td colspan="1" rowspan="1">You can put a "test" next to a "next" attribute to indicate
                    that you only want to branch to the label specified with "next"
                    if the variable specified in "test" is set (through <link href="#action_regexp">regexp</link>
                    for example).
                    See <link href="#branching">conditional branching</link> section for more info.</td>
                    <td colspan="1" rowspan="1">Example to jump to label "6" after sending an ACK only if
                    variable 4 is set:<source xml:space="preserve"><![CDATA[  <send next="6" test="4">
    <![CDATA[

      ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: ...
      From: ...
      To: ...
      Call-ID: ...
      Cseq: ...
      Contact: ...
      Max-Forwards: ...
      Subject: ...
      Content-Length: 0

    ]]]]><![CDATA[>
  </send>
]]></source></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1">chance</td>
                    <td colspan="1" rowspan="1">In combination with "test", probability to actually branch to another part
		    of the scenario. Chance can have a value between 0 (never) and 1 (always). 
		    See <link href="#branching">conditional branching</link> section for more info.</td>
                    <td colspan="1" rowspan="1"><source xml:space="preserve"><![CDATA[  <recv response="403" optional="true" next="5" test="3" chance="0.90">
  </recv>]]></source>90% chance to go to label "5" if variable "3" is set.</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1">condexec</td>
                    <td colspan="1" rowspan="1">Executes an element only if the variable in the condexec attribute is set.  This attribute allows you to write complex XML scenarios with fewer next attributes and labels.</td>
                    <td colspan="1" rowspan="1"><code>&lt;nop condexec="executethis"&gt;</code></td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1">condexec_inverse</td>
                    <td colspan="1" rowspan="1">If condexec is set, condexec_inverse inverts the condition in condexec.  This allows you to execute an element only when a variable is <b>not</b> set.</td>
                    <td colspan="1" rowspan="1"><code>&lt;nop condexec="skipthis" condexec_inverse="true"&gt;</code></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1">counter</td>
                    <td colspan="1" rowspan="1">Increments the counter given as parameter when the message is sent.
                    The counters are saved in the <link href="#Available+counters">statistic file</link>.</td>
                    <td colspan="1" rowspan="1"><code>&lt;send counter="MsgA"&gt;</code>: Increments counter "MsgA" when the message is sent.</td>
                </tr>            
		</table>

	<p>Each command also has its own unique attributes, listed here:</p>
            <table>
                <caption>List of commands with their attributes</caption>
                <tr>
                    <th colspan="1" rowspan="1">Command</th>
                    <th colspan="1" rowspan="1">Attribute(s)</th>
                    <th colspan="1" rowspan="1">Description</th>
                    <th colspan="1" rowspan="1">Example</th>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="send"/><strong>&lt;send&gt;</strong></td>
                    <td colspan="1" rowspan="1">retrans</td>
                    <td colspan="1" rowspan="1">Used for UDP transport only: it specifies the T1 timer value,
                    as described in SIP RFC 3261, section 17.1.1.2.</td>
                    <td colspan="1" rowspan="1"><code>&lt;send retrans="500"&gt;</code>: will initiate T1 timer to 500 milliseconds (RFC3261 default).</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">lost</td>
                    <td colspan="1" rowspan="1">Emulate packet lost. The value is specified as a percentage.</td>
                    <td colspan="1" rowspan="1"><code>&lt;send lost="10"&gt;</code>: 10% of the message sent are actually not sent :).</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">start_txn</td>
                    <td colspan="1" rowspan="1">Records the branch ID of this sent message so that responses can be properly matched (without this element the transaction matching is done based on the CSeq method, which is imprecise).</td>
                    <td colspan="1" rowspan="1"><code>&lt;send start_txn="invite"&gt;</code>: Stores the branch ID of this message in the transaction named "invite".</td>
                </tr>            

                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">ack_txn</td>
                    <td colspan="1" rowspan="1">Indicates that the ACK being sent corresponds to the transaction started by a start_txn attribute.  Every INVITE with a start_txn tag must have a matching ACK with an ack_txn attribute.</td>
                    <td colspan="1" rowspan="1"><code>&lt;send ack_txn="invite"&gt;</code>: References the branch ID of the transaction named "invite".</td>
                </tr>            

                <tr>
                    <td colspan="1" rowspan="1"><anchor id="recv"/><strong>&lt;recv&gt;</strong></td>
                    <td colspan="1" rowspan="1">response</td>
                    <td colspan="1" rowspan="1">Indicates what SIP message code is expected.</td>
                    <td colspan="1" rowspan="1"><code>&lt;recv response="200"&gt;</code>: SIPp will expect a SIP message with code "200".</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">request</td>
                    <td colspan="1" rowspan="1">Indicates what SIP message request is expected.</td>
                    <td colspan="1" rowspan="1"><code>&lt;recv request="ACK"&gt;</code>: SIPp will expect an "ACK" SIP message.</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">optional</td>
                    <td colspan="1" rowspan="1">Indicates if the message to receive is optional. In case of an optional
                    message and if the message is actually received, it is not seen as a unexpected message.
                    When an unexpected message is received, Sipp looks if this message matches an optional message defined in the previous step of the scenario.<br/>
                    If optional is set to "global", Sipp will look every previous steps of the scenario.</td><td colspan="1" rowspan="1"><code>&lt;recv response="100" optional="true"&gt;</code>: The 100 SIP message can be received without 
                    being considered as "unexpected".</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">rrs</td>
                    <td colspan="1" rowspan="1"><strong>R</strong>ecord <strong>R</strong>oute <strong>S</strong>et. if this attribute is set to "true",
                    then the "Record-Route:" header of the message received is stored and can be recalled using the <strong>[routes]</strong> keyword.</td>
                    <td colspan="1" rowspan="1"><code>&lt;recv response="100" rrs="true"&gt;</code>.</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">auth</td>
                    <td colspan="1" rowspan="1"><link href="#authentication">Authentication</link>. if this attribute is set to "true",
                    then the "Proxy-Authenticate:" header of the message received is stored and is used to build
                    the <strong>[authentication]</strong> keyword.</td>
                    <td colspan="1" rowspan="1"><code>&lt;recv response="407" auth="true"&gt;</code>.</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">lost</td>
                    <td colspan="1" rowspan="1">Emulate packet lost. The value is specified as a percentage.</td>
                    <td colspan="1" rowspan="1"><code>&lt;recv lost="10"&gt;</code>: 10% of the message received are thrown away.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">timeout</td>
                    <td colspan="1" rowspan="1">Specify a timeout while waiting for a message. If the message is not received, the call is aborted, unless an ontimeout label is defined. </td>
                    <td colspan="1" rowspan="1"><code>&lt;recv timeout="100000"&gt;</code></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">ontimeout</td>
                    <td colspan="1" rowspan="1">Specify a label to jump to if the timeout popped before the message to be received.</td>
                    <td colspan="1" rowspan="1">Example to jump to label "5" when not receiving a 100 message after 100 seconds:<source xml:space="preserve"><![CDATA[  <recv response="100" timeout="100000" ontimeout="5">
  </recv>
]]></source></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">action</td>
                    <td colspan="1" rowspan="1">Specify an action when receiving the message. See  <link href="#actions">Actions section</link> for possible actions.</td>
                    <td colspan="1" rowspan="1">Example of a "regular expression" action:<source xml:space="preserve"><![CDATA[<recv response="200">
 <action>
  <ereg regexp="([0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*"
    search_in="msg"
    check_it="true"
    assign_to="1,2"/>
  </action>
 </recv>]]></source></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">regexp_match</td>
                    <td colspan="1" rowspan="1">Boolean. Indicates if 'request' ('response' is not available) is given as a regular expression. If so, the recv
		    command will match against the regular expression. This allows to catch several cases
		    in the same receive command.
		    </td>
                    <td colspan="1" rowspan="1">Example of a recv command that matches MESSAGE or PUBLISH or SUBSCRIBE requests:<br/>
		    <source xml:space="preserve"><![CDATA[<recv request="MESSAGE|PUBLISH|SUBSCRIBE" crlf="true" regexp_match="true">
</recv>]]></source></td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">response_txn</td>
                    <td colspan="1" rowspan="1">Indicates that this is a response to a transaction that was previously started.  To match, the branch ID of the first via header must match the stored transaction ID.</td>
                    <td colspan="1" rowspan="1"><code>&lt;recv response="200" response_txn="invite" /&gt;</code>: Matches only responses to the message sent with start_txn="invite" attribute.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>&lt;pause&gt;</strong></td>
                    <td colspan="1" rowspan="1">milliseconds</td>
                    <td colspan="1" rowspan="1">Specify the pause delay, in milliseconds. When this delay is not set, the value of the <code>-d</code> command
                    line parameter is used.</td>
                    <td colspan="1" rowspan="1"><code>&lt;pause milliseconds="5000"/&gt;</code>: pause the scenario for 5 seconds.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">variable</td>
                    <td colspan="1" rowspan="1">Indicates which call variable to use to determine the length of the pause.</td>
                    <td colspan="1" rowspan="1"><code>&lt;pause variable="1" /&gt;</code> pauses for the number of milliseconds specified by call variable 1.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1"><anchor id="pause_distributions"/>distribution</td>
                    <td colspan="1" rowspan="1">Indicates which statistical distribution to use to determine the length of the pause.  Without GSL, you may use <code>uniform</code> or <code>fixed</code>.  With GSL, normal, exponential, gamma, lambda, lognormal, negbin, (negative binomial), pareto, and weibull are available.  Depending on the distribution you select, you must also supply distribution specific parameters.</td>
                    <td colspan="1" rowspan="1">
			The following examples show the various types of distributed pauses:

			<ul>
			<li><code>&lt;pause distribution="fixed" value="1000" /&gt;</code> pauses for 1 second.</li>
			<li><code>&lt;pause distribution="uniform" min="2000" max="5000"/&gt;</code> pauses between 2 and 5 seconds.</li>
			</ul>

			The remaining distributions require GSL.  In general The
			parameter names were chosen to be as consistent with
			Wikipedia's distribution description pages.
			<ul>
			<li><code>&lt;pause distribution="normal" mean="60000" stdev="15000"/&gt;</code> provides a normal pause with a mean of 60 seconds (i.e. 60,000 ms) and a standard deviation of 15 seconds.  The mean and standard deviation are specified as integer milliseconds.  The distribution will look like:<br/>
			<img alt="Normal pause distribution" src="images/dist_normal.gif"/>
			</li>
			<li><code>&lt;pause distribution="lognormal" mean="12.28" stdev="1" /&gt;</code> creates a distribution's whose natural logarithm has a mean of 12.28 and a
  standard deviation of 1.  The mean and standard deviation are specified as
  double values (in milliseconds).  The distribution will look like:<br/>
			<img alt="Log normal pause distribution" src="images/dist_lognormal.gif"/></li>

                        <li><code>&lt;pause distribution="exponential" mean="900000"/&gt;</code> creates an exponentially distributed pause with a mean of 15 minutes.  The distribution will look like:<br/>
                        <img alt="Normal pause distribution" src="images/dist_exponential.gif"/></li>

                        <li><code>&lt;pause distribution="weibull" lambda="3" k ="4"/&gt;</code> creates a Weibull distribution with a scale of 3 and a shape of 4 (see <link href="http://en.wikipedia.org/wiki/Weibull">Weibull on Wikipedia</link> for a description of the distribution).</li>

                        <li><code>&lt;pause distribution="pareto" k="1" x_m="2"/&gt;</code> creates a Pareto distribution with k and x<sub>m</sub> of 1 and 2, respectively (see <link href="http://en.wikipedia.org/wiki/Pareto_distribution">Pareto on Wikipedia</link> for a description of the distribution).</li>

                        <li><code>&lt;pause distribution="gamma" k="3" theta="2"/&gt;</code> creates a Gamma distribution with k and theta of 9 and 2, respectively (see <link href="http://en.wikipedia.org/wiki/Gamma_distribution">Gamma on Wikipedia</link> for a description of the distribution).</li>

                        <li><code>&lt;pause distribution="negbin" p="0.1" n="2"/&gt;</code> creates a Negative binomial distribution with p and n of 0.1 and 2, respectively (see <link href="http://en.wikipedia.org/wiki/Negative_binomial_distribution">Negative Binomial on Wikipedia</link> for a description of the distribution).</li>
			</ul>

                    </td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">sanity_check</td>
                    <td colspan="1" rowspan="1">By default, statistically distributed pauses are sanity checked to ensure that their 99th percentile values are less than INT_MAX.  Setting <strong>sanity_check</strong> to false disables this behavior.</td>
                    <td colspan="1" rowspan="1"><code>&lt;pause distribution="lognormal" mean="10" stdev="10" sanity_check="false"/&gt;</code> disables sanity checking of the lognormal distribution.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="nop"/><strong>&lt;nop&gt;</strong></td>
                    <td colspan="1" rowspan="1">action</td>
                    <td colspan="1" rowspan="1">The nop command doesn't do anything at SIP level. It is 
                    only there to specify an action to execute. See  <link href="#actions">Actions section</link> for possible actions.</td>
                    <td colspan="1" rowspan="1">Execute the play_pcap_audio/video action:<source xml:space="preserve"><![CDATA[<nop>
  <action>
    <exec play_pcap_audio="pcap/g711a.pcap"/>
  </action>
</nop>
]]></source></td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="sendCmd"/><strong>&lt;sendCmd&gt;</strong></td>
                    <td colspan="1" rowspan="1">&lt;![CDATA[]]&gt;</td>
                    <td colspan="1" rowspan="1">Content to be sent to the twin <link href="#ThreePCC">3PCC</link> SIPp instance. The Call-ID must be included in the CDATA. In 3pcc extended mode, the From must be included to. </td>
                    <td colspan="1" rowspan="1"><source xml:space="preserve"><![CDATA[<sendCmd>
  <![CDATA[
    Call-ID: [call_id]
    [$1]

   ]]]]><![CDATA[>
</sendCmd>]]></source></td>
                </tr> 
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">dest</td>
                    <td colspan="1" rowspan="1">3pcc extended mode only: the twin sipp instance which the command will be sent to</td>
                    <td colspan="1" rowspan="1"><code>&lt;sendCmd dest="s1"&gt;</code>: the command will be sent to the "s1" twin instance</td>
                </tr>           
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="recvCmd"/><strong>&lt;recvCmd&gt;</strong></td>
                    <td colspan="1" rowspan="1">action</td>
                    <td colspan="1" rowspan="1">Specify an action when receiving the command. See  <link href="#actions">Actions section</link> for possible actions.</td>
                    <td colspan="1" rowspan="1">Example of a "regular expression" to retrieve what has been send by a sendCmd command:<source xml:space="preserve"><![CDATA[<recvCmd>
  <action
     <ereg regexp="Content-Type:.*"
           search_in="msg"
           assign_to="2"/>
  </action>
</recvCmd>]]></source></td>
                </tr> 
                <tr>
                    <td colspan="1" rowspan="1"/>
                    <td colspan="1" rowspan="1">src</td>
                    <td colspan="1" rowspan="1">3pcc extended mode only: indicate the twin sipp instance which the command is expected to be received from </td>
                    <td colspan="1" rowspan="1"><code>&lt;recvCmd src = "s1"&gt;</code>: the command will be expected to be received from the "s1" twin instance</td>
                </tr>           
                <tr>
                    <td colspan="1" rowspan="1"><strong>&lt;label&gt;</strong></td>
                    <td colspan="1" rowspan="1">id</td>
                    <td colspan="1" rowspan="1">A label is used when you want to branch to specific parts
                    in your scenarios. The "id" attribute is an integer where the maximum value is 19.
                    See <link href="#branching">conditional branching</link> section for more info.</td>
                    <td colspan="1" rowspan="1">Example: set label number 13:<source xml:space="preserve"><![CDATA[<label id="13"/>]]></source></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="resptimerep"/><strong>&lt;Response Time Repartition&gt;</strong></td>
                    <td colspan="1" rowspan="1">value</td>
                    <td colspan="1" rowspan="1">Specify the intervals, in milliseconds, used to distribute the values of response times.</td>
                    <td colspan="1" rowspan="1"><code>&lt;ResponseTimeRepartition value="10, 20,
                    30"/&gt;</code>: response time values are distributed
                    between 0 and 10ms, 10 and 20ms, 20 and 30ms, 30 and
                    beyond.</td>
                </tr>            
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="calllengthrep"/><strong>&lt;Call Length Repartition&gt;</strong></td>
                    <td colspan="1" rowspan="1">value</td>
                    <td colspan="1" rowspan="1">Specify the intervals, in milliseconds, used to distribute the values of the call length measures.</td>
                    <td colspan="1" rowspan="1"><code>&lt;CallLengthRepartition value="10, 20,
                    30"/&gt;</code>: call length values are distributed between
                    0 and 10ms, 10 and 20ms, 20 and 30ms, 30 and beyond.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="globals"/><strong>&lt;Globals&gt;</strong></td>
                    <td colspan="1" rowspan="1">variables</td>
                    <td colspan="1" rowspan="1">Specify the name of globally scoped variables.</td>
                    <td colspan="1" rowspan="1"><code>&lt;Globals variables="foo,bar" /&gt;</code>.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="uservars"/><strong>&lt;User&gt;</strong></td>
                    <td colspan="1" rowspan="1">variables</td>
                    <td colspan="1" rowspan="1">Specify the name of user-scoped variables.</td>
                    <td colspan="1" rowspan="1"><code>&lt;User variables="foo,bar" /&gt;</code>.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><anchor id="reference"/><strong>&lt;Reference&gt;</strong></td>
                    <td colspan="1" rowspan="1">variables</td>
                    <td colspan="1" rowspan="1">Suppresses warnings about unused variables.</td>
                    <td colspan="1" rowspan="1"><code>&lt;Reference variables="dummy" /&gt;</code></td>
                </tr>
            </table>
            <p>There are not so many commands: send, recv, sendCmd, recvCmd,
            pause, ResponseTimeRepartition, CallLengthRepartition, Globals, User, and Reference. To make
            things even clearer, nothing is better than an example...</p>
            <section><title>Structure of client (UAC like) XML scenarios</title>
            <p>A client scenario is a scenario that starts with a "send" command. So let's start:</p>
            <source xml:space="preserve"><![CDATA[<scenario name="Basic Sipstone UAC">
  <send>
    <![CDATA[
    
      INVITE sip:]]><strong>[service]</strong><![CDATA[@]]><strong>[remote_ip]</strong><![CDATA[:]]><strong>[remote_port]</strong><![CDATA[ SIP/2.0
      Via: SIP/2.0/]]><strong>[transport]</strong><![CDATA[ ]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[
      From: sipp <sip:sipp@]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[>;tag=]]><strong>[call_number]</strong><![CDATA[
      To: sut <sip:]]><strong>[service]</strong><![CDATA[@]]><strong>[remote_ip]</strong><![CDATA[:]]><strong>[remote_port]</strong><![CDATA[>
      Call-ID: ]]><strong>[call_id]</strong><![CDATA[
      Cseq: 1 INVITE
      Contact: sip:sipp@]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[
      Max-Forwards: 70
      Subject: Performance Test
      Content-Type: application/sdp
      Content-Length: ]]><strong>[len]</strong><![CDATA[

      v=0
      o=user1 53655765 2353687637 IN IP]]><strong>[local_ip_type]</strong><![CDATA[ ]]><strong>[local_ip]</strong><![CDATA[
      s=-
      t=0 0
      c=IN IP]]><strong>[media_ip_type]</strong><![CDATA[ ]]><strong>[media_ip]</strong><![CDATA[
      m=audio ]]><strong>[media_port]</strong><![CDATA[ RTP/AVP 0
      a=rtpmap:0 PCMU/8000


    ]]]]><![CDATA[>
  </send>]]></source>
            <p>Inside the "send" command, you have to enclose your SIP message
            between the "&lt;![CDATA" and the "]]&gt;" tags. Everything between
            those tags is going to be sent toward the remote system. You may
            have noticed that there are strange keywords in the SIP message,
            like <strong>[service], [remote_ip], ...</strong>. Those keywords
            are used to indicate to SIPp that it has to do something with
            it.</p>
            <p>Here is the list:</p>
            <anchor id="keyword"/>
            <table>
                <caption>Keyword list</caption>
                <tr>
                    <th colspan="1" rowspan="1">Keyword</th>
                    <th colspan="1" rowspan="1">Default</th>
                    <th colspan="1" rowspan="1">Description</th>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[service]</strong></td>
                    <td colspan="1" rowspan="1">service</td>
                    <td colspan="1" rowspan="1">Service field, as passed in the <strong><code>-s service_name</code></strong></td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[remote_ip]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Remote IP address, as passed on the command line.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[remote_port]</strong></td>
                    <td colspan="1" rowspan="1">5060</td>
                    <td colspan="1" rowspan="1">Remote IP port, as passed on the command line. You can 
                    add a computed offset [remote_port+3] to this value.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[transport]</strong></td>
                    <td colspan="1" rowspan="1">UDP</td>
                    <td colspan="1" rowspan="1">Depending on the value of <strong>-t</strong> parameter, this will take the values "UDP" or "TCP".</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[local_ip]</strong></td>
                    <td colspan="1" rowspan="1">Primary host IP address</td>
                    <td colspan="1" rowspan="1">Will take the value of <strong>-i</strong> parameter.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[local_ip_type]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Depending on the address type of <strong>-i</strong> parameter (IPv4 or IPv6),
                    local_ip_type will have value "4" for IPv4 and "6" for IPv6.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[local_port]</strong></td>
                    <td colspan="1" rowspan="1">Chosen by the system</td>
                    <td colspan="1" rowspan="1">Will take the value of <strong>-p</strong> parameter.
                    You can add a computed offset [local_port+3] to this value.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[len]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Computed length of the SIP body. To be used in "Content-Length"
                    header. You can add a computed offset [len+3] to this value.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[call_number]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Index. The call_number starts from "1" and is incremented by 1 for each call.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[cseq]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Generates automatically the CSeq number. The initial value is 1 by default. It
                    can be changed by using the <code>-base_cseq</code> command line option.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[call_id]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">A call_id identifies a call and is generated by SIPp for each new call. <strong>In client mode, it is mandatory
                    to use the value generated by SIPp in the "Call-ID" header.</strong> Otherwise, SIPp will not recognise
                    the answer to the message sent as being part of an existing call.<br/>
                    Note: [call_id] can be pre-pended with an arbitrary string using '///'. Example: Call-ID: ABCDEFGHIJ///[call_id] - it will still be recognized by SIPp as part of the same call.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[media_ip]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Depending on the value of <strong>-mi</strong> parameter, it is the local IP address for RTP echo.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[media_ip_type]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Depending on the address type of <strong>-mi</strong> parameter (IPv4 or IPv6),
                    media_ip_type will have value "4" for IPv4 and "6" for IPv6. Useful to build the SDP independently
                    of the media IP type.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[media_port]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Depending on the value of <strong>-mp</strong> parameter, it set the local RTP echo port number. Default
                      is none. RTP/UDP packets received on that port are echoed to their sender. You can 
                    add a computed offset [media_port+3] to this value.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[auto_media_port]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Only for pcap. To make audio and video ports begin from the value of <strong>-mp</strong> parameter, 
                        and change for each call using a periodical system, modulo 10000 (which limits to 10000 concurrent RTP sessions for pcap_play) </td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[last_*]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">The '[last_*]' keyword is replaced automatically by the
                    specified header if it was present in the last message
                    received (except if it was a retransmission). If the header
                    was not present or if no message has been received, the
                    '[last_*]' keyword is discarded, and all bytes until the end
                    of the line are also discarded. If the specified header was
                    present several times in the message, all occurences are
                    concatenated (CRLF separated) to be used in place of the
                    '[last_*]' keyword.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[field0-n file=&lt;filename&gt; line=&lt;number&gt;]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Used to inject values from an external CSV file. See
                    <link href="#inffile">"Injecting values from an external CSV
		    during calls"</link> section.  The optional file and line
		    parameters allow you to select which of the injection files
		    specified on the command line to use and which line number
		    from that file.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[file name=&lt;filename&gt;]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Inserts the entire contents of filename into the message.  Whitespace,
		    including carriage returns and newlines at the end of the line in the file
		    are not processed as with other keywords; thus your file must be formatted
		    exactly as you would like the bytes to appear in the message.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[timestamp]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">The current time using the same format as error log messages.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[last_message]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">The last received message.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[$n]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Used to inject the value of call variable number n. See "<link href="#actions">Actions</link>" section</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[authentication]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Used to put the authentication header. This field can have parameters, in the following form: 
                    [authentication username=myusername password=mypassword]. If no username is provided, 
                    the value from the -au (authentication username) or -s (service) command line parameter is used.  If no password is provided, the value 
                    from -ap command line parameter is used. See "<link href="#authentication">Authentication</link>" section</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[pid]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Provide the process ID (pid) of the main SIPp thread.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[routes]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">If the "rrs" attribute in a recv command is set to "true",
                    then the "Record-Route:" header of the message received is stored 
                    and can be recalled using the [routes] keyword</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[next_url]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">If the "rrs" attribute in a recv command is set to "true",
                    then the [next_url] contains the contents of the Contact header 
                    (i.e within the '&lt;' and '&gt;' of Contact)</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[branch]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Provide a branch value which is a concatenation of magic cookie 
                    (z9hG4bK) + call number + message index in scenario.<br/> An offset (like [branch-N]) can be appended if you need to have the same branch value as a previous message.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[msg_index]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Provide the message number in the scenario.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[cseq]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Provides the CSeq value of the last request received. This value can be incremented (e.g. [cseq+1] adds 1 to
                        the CSeq value of the last request).</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[clock_tick]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Includes the internal SIPp clock tick value in the message.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[sipp_version]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Includes the SIPp version string in the message.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[tdmmap]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Includes the tdm map values used by the call in the message (see -tdmmap option).</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[fill]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">Injects filler characters into the message.  The length of the fill
		    text is equal to the call variable stored in the
		    <code>variable=N</code> parameter.  By default the text is a sequence
		    of X's, but can be controlled with the <code>text="text"</code> parameter.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[users]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">If the <code>-users</code> command line option is specified, then this keyword contains the number of users that are currently instantiated.</td>
                </tr>
                <tr>
                    <td colspan="1" rowspan="1"><strong>[userid]</strong></td>
                    <td colspan="1" rowspan="1">-</td>
                    <td colspan="1" rowspan="1">If the <code>-users</code> command line option is specified, then this keyword containst he integer identifier of the current user (starting at zero and ending at <code>[users-1]</code>).</td>
                </tr>
            </table>
            <p>Now that the INVITE message is sent, SIPp can wait for an answer by using the "<link href="#recv">recv</link>" command.</p>
<source xml:space="preserve"><![CDATA[  <recv response="100"> optional="true"
  </recv>

  <recv response="180"> optional="true"
  </recv>

  <recv response="200">
  </recv>]]></source>
            <p>100 and 180 messages are optional, and 200 is mandatory. 
            <strong>In a "recv" sequence, there must be one mandatory message</strong>.</p>
            <p>Now, let's send the ACK:</p>
<source xml:space="preserve"><![CDATA[  <send>
    <![CDATA[

      ACK sip:]]><strong>[service]</strong><![CDATA[@]]><strong>[remote_ip]</strong><![CDATA[:]]><strong>[remote_port]</strong><![CDATA[ SIP/2.0
      Via: SIP/2.0/]]><strong>[transport]</strong><![CDATA[ ]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[
      From: sipp <sip:sipp@]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[>;tag=]]><strong>[call_number]</strong><![CDATA[
      To: sut <sip:]]><strong>[service]</strong><![CDATA[@]]><strong>[remote_ip]</strong><![CDATA[:]]><strong>[remote_port</strong><![CDATA[]>]]><strong>[peer_tag_param]</strong><![CDATA[
      Call-ID: ]]><strong>[call_id]</strong><![CDATA[
      Cseq: 1 ACK
      Contact: sip:sipp@]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[
      Max-Forwards: 70
      Subject: Performance Test
      Content-Length: 0

    ]]]]><![CDATA[>
  </send>]]></source>
            <p>We can also insert a pause. The scenario will wait for 5 seconds at this point.</p>
<source xml:space="preserve"><![CDATA[  <pause milliseconds="5000"/>]]></source>
            <p>And finish the call by sending a BYE and expecting the 200 OK:</p>
<source xml:space="preserve"><![CDATA[    <send retrans="500">
     <![CDATA[

      BYE sip:]]><strong>[service]</strong><![CDATA[@]]><strong>[remote_ip]</strong><![CDATA[:]]><strong>[remote_port]</strong><![CDATA[ SIP/2.0
      Via: SIP/2.0/]]><strong>[transport] [local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[
      From: sipp  <sip:sipp@]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[>;tag=]]><strong>[call_number]</strong><![CDATA[
      To: sut  <sip:]]><strong>[service]</strong><![CDATA[@]]><strong>[remote_ip]</strong><![CDATA[:]]><strong>[remote_port]</strong><![CDATA[>]]><strong>[peer_tag_param]</strong><![CDATA[
      Call-ID: ]]><strong>[call_id]</strong><![CDATA[
      Cseq: 2 BYE
      Contact: sip:sipp@]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[
      Max-Forwards: 70
      Subject: Performance Test
      Content-Length: 0

    ]]]]><![CDATA[>
   </send>

   <recv response="200">
   </recv>]]></source>
            <p>And this is the end of the scenario:</p>
<source xml:space="preserve"><![CDATA[</scenario>]]></source>
            <p>Creating your own SIPp scenarios is not a big deal. 
            If you want to see other examples, use the <code>-sd</code> parameter
            on the command line to display embedded scenarios.</p>
            </section>
            <section><title>Structure of server (UAS like) XML scenarios</title>
            <p>A server scenario is a scenario that starts with a "<link href="#recv">recv</link>" command. 
            The syntax and the list of available commands is the same as for
            "client" scenarios.</p>
            <p>But you are more likely to use [last_*] keywords in those server
            side scenarios. For example, a UAS example will look like:</p>
<source xml:space="preserve"><![CDATA[  <recv request="INVITE">
  </recv>

  <send>
    <![CDATA[

      SIP/2.0 180 Ringing
      ]]><strong>[last_Via:]</strong><![CDATA[
      ]]><strong>[last_From:]</strong><![CDATA[
      ]]><strong>[last_To:]</strong><![CDATA[;tag=]]><strong>[call_number]</strong><![CDATA[
      ]]><strong>[last_Call-ID:]</strong><![CDATA[
      ]]><strong>[last_CSeq:]</strong><![CDATA[
      Contact: <sip:]]><strong>[local_ip]</strong><![CDATA[:]]><strong>[local_port]</strong><![CDATA[;transport=]]><strong>[transport]</strong><![CDATA[>
      Content-Length: 0

    ]]]]><![CDATA[>
  </send>]]></source>
            <p>The answering message, 180 Ringing in this case, is built
            with the content of headers received in the INVITE message.</p>
            </section>
            <anchor id="actions"/><section><title>Actions</title>
              <p>In a "<link href="#recv">recv</link>" or "<link href="#recvCmd">recvCmd</link>" command, you have the possibility to
              execute an action. Several actions are available:</p>
              <ul>
                <li><link href="#action_regexp">Regular expressions</link> (ereg)</li>
                <li><link href="#action_log">Log something in aa log file</link> (log)</li>
                <li><link href="#action_exec">Execute an external (system), internal (int_cmd) or 
                pcap_play_audio/pcap_play_video command</link> (exec)</li>
		<li><link href="#action_variables">Manipulate double precision variables using arithmetic</link></li>
		<li><link href="#action_strings">Assign string values to a variable</link></li>
		<li><link href="#action_test">Compare double precision variables</link></li>
		<li><link href="#action_jump">Jump to a particular scenario index</link></li>
		<li><link href="#action_gettimeofday">Store the current time into variables</link></li>
		<li><link href="#action_lookup">Lookup a key in an indexed injection file</link></li>
		<li><link href="#action_verifyauth">Verify Authorization credentials</link></li>
		<li><link href="#action_setdest">Change a Call's Network Destination</link></li>
              </ul>
                <anchor id="action_regexp"/><section><title>Regular expressions</title>
                  <p>Using regular expressions in SIPp allows to</p>
                  <ul>
                     <li>Extract content of a SIP message or a SIP header and
                     store it for future usage (called re-injection)</li>
                     <li>Check that a part of a SIP message or of an header 
                     is matching an expected expression</li>
                  </ul>
                  <p>Regular expressions used in SIPp are defined per 
                  <link href="http://www.opengroup.org/onlinepubs/007908799/xbd/re.html">
                  Posix Extended standard (POSIX 1003.2)</link>. If you want to
                  learn how to write regular expressions, I will recommend 
                  this <link href="http://analyser.oli.tudelft.nl/regex/index.html.en">
                  regexp tutorial</link>.</p>
                  <p>Here is the syntax of the regexp action:</p>
                  <table>
                      <caption>regexp action syntax</caption>
                      <tr>
                          <th colspan="1" rowspan="1">Keyword</th>
                          <th colspan="1" rowspan="1">Default</th>
                          <th colspan="1" rowspan="1">Description</th>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">regexp</td>
                          <td colspan="1" rowspan="1">None</td>
                          <td colspan="1" rowspan="1">Contains the regexp to use for matching the 
                          received message or header. MANDATORY.</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">search_in</td>
                          <td colspan="1" rowspan="1">msg</td>
                          <td colspan="1" rowspan="1">can have four values: "msg" (try to match against 
                          the entire message); "hdr" (try to match against a specific SIP header); "body" (try to match against the SIP message body); or "var" (try to match against a SIPp string variable).</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">header</td>
                          <td colspan="1" rowspan="1">None</td>
                          <td colspan="1" rowspan="1">Header to try to match against. Only used when 
                          the search_in tag is set to hdr. MANDATORY IF 
                          search_in is equal to hdr.</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">variable</td>
                          <td colspan="1" rowspan="1">None</td>
                          <td colspan="1" rowspan="1">Variable to try to match against. Only used when 
                          the search_in tag is set to var. MANDATORY IF 
                          search_in is equal to var.</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">case_indep</td>
                          <td colspan="1" rowspan="1">false</td>
                          <td colspan="1" rowspan="1">To look for a header ignoring case . Only used when 
                          the search_in tag is set to hdr. </td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">occurence</td>
                          <td colspan="1" rowspan="1">1</td>
                          <td colspan="1" rowspan="1">To find the nth occurence of a header. Only used when 
                          the search_in tag is set to hdr.</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">start_line</td>
                          <td colspan="1" rowspan="1">false</td>
                          <td colspan="1" rowspan="1">To look only at start of line. Only used when 
                          the search_in tag is set to hdr.</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">check_it</td>
                          <td colspan="1" rowspan="1">false</td>
                          <td colspan="1" rowspan="1">if set to true, the call is marked as failed if 
                          the regexp doesn't match. Can not be combined with check_it_inverse.</td>
			  </tr>
                      <tr>
                          <td colspan="1" rowspan="1">check_it_inverse</td>
                          <td colspan="1" rowspan="1">false</td>
                          <td colspan="1" rowspan="1">Inverse of check_it. iff set to true, the call is marked as failed if 
                          the regexp does match. Can not be combined with check_it.</td>
                      </tr>
                      <tr>
                          <td colspan="1" rowspan="1">assign_to</td>
                          <td colspan="1" rowspan="1">None</td>
                          <td colspan="1" rowspan="1">contain the variable id (integer) or a list of 
                          variable id which will be used to store the 
                          result(s) of the matching process between the regexp 
                          and the message. Those variables can be re-used at 
                          a later time either by using '[$n]' in the scenario 
                          to inject the value of the variable in the messages or
                          by using the content of the variables for <link href="#branching">conditional 
                          branching</link>. The first variable in the variable list of
                          assign_to contains the entire regular
                          expression matching. The following variables contain the
                          sub-expressions matching. Example: <source xml:space="preserve"><![CDATA[<ereg regexp="o=([[:alnum:]]*) ([[:alnum:]]*) ([[:alnum:]]*)"
            search_in="msg"
            check_it=i"true"
            assign_to="3,4,5,8"/>]]></source>If the SIP message contains the line <source xml:space="preserve"><![CDATA[o=user1 53655765 2353687637 IN IP4 127.0.0.1]]></source>
            variable 3 contains "o=user1 53655765 2353687637", variable 4 contains "user1", 
            variable 5 contains "53655765" and variable 8 contains "2353687637".</td>
                      </tr>
                  </table>
                  <p>Note that you can have several regular expressions
                  in one action.</p>
                  <p>The following example is used to:</p>
                  <ul>
                    <li>First action:
                      <ul>
                        <li>Extract the first IPv4 address of the received SIP message</li>
                        <li>Check that we could actually extract this IP address (otherwise
                        call will be marked as failed)</li>
                        <li>Assign the extracted IP address to call variables 1
                        and 2.</li>
                      </ul>
                    </li>
                    <li>Second action:
                      <ul>
                        <li>Extract the Contact: header of the received SIP message</li>
                        <li>Assign the extracted Contract: header to variable 6.</li>
                      </ul>
                    </li>
                  </ul>
                  <source xml:space="preserve"><![CDATA[
<recv response="200" start_rtd="true">
  <action>
    <ereg regexp="([0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*" search_in="msg" check_it="true" assign_to="1,2" /> 
    <ereg regexp=".*" search_in="hdr" header="Contact:" check_it="true" assign_to="6" />
  </action>
</recv>
]]></source>
                </section>
                <anchor id="action_log"/><section><title>Log a message</title>
                  <p>The "log" action allows you to customize your traces. Messages
                  are printed in the &lt;scenario file name&gt;_&lt;pid&gt;_logs.log file.
                  Any <link href="#keyword">keyword</link> is expanded to reflect the value actually used.</p>
                  <warning>Logs are generated only if -trace_logs option is set on
                  the command line.</warning>
                  <p>Example:</p>
                  <source xml:space="preserve"><![CDATA[   <recv request="INVITE" crlf="true" rrs="true">
     <action>
	 <ereg regexp=".*" search_in="hdr" header="Some-New-Header:" assign_to="1" />
          <log message="From is [last_From]. Custom header is [$1]"/>
     </action>
   </recv>]]></source>
		  <p>You can use the alternative "warning" action to log a message to SIPp's error log.  For example:</p>
                  <source xml:space="preserve"><![CDATA[<warning message="From is [last_From]. Custom header is [$1]"/>]]></source>
                </section>
                <anchor id="action_exec"/><section><title>Execute a command</title>
                  <p>The "exec" action allows you to execute "internal", "external", "play_pcap_audio" or "play_pcap_video" commands.</p>
                  <section><title>Internal commands</title>
                  <p><strong>Internal</strong> commands (specified using int_cmd attribute) are stop_call, stop_gracefully (similar to pressing 'q'), stop_now (similar to ctrl+C).</p>
                  <p>Example that stops the execution of the script on receiving a 603 response:</p>
                  <source xml:space="preserve"><![CDATA[   <recv response="603" optional="true">
     <action>
          <exec int_cmd="stop_now"/>
      </action>
   </recv>]]></source>

                  </section>
                  <section><title>External commands</title>
                  <p><strong>External</strong> commands (specified using command attribute) are anything that can be executed on local host with a shell.</p>
                  <p>Example that execute a system echo for every INVITE received:</p>
                  <source xml:space="preserve"><![CDATA[   <recv request="INVITE">
     <action>
          <exec command="echo [last_From] is the from header received >> from_list.log"/>
      </action>
   </recv>]]></source>
                  </section>
                  </section>
                  <section><title>PCAP (media) commands</title>
                  <p><strong>PCAP play</strong> commands (specified using play_pcap_audio / play_pcap_video attributes) 
                    allow you to send a pre-recorded RTP stream using the <link href="http://www.tcpdump.org/pcap3_man.html">pcap library</link>.
                      <p>Choose <strong>play_pcap_audio</strong> to send the pre-recorded RTP stream using the "m=audio" SIP/SDP line port as a base for the replay.</p>
                      <p>Choose <strong>play_pcap_video</strong> to send the pre-recorded RTP stream using the "m=video" SIP/SDP line port as a base.</p> 
                      <p>The play_pcap_audio/video command has the following format: play_pcap_audio="[file_to_play]" with:</p>
                          <ul>
                            <li>file_to_play: the pre-recorded pcap file to play</li>
                          </ul>
                          <note>The action is non-blocking. SIPp will start a light-weight thread to play the file 
                          and the scenario with continue immediately. If needed, you will need to add a pause
                          to wait for the end of the pcap play.</note>
                      <warning>A known bug means that starting a pcap_play_audio command will end any pcap_play_video command, and vice versa; you cannot play both audio and video streams at once.</warning></p>
                  <p>Example that plays a pre-recorded RTP stream:</p>
                  <source xml:space="preserve"><![CDATA[<nop>
  <action>
    <exec play_pcap_audio="pcap/g711a.pcap"/>
  </action>
</nop>
]]></source>

		  </section>

                  <anchor id="action_variables"/><section><title>Variable Manipulation</title>
		<p>You may also perform simple arithmetic (add, subtract,
		multiply, divide) on floating point values.  The "assign_to" attribute contains
		the first operand, and is also the destination of the resulting value.
		The second operand is either an immediate value or stored in a variable, represented by
		the "value" and "variable" attributes, respectively.</p>



                  <p>SIPp supports call variables that take on double-precision floating values.
		  The actions that modify double variables all write to the
		  variable referenced by the <strong>assign_to</strong> parameter.  
		  These variables can be assigned using one of three actions:
		  assign, sample, or todouble.  For assign, the
		  double precision value is stored in the "value" parameter.  The sample action assigns
		  values based on statistical distributions, and uses the same
		  parameters as a <link href="#pause_distributions">statistically distributed
		  pauses</link>.  Finally, the todouble command converts the variable referenced by the
		  "variable" attribute to a double before assigning it.</p>


                  <p>For example, to assign the value 1.0 to $1 and sample from the normal distribution into $2:</p>
                  <source xml:space="preserve"><![CDATA[<nop>
  <action>
    <assign assign_to="1" value="1" />
    <sample assign_to="2" distribution="normal" mean="0" stdev="1"/>
    <!-- Stores the first field in the injection file into string variable $3.
         You may also use regular expressions to store string variables. -->
    <assignstr assign_to="3" value="[field0]" />
    <!-- Converts the string value in $3 to a double-precision value stored in $4. -->
    <todouble assign_to="4" variable="3" />
  </action>
</nop>
]]></source>

		  <p>Simple arithmetic is also possible using the <strong>&lt;add&gt;</strong>, <strong>&lt;subtract&gt;</strong>, <strong>&lt;multiply&gt;</strong>, and <strong>&lt;divide&gt;</strong> actions, which add, subtract, multiply, and divide the variable referenced by <strong>assign_to</strong> by the value in <strong>value</strong>.
For example, the following action modifies variable one as follows:</p>
<source xml:space="preserve"><![CDATA[<nop>
  <action>
    <assign assign_to="1" value="0" /> <!-- $1 == 0 -->
    <add assign_to="1" value="2" /> <!-- $1 == 2 -->
    <subtract assign_to="1" value="3" /> <!-- $1 == -1 -->
    <multiply assign_to="1" value="4" /> <!-- $1 == -4 -->
    <divide assign_to="1" value="5" /> <!-- $1 == -0.8 -->
  </action>
]]></source>
		<p>Rather than using fixed values, you may also retrieve the second operand from a variable, using the <strong>&lt;variable&gt;</strong> parameter.  For example:</p>
		<source xml:space="preserve"><![CDATA[<nop>
  <action>
	 <!-- Multiplies $1 by itself -->
	 <multiply assign_to="1" variable="1" />
	 <!-- Divides $1 by $2, Note that $2 must not be zero -->
	 <multiply assign_to="1" variable="2" />
     </action>
   </nop>]]></source>

                  </section>

                  <anchor id="action_strings"/><section><title>String Variables </title>
		<p>You can create string variables by using the <strong>&lt;assignstr&gt;</strong>
		command, which accepts two parameters: <strong>assign_to</strong> and
		<strong>value</strong>.  The value may contain any of the same substitutions
		that a message can contain.  For example:</p>
		<source xml:space="preserve"><![CDATA[<nop>
     <action>
         <!-- Assign the value in field0 of the CSV file to a $1. -->
	 <assignstr assign_to="1" value="[field0]" />
     </action>
   </nop>]]></source>

		<p>A string variable and a value can be compared using the
<strong>&lt;strcmp&gt;</strong> action.  The result is a double value, that is
less than, equal to, or greater than zero if the variable is lexographically
less than, equal to, or greater than the value.  The parameters are assign_to,
variable, and value.  For example:</p>
		<source xml:space="preserve"><![CDATA[<nop>
     <action>
         <!-- Compare the value of $strvar to "Hello" and assign it to $result.. -->
	 <strcmp assign_to="result" variable="strvar" value="Hello" />
     </action>
   </nop>]]></source>
		</section>

                  <anchor id="action_test"/><section><title>Variable Testing</title>
		  <p>Variable testing allows you to construct loops and control
		  structures using call variables.  THe <strong>test</strong>
		  action takes four arguments: <strong>variable</strong> which
		  is the variable that to <strong>compare</strong> against
		  <strong>value</strong>, and <strong>assign_to</strong> which
		  is a boolean call variable that the result of the test is
		  stored in.  Compare may be one of the following tests:
		  <strong>equal</strong>, <strong>not_equal</strong>,
		  <strong>greater_than</strong>, <strong>less_than</strong>,
		  <strong>greater_than_equal</strong>, or
		  <strong>less_than_equal</strong>.</p> <p>Example that sets $2
		  to true if  $1 is less than 10:</p>

                  <source xml:space="preserve"><![CDATA[<nop>
  <action>
    <test assign_to="2" variable="1" compare="less_than" value="10" />
  </action>
</nop>
]]></source>
                  </section>

                  <anchor id="action_lookup"/><section><title>lookup</title>
		  <p>The lookup action is used for indexed injection files (see <link href="#infindex">indexed injection files</link>).  The lookup action takes a file and key as input and produces an integer line number as output. For example the following action extracts the username from an authorization header and uses it to find the corresponding line in users.csv.</p>

                  <source xml:space="preserve"><![CDATA[<recv request="REGISTER">
  <action>
    <ereg regexp="Digest .*username=\"([^\"]*)\"" search_in="hdr" header="Authorization:" assign_to="junk,username" />
    <lookup assign_to="line" file="users.csv" key="[$username]" />
  </action>
</nop>
]]></source></section>


		  <anchor id="action_insert"/><section><title>Updating In-Memory Injection files</title>
		  <p>Injection files, particularly when an <link href="#infindex">index</link> is defined can serve as an
		  in-memory data store for your SIPp scenario.  The
		  &lt;insert&gt; and &lt;replace&gt; actions provide
		  a method of programmatically updating SIPp's
		  in-memory version of an injection file (there is presently no
		  way to update the disk-based version).  The insert action takes
		  two parameters: file and value, and the replace action takes an
		  additional line value.  For example, to inserting a new line can
		  be accomplished as follows:</p>
                  <source xml:space="preserve"><![CDATA[<nop display="Insert User">
        <action>
                <insert file="usersdb.conf" value="[$user];[$calltype]" />
        </action>
</nop>]]></source>
		  <p>Replacing a line is similar, but a line number must be specified.
		  You will probably want to use the lookup action to obtain the
		  line number for use with replace as follows:</p>
		<source xml:space="preserve"><![CDATA[<nop display="Update User">
        <action>
		<lookup assign_to="index" file="usersdb.conf" key="[$user]" />
		<!-- Note: This assumes that the lookup always succeeds. -->
                <replace file="usersdb.conf" line="[$index]" value="[$user];[$calltype]" />
        </action>
</nop>]]></source>
		  </section>


                  <anchor id="action_jump"/><section><title>Jumping to an Index</title>
                  <p>You can jump to an arbitrary scenario index using the &lt;jump&gt; action.  This can be used to create rudimentary subroutines.  The caller can save their index using the [msg_index] substitution, and the callee can jump back to the same place using this action.  If there is a special label named "_unexp.main" in the scenario, SIPp will jump to that label whenever an unexpected message is received and store the previous address in the variable named "_unexp.retaddr".</p>

                  <p>Example that jumps to index 5:</p>
                  <source xml:space="preserve"><![CDATA[<nop>
  <action>
    <jump value="5" />
  </action>
</nop>
]]></source>
                  <p>Example that jumps to the index contained in the variable named _unexp.retaddr:</p>
                  <source xml:space="preserve"><![CDATA[<nop>
  <action>
    <jump variable="_unexp.retaddr" />
  </action>
</nop>
]]></source>
                  </section>
                  <anchor id="action_gettimeofday"/><section><title>gettimeofday</title>
		  <p>The gettimeofday action allows you to get the current time in seconds and microseconds since the epoch.  For example:</p>
                  <source xml:space="preserve"><![CDATA[<nop>
  <action>
    <gettimeofday assign_to="seconds,microseconds" />
  </action>
</nop>
]]></source></section>

                  <anchor id="action_setdest"/><section><title>setdest</title>
		  <p>The setdest action allows you to change the remote end
point for a call.  The parameters are the transport, host, and port to connect
the call to.  There are certain limitations baed on SIPp's design: you can not
change the transport for a call; and if you are using TCP then multi-socket
support must be selected (i.e. <code>-t tn</code> must be specified).  Also, be
aware that frequently using setdest may reduce SIPp's capacity as name
resolution is a blocking operation (thus potentially causing SIPp to stall
while looking up host names).  This example connects to the value specified in the <code>[next_url]</code> keyword.</p>

                  <source xml:space="preserve"><![CDATA[  <nop>
     <action>
        <assignstr assign_to="url" value="[next_url]" />
        <ereg regexp="sip:.*@([0-9A-Za-z\.]+):([0-9]+);transport=([A-Z]+)"  search_in="var" check_it="true" assign_to="dummy,host,port,transport" variable="url" />
        <setdest host="[$host]" port="[$port]" protocol="[$transport]" />
     </action>
  </nop>
  ]]></source>
  <warning>If you are using setdest with IPv6, you must not use square brackets around the address. These have a special meaning to SIPp, and it will try to interpret your IPv6 address as a variable.<br/>
  Since the port is specified separately, square brackets are never necessary.</warning>
  </section>


                  <anchor id="action_verifyauth"/><section><title>verifyauth</title>
		  <p>The verifyauth action checks the Authorization header in
		  an incoming message against a provided username and password.
		  The result of the check is stored in a boolean variable.
		  This allows you to simulate a server which requires
		  authorization.  Currently only simple MD5 digest
		  authentication is supported.  Before using the verifyauth
		  action, you must send a challenge.  For example:</p>

                  <source xml:space="preserve"><![CDATA[  <recv request="REGISTER" />
  <send><![CDATA[

      SIP/2.0 401 Authorization Required
      [last_Via:]
      [last_From:]
      [last_To:];tag=[pid]SIPpTag01[call_number]
      [last_Call-ID:]
      [last_CSeq:]
      Contact: <sip:[local_ip]:[local_port];transport=[transport]>
      WWW-Authenticate: Digest realm="test.example.com", nonce="47ebe028cda119c35d4877b383027d28da013815"
      Content-Length: [len]

    ]]]]><![CDATA[>
  </send>
]]></source>
		<p>After receiving the second request, you can extract the username provided and compare it against a list of user names and passwords provided as an injection file, and take the appropriate action based on the result:</p>
		<source xml:space="preserve"><![CDATA[<recv request="REGISTER" />
        <action>
                <ereg regexp="Digest .*username=\"([^\"]*)\"" search_in="hdr" header="Authorization:" assign_to="junk,username" />
                <lookup assign_to="line" file="users.conf" key="[$username]" />
                <verifyauth assign_to="authvalid" username="[field0 line=\"[$line]\"]" password="[field3 line=\"[$line]\"]" />
        </action>
  </recv>

  <nop hide="true" test="authvalid" next="goodauth" />
  <nop hide="true" next="badauth" />]]></source>


		  </section>

            </section>
            <anchor id="variables"/><section><title>Variables</title>
	      <p>For complex scenarios, you will need to store bits of
	      information that can be used across messages or even calls.
	      Like other programming languages, SIPp's XML scenario definition
	      allows you to use variables for this purpose.  A variable in SIPp
	      is referenced by an alphanumeric name.  In past versions of SIPp,
	      variables names were numeric only; thus in this document and the
	      embedded scenarios, you are likely to see lots of variables of
	      the form "1", "2", etc.; although when creating new scenarios you
	      are encouraged to assign meaningful names to your variables.</p>
	      <p>Aside from a name, SIPp's variables are also loosely typed.  The
	      type of a variable is not explicitly declared, but is instead
	      inferred from the action that set it.  There are four types of variables:
	      string, regular expression matches, doubles, and booleans.  All
	      mathematical operations take place on doubles.  The
	      <strong>&lt;test&gt;</strong> and
	      <strong>&lt;verifyauth&gt;</strong> actions create boolean
	      values.  String variables and regular expression matches are
	      similar.  When a string's value is called for, a regular
	      expression match can be substituted.  The primary difference is
	      related to the <strong>test</strong> attribute (see <link href="#branching">Conditional Branching</link>).  If a
	      string has been defined, a test is evaluated to true.
	      However, for a regular expression variable, the regular
	      expression that set it must match for the test to evaluated to true.
	      Values can be converted to strings using the
	      <link href="#action_strings"><strong>&lt;assignstr&gt;</strong></link>
	      action.  Values can be converted to doubles using the <link href="#action_variables"><strong>&lt;todouble&gt;</strong></link> action.</p>
	     <p>Variables also have a scope, which is one of global to all
	     calls, per-user, or the default per-call.  A global variable can be used,
	     for example to store scenario configuration parameters or to keep
	     a global counter.  A user-variable when combined with the
	     <code>-users</code> option allows you to keep per-user state
	     across calls (e.g., if this user has already registered).
	     Finally, the default per-call variables are useful for copying
	     values from one SIP message to the next or controlling
	     branching.  Variables can be declared globally or per-user using the
	     following syntax:</p>
	     <source xml:space="preserve"><![CDATA[<Global variables="foo,bar" />
<User variables="baz,quux" />
]]></source>
	    <p>Local variables need not be declared.  To prevent programming
	    errors, SIPp performs very rudimentary checks to ensure that each
	    variable is used more than once in the scenario (this helps prevent
	    some typos from turning into hard to debug errors).  Unfortunately,
	    this can cause some complication with <link href="#action_regexp">regular expression matching</link>.  The regular
	    expression action must assign the entire matched expression to a
	    variable.  If you are only interested in checking the validity of
            the expression (i.e. the check_it attribute is set) or in capturing
	    a sub-expression, you must still assign the entire expression to a
            variable.  As this variable is likely only referenced once, you must
	    inform SIPp that you are knowingly using this variable once with
	    a Reference clause.  For example:</p>
	    <source xml:space="preserve"><![CDATA[<recv request="INVITE">
  <action>
    <ereg regexp="<sip:([^;@]*)" search_in="hdr" header="To:" assign_to="dummy,uri" />
  </action>
</recv>
<Reference variables="dummy" />
]]></source>

	    </section>
            <anchor id="inffile"/><section><title>Injecting values from an external CSV during calls</title>
                <p>You can use "<code>-inf file_name</code>" as a command line parameter
                to input values into the scenarios. The first line of the file should
                say whether the data is to be read in sequence (SEQUENTIAL), random
                order (RANDOM),  or in a user based manner (USER). Each line corresponds
		to one call and has one or more ';' delimited data fields and they can be
		referred as [field0], [field1], ... in the xml scenario file. Example:</p>
<source xml:space="preserve"><![CDATA[SEQUENTIAL
#This line will be ignored
Sarah;sipphone32
Bob;sipphone12
#This line too
Fred;sipphone94]]></source>
                <p>Will be read in sequence (first call will use first line,
                second call second line). At any place where the keyword
                "[field0]" appears in the scenario file, it will be replaced by
                either "Sarah", "Bob" or "Fred" depending on the call. At any
                place where the keyword "[field1]" appears in the scenario file,
                it will be replaced by either "sipphone32" or "sipphone12" or
                "sipphone94" depending on the call. At the end of the file, SIPp
                will re-start from the beginning. The file is not limited in
                size.</p>
		<p>You can override the default line selection strategy with the
		optional line argument.  For example:</p>
		<source xml:space="preserve"><![CDATA[[field0 line=1]]]></source>
		<p>Selects the second line in the file (the first line is line zero.
		The line parameters support keywords in the argument, so in
		conjunction with a lookup action it is possible to select
		values based on a key.</p>
                <p>The CSV file can contain comment lines. A comment line is
		a line that starts with a "#".</p>

                <p>As a picture says more than 1000 words, here is one:</p>
                <p><img src="images/sipp-02.gif" alt="Field injection"/></p>
                <p>Think of the possibilities of this feature. They are huge.</p>
		<p>It is possible to use more than one injection file, and is
		necessary when you want to select different types of data in different
		ways.  For example, when running a user-based benchmark, you may have
		a caller.csv with "USER" as the first line and a callee.csv
		with "RANDOM" as the first line.  To specify which CSV file is
		used, add the file= parameter to the keyword.  For example:</p>
		<source xml:space="preserve"><![CDATA[
INVITE sip:[field0 file="callee.csv"] SIP/2.0
From: sipp user <[field0 file="caller.csv"]>;tag=[pid]SIPpTag00[call_number]
To: sut user <[field0 file="callee.csv"]>
...]]></source>
		<p>Will select the destination user from callee.csv and the sending
		user from caller.csv.  If no file parameter is specified, then the
		first input file on the command line is used by default.</p>

		<section><title>PRINTF Injection files</title>
		<p>An extension of the standard injection file is a "PRINTF" injection file.  Often, an input file will has a repetitive nature such as:</p>
		<source xml:space="preserve"><![CDATA[
		USERS
		user000;password000
		user001;password001
		...
		user999;password999
		]]></source>
		<p>SIPp must maintain this structure in memory, which can reduce performance for very large injection files.  To eliminate this problem, SIPp can automatically generate such a structured file based on one or more template lines. For example:</p>
		<source xml:space="preserve"><![CDATA[
		USERS,PRINTF=999
		user%03d;password%03d
		]]></source>
		<p>Has the same logical meaning as the original example, yet
		SIPp only needs to store one entry in memory.  Each time a line
		is used; SIPp will replace %d with the requested line number
		(starting from zero).  Standard printf format decimal
		specifiers can be used.  When more than one template line is
		available, SIPp cycles through them.  This example:</p>
		<source xml:space="preserve"><![CDATA[
		USERS,PRINTF=4
		user%03d;password%03d;Foo
		user%03d;password%03d;Bar
		]]></source>
		<p>Is equivalent to the following injection file:</p>
		<source xml:space="preserve"><![CDATA[
		USERS
		user000;password000;Foo
		user001;password001;Bar
		user002;password002;Foo
		user003;password003;Bar
		]]></source>
		<p>The following parameters are used to control the behavior of
		printf injection files:</p>
		<table>
		  <caption>Printf Injection File Parameters</caption>
                  <tr>
                      <th colspan="1" rowspan="1">Parameter</th>
                      <th colspan="1" rowspan="1">Description</th>
                      <th colspan="1" rowspan="1">Example</th>
                  </tr>
                  <tr>
                      <td colspan="1" rowspan="1">PRINTF</td>
                      <td colspan="1" rowspan="1">How many virtual lines exist in this file.</td>
                      <td colspan="1" rowspan="1">PRINTF=10, creates 10 virtual lines</td>
                  </tr>
                  <tr>
                      <td colspan="1" rowspan="1">PRINTFMULTIPLE</td>
                      <td colspan="1" rowspan="1">Multiple the virtual line number by this value before generating the substitutions used.</td>
                      <td colspan="1" rowspan="1">PRINTF=10,PRINTFMULTIPLE=2 creates 10 virtual lines numbered 0,2,4,...,18.</td>
                  </tr>
                  <tr>
                      <td colspan="1" rowspan="1">PRINTFOFFSET</td>
                      <td colspan="1" rowspan="1">Add this value to the virtual line number before generating the substitutions used (applied after PRINTFMULTIPLE).</td>
                      <td colspan="1" rowspan="1">PRINTF=10,PRINTFOFFSET=100 creates 10 virtual lines numbered 100-109.  PRINTF=10,PRINTFMULTIPLE=2,PRINTFOFFSET=10 creates 10 users numbered 10,12,14,...28.</td>
                  </tr>
		</table>
		</section>
		<anchor id="infindex"/><section><title>Indexing Injection files</title>
		<p>The <code>-infindex</code> option allows you to generate an
		index of an injection file.  The arguments to <code>-infindex</code> are the
		injection file to index and the field number that should be
		indexed.  For example if you have an injection file that
		contains user names and passwords (as the following):</p>
		<source xml:space="preserve"><![CDATA[
		USERS
		alice,pass_A
		bob,pass_B
		carol,pass_C
		]]></source>
		<p>You may want to extract the password for a given user in the
		file.  To do this efficiently, SIPp must build an index for the
		first field (0).  Thus you would pass the argument
		<code>-infindex users.csv 0</code> (assuming the file is named
		users.csv).  SIPp will create an index that contains the
		logical entries {"alice" =&gt; 0, "bob" =&gt; 1, "carol" =&gt; 2}.  To
		extract a particular password, you can use the lookup action to
		store the line number into a variable (say $line) and then use
		the keyword<code>[field1 line="[$line]"]</code>.</p>

		</section>

            </section>
            <anchor id="branching"/><section><title>Conditional branching</title>
	      <section><title>Conditional branching in scenarios</title>
		      <p>It is possible to execute a scenario in a non-linear
		      way. You can jump from one part of the scenario to another for example 
		      when a message is received or if a call variable is set.</p>
		      <p>You define a label (in the xml) as <code>&lt;label id="n"/&gt;</code>
		      Where n is a number between 1 and 19 (we can easily have more if needed). 
		      The label commands go anywhere in the main scenario between other commands.
		      To any action command (send, receive, pause, etc.) you add a next="n"
		      parameter, where n matches the id of a label. <strong>When it has done the 
		      command</strong> it continues the scenario from that label. This part is
		      useful with optional receives like 403 messages, because it allows 
		      you to go to a different bit of script to reply to it and then 
		      rejoin at the BYE (or wherever or not).</p>

		      <p>Alternatively, if you add a <strong>test="m"</strong> parameter to the next, 
		      it goes to the label only if variable [$m] is set. This allows you 
		      to look for some string in a received packet and alter the 
		      flow either on that or a later part of the script.  The
		      evaluation of a test varies based on the type of call
                      variable.  For regular expressions, at least one match must have been found;
		      for boolean variables the value must be true; and for all others a value must
		      have been set (currently this only applies to doubles).  For more complicated
		      tests, see the <link href="#action_test">&lt;test&gt; action</link>.</p>


		      <warning>If you add special cases at the end, don&#8217;t forget to put 
		      a label at the real end and jump to it at the end of the normal flow.</warning>
		      <p><strong>Example:</strong></p>
		      <p>The following example corresponds to the embedded '<link href="#scenario_branch">branchc</link>' (client side) scenario.
		      It has to run against the embedded '<link href="#scenario_branch">branchs</link>' (server side) scenario.<br/>
		      <img alt="Conditional branching example" src="images/branching_01.gif"/><br/>
		      <img alt="Conditional branching example" src="images/branching_02.gif"/></p>
              </section>
	      <section><title>Randomness in conditional branching</title>
	        <p>To have SIPp behave somewhat more like a "normal" SIP client being used by a human, 
		it is possible to use "statistical branching". 
		Wherever you can have a conditional branch on a variable being set (test="4"), 
		you can also branch based on a statistical decision using the attribute 
		"chance" (e.g. chance="0.90"). Chance can have a value between 0 (never) 
		and 1 (always). "test" and "chance" can be combined, i.e. only 
		branching when the test succeeds and the chance is good.</p>
		<p>With this, you can have a variable reaction in a given scenario 
		(e.g.. answer the call or reject with busy), or run around in a
		loop (e.g. registrations) and break out of it after some random number of iterations.</p>
              </section>
            </section>
            <anchor id="authentication"/><section><title>SIP authentication</title>
              <p>SIPp supports SIP authentication. Two authentication algorithm are supported: Digest/MD5 ("algorithm="MD5"")
              and Digest/AKA ("algorithm="AKAv1-MD5"", as specified by 3GPP for IMS).</p>
              <p>Enabling authentication is simple. When receiving a 401 (Unauthorized)
              or a 407 (Proxy Authentication Required), you must add auth="true"
              in the &lt;recv&gt; command to take the challenge into account.
              Then, the authorization header can be re-injected in the next message
              by using [authentication] keyword.</p>
              <p>Computing the authorization header is done through the usage of the
              "[authentication]" keyword. Depending on the algorithm ("MD5" or "AKAv1-MD5"), 
              different parameters must be passed next to the authentication
              keyword:</p>
              
              <ul>
                <li>Digest/MD5 (example: [authentication username=joe password=schmo])
                  <ul>
                    <li><strong>username</strong>: username: if no username is specified, the username is taken from the '-au' (authentication username) or '-s' (service) command
              line parameter</li>
                    <li><strong>password</strong>: password: if no password is specified, the password is taken from the '-ap' (authentication
              password) command line parameter</li>
                  </ul>
                </li>
                <li>Digest/AKA: (example: [authentication username=HappyFeet aka_OP=0xCDC202D5123E20F62B6D676AC72CB318 aka_K=0x465B5CE8B199B49FAA5F0A2EE238A6BC aka_AMF=0xB9B9])
                  <ul>
                    <li><strong>username</strong>: username: if no username is specified, the username is taken from the '-au' (authentication username) or '-s' (service) command
              line parameter</li>
                    <li><strong>aka_K</strong>: Permanent secret key. If no aka_K is provided, the "password" attributed is used as aka_K.</li>
                    <li><strong>aka_OP</strong>: OPerator variant key</li>
                    <li><strong>aka_AMF</strong>: Authentication Management Field (indicates the algorithm and key in use)</li>
                  </ul>
                </li>
              </ul>
              <p>In case you want to use authentication with a different username/password or aka_K
              for each call, you can do this:</p>
              <ul>
                <li>Make a CSV like this: 
                <source xml:space="preserve"><![CDATA[SEQUENTIAL
User0001;[authentication username=joe password=schmo]
User0002;[authentication username=john password=smith]
User0003;[authentication username=betty password=boop]]]></source>
                </li>
                <li>And an XML like this (the [field1] will be substituted with the full auth string, which is the processed as a new keyword):
                <source xml:space="preserve"><![CDATA[<send retrans="500">
    <![CDATA[

      REGISTER sip:[remote_ip] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port]
      To: <sip:[field0]@sip.com:[remote_port]>
      From: <sip:[field0]@[remote_ip]:[remote_port]>
      Contact: <sip:[field0]@[local_ip]:[local_port]>;transport=[transport]
      [field1]
      Expires: 300
      Call-ID: [call_id]
      CSeq: 2 REGISTER
      Content-Length: 0

    ]]]]><![CDATA[>
  </send>
]]></source>
                </li>
              </ul>
              <p><strong>Example:</strong></p>
<source xml:space="preserve"><![CDATA[  <recv response="407" ]]><strong>auth="true"</strong><![CDATA[>
  </recv>

  <send>
    <![CDATA[

      ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port]
      From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
      To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
      Call-ID: [call_id]
      CSeq: 1 ACK
      Contact: sip:sipp@[local_ip]:[local_port]
      Max-Forwards: 70
      Subject: Performance Test
      Content-Length: 0

    ]]]]><![CDATA[>
  </send>

  <send retrans="500">
    <![CDATA[

      INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port]
      From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
      To: sut <sip:[service]@[remote_ip]:[remote_port]>
      Call-ID: [call_id]
      CSeq: 2 INVITE
      Contact: sip:sipp@[local_ip]:[local_port]
      ]]><strong>[authentication username=foouser]</strong><![CDATA[
      Max-Forwards: 70
      Subject: Performance Test
      Content-Type: application/sdp
      Content-Length: [len]

      v=0
      o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
      s=-
      t=0 0
      c=IN IP[media_ip_type] [media_ip]
      m=audio [media_port] RTP/AVP 0
      a=rtpmap:0 PCMU/8000

    ]]]]><![CDATA[>
  </send>

]]></source>
            </section>
	<anchor id="initstanza"/><section><title>Initialization Stanza</title>
	<p>Some complex scenarios require setting appropriate global variables
	at SIPp startup.  The initialization stanza allows you do do just that.
	To create an initialization stanza, simply surround a series of
	&lt;nop&gt; and &lt;label&gt; commands with &lt;init&gt; and
	&lt;/init&gt;.  These &lt;nop&gt;s are executed once at SIPp startup.
	The variables within the init stanza, except for globals, are not
	shared with calls.  For example, this init stanza sets $THINKTIME to 1
	if it is not already set (e.g., by the -set command line parameter).</p>
<source xml:space="preserve"><![CDATA[
<init>
	<!-- By Default THINKTIME is true. -->
	<nop>
		<action>
			<strcmp assign_to="empty" variable="THINKTIME" value="" />
			<test assign_to="empty" compare="equal" variable="empty" value="0" />
		</action>
	</nop>
	<nop condexec="empty">
		<action>
			<assignstr assign_to="THINKTIME" value="1" />
		</action>
	</nop>
</init>
]]></source>
	</section>
        </section>
        <section><title>Screens</title>
            <p>Several screens are available to monitor SIP traffic. You can 
            change the screen view by pressing 1 to 9 keys on the keyboard.</p>
            <ul>
                <li>Key '1': Scenario screen. It displays a call flow of
                the scenario as well as some important informations.
                <p><img src="images/sipp-03.jpg" alt="Scenario screen"/></p>
                </li>
                <li><anchor id="stat_screen"/>Key '2': Statistics screen. It displays the main statistics
                counters. The "Cumulative" column gather all statistics, since
                SIPp has been launched. The "Periodic" column gives the statistic
                value for the period considered (specified by <code>-f frequency</code> command
                line parameter).
                <p><img src="images/sipp-04.jpg" alt="Statistics screen"/></p>
                </li>
                <li>Key '3': Repartition screen. It displays the distribution
                of response time and call length, as specified in the scenario.
                <p><img src="images/sipp-05.jpg" alt="Repartition screen"/></p></li>
                <li>Key '4': Variables screen. It displays informations on
                actions in scenario as well as scenario variable informations.
                <p><img src="images/sipp-06.jpg" alt="Variables screen "/></p></li>
            </ul>
        </section>
        <section><title>Transport modes</title>
            <p>SIPp has several transport modes. The default transport mode is 
            "UDP mono socket".</p>
            <section><title>UDP mono socket</title>
                <p>In UDP mono socket mode (<code>-t u1</code> command line parameter),
                one IP/UDP socket is opened between SIPp and the remote. All calls
                are placed using this socket.</p>
                <p>This mode is generally used for emulating a relation
                between 2 SIP servers.</p>
            </section>
            <section><title>UDP multi socket</title>
                <p>In UDP multi socket mode (<code>-t un</code> command line parameter),
                one IP/UDP socket is opened for each new call between SIPp and the remote.</p>
                <p>This mode is generally used for emulating user agents calling a SIP server.</p>
            </section>
            <section><title>UDP with one socket per IP address</title>
                <p>In UDP with one socket per IP address mode (<code>-t ui</code> command line parameter),
                one IP/UDP socket is opened for each IP address given in the <link href="#inffile">inf file</link>.</p>
                <p>In addition to the "-t ui" command line parameter, one must indicate which field in the
                inf file is to be used as local IP address for this given call. Use "-ip_field &lt;nb&gt;"
                to provide the field number.</p>
                <p>There are two distinct cases to use this feature:</p>
                <ul><li>Client side: when using -t ui for a client, SIPp will originate each call
                with a different IP address, as provided in the inf file. In this case,
                when your IP addresses are in field X of the inject file, 
                then you have to use [fieldX] instead of [local_ip] in your UAC XML scenario file. </li>
                <li>Server side: when using -t ui for a server, SIPp will bind itself
                to all the IP addresses listed in the inf file instead of using 0.0.0.0. This
                will have the effect SIPp will answer the request on the same IP on which 
                it received the request. In order to have proper Contact and Via fields,
                a keyword [server_ip] can be used and provides the IP address on
                which a request was received. So when using this, you have to replace the [local_ip] in
                your UAS XML scenario file by [server_ip].</li></ul>
                <p>In the following diagram, the command line for a client scenario will look like: 
                <code>./sipp -sf myscenario.xml -t ui -inf database.csv -ip_field 2 192.168.1.1</code><br/>
                By doing so, each new call will come sequentially from IP 192.168.0.1, 192.168.0.2, 192.168.0.3, 192.168.0.1, ...<br/><br/>
                <img alt="One originating IP per call" src="images/sipp-03.gif"/></p>
                <p>This mode is generally used for emulating user agents, using on IP address
                per user agent and calling a SIP server.</p>
            </section>
            <section><title>TCP mono socket</title>
                <p>In TCP mono socket mode (<code>-t t1</code> command line parameter),
                one IP/TCP socket is opened between SIPp and the remote. All calls
                are placed using this socket.</p>
                <p>This mode is generally used for emulating a relation between 2 SIP servers.</p>
            </section>
            <section><title>TCP multi socket</title>
                <p>In TCP multi socket mode (<code>-t tn</code> command line parameter),
                one IP/TCP socket is opened for each new call between SIPp and the remote.</p>
                <p>This mode is generally used for emulating user agents calling a SIP server.</p>
            </section>
            <section><title>TCP reconnections</title>
                <p>SIPp handles TCP reconnections. In case the TCP socket is lost,
                SIPp will try to reconnect. The following parameters on the command line
                control this behaviour:</p>
                <ul>
                  <li><strong>-max_reconnect</strong>: Set the maximum number of reconnection attempts.</li>
                  <li><strong>-reconnect_close true/false</strong>: Should calls be closed on reconnect?</li>
                  <li><strong>-reconnect_sleep int</strong>: How long to sleep (in milliseconds) between the close and reconnect? </li>
                </ul>
            </section>
            <anchor id="tls"/><section><title>TLS mono socket</title>
                <p>In TLS mono socket mode (<code>-t l1</code> command line parameter),
                one secured TLS (Transport Layer Security) socket is opened between SIPp and the remote. All calls
                are placed using this socket.</p>
                <p>This mode is generally used for emulating a relation between 2 SIP servers.</p>
                <warning>When using TLS transport, SIPp will expect to have two files in the current
                directory: a certificate (cacert.pem) and a key (cakey.pem). 
                If one is protected with a password, SIPp will
                ask for it.</warning>
                <p>SIPp supports X509's CRL (Certificate Revocation List). The CRL is 
                read and used if <code>-tls_crl</code> command line specifies
                a CRL file to read.</p>
            </section>
            <section><title>TLS multi socket</title>
                <p>In TLS multi socket mode (<code>-t ln</code> command line parameter),
                one secured TLS (Transport Layer Security) socket is opened for each new call between SIPp and the remote.</p>
                <p>This mode is generally used for emulating user agents calling a SIP server.</p>
            </section>
            <anchor id="sctp"/><section><title>SCTP mono socket</title>
                <p>In SCTP mono socket mode (<code>-t s1</code> command line parameter),
                one SCTP (Stream Transmission Control Protocol) socket is opened between SIPp and the remote. All calls
                are placed using this socket.</p>
                <p>This mode is generally used for emulating a relation between 2 SIP servers.</p>
                <p>The <code>-multihome, -heartbeat, -assocmaxret, -pathmaxret,  -pmtu </code> and <code>-gracefulclose</code> command-line arguments allow control over specific features of the SCTP protocol, but are usually not necessary.</p> 
            </section>
            <section><title>SCTP multi socket</title>
                <p>In SCTP multi socket mode (<code>-t sn</code> command line parameter),
                one SCTP socket is opened for each new call between SIPp and the remote.</p>
                <p>This mode is generally used for emulating user agents calling a SIP server.</p>
            </section>
            <anchor id="ipv6"/><section><title>IPv6 support</title>
                <p>SIPp includes IPv6 support. To use IPv6, just specify the local
                IP address (-i command line parameter) to be an IPv6 IP address.</p>
                <p>The following example launches a UAS server listening on port 5063 and a UAC client sending
                IPv6 traffic to that port.</p>
                <source xml:space="preserve"><![CDATA[./sipp -sn uas -i [fe80::204:75ff:fe4d:19d9] -p 5063
./sipp -sn uac -i [fe80::204:75ff:fe4d:19d9] [fe80::204:75ff:fe4d:19d9]:5063
                ]]></source>
                <warning>The Pcap play feature may currently not work on IPv6.</warning>
            </section>
            <anchor id="maxsocket"/><section><title>Multi-socket limit</title>
                <p>When using one of the "multi-socket" transports, the maximum number of sockets that can be opened
                (which corresponds to the number of simultaneous calls) will be determined by
                the system (see <link href="#filedesc">how to increase file descriptors section</link> to
                modify those limits). You can also limit the number of socket used by using the <code>-max_socket</code>
                command line option. Once the maximum number of opened sockets is reached,
                the traffic will be distributed over the sockets already opened.
                </p>
            </section>
        </section>
        <section><title>Handling media with SIPp</title>
          <p>SIPp is originally a signalling plane traffic generator. There is a limited
          support of media plane (RTP).</p>
          <section><title>RTP echo</title>
            <p>The "RTP echo" feature allows SIPp to listen to one or two local IP
            address and port (specified using <code>-mi</code> and
            <code>-mp</code> command line parameters) for RTP media. Everything
            that is received on this address/port is echoed back to the
            sender.</p>
            <p>RTP/UDP packets coming on this port + 2 are also echoed to their sender (used for
            sound and video echo).</p>
          </section>
          <anchor id="pcapplay"/><section><title>PCAP Play</title>
            <p>The PCAP play feature makes use of the <link href="http://www.tcpdump.org/pcap3_man.html">PCAP library</link>
            to replay pre-recorded RTP streams towards a destination. RTP streams can be 
            recorded by tools like <link href="http://www.wireshark.org/">Wireshark</link>
            (formerly known as Ethereal) or <link href="http://www.tcpdump.org/">tcpdump</link>. This allows you to:</p>
            <ul>
              <li>Play any RTP stream (voice, video, voice+video, out of band DTMFs/RFC 2833, T38 fax, ...)</li>
              <li>Use any codec as the codec is not handled by SIPp</li>
              <li>Emulate precisely the behavior of any SIP equipment as the 
              pcap play will try to replay the RTP stream as it was recorded (limited
              to the performances of the system).</li>
              <li>Reproduce exactly what has been captured using an IP sniffer like <link href="http://www.wireshark.org/">Wireshark</link>.</li>
            </ul>
            <p>A good example is the <link href="#uac_with_media">UAC with media</link> (uac_pcap) embedded scenario.</p>
            <p>SIPp comes with a G711 alaw pre-recorded pcap file and 
            out of band (RFC 2833) DTMFs in the pcap/ directory.</p>
            <warning>The PCAP play feature uses pthread_setschedparam calls from pthread library. 
            Depending on the system settings, you might need to be root to allow this. Please
            check "man 3 pthread_setschedparam" man page for details</warning>
            <p>More details on the possible PCAP play actions can be found in the <link href="#action_exec">action reference section</link>.</p>
            <!--<p>The latest info on this feature, tips and tricks can be found on <a href="http://sipp.sourceforge.net/wiki/index.php/Pcapplay" >SIPp wiki</a>.</p>-->
          </section>
        </section>
        <section><title>Exit codes</title>
            <p>To ease automation of testing, upon exit (on fatal error or when
            the number of asked calls (<code>-m</code> command line option) is
            reached, sipp exits with one of the following exit codes:</p>
            <ul>
                <li>0: All calls were successful</li>
                <li>1: At least one call failed</li>
                <li>97: exit on internal command. Calls may have been processed. Also exit on global timeout (see -timeout_global option) </li>
                <li>99: Normal exit without calls processed</li>
                <li>-1: Fatal error</li>
            </ul>
            <p>Depending on the system that SIPp is running on, you can echo
            this exit code by using "<code>echo ?</code>" command.</p>
        </section>
        <section><title>Statistics</title>
            <section><title>Response times</title>
		 <p>Response times can be gathered and reported. Response time
		names can be arbitrary strings, but for backwards compatibility
		the value "true" is treated as if it were named "1".  Each
		response time can be used to compute time between
                 two SIPp commands (send, recv or nop). You can start a timer
                 by using the <link href="#start_rtd">start_rtd</link> attribute
                 and stop it using the <link href="#rtd">rtd</link> attribute.</p>
                 <p>You can view the value of those timers in the SIPp interface
                 by pressing 3, 6, 7, 8 or 9. You can also save the values 
                 in a CSV file using the -trace_stat option (see below).</p>
                 <p>If the -trace_rtt option is set, the response times are also dumped
                 in the &gt;scenario file name&lt;_&gt;pid&lt;_rtt.csv.</p>
                 <p>Each line represents a RTD measure (triggered by a message reception with a rtd="n" attribute).
                 The dump frequency is tuned by the -rtt_freq parameter.</p>
            </section>
            <section><title>Available counters</title>
                <p>The <code>-trace_stat</code> option dumps all statistics in
                the scenario_name_pid.csv file. The dump starts with one header line
                with all counters. All following lines are 'snapshots' of
                statistics counter given the statistics report frequency (-fd
                option). When SIPp exits, the last values of the statistics
                are also dumped in this file.</p>
                <p>This file can be easily imported in any spreadsheet
                application, like Excel.</p>
                <p>In counter names, (P) means 'Periodic' - since last statistic
                row and (C) means 'Cumulated' - since sipp was started.</p>
<anchor id="stats"/><p>Available statistics are:</p>
  <ul>
    <li>StartTime: 
    Date and time when the test has started.</li>
    <li>LastResetTime:
    Date and time when periodic counters where last reseted.</li>
    <li>CurrentTime:
    Date and time of the statistic row.</li>
    <li>ElapsedTime:
    Elapsed time.</li>
    <li>CallRate:
    Call rate (calls per seconds).</li>
    <li>IncomingCall:
    Number of incoming calls.</li>
    <li>OutgoingCall:
    Number of outgoing calls.</li>
    <li>TotalCallCreated:
    Number of calls created.</li>
    <li>CurrentCall:
    Number of calls currently ongoing.</li>
    <li>SuccessfulCall:
    Number of successful calls.</li>
    <li>FailedCall:
    Number of failed calls (all reasons).</li>
    <li>FailedCannotSendMessage:
    Number of failed calls because Sipp cannot send the
    message (transport issue).</li>
    <li>FailedMaxUDPRetrans:
    Number of failed calls because the maximum number of
    UDP retransmission attempts has been reached.</li>
    <li>FailedUnexpectedMessage:
    Number of failed calls because the SIP message received
    is not expected in the scenario.</li>
    <li>FailedCallRejected:
    Number of failed calls because of Sipp internal error.
    (a scenario sync command is not recognized or a scenario
    action failed or a scenario variable assignment failed).</li>
    <li>FailedCmdNotSent:
    Number of failed calls because of inter-Sipp
    communication error (a scenario sync command failed to
    be sent).</li>
    <li>FailedRegexpDoesntMatch:
    Number of failed calls because of regexp that doesn't
    match (there might be several regexp that don't match
    during the call but the counter is increased only by
    one).</li>
    <li>FailedRegexpShouldntMatch:
    Number of failed calls because of regexp that shouldn't
    match (there might be several regexp that shouldn't match
    during the call but the counter is increased only by
    one).</li>
    <li>FailedRegexpHdrNotFound:
    Number of failed calls because of regexp with hdr    
    option but no matching header found.</li>
    <li>FailedOutboundCongestion:
    Number of failed outgoing calls because of TCP congestion. </li>
    <li>FailedTimeoutOnRecv:
    Number of failed calls because of a recv timeout statement.</li>
    <li>FailedTimeoutOnSend: 
    Number of failed calls because of a send timeout statement.</li>
    <li>OutOfCallMsgs:
    Number of SIP messages received that cannot be associated
    with an existing call.</li>
    <li>Retransmissions:
    Number of SIP messages being retransmitted.</li>
    <li>AutoAnswered:
    Number of unexpected specific messages received for new Call-ID.
    The message has been automatically answered by a 200 OK
    Currently, implemented for 'PING' message only.</li>
    </ul>
    <p>The counters defined in the scenario are also dumped in the stat file.  Counters that have a numeric name are identified by the GenericCounter columns. </p>
    <p>In addition, two other statistics are gathered:</p>
    <ul><li>ResponseTime (see previous section)</li>
    <li>CallLength: this is the time of the duration of an entire call.</li>
    </ul>
    <p>Both ResponseTime and CallLength statistics can be tuned using <link href="#resptimerep">ResponseTimeRepartition</link>
    and <link href="#calllengthrep">CallLengthRepartition</link> commands in the scenario.</p>
    <p>The standard deviation (STDev) is also available in the log stat file for these two statistics.</p>
            </section>
            <section><title>Detailed Message Counts</title>
		 <p>The SIPp screens provide detailed information about the
number of messages sent or recieved, retransmissions, messages lost, and the
number of unexpected messages for each scenario element.  Although these
screens can be parsed, it is much simpler to parse a CSV file.  To produce a
CSV file that contains the per-message information contained in the main
display screen pass the -trace_counts option.  Each column of the file
represents a message and a particular count of interest (e.g., "1_INVITE_Sent"
or "2_100_Unexp").  Each row corresponds to those statistics at a given
statistics reporting interval.</p>
            </section>
            <section><title>Importing statistics in spreadsheet applications</title>
                <section><title>Example: importation in Microsoft Excel</title>
                  <p>Here is a video (Windows Media Player 9 codec or above
                  required) on how to import CSV statistic files in Excel and
                  create a graph of failed calls over time.</p>
                  <p><icon src="images/wmv.gif" alt="wmv"/><link href="images/sipp-02.wmv">sipp-02.wmv</link></p>
                </section>
            </section>
        </section>
        <section><title>Error handling</title>
            <p>SIPp has advanced feature to handle errors and unexpected events. 
            They are detailed in the following sections.</p>
            <section><title>Unexpected messages</title>
                <ul>
                    <li>When a SIP message that <strong>can</strong> be
                    correlated to an existing call (with the
                    <code>Call-ID:</code> header) but is not expected in the
                    scenario is received, SIPp will send a CANCEL message if no
                    200 OK message has been received or a BYE message if a 200
                    OK message has been received. The call will be marked 
                    as failed. If the unexpected message is a 4XX or 5XX,
                    SIPp will send an ACK to this message, close the call
                    and mark the call as failed.</li>
                    <li>When a SIP message that <strong>can't</strong> be
                    correlated to an existing call (with the
                    <code>Call-ID:</code> header) is received, SIPp will send a
                    BYE message. The call will not be counted at all.</li>
                    <li>When a SIP "PING" message is received, SIPp will send
                    an ACK message in response. This message is not counted as 
                    being an unexpected message. But it is counted in the "AutoAnswered"
                    <link href="#stats">statistic counter</link>.
                    </li>
                    <li>An unexpected message that is not a SIP message will
                    be simply dropped.</li>
                </ul>
            </section>
            <section><title>Retransmissions (UDP only)</title>
                <p>A retransmission mechanism exists in UDP transport mode. 
                To activate the retransmission mechanism, the "send" command must include
                the "retrans" attribute.</p>
                <p>When it is activated and a SIP message is sent and no ACK or
                response is received in answer to this message, the message is
                re-sent.</p>
                <note>The retransmission mechanism follows RFC 3261, section 17.1.1.2. 
                Retransmissions are differentiated between INVITE and non-INVITE 
                methods.</note>
                <p><code>&lt;send retrans="500"&gt;</code>: will initiate the T1 timer
                to 500 milliseconds.</p>
                <p>Even if retrans is specified in your scenarios, you can override this by 
                using the <code>-nr</code> command line option to globally disable the
                retransmission mechanism.</p>
            </section>
            <section><title>Log files </title>
                <p>There are several ways to trace what is going on during your SIPp runs.</p>
                <ul>
                    <li>You can log sent and received SIP messages in &lt;name_of_the_scenario&gt;_&lt;pid&gt;_messages.log by
                    using the command line parameter <code>-trace_msg</code>. The messages are time-stamped so that you
                    can track them back.</li>
                    <li>You also can trace it using the <code>-trace_shortmsg</code> parameter. This logs the most important
	                values of a message as CSV into one line of the &lt;scenario file name&gt;_&lt;pid&gt;_shortmessages.log </li>
                    <li>You can trace all unexpected messages or events in &lt;name_of_the_scenario&gt;_&lt;pid&gt;_errors.log by using
                    the command line parameter <code>-trace_err</code>.</li>
                    <li>You can trace the counts from the main scenario screen in &lt;name_of_the_scenario&gt;_&lt;pid&gt;_counts.csv by using
                    the command line parameter <code>-trace_counts</code>.</li>
                    <li>You can trace the messages and state transitions of
                    failed calls in &lt;name_of_the_scenario&gt;_&lt;pid&gt;_calldebug.log using
                    the <code>-trace_calldebug</code> command line parameter.  This is useful,
                    because it has less overhead than <code>-trace_msg</code> yet allows you to
                    debug call flows that were not completed successfully.</li>
                    <li>You can save in a file the statistics screens, as displayed in
                    the interface. This is especially useful when running SIPp in background
                    mode. <br/>
                    This can be done in different ways:
                        <ul>
                          <li>When SIPp exits to get a final status report (-trace_screen option)</li>
                          <li>On demand by using USR2 signal (example: <code>kill -SIGUSR2 738</code>)</li>
                          <li>By pressing 's' key (if -trace_screen option is set)</li>
                          <li>If the -trace_logs option is set, you can use the <code>&lt;log&gt;</code> action to print some scenario traces in the &lt;scenario file name&gt;_&lt;pid&gt;_logs.log file.  See the <link href="#action_log">Log action section </link></li>
                        </ul>
                    </li>
                </ul>
		<p>SIPp can treat the messages, short messages, logs, and error logs as ring buffers.  This allows you to limit the total amount of space used by these log files and keep only the most recent messages.  To set the maximum file size use the <code>-ringbuffer_size</code> option.  Once the file exceeds this size (the file size can be exceeded up to the size of a single log message), it is rotated.  SIPp can keep several of the most recent files, to specify the number of files to keep use the <code>-ringbuffer_files</code> option.  The rotated files have a name of the form &lt;name_of_the_scenario&gt;_&lt;pid&gt;_&lt;logname&gt;_&lt;date&gt;.log, where &lt;date&gt; is the number of seconds since the epoch.  If more than one log file is rotated during a one second period, then the date is expressed as &lt;seconds.serial&gt;, where serial is an increasing integer identifier.</p>
            </section>
        </section>
        <section><title>Online help (-h)</title>
          <p>The online help, available through the -h option is duplicated here for your
          convenience</p>
      <source xml:space="preserve"><![CDATA[
  Usage:

  sipp remote_host[:remote_port] [options]

  Available options:

   -v               : Display version and copyright information.

   -aa              : Enable automatic 200 OK answer for INFO, UPDATE and
                      NOTIFY messages.

   -auth_uri        : Force the value of the URI for authentication.
                      By default, the URI is composed of
                      remote_ip:remote_port.

   -au              : Set authorization username for authentication challenges.
                      Default is taken from -s argument

   -ap              : Set the password for authentication challenges. Default
                      is 'password'

   -base_cseq       : Start value of [cseq] for each call.

   -bg              : Launch SIPp in background mode.

   -bind_local      : Bind socket to local IP address, i.e. the local IP
                      address is used as the source IP address.  If SIPp runs
                      in server mode it will only listen on the local IP
                      address instead of all IP addresses.

   -buff_size       : Set the send and receive buffer size.

   -calldebug_file  : Set the name of the call debug file.

   -calldebug_overwrite: Overwrite the call debug file (default true).

   -cid_str         : Call ID string (default %u-%p@%s).  %u=call_number,
                      %s=ip_address, %p=process_number, %%=% (in any order).

   -ci              : Set the local control IP address

   -cp              : Set the local control port number. Default is 8888.

   -d               : Controls the length of calls. More precisely, this
                      controls the duration of 'pause' instructions in the
                      scenario, if they do not have a 'milliseconds' section.
                      Default value is 0 and default unit is milliseconds.

   -deadcall_wait   : How long the Call-ID and final status of calls should be
                      kept to improve message and error logs (default unit is
                      ms).

   -default_behaviors: Set the default behaviors that SIPp will use.  Possbile
                      values are:
                      - all Use all default behaviors
                      - none    Use no default behaviors
                      - bye Send byes for aborted calls
                      - abortunexp  Abort calls on unexpected messages
                      - pingreply   Reply to ping requests
                      If a behavior is prefaced with a -, then it is turned
                      off.  Example: all,-bye
                      

   -error_file      : Set the name of the error log file.

   -error_overwrite : Overwrite the error log file (default true).

   -f               : Set the statistics report frequency on screen. Default is
                      1 and default unit is seconds.

   -fd              : Set the statistics dump log report frequency. Default is
                      60 and default unit is seconds.

   -i               : Set the local IP address for 'Contact:','Via:', and
                      'From:' headers. Default is primary host IP address.
                      

   -inf             : Inject values from an external CSV file during calls into
                      the scenarios.
                      First line of this file say whether the data is to be
                      read in sequence (SEQUENTIAL), random (RANDOM), or user
                      (USER) order.
                      Each line corresponds to one call and has one or more
                      ';' delimited data fields. Those fields can be referred
                      as [field0], [field1], ... in the xml scenario file. 
                      Several CSV files can be used simultaneously (syntax:
                      -inf f1.csv -inf f2.csv ...)

   -infindex        : file field
                      Create an index of file using field.  For example -inf
                      users.csv -infindex users.csv 0 creates an index on the
                      first key.

   -ip_field        : Set which field from the injection file contains the IP
                      address from which the client will send its messages.
                      If this option is omitted and the '-t ui' option is
                      present, then field 0 is assumed.
                      Use this option together with '-t ui'

   -l               : Set the maximum number of simultaneous calls. Once this
                      limit is reached, traffic is decreased until the number
                      of open calls goes down. Default:
                        (3 * call_duration (s) * rate).

   -log_file        : Set the name of the log actions log file.

   -log_overwrite   : Overwrite the log actions log file (default true).

   -lost            : Set the number of packets to lose by default (scenario
                      specifications override this value).

   -rtcheck         : Select the retransmisison detection method: full
                      (default) or loose.

   -m               : Stop the test and exit when 'calls' calls are processed

   -mi              : Set the local media IP address (default: local primary
                      host IP address)

   -master          : 3pcc extended mode: indicates the master number

   -max_recv_loops  : Set the maximum number of messages received read per
                      cycle. Increase this value for high traffic level.  The
                      default value is 1000.

   -max_sched_loops : Set the maximum number of calsl run per event loop.
                      Increase this value for high traffic level.  The default
                      value is 1000.

   -max_reconnect   : Set the the maximum number of reconnection.

   -max_retrans     : Maximum number of UDP retransmissions before call ends on
                      timeout.  Default is 5 for INVITE transactions and 7 for
                      others.

   -max_invite_retrans: Maximum number of UDP retransmissions for invite
                      transactions before call ends on timeout.

   -max_non_invite_retrans: Maximum number of UDP retransmissions for non-invite
                      transactions before call ends on timeout.

   -max_log_size    : What is the limit for error and message log file sizes.

   -max_socket      : Set the max number of sockets to open simultaneously.
                      This option is significant if you use one socket per
                      call. Once this limit is reached, traffic is distributed
                      over the sockets already opened. Default value is 50000

   -mb              : Set the RTP echo buffer size (default: 2048).

   -message_file    : Set the name of the message log file.

   -message_overwrite: Overwrite the message log file (default true).

   -mp              : Set the local RTP echo port number. Default is 6000.

   -nd              : No Default. Disable all default behavior of SIPp which
                      are the following:
                      - On UDP retransmission timeout, abort the call by
                        sending a BYE or a CANCEL
                      - On receive timeout with no ontimeout attribute, abort
                        the call by sending a BYE or a CANCEL
                      - On unexpected BYE send a 200 OK and close the call
                      - On unexpected CANCEL send a 200 OK and close the call
                      - On unexpected PING send a 200 OK and continue the call
                      - On any other unexpected message, abort the call by
                        sending a BYE or a CANCEL
                      

   -nr              : Disable retransmission in UDP mode.

   -nostdin         : Disable stdin.
                      

   -p               : Set the local port number.  Default is a random free port
                      chosen by the system.

   -pause_msg_ign   : Ignore the messages received during a pause defined in
                      the scenario 

   -periodic_rtd    : Reset response time partition counters each logging
                      interval.

   -plugin          : Load a plugin.

   -r               : Set the call rate (in calls per seconds).  This value can
                      bechanged during test by pressing '+','_','*' or '/'.
                      Default is 10.
                      pressing '+' key to increase call rate by 1 *
                      rate_scale,
                      pressing '-' key to decrease call rate by 1 *
                      rate_scale,
                      pressing '*' key to increase call rate by 10 *
                      rate_scale,
                      pressing '/' key to decrease call rate by 10 *
                      rate_scale.
                      If the -rp option is used, the call rate is calculated
                      with the period in ms given by the user.

   -rp              : Specify the rate period for the call rate.  Default is 1
                      second and default unit is milliseconds.  This allows
                      you to have n calls every m milliseconds (by using -r n
                      -rp m).
                      Example: -r 7 -rp 2000 ==> 7 calls every 2 seconds.
                               -r 10 -rp 5s => 10 calls every 5 seconds.

   -rate_scale      : Control the units for the '+', '-', '*', and '/' keys.

   -rate_increase   : Specify the rate increase every -fd units (default is
                      seconds).  This allows you to increase the load for each
                      independent logging period.
                      Example: -rate_increase 10 -fd 10s
                        ==> increase calls by 10 every 10 seconds.

   -rate_max        : If -rate_increase is set, then quit after the rate
                      reaches this value.
                      Example: -rate_increase 10 -rate_max 100
                        ==> increase calls by 10 until 100 cps is hit.

   -no_rate_quit    : If -rate_increase is set, do not quit after the rate
                      reaches -rate_max.

   -recv_timeout    : Global receive timeout. Default unit is milliseconds. If
                      the expected message is not received, the call times out
                      and is aborted.

   -send_timeout    : Global send timeout. Default unit is milliseconds. If a
                      message is not sent (due to congestion), the call times
                      out and is aborted.

   -sleep           : How long to sleep for at startup. Default unit is
                      seconds.

   -reconnect_close : Should calls be closed on reconnect?

   -reconnect_sleep : How long (in milliseconds) to sleep between the close and
                      reconnect?

   -ringbuffer_files: How many error/message files should be kept after
                      rotation?

   -ringbuffer_size : How large should error/message files be before they get
                      rotated?

   -rsa             : Set the remote sending address to host:port for sending
                      the messages.

   -rtp_echo        : Enable RTP echo. RTP/UDP packets received on port defined
                      by -mp are echoed to their sender.
                      RTP/UDP packets coming on this port + 2 are also echoed
                      to their sender (used for sound and video echo).

   -rtt_freq        : freq is mandatory. Dump response times every freq calls
                      in the log file defined by -trace_rtt. Default value is
                      200.

   -s               : Set the username part of the resquest URI. Default is
                      'service'.

   -sd              : Dumps a default scenario (embeded in the sipp executable)

   -sf              : Loads an alternate xml scenario file.  To learn more
                      about XML scenario syntax, use the -sd option to dump
                      embedded scenarios. They contain all the necessary help.

   -shortmessage_file: Set the name of the short message log file.

   -shortmessage_overwrite: Overwrite the short message log file (default true).

   -oocsf           : Load out-of-call scenario.

   -oocsn           : Load out-of-call scenario.

   -skip_rlimit     : Do not perform rlimit tuning of file descriptor limits. 
                      Default: false.

   -slave           : 3pcc extended mode: indicates the slave number

   -slave_cfg       : 3pcc extended mode: indicates the file where the master
                      and slave addresses are stored

   -sn              : Use a default scenario (embedded in the sipp executable).
                      If this option is omitted, the Standard SipStone UAC
                      scenario is loaded.
                      Available values in this version:
                      
                      - 'uac'      : Standard SipStone UAC (default).
                      - 'uas'      : Simple UAS responder.
                      - 'regexp'   : Standard SipStone UAC - with regexp and
                        variables.
                      - 'branchc'  : Branching and conditional branching in
                        scenarios - client.
                      - 'branchs'  : Branching and conditional branching in
                        scenarios - server.
                      
                      Default 3pcc scenarios (see -3pcc option):
                      
                      - '3pcc-C-A' : Controller A side (must be started after
                        all other 3pcc scenarios)
                      - '3pcc-C-B' : Controller B side.
                      - '3pcc-A'   : A side.
                      - '3pcc-B'   : B side.
                      

   -stat_delimiter  : Set the delimiter for the statistics file

   -stf             : Set the file name to use to dump statistics

   -t               : Set the transport mode:
                      - u1: UDP with one socket (default),
                      - un: UDP with one socket per call,
                      - ui: UDP with one socket per IP address The IP
                        addresses must be defined in the injection file.
                      - t1: TCP with one socket,
                      - tn: TCP with one socket per call,
                      - l1: TLS with one socket,
                      - ln: TLS with one socket per call,
                      - s1: SCTP with one socket (default),
                      - sn: SCTP with one socket per call,
                      - c1: u1 + compression (only if compression plugin
                        loaded),
                      - cn: un + compression (only if compression plugin
                        loaded).  This plugin is not provided with sipp.
                      

   -timeout         : Global timeout. Default unit is seconds.  If this option
                      is set, SIPp quits after nb units (-timeout 20s quits
                      after 20 seconds).

   -timeout_error   : SIPp fails if the global timeout is reached is set
                      (-timeout option required).

   -timer_resol     : Set the timer resolution. Default unit is milliseconds. 
                      This option has an impact on timers precision.Small
                      values allow more precise scheduling but impacts CPU
                      usage.If the compression is on, the value is set to
                      50ms. The default value is 10ms.

   -T2              : Global T2-timer in milli seconds

   -sendbuffer_warn : Produce warnings instead of errors on SendBuffer
                      failures.

   -trace_msg       : Displays sent and received SIP messages in <scenario file
                      name>_<pid>_messages.log

   -trace_shortmsg  : Displays sent and received SIP messages as CSV in
                      <scenario file name>_<pid>_shortmessages.log

   -trace_screen    : Dump statistic screens in the
                      <scenario_name>_<pid>_screens.log file when
                      quitting SIPp. Useful to get a final status report in
                      background mode (-bg option).

   -trace_err       : Trace all unexpected messages in <scenario file
                      name>_<pid>_errors.log.

   -trace_calldebug : Dumps debugging information about aborted calls to
                      <scenario_name>_<pid>_calldebug.log file.

   -trace_stat      : Dumps all statistics in <scenario_name>_<pid>.csv file.
                      Use the '-h stat' option for a detailed description of
                      the statistics file content.

   -trace_counts    : Dumps individual message counts in a CSV file.

   -trace_rtt       : Allow tracing of all response times in <scenario file
                      name>_<pid>_rtt.csv.

   -trace_logs      : Allow tracing of <log> actions in <scenario file
                      name>_<pid>_logs.log.

   -users           : Instead of starting calls at a fixed rate, begin 'users'
                      calls at startup, and keep the number of calls constant.

   -watchdog_interval: Set gap between watchdog timer firings.  Default is 400.

   -watchdog_reset  : If the watchdog timer has not fired in more than this
                      time period, then reset the max triggers counters. 
                      Default is 10 minutes.

   -watchdog_minor_threshold: If it has been longer than this period between watchdog
                      executions count a minor trip.  Default is 500.

   -watchdog_major_threshold: If it has been longer than this period between watchdog
                      executions count a major trip.  Default is 3000.

   -watchdog_major_maxtriggers: How many times the major watchdog timer can be tripped
                      before the test is terminated.  Default is 10.

   -watchdog_minor_maxtriggers: How many times the minor watchdog timer can be tripped
                      before the test is terminated.  Default is 120.

   -tls_cert        : Set the name for TLS Certificate file. Default is
                      'cacert.pem

   -tls_key         : Set the name for TLS Private Key file. Default is
                      'cakey.pem'

   -tls_crl         : Set the name for Certificate Revocation List file. If not
                      specified, X509 CRL is not activated.

   -3pcc            : Launch the tool in 3pcc mode ("Third Party call
                      control"). The passed ip address is depending on the
                      3PCC role.
                      - When the first twin command is 'sendCmd' then this is
                        the address of the remote twin socket.  SIPp will try to
                        connect to this address:port to send the twin command
                        (This instance must be started after all other 3PCC
                        scenarii).
                          Example: 3PCC-C-A scenario.
                      - When the first twin command is 'recvCmd' then this is
                        the address of the local twin socket. SIPp will open
                        this address:port to listen for twin command.
                          Example: 3PCC-C-B scenario.

   -tdmmap          : Generate and handle a table of TDM circuits.
                      A circuit must be available for the call to be placed.
                      Format: -tdmmap {0-3}{99}{5-8}{1-31}

   -key             : keyword value
                      Set the generic parameter named "keyword" to "value".

   -set             : variable value
                      Set the global variable parameter named "variable" to
                      "value".

   -multihome       : Set multihome address for SCTP

   -heartbeat       : Set heartbeat interval in ms for SCTP

   -assocmaxret     : Set association max retransmit counter for SCTP

   -pathmaxret      : Set path max retransmit counter for SCTP

   -pmtu            : Set path MTU for SCTP

   -gracefulclose   : If true, SCTP association will be closed with SHUTDOWN
                      (default).
                       If false, SCTP association will be closed by ABORT.
                      

   -dynamicStart    : variable value
                      Set the start offset of dynamic_id varaiable

   -dynamicMax      : variable value
                      Set the maximum of dynamic_id variable     

   -dynamicStep     : variable value
                      Set the increment of dynamic_id variable

Signal handling:

   SIPp can be controlled using posix signals. The following signals
   are handled:
   USR1: Similar to press 'q' keyboard key. It triggers a soft exit
         of SIPp. No more new calls are placed and all ongoing calls
         are finished before SIPp exits.
         Example: kill -SIGUSR1 732
   USR2: Triggers a dump of all statistics screens in
         <scenario_name>_<pid>_screens.log file. Especially useful 
         in background mode to know what the current status is.
         Example: kill -SIGUSR2 732

Exit code:

   Upon exit (on fatal error or when the number of asked calls (-m
   option) is reached, sipp exits with one of the following exit
   code:
    0: All calls were successful
    1: At least one call failed
   97: exit on internal command. Calls may have been processed
   99: Normal exit without calls processed
   -1: Fatal error
   -2: Fatal error binding a socket


Example:

   Run sipp with embedded server (uas) scenario:
     ./sipp -sn uas
   On the same host, run sipp with embedded client (uac) scenario
     ./sipp -sn uac 127.0.0.1


          ]]></source>
       </section>
    </section>
    <anchor id="perf"/><section><title>Performance testing with SIPp</title>
      <section><title>Advices to run performance tests with SIPp</title>
        <p>SIPp has been originally designed for SIP performance testing. Reaching 
        high call rates and/or high number of simultaneous SIP calls is possible
        with SIPp, provided that you follow some guidelines:</p>
        <ul>
          <li>Use an HP-UX, Linux or other *ix system to reach high performances. 
          The Windows port of SIPp (through CYGWIN) cannot handle high performances.</li>
          <li>Limit the traces to a minimum (usage of -trace_msg, -trace_logs
          should be limited to scenario debugging only)</li>
          <li>To reach a high number of simultaneous calls in multi-socket mode,
          you must increase the number of filedescriptors handled by your system. Check
          "<link href="#filedesc">Increasing File Descriptors Limit</link>" section for more details.</li>
          <li>Understand <link href="#scheduling">internal SIPp's scheduling mechanism</link> 
          and use the -timer_resol, -max_recv_loops and -up_nb command
          line parameters to tune SIPp given the system it is running on.</li>
        </ul>
        <p>Generally, running performance tests also implies measuring response
        times. You can use SIPp's timers (start_rtd, rtd in scenarios and -trace_rtt
        command line option) to measure those response times. The precision of those
        measures are entirely dependent on the timer_resol parameter
        (as described in "<link href="#scheduling">SIPp's internal scheduling</link>"
        section). You might want to use another "objective" method if 
        you want to measure those response times with a high precision (a tool
        like <link href="http://www.wireshark.org/">Wireshark</link> will allow you to do so).</p>
      </section>
      <anchor id="scheduling"/><section><title>SIPp's internal scheduling</title>
	<p>SIPp has a single-threaded event-loop architecture, which allows it to handle
	high SIP traffic loads.  SIPp's event loop tracks various tasks, most of which are
	the calls that are defined in your scenario.  In addition to tasks that represent
	calls there are several special tasks: a screen update task, a
	statistics update task, a call opening task, and a watchdog task.  SIPp's main
	execution loop consists of:</p>
	<ol>
		<li>Waking up tasks that have expired timers.</li>
		<li>Running up to max_sched_loop tasks that are in a running
		state (each call is executed until it is no longer runnable).</li>
		<li>Handling each of the sockets in turn, reading max_recv_loops messages
		from the various sockets.</li>
	</ol>
	<p>SIPp executes this loop continuously, until some condition tells it
	to stop (e.g., the user pressing the 'q' key or the global call limit
	or timeout being reached).</p>

        <p>Several parameters can be specified on the command line to fine tune
        this scheduling.</p>
        <ul>
          <li>timer_resol:
            during the main loop, the management of calls (management of wait,
            retransmission ...) is done for all calls, every "timer_resol" ms at
            best. The delay of retransmission must be higher than "timer_resol".
	    The default timer resolution is 1 millisecond, and that is the most
	    precise resolution that SIPp currently supports.  If you increase
	    this parameter, SIPp's traffic will be burstier and you are likely
	    to encounter retransmissions at high load.  If you have too many calls,
	    or each call takes too long, the timer resolution will not be
	    respected.</li>

          <li>max_recv_loops and max_sched_loops:
            received messages are read and treated in batch. "max_recv_loops" is the
            maximum number of messages that can be read at one time. "max sched loops" is
	    the maximum number of processing calls loops. These limits prevent
	    SIPp from reading and processing new messages from sockets to the
	    exclusion of processing existing calls, and vice versa.  For heavy
	    call rate, increase both values.  Be careful, those two parameters
	    have a large influence on the CPU occupation of SIPp.</li>

	  <li>watchdog_interval, watchdog_minor_threshold, watchdog_major_threshold,
	   watchdog_minor_maxtriggers, and watchdog_major_maxtriggers:
	   The watchdog timer is designed to provide feedback if your call load is
	   causing SIPp's scheduler to be overwhelmed.  The watchdog task sets a timer
	   that should fire every watchdog_interval milliseconds (by defualt
	   400ms).  If the timer is not serviced for more than
	   watchdog_minor_threshold milliseconds (by default 500s), then a
	   "minor" trigger is recorded.  If the number of minor triggers is more than
	   watchdog_minor_maxtriggers; the watchdog task terminates SIPp.  Similarly,
	   if the timer is not serviced for more than watchdog_major_threshold
	   milliseconds (by default 3000ms), then a major trigger is recorded; and if more
	   than watchdog_major_maxtriggers are recorded SIPp is terminated. If you only
	   see occasional messages, your test is likely acceptable, but if these events
	   are frequent you need to consider using a more powerful machine or
	   set of machines to run your scenario.</li> </ul>
      </section>
    </section>
    <section><title>Useful tools aside SIPp</title>
        <section><title>JEdit</title>
            <p>JEdit (<link href="http://www.jedit.org/">http://www.jedit.org/</link>) is a
            GNU GPL text editor written in Java, and available on almost all
            platforms. It's extremely powerful and can be used
            to edit SIPp scenarios with syntax checking if you put the DTD 
            (<link href="http://sipp.sourceforge.net/doc/sipp.dtd">sipp.dtd</link>)
            in the same directory as your XML scenario.</p>
        </section>
        <section><title>Wireshark/tshark</title>
            <p>Wireshark (<link href="http://www.wireshark.org/">http://www.wireshark.org/</link>) is a
            GNU GPL protocol analyzer. It was formerly known as Ethereal. It supports SIP/SDP/RTP.</p>
            <p/>
        </section>
        <section><title>SIP callflow</title>
            <p>When tracing SIP calls, it is very useful to be able 
            to get a call flow from an wireshark trace. The "callflow" tool allows you to do 
            that in a graphical way:
            <link href="http://callflow.sourceforge.net/">http://callflow.sourceforge.net/</link></p>
            <p>An equivalent exist if you want to generate HTML only call flows
            <link href="http://www.iptel.org/~sipsc/">http://www.iptel.org/~sipsc/</link></p>
        </section>
    </section>
    <section><title>Getting support</title>
        <p>You can likely get email-based support from the sipp users community. The mailing list address is 
        <link href="mailto:sipp-users@lists.sourceforge.net">sipp-users@lists.sourceforge.net</link>.
        To protect you from SPAM, this list is restricted (only people that actually subscribed can
        post). Also, you can browse the SIPp mailing list archive: 
        <link href="http://lists.sourceforge.net/lists/listinfo/sipp-users">http://lists.sourceforge.net/lists/listinfo/sipp-users</link></p>
    </section>
    <section><title>Contributing to SIPp</title>
        <p>Of course, we welcome contributions! If you created a feature 
        for SIPp, please send the "diff" output 
        (<code>diff -bruN old_sipp_directory new_sipp_directory</code>)
        on the <link href="http://lists.sourceforge.net/lists/listinfo/sipp-users">SIPp mailing list</link>, so that we can review and possibly integrate it in SIPp.</p>
    </section>
  </body>
</document>