Hi,
I made changes in openser.cfg like this to act it as a SIP redirect server:
route{
# for testing purposes, simply okay all REGISTERs
if (method=="REGISTER") {
log("REGISTER");
sl_send_reply("200", "ok");
return;
};
# rewrite current URI, which is always part of destination ser
rewriteuri("sip:parallel@siphub.net <mailto:parallel@siphub.net>
:9");
# append one more URI to the destination ser
append_branch("sip:redirect@siphub.net <mailto:redirect@siphub.net>
:9");
# redirect now
sl_send_reply("300", "Redirect");
}
then restarted openser, but still not getting redirect messages, should I
need to do something more for enabling this option? Please help me and tell
me that how can I run my redirect server for SIP.
Regards,
ajay
Ok, I worked out that you need to use append_branch, like this:
append_branch (proxy1)
append_branch (proxy1)
t_replicate (proxy3)
That's what the devevelopers say anyway...
However, all the t_replicate's are going to exactly the same proxy.
Here's a post by two people that have reported _exactly_ the same problem.
Is there a solution?
http://www.archivum.info/serusers@iptel.org/2004-12/msg00268.html
Thanks,
Doug.
-----Original Message-----
From: Douglas Garstang
Sent: Wednesday, November 30, 2005 4:11 PM
To: users(a)openser.org
Subject: [Users] t_replicate after failure
In the scenario below, if the first t_replicate fails because 192.168.10.5 returns "Not Found", the second t_replicate command does not execute. Why? How can I make it execute? Call me crazy, but this doesn't seem at all intuitive to me. In a functional programming world, if the first fails, the next should still run.
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication
if (!www_authorize("voip.com", "subscriber")) {
www_challenge("voip.com", "0");
exit;
};
save("location");
t_replicate("192.168.10.5","5060");
t_replicate("192.168.10.7","5060");
exit;
};
Thanks,
Doug.
_______________________________________________
Users mailing list
Users(a)openser.org
http://openser.org/cgi-bin/mailman/listinfo/users
I want to implement a monitor system when there is a failure route.
At first I think to send an snmp message when there was a failure
route, but the snmp module is frozen, isn't it?
Now I want to write a line in a special log file. So I want to have
the normal log file for monitor information (call stablish, call
released, etc..) and another log file for errors.
I though in use the exec module to inser the errors in the error-log
file in this way:
exec_dset("echo Error_failure_route >> file_error.log");
Does anyone have a better idea to do this? Because I think that the
exec module is slower than use xlog. It is possible to execute that
command in background? That openser does not stop the execution until
the command has finished.
Thanks
--
Salu2:
***************************************
José María González
***************************************
Alright.. here is some dbg level 9 output of my problem. Basically openser starts, says it starts successfully, and then quits. I think it may have something to do with the fact that it is trying to access a local database even though it has been configured to access a remote one. I am quite sure that it is accessing the proper cfg, cause when I put garbage in it I get an error.
Any help, clues, snide remarks, cryptic-guru-riddle-answers would be appreciated.
Dec 1 11:48:41 amnesiac openser: 0(0) db_init: Connection 'mysql://openser:openserrw@localhost
/openser' not found in pool
Dec 1 11:48:41 amnesiac openser: 0(0) new_connection: Opening MySQL connection: mysql://opense
r:openserrw@localhost/openser
Dec 1 11:48:41 amnesiac openser: 0(0) new_connection: Can't connect to local MySQL server thro
ugh socket '/var/lib/mysql/mysql.sock' (2)
Dec 1 11:48:41 amnesiac openser: 0(0) register_udomain(): Can not open database connection
Dec 1 11:48:41 amnesiac openser: 0(0) domain_fixup(): Error while registering domain
Dec 1 11:48:41 amnesiac openser: ERROR: error -1 while trying to fix configuration
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: tm_shutdown : start
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: unlink_timer_lists : emptying DELETE list
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: tm_shutdown : emptying hash table
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: tm_shutdown : releasing timers
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: tm_shutdown : removing semaphores
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: tm_shutdown : destroying tmcb lists
Dec 1 11:48:41 amnesiac openser: 0(0) DEBUG: tm_shutdown : done
Dec 1 11:48:41 amnesiac openser: 0(3791) shm_mem_destroy
Dec 1 11:48:41 amnesiac openser: 0(3791) destroying the shared memory lock
Dec 1 11:48:41 amnesiac openser: openser startup succeeded
my config file is simply the sample config, modified with the suggestions to access a remote mysql database, it looks like this:
#
# $Id: openser.cfg,v 1.5 2005/10/28 19:45:33 bogdan_iancu Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=9 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=yes # (cmd line: -E)
/* Uncomment these lines to enter debugging mode
fork=no
log_stderror=yes
*/
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=4
fifo="/tmp/openser_fifo"
# Uncomment this if you want to use SQL database
loadmodule "//lib/openser/modules/mysql.so"
loadmodule "//lib/openser/modules/sl.so"
loadmodule "//lib/openser/modules/tm.so"
loadmodule "//lib/openser/modules/rr.so"
loadmodule "//lib/openser/modules/maxfwd.so"
loadmodule "//lib/openser/modules/usrloc.so"
loadmodule "//lib/openser/modules/registrar.so"
loadmodule "//lib/openser/modules/textops.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "//lib/openser/modules/auth.so"
loadmodule "//lib/openser/modules/auth_db.so"
# ----------------- setting module-specific parameters ---------------
modparam("auth_db", "db_url", "mysql://serusr:testpass@192.168.0.54/ser")
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
modparam("usrloc", "db_mode", 2)
# -- auth params --
# Uncomment if you are using auth module
#
modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
# ------------------------- request routing logic -------------------
# main routing logic
route{
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
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;
};
# we record-route all messages -- to make sure that
# subsequent messages will go through our proxy; that's
# particularly good if upstream and downstream entities
# use different transport protocol
if (!method=="REGISTER")
record_route();
# subsequent messages withing a dialog should take the
# path determined by record-routing
if (loose_route()) {
# mark routing logic in request
append_hf("P-hint: rr-enforced\r\n");
route(1);
};
if (!uri==myself) {
# mark routing logic in request
append_hf("P-hint: outbound\r\n");
# if you have some interdomain connections via TLS
#if(uri=~"@tls_domain1.net") {
# t_relay_to_tls("IP_domain1","port_domain1");
# exit;
#} else if(uri=~"@tls_domain2.net") {
# t_relay_to_tls("IP_domain2","port_domain2");
# exit;
#}
route(1);
};
# if the request is for other domain use UsrLoc
# (in case, it does not work, use the following command
# with proper names and addresses in it)
if (uri==myself) {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication
#if (!www_authorize("openser.org", "subscriber")) {
# www_challenge("openser.org", "0");
# exit;
#};
save("location");
exit;
};
lookup("aliases");
if (!uri==myself) {
append_hf("P-hint: outbound alias\r\n");
route(1);
};
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
append_hf("P-hint: usrloc applied\r\n");
};
route(1);
}
route[1] {
# send it out now; use stateful forwarding as it works reliably
# even for UDP2TCP
if (!t_relay()) {
sl_reply_error();
};
exit;
}
What is the correct way to handle message retrasmissions?
Usually t_relay() seems to hadle them correctly. But if a transactions
was previously created by some module function, I found that t_relay()
(and subsequent sl_reply_error()) generates the following errors:
Dec 5 18:49:25 eowyn OpenSER[5654]: ERROR: t_newtran: transaction
already in process 0x502a56f8
Dec 5 18:49:25 eowyn OpenSER[5654]: ERROR: sl_reply_error used: I'm
terribly sorry, server error occurred (1/SL)
So, I have the following questions:
1) What is the correct script code to relay a message, even with
retrasmissions and transaction already created?
2) Is it OK to simply discard retrasmissions (not forwarding or replying
them)?
3) How can I recognize retrasmissions? Is t_lookup_request() the correct
function for a test?
Thanks.
--
___________________________________________________
__
|- giannici(a)neomedia.it
|ederico Giannici http://www.neomedia.it
___________________________________________________
Opps i made a mistake, instead of "avp_write" you need to use
"avp_printf" to store the pseudo variable into an AVP
and when you are doing the comparison with avp_check you need an alias
defined for the second AVP otherwise you might end up comparing the AVP
with a literal value
modparam( "avpops", "avp_aliases", "dest_ip=i:401" )
avp_printf("i:400", "$si");
avp_printf("i:401", "$rd");
if ( avp_check("i:400", "eq/$dest_ip/g") )
{
xlog("L_INFO", "\"$si\" == \"$rd\" ");
}
Norman Brandinger wrote:
> I agree that the solution that was presented is BAD for the reasons
> stated by both of us and probably more :)
>
> Perhaps using $Ri after the successful lookup() and comparing it to
> the $src_ip AVP would work.
>
> The problem was trying to compare a pseudo variable with an AVP.
>
>
> The doc <snipped below> does not state that pseudo variables can be
> used by avp_write().
>
> Pseudo-variables can be used with following modules of OpenSER:
>
> * avpops - function “avp_printf()”
> * xlog - functions “xlog()” and “xdbg()”
>
> I did try to use avp_write() to save a pseudo variable to an AVP but
> was unsuccessful.
>
> Do you have an example of writing a pseudo variable to an AVP ?
>
> Regards,
> Norm
>
>
>
> Tavis P wrote:
>
>> Another, more lightweight solution, is:
>>
>> After a successful lookup(location) you can compare the received IP
>> address ($si) with the destination domain/ip address returned from the
>> "lookup" function call ($rd), i think these two pieces of information
>> are reliable for this purpose
>>
>> This way you don't have to make extra database calls to determine
>> locality
>>
>> Also if you want to compare pseudo variables you can first write them to
>> an AVP using "avp_write" and then you can make use of "avp_check" with
>> data sourced from a pseudo variable
>>
>> Norman Brandinger wrote:
>>
>>
>>
>>> I have looked into the problem related to saving saving resources by
>>> not calling rtpproxy or mediaproxy when both the caller and callee are
>>> behind the same NAT.
>>>
>>> This topic has been discussed many times however, there have been no
>>> "working" examples, or even partial examples posted (that I'm aware
>>> of).
>>>
>>> Below is a solution to the problem, but is a BAD hack at best.
>>>
>>> This solution is BAD because AVP's are added to the usr_preferences
>>> table during the registration process, but there is no notification
>>> that a registration has expired and is no longer valid. A cron job
>>> could be run periodically to delete all received_ip AVP's with no
>>> matching entry in the location table, but this is another hack to fix
>>> the first hack.
>>>
>>> The solution is BAD because a database calls must be made to save the
>>> received_ip address into an AVP, then another database call must be
>>> made to reload the value just so that it can be tested against the
>>> caller's $src_ip. A pseudo variable $Ri already exists that contains
>>> the value we use in received_ip, but I have not been able to find a
>>> way for avp_check() to use $Ri.
>>>
>>> The solution is BAD because it will fail when the SIP device(s) are
>>> behind more than a single NAT router. I believe this is not an issue
>>> for 95% of the users and 99% of the small office or home users.
>>>
>>> I think that a better solution would be to enhance avp_check() to
>>> accept pseudo variables for the "value" parameter. This would remove
>>> the need for any database calls.
>>>
>>> I'm cross-posting this response to the developers list to bring this
>>> to their attention and ask for suggestions (it's possible that I've
>>> totally missed something). If a decision is made to open the avpops
>>> module to pseudo variables (other than just avp_print()), I would
>>> suggest the following be looked at:
>>>
>>> avp_check() the value parm should accept pseudo variables
>>> avp_write() the value parm should accept pseudo variables
>>> avp_pushto() the name parameter should accept pseudo variables
>>> avp_op() the value parameter should accept pseudo variables
>>>
>>> Regards,
>>> Norm
>>>
>>>
>>> 1) During REGISTER processing, place the following code. I would
>>> suggest that you put the code "after" all authentication checks and
>>> "after" the save("location") statement.
>>>
>>> # Delete any previously saved IP addressess from the user.
>>> avp_db_delete("$from/username","s:received_ip");
>>>
>>> # Save the source IP address of the user into an AVP called
>>> received_ip.
>>> # The saved IP address should be the public address of the NAT router.
>>> avp_write("$src_ip", "s:received_ip");
>>>
>>> # Save the AVP received_ip into the usr_preferences tables associated
>>> with the user that just registered
>>> avp_db_store("$from/username","s:received_ip");
>>>
>>> 2) During INVITE processing (or wherever you make the decision to use
>>> or not use rtpproxy / mediaproxy) , place the following code.
>>>
>>>
>>> #---------------------------------------------------------------------------
>>>
>>>
>>> # Are the caller and callee behind the same NAT ?
>>>
>>> #---------------------------------------------------------------------------
>>>
>>>
>>> avp_db_load("$to/username", "s:received_ip");
>>> if (avp_check("s:received_ip", "eq/$src_ip")) {
>>> setflag(CALLER_AND_CALLEE_ ARE_BEHIND_THE_SAME_NAT);
>>> };
>>>
>>>
>>>
>>> _______________________________________________
>>> Devel mailing list
>>> Devel(a)openser.org
>>> http://openser.org/cgi-bin/mailman/listinfo/devel
>>>
>>>
>>>
>>
>>
>>
>>
>>
>
>
>
Hi,
Does SER have any control or any can it be configured (if yes,
please guide) to implement various QoS mechanisms like Diffserv,RSVP,
Admission control etc.., to improve the voice quality and delays and/or
jitter? Because lately, we are facing a decrease in call quality in our ser
calls.
Or do we have to do this only at the network level, eg. Routers etc..?
Any poiners/guides will be most welcome.
Regards,
Ashutosh Kumar
Im trying to set the invite timer to 6 seconds when i have a call to pstn gw
but it does not seem to affect anything,
This is how i set the timer: avp_write("5", "inv_timeout");
any ideas?
--
Kyriakos Mavromichalis
Otenet Telecom