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@192.168.0.1;user=phone "Steven Jones" sip:102@192.168.0.1;user=phone "Marie Sun" sip:103@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@111.222.333.444} 0(24828) DEBUG: get_hdr_field: <to> [43]; uri=[sip:eserra@111.222.333.444] 0(24828) DEBUG: to body ["Edoardo" sip:eserra@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@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@111.222.333.444;tag=39wlni6ex1 To: "Edoardo" sip:eserra@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@111.222.333.444;tag=6c1y8pp3fb to: "Edoardo" sip:eserra@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@192.168.0.1;user=phone\n "Steven Jones" sip:102@192.168.0.1;user=phone\n "Marie Sun" sip:103@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@openser.org http://openser.org/cgi-bin/mailman/listinfo/users
Users mailing list Users@openser.org http://openser.org/cgi-bin/mailman/listinfo/users
Users mailing list Users@openser.org http://openser.org/cgi-bin/mailman/listinfo/users