Home Project Documentation Download Screenshots/videos

Seagull - SIP protocol

SIP protocol details

The implementation of SIP in Seagull conforms to SIP standards

Note

Seagull doesn't currently support "optional" messages. The messages actually exchanged must exactly match the scenario.

Getting started with SIP

First try

So that you can get familiar with Seagull in the context of SIP, here is an example that will launch the following SIP scenario:

 
 |(1) INVITE |
 |--------------------->| 
 |(2) 180 Ringing |
 |<---------------------| 
 |(3) 200 OK |
 |<---------------------| 
 |(4) ACK |
 |--------------------->|
 | |
 |(5) PAUSE |
 | |
 |(6) BYE |
 |--------------------->| 
 |(7) 200 OK |
 |<---------------------|

First try explained using external file

Here is the commented version of the SIP client using a external file to set fields

Scenario. You can also see the client XML scenario. Comments
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario>
<counter>
 <counterdef name="callid-counter" init="0"> </counterdef>
</counter>
<traffic>
 <send channel="channel-1">
 <action>
 
 <inc-counter name="callid-counter"> </inc-counter>
 
 <set-value name="call-id"
 format="$(callid-counter)@255.255.255.255"></set-value>
 
 <restore-from-external field="1" entity="call-id-addr"></restore-from-external>
 
 <store name="local_ip" entity="call-id-addr"></store>
 
 <set-value name="via"
 format="SIP/2.0/UDP 255.255.255.255"></set-value>
 <restore name="local_ip" entity="via-addr"></restore>
 
 <restore-from-external field="4" entity="via-transport"></restore-from-external>
 
 <set-value name="from"
 format="seagull <sip:seagull@255.255.255.255&gt;;tag=1"></set-value>
 
 <restore-from-external field="0" entity="from-name"></restore-from-external>
 
 <store name="local_name" entity="from-name"></store>
 <restore name="local_ip" entity="from-addr"></restore>
 
 <set-value name="to"
 format="sut <sip:service@255.255.255.255:5060&gt;"></set-value>
 
 <restore-from-external field="2" entity="to-name"></restore-from-external>
 <restore-from-external field="3" entity="to-addr"></restore-from-external>
 
 <restore name="local_name" entity="invite-name"></restore>
 <restore name="local_ip" entity="invite-addr"></restore>
 </action>
 <message>
 <! [ CDATA[INVITE sip:schooler@cs.caltech.edu SIP/2.0
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley $lt;sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu>
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE
 Subject: SIP will be discussed, too
 Content-Type: application/sdp
 Content-Length: 187]] >
 <![CDATA[v=0
 o=user1 53655765 2353687637 IN IP4 155.208.221.173
 s=Mbone Audio
 i=Discussion of Mbone Engineering Issues
 e=mbone@somewhere.com
 c=IN IP4 155.208.221.173
 t=0 0
 m=audio 3456 RTP/AVP 0
 a=rtpmap:0 PCMU/8000]] >
 </message>
 <action>
 
 <store name="SID" entity="call-id"></store>
 <store name="VIA" entity="via"></store>
 <store name="FROM" entity="from"></store>
 <store name="TO" entity="to"></store>
 </action>
 </send>
 <receive channel="channel-1">
 <message>
 
 <! [CDATA[SIP/2.0 180 Ringing
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley <sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE]] >
 </message>
 </receive>
 <receive channel="channel-1">
 <message>
 
 <! [CDATA[SIP/2.0 200 OK
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley <sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE
 Contact: sip:es@jove.cs.caltech.edu]] >
 </message>
 </receive>
<send channel="channel-1">
 <action>
 
 <restore name="SID" entity="call-id"></restore>
 <restore name="VIA" entity="via"></restore>
 <restore name="FROM" entity="from"></restore>
 <restore name="TO" entity="to"></restore>
 
 <restore name="local_name" entity="ack-name"></restore>
 <restore name="local_ip" entity="ack-addr"></restore>
 </action>
 <message>
 
 <! [ CDATA[ACK sip:es@jove.cs.caltech.edu SIP/2.0
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley <sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 ACK]] >
 </message>
 </send>
 <send channel="channel-1">
 <action>
 
 <restore name="SID" entity="call-id"></restore>
 <restore name="VIA" entity="via"></restore>
 <restore name="FROM" entity="from"></restore>
 <restore name="TO" entity="to"></restore>
 
 <restore name="local_name" entity="bye-name"></restore>
 <restore name="local_ip" entity="bye-addr"></restore>
 </action> 
 <message>
 
 <! [ CDATA[BYE sip:watson@y.bell-tel.com SIP/2.0
 Via: SIP/2.0/UDP c.bell-tel.com
 From: A. Bell <sip:a.g.bell@bell-tel.com>
 To: T. Watson <sip:t.watson@ieee.org> ;tag=35253448
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 2 BYE]] >
 </message>
 </send>
 <receive channel="channel-1">
 <message>
 
 <! [CDATA[SIP/2.0 200 OK
 Via: SIP/2.0/UDP c.bell-tel.com
 From: A. Bell <sip:a.g.bell@bell-tel.com>
 To: T. Watson <sip:t.watson@ieee.org> ;tag=35253448
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 2 BYE]] >
 </message>
 </receive>
</traffic>
</scenario>
XML header
The call id counter is declared and 
will be incremented for each new call
 
For each new call, increment the call-id and set the call-id field
 
 
 
 
 
Get address from the external file
 
Store it for other fields
 
Set the VIA field
 
 
 
Get protocol from external file
 
Set the From field
 
 
Get Name from external file
 
Store it for other fields 
 
 
Set the To field 
 
Get Name from external file
 
Get address from external file
 
Set the INVITE request address and name
 
 
Header
 
 
 
 
 
 
 
Body
 
 
 
 
 
 
 
 
Store completed fields for future msg
 
 
 
 
 
 
 
 
Header
 
 
 
 
 
 
Header
 
 
 
 
 
 
 
 
 
Restore fields
 
 
 
 
Set name and address in the Ack request
Header
 
 
 
 
 
 
 
 
Restore fields 
 
 
Set name and address in the BYE request
Header
 
 
 
 
 
 
 
 
Header
 
 
 
 
 
 
 

First try explained with configuration parameters

Here is the commented version of the SIP client using configuration parameters to set fields

In the configuration file, several parameters are added, for example:

<define entity="config-param" name="param_call-id-addr" value="127.0.0.1:5060"></define>
<define entity="config-param" name="param_via" value="SIP/2.0/UDP 127.0.0.1"></define>
<define entity="config-param" name="param_from" value="seagull <sip:seagull@127.0.0.1:5060>;tag=1"></define>
<define entity="config-param" name="param_to" value="sut <sip:service@127.0.0.1:5060>"></define>
 
They will be used in the sceanrio.

Scenario. You can also see the client XML scenario. Comments
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario>
<counter>
 <counterdef name="callid-counter" init="0"> </counterdef>
</counter>
<traffic>
 <send channel="channel-1">
 <action>
 <!-- For each new call, increment the callid counter -->
 <inc-counter name="callid-counter"> </inc-counter>
 <!-- And set the call-id field -->
 <set-value name="call-id"
 format="$(callid-counter)@127.0.0.1"></set-value>
 
 </action>
 <message>
 <!-- header -->
 <! [ CDATA[INVITE sip:$(param_call-id-addr) SIP/2.0
 Via: $(param_via)
 From: $(param_from)
 To: $(param_to)
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE
 Subject: SIP will be discussed, too
 Content-Type: application/sdp
 Content-Length: 187 ]] >
 <!-- body -->
 <![CDATA[v=0
 o=user1 53655765 2353687637 IN IP4 155.208.221.173
 s=Mbone Audio
 i=Discussion of Mbone Engineering Issues
 e=mbone@somewhere.com
 c=IN IP4 155.208.221.173
 t=0 0
 m=audio 3456 RTP/AVP 0
	 a=rtpmap:0 PCMU/8000]] >
 </message>
 <action>
 <!-- Store completed fields for future msg-->
 <store name="SID" entity="call-id"></store>
 </action>
 </send>
 <receive channel="channel-1">
 <message>
 <!-- header -->
 <! [CDATA[SIP/2.0 180 Ringing
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley <sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE]] >
 </message>
 </receive>
 <receive channel="channel-1">
 <message>
 <!-- header -->
 <! [CDATA[SIP/2.0 200 OK
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley <sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu> ;tag=9883472
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE
 Contact: sip:es@jove.cs.caltech.edu]] >
 </message>
 </receive>
 <send channel="channel-1">
 <action>
 <!-- restore fields -->
 <restore name="SID" entity="call-id"></restore>
 </action>
 <message>
 <!-- header -->
 <! [ CDATA[ACK sip:$(param_call-id-addr) SIP/2.0
 Via: $(param_via)
 From: $(param_from)
 To: $(param_to)
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 ACK]] >
 </message>
 </send>
 <send channel="channel-1">
 <action>
 <!-- restore fields -->
 <restore name="SID" entity="call-id"></restore>
 </action> <message>
 <!-- header -->
 <! [ CDATA[BYE sip:$(param_call-id-addr) SIP/2.0
 Via: $(param_via)
 From: $(param_from)
 To: $(param_to)
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 2 BYE]] >
 </message>
 </send>
 <receive channel="channel-1">
 <message>
 <!-- header -->
 <! [CDATA[SIP/2.0 200 OK
 Via: SIP/2.0/UDP c.bell-tel.com
 From: A. Bell <sip:a.g.bell@bell-tel.com>
 To: T. Watson <sip:t.watson@ieee.org>;tag=35253448
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 2 BYE]] >
 </message>
 </receive>
</traffic>
</scenario>
XML header
The call id counter is declared and 
will be incremented for each new call
 
First scenario command: send a INVITE message 
Action done before sending message
For each new call, increment the call-id and set the call-id field
 
 
 
 
Set the INVITE request address and name 
Header
Set address from the configuration parameter "param_call-id-addr"
Set Via from the configuration parameter "param_via" 
Set From from the configuration parameter "param_from"
Set To from the configuration parameter "param_to" 
 
 
Body 
Action done after sending message
Store session-id ("Call-id") field for future msg
 
 
 
scenario command: receive a 180 message 
 
 
Header
 
 
 
 
 
 
 
 
scenario command: receive a 200 message 
 
 
Header 
 
scenario command: send a ACK message 
 
Restore session-id in the "Call-id" field
 
 
Header 
 
 
 
 
 
 
 
scenario command: send a BYE message 
 
Restore session-id in the "Call-id" field
 
 
Header 
 
 
 
 
scenario command: receive a 200 message 
 
Header 
 

Miscellaneous considerations

Users must be aware of the fact that Seagull currently works only with "perfect" SIP scenarios. It means that the following messages are not properly handled:

  • Retransmissions (in reception)
  • INFO and NOTIFY messages
  • Optional responses

These points are currently in progress.

SIP authentication

Seagull supports two authentication algorithm: Digest/MD5 ("algorithm="MD5") and Digest/AKA ("algorithm="AKAv1-MD5").
Computing the authorization header is done through the usage of the "method" in a "set-value" action in the scenario.
Depending on the algorithm ("MD5" or "AKAv1-MD5"), different parameters must be passed next to the www-authentication field:

  • Digest/MD5:
    • username: username
    • password: password
    • auth: authentication parameters (example auth=Digest realm="cosims.net", nonce="b8Q2u9ZxyE3VKg6ZD3P07Wo6myth4AAArn7NvQlWWR4=", algorithm=MD5)
    • method: SIP method (example method=INVITE)
    • uri: Uniform Resource Identifier (example uri=sip:127.0.0.1:5061)
  • Digest/AKA:
    • username: username (example : username=joe)
    • aka_k: Permanent secret key (example : aka_k=0x465B5CE8B199B49FAA5F0A2EE238A6BC)
    • aka_op: OPerator variant key (example : aka_op=0xCDC202D5123E20F62B6D676AC72CB318)
    • aka_amf: Authentication Management Field (indicates the algorithm and key in use) (example aka_amf=0xB9B9)
    • auth: authentication parameters (example auth=Digest realm="cosims.net", nonce="b8Q2u9ZxyE3VKg6ZD3P07Wo6myth4AAArn7NvQlWWR4=", algorithm=AKAv1-MD5)
    • method: SIP method (example method=INVITE)
    • uri: Uniform Resource Identifier (example uri=sip:127.0.0.1:5061)

In case of authentication (example for AKA):

  • Add, in the dictionary, the external method:
  • <external-method>
     <defmethod name="authentication"
     param="lib=lib_crypto.so;function=crypto_method">
     </defmethod>
    </external-method>
    For now, "crypto_method" is the only available method.

  • and the field "www-authenfication" in the header:
  • <fielddef name="www-authentication"
     format="www-authentication: $(field-value)\r\n">
     <regexp name="auth"
     expr="[wW][wW][wW]-[aA][uU][tT][hH][eE][nN][tT][iI][cC][aA][tT][iI][oO][nN][ ]*:[ ]*([!-}]*).*$"
     nbexpr="2"
     subexpr="1">
     </regexp>
     </fielddef>
  • then in the scenario, set the field "www-authentication" in the pre-action:
  • <set-value name="www-authentication" method="authentication"
     format="username=$(USER_AUTH);aka_op=$(OP-AUTH);aka_k=$(K-AUTH);aka_amf=$(AMF-AUTH);auth=$(AUTH-AUTH);method=$(METHOD-AUTH);uri=$(URI-AUTH)"></set-value>
     
    The value of "USER_AUTH", OP-AUTH, K-AUTH, AMF-AUTH, AUTH-AUTH, METHOD-AUTH and URI-AUTH can be set with external data from a file with the action "restore-from-external" or from a previous message with the action "store".

Example of scenario which get external data from a file:

 <send channel="channel-1">
 <action>
 <!-- For each new call, increment the callid counter -->
 <inc-counter name="callid-counter"> </inc-counter>
 <set-value name="call-id"
 format="$(callid-counter)@255.255.255.255"></set-value>
 
 <!-- Restore data for authentication -->
 <restore-from-external field="0" name="USER-AUTH"></restore-from-external>
 <restore-from-external field="1" name="AUTH-AUTH"></restore-from-external>
 <restore-from-external field="2" name="METHOD-AUTH"></restore-from-external>
 <restore-from-external field="3" name="URI-AUTH"></restore-from-external>
 <restore-from-external field="4" name="OP-AUTH"></restore-from-external>
 <restore-from-external field="5" name="K-AUTH"></restore-from-external>
 <restore-from-external field="6" name="AMF-AUTH"></restore-from-external>
 <set-value name="www-authentication" method="authentication"
 format="username=$(USER-AUTH);aka_op=$(OP-AUTH);aka_k=$(K-AUTH);aka_amf=$(AMF-AUTH);auth=$(AUTH-AUTH);method=$(METHOD-AUTH);uri=$(URI-AUTH)"></set-value>
 </action>
 <message>
 <!-- header -->
 <! [ CDATA[INVITE sip:schooler@cs.caltech.edu SIP/2.0
 Via: SIP/2.0/UDP north.east.isi.edu
 From: Mark Handley <sip:mjh@isi.edu>
 To: Eve Schooler <sip:schooler@caltech.edu>
 Call-ID: 2963313058@north.east.isi.edu
 CSeq: 1 INVITE
 Subject: SIP will be discussed, too
 Content-Type: application/sdp
 Content-Length: 187]] >
 <!-- body -->
 <![CDATA[v=0
 o=user1 53655765 2353687637 IN IP4 155.208.221.173
 s=Mbone Audio
 i=Discussion of Mbone Engineering Issues
 e=mbone@somewhere.com
 c=IN IP4 155.208.221.173
 t=0 0
 m=audio 3456 RTP/AVP 0
 a=rtpmap:0 PCMU/8000]] >
 </message>
 <action>
 <!-- Store completed fields for future msg-->
 <store name="SID" entity="call-id"></store>
 <store name="VIA" entity="via"></store>
 <store name="FROM" entity="from"></store>
 <store name="TO" entity="to"></store>
 </action>
 </send>
 

The external data file looks like that:

 "string" ; "string" ; "string" ; "string" ; "string" ; "string" ; "string" ;
 "joe" ; "Digest realm=\"cosims.net\", nonce=\"b8d2v9ZxfE3VHg6ZD3P87Wo1mfth4BBArn7VFQlWWR4=\", algorithm=AKAv1-MD5" ; "INVITE" ; "sip:127.0.0.1:5061" ; "0xCDC2458FEB3E20F62B6D676AC72CB318" ; "0x465B5CE8B199B4BA48D2B72EE238A6BC" ; "0xB9A3" ;
 "xxxxxx" ; "Digest xxxxxxxx" " ; "XXXXXX" ; "xxxxxxxxxxxxxxxxxx" ; "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ; "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ; "0xAAAA" ;
 ...
 ...
 
 

SIP Correlation example

An example of the correlation feature is proposed in the SIP environment.
Here is the call flow:

 
 CLIENT SERVER_1 SERVER_2
 |(1) INVITE 
 |--------------------->| 
 |(2) 180 Ringing |
 |<---------------------| 
 |(3) 200 OK |
 |<---------------------| 
 |(4) ACK |
 |--------------------->|
 |
 |(5) INVITE 
 |--------------------->|
 |(6) 180 Ringing |
 |<---------------------| 
 |(7) 200 OK |
 |<---------------------| 
 |(8) ACK |
 |--------------------->|
 |
 (9) INVITE |
 |<--------------------------------------------| 
 |(10) 180 Ringing |
 |<--------------------------------------------| 
 |(11) 200 OK |
 |<--------------------------------------------| 
 |(12) ACK |
 |---------------------------------------------|
 | 
 |(13) PAUSE 
 | 
 |(14) BYE |
 |-------------------------------------------->| 
 |(15) 200 OK |
 |<--------------------------------------------|
 | 
 |(16) BYE |
 |--------------------->| 
 |(17) 200 OK |
 |<---------------------| 
The call-id used between the client and the server_1 is defined by the client. The call-id used between the server_1 and the server_2 and between the server_2 and the client is defined by the server_1. The value of this last call-id is sent from the server_1 to the client in the "o" field of the body of the "200 OK" (3) message.
To execute this example, Open three terminal sessions. Terminal 2 will be the server_1, Terminal 3 will be the server_2 and Terminal 1 the client. Examples are located in the "run" directory. So the first thing you need to do is to go in this directory (in both terminal windows):
 cd run

In Terminal 2 window type:

./start_server_corr_1.ksh

In Terminal 3 window type:

./start_server_corr_2.ksh

In Terminal 1 window type:

./start_client_corr.ksh

AltStyle によって変換されたページ (->オリジナル) /