[OpenSER-Users] Snom number-guessing and OpenSER
Klaus Darilion
klaus.mailinglists at pernau.at
Tue Oct 9 09:26:19 CEST 2007
Edoardo Serra schrieb:
> 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)
That would work in any case.
But you could also extend openser to allow adding a body to the reply.
> Otherwise, is there a way to make openser relay stateless the 200 OK ?
> It could lookup("location") and forward to the user..
relaying of reply is done like relaying of the request. If you relay a
request statefull, a transaction is created inside tm module. Every
received reply is checked against transactions in tm module. If it
matches a transaction the reply is forwarded stateful, if it does not
match it is relayed stateless.
klaus
>
> 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
>>
>
>
> _______________________________________________
> Users mailing list
> Users at openser.org
> http://openser.org/cgi-bin/mailman/listinfo/users
More information about the Users
mailing list