[OpenSER-Users] Snom number-guessing and OpenSER

Edoardo Serra eserra at exsorsa.it
Mon Oct 8 16:27:44 CEST 2007


Tnx, comments inline

Klaus Darilion ha scritto:
> Yes - the perl module sees the original received message. I dirty 
> workaround would be to t_relay the message to openser again, and in the 
> second iteration forward the request to perl and then drop it (without 
> generating a second transaction).

Uhm...  it sounds dirty... I was thinking at implementing the SIP Server 
which will handle PUBLISH messages completely in perl anf forwarding 
from OpenSER to that server (without using perl module in openser)

Otherwise, is there a way to make openser relay stateless the 200 OK ?
It could lookup("location") and forward to the user..

Tnx again

Edoardo


> 
> regards
> klaus
> 
>>
>> About the to-tag I'll have a look at Net::SIP if it has a way to 
>> generate one.
>>
>> regards
>>
>> Edoardo
>>
>>
>> Klaus Darilion ha scritto:
>>> Some hints:
>>>
>>> A reply should have a to-tag.
>>> Openser adds a Via header during forwarding (with a generated 
>>> branch.id). This branch.id is also used for transaction matching.
>>>
>>> regards
>>> klaus
>>>
>>>
>>> Edoardo Serra schrieb:
>>>> Hi all,
>>>>     I'm trying to develop an extension to support SNOM's number 
>>>> guessing feature (I don't know if it's somehow a standard but 
>>>> description on how it works is here: 
>>>> http://kb.snom.com/kb/index.php?View=entry&CategoryID=14&EntryID=14)
>>>>
>>>> As I have to do some 'complicated' db queries I was thinking to use 
>>>> PERL module to handle number guessing request from the phone.
>>>>
>>>> I see there's no way (please correct me if I'm wrong) from OpenSER, 
>>>> neither from OpenSER::Message, to send a stateless reply with a 
>>>> customized body (SNOM says that possible number completion shoud be 
>>>> included in the body of a 200 OK reply).
>>>>
>>>> For this reason I have to use Net::SIP to generate the reply packet 
>>>> but I'm doing something wrong as OpenSER is not forwarding it back 
>>>> to the client.
>>>>
>>>> Test client is a Snom 360 and is behind a NAT, OpenSER has a public IP
>>>>
>>>> Here is my routing logic in openser.cfg
>>>>
>>>> ------------------- BEGIN openser.cfg
>>>> route{
>>>>
>>>>         if (!mf_process_maxfwd_header("10")) {
>>>>                 sl_send_reply("483","Too Many Hops");
>>>>                 exit;
>>>>         };
>>>>         if (msg:len >=  2048 ) {
>>>>                 sl_send_reply("513", "Message too big");
>>>>                 exit;
>>>>         };
>>>>
>>>>         if (nat_uac_test("19")) {
>>>>                 fix_nated_contact();
>>>>                 force_rport();
>>>>                 setbflag(6);
>>>>         }
>>>>
>>>>
>>>>         if (method=="PUBLISH") {
>>>>                 if ($hdr(Event)=="number-guessing") {
>>>>                         log("- Initial PUBLISH\n");
>>>>                         t_newtran();
>>>>                         t_on_reply("1");
>>>>                         perl_exec("numberguessing");
>>>>                         exit;
>>>>                 }
>>>>                 sl_send_reply("501", "Not implemented");
>>>>                 exit;
>>>>         }
>>>>
>>>>         if (method=="REGISTER") {
>>>>                 if (nat_uac_test("19")) {
>>>>                         fix_nated_contact();
>>>>                         force_rport();
>>>>                         setbflag(6);
>>>>                 }
>>>>                 save("location");
>>>>                 exit;
>>>>         };
>>>>
>>>>         exit;
>>>> }
>>>>
>>>> route[1] {
>>>>         log("--------------------- Stateful Reply\n");
>>>>         if (!t_relay()) {
>>>>                 sl_reply_error();
>>>>         };
>>>>         exit;
>>>> }
>>>> ------------------- END openser.cfg
>>>>
>>>> Here is my Simple Perl
>>>>
>>>>
>>>> ------------------- BEGIN net-sip.pl
>>>> use OpenSER qw ( log );
>>>> use OpenSER::Constants;
>>>> use Net::SIP;
>>>>
>>>> # Predefined body, not querying db yet
>>>> my $body = '"Franky Chang" 
>>>> sip:101 at 192.168.0.1;user=phone
>>>> "Steven Jones" 
>>>> sip:102 at 192.168.0.1;user=phone
>>>> "Marie Sun" sip:103 at 192.168.0.1;user=phone
>>>> ';
>>>>
>>>>
>>>> sub numberguessing {
>>>>         my $m = shift;
>>>>         my $pkt = Net::SIP::Request->new( $m->getMessage() );
>>>>         my $resp = $pkt->create_response(200, "OK");
>>>>         $resp->set_body($body);
>>>>         
>>>> $resp->add_header('Content-Type','application/number-guessing');
>>>>
>>>>         my $leg = Net::SIP::Leg->new(
>>>>             addr => '111.222.333.444', port => '5061');
>>>>
>>>>         $leg->deliver( $resp, '111.222.333.444:5060' );
>>>>
>>>>         # 111.222.333.444 is the IP of OpenSER
>>>>         # I'm sending from port 5061 to port 5060
>>>>
>>>>         return 1;
>>>> }
>>>> ------------------- END net-sip.pl
>>>>
>>>> OpenSER in verbose debugging module says that it cannot find a 
>>>> matching transaction for the 200 OK reply (probably because is 
>>>> originated from port 5061 and it has never forwarded it to that port 
>>>> ? )
>>>>
>>>> Here is OpenSER DEBUG log:
>>>>
>>>>  0(24828) SIP Reply  (status):
>>>>  0(24828)  version: <SIP/2.0>
>>>>  0(24828)  status:  <200>
>>>>  0(24828)  reason:  <OK>
>>>>  0(24828) parse_headers: flags=2
>>>>  0(24828) get_hdr_field: cseq <cseq>: <1> <PUBLISH>
>>>>  0(24828) DEBUG:parse_to:end of header reached, state=10
>>>>  0(24828) DBUG:parse_to: display={"Edoardo"}, 
>>>> ruri={sip:eserra at 111.222.333.444}
>>>>  0(24828) DEBUG: get_hdr_field: <to> [43]; 
>>>> uri=[sip:eserra at 111.222.333.444]
>>>>  0(24828) DEBUG: to body ["Edoardo" 
>>>> <sip:eserra at 111.222.333.444>
>>>> ]
>>>>  0(24828) Found param type 232, <branch> = <z9hG4bK-m3j054b6d8q6>; 
>>>> state=6
>>>>  0(24828) Found param type 235, <rport> = <n/a>; state=17
>>>>  0(24828) end of header reached, state=5
>>>>  0(24828) parse_headers: Via found, flags=2
>>>>  0(24828) parse_headers: this is the first via
>>>>  0(24828) After parse_msg...
>>>>  0(24828) DEBUG:forward_reply: found module tm, passing reply to it
>>>>  0(24828) DEBUG: t_check: start=0xffffffff
>>>>  0(24828) parse_headers: flags=22
>>>>  0(24828) DEBUG: t_reply_matching: failure to match a transaction
>>>>  0(24828) DEBUG: t_check: end=(nil)
>>>>  0(24828) parse_headers: flags=4
>>>>  0(24828) DEBUG: get_hdr_body : content_length=135
>>>>  0(24828) found end of header
>>>>  0(24828) ERROR:forward_reply: no 2nd via found in reply
>>>>  0(24828) DEBUG:destroy_avp_list: destroying list (nil)
>>>>  0(24828) receive_msg: cleaning up
>>>>
>>>> Here is also the tshark dump of the 2 packets (PUBLISH and its reply)
>>>>
>>>> Request-Line: PUBLISH 
>>>> sip:eserra at 213.92.23.108 SIP/2.0
>>>> Message Header
>>>>     Via: SIP/2.0/UDP 
>>>> 192.168.254.151:2051;branch=z9hG4bK-ma9r5n0t4jfq;rport
>>>>     From: "Edoardo" 
>>>> <sip:eserra at 111.222.333.444>;tag=39wlni6ex1
>>>>     To: "Edoardo" <sip:eserra at 111.222.333.444>
>>>>     Call-ID: 3c27c039249b-jml9w7t9sywx
>>>>     CSeq: 1 PUBLISH
>>>>     Max-Forwards: 70
>>>>     Event: number-guessing
>>>>     Content-Type: application/text
>>>>     Content-Length: 25
>>>> Message body
>>>>     Number: 10\r\n
>>>>     Max-Hits: 3\r\n
>>>>
>>>>
>>>> Status-Line: SIP/2.0 200 OK
>>>> Message Header
>>>>     call-id: 3c27c0daa600-emnlo1xcejtn
>>>>     cseq: 1 PUBLISH
>>>>     from: "Edoardo" 
>>>> <sip:eserra at 111.222.333.444>;tag=6c1y8pp3fb
>>>>     to: "Edoardo" <sip:eserra at 111.222.333.444>
>>>>     via: SIP/2.0/UDP 
>>>> 192.168.254.151:2051;branch=z9hG4bK-623oddiyzg56;rport
>>>>     content-type: application/number-guessing
>>>>     Content-Length: 135
>>>> Message body
>>>>     "Franky Chang" 
>>>> sip:101 at 192.168.0.1;user=phone\n
>>>>     "Steven Jones" 
>>>> sip:102 at 192.168.0.1;user=phone\n
>>>>     "Marie Sun" 
>>>> sip:103 at 192.168.0.1;user=phone\n
>>>>
>>>> Hope this info is enough for a debug :)
>>>>
>>>> Tnx in advance
>>>>
>>>> Regards
>>>>
>>>> Edoardo Serra
>>>> EXSORSA LLC
>>>>
>>>>
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users at openser.org
>>>> http://openser.org/cgi-bin/mailman/listinfo/users
>>>
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at openser.org
>> http://openser.org/cgi-bin/mailman/listinfo/users
> 





More information about the Users mailing list