Ok, I've roughly used the examples that are included in the
modules/mediaproxy/ser.cfg file to use mediaproxy. The initial call is set
up very nicely. However reinvites don't seem to be processsed right.
When I place the call on hold, I can see that mediaproxy sees the call on
hold (with the sessions tool). However, when I return to the call from
hold, the reinvite just sets the devices up to each other direct without
the mediaproxy. Mediaproxy will for about 1 second show the call come back
to "ACTIVE" and then to "IDLE". I'm sure the rtp isn't being
proxied
because 1. I can kill the proxy, and still pass audio 2. the sessions tool
doesn't show packets being transmitted 3. the SDP isn't pointing to the
mediaproxy.
I can't figure out what I'm doing wrong. However, mediaproxy sees to be
very sensitive on how it's called. Per the example, use_media_proxy() will
be called TWICE for a new call. This works for the initial call.. However,
I removed the initial call to use_media_proxy and only left the one in the
on_reply route. Doing this totally broke it and routed the calls without
media proxy.
**** Oh, something that is worth mentioning. In the example file, there is
an end_media_session() at the begining of the on_reply block. If this is
in there, no calls will goto the mediaproxy ever. I get an error message:
3(3114) error: use_media_proxy(): empty response from mediaproxy
So I removed it to get where I am now.
Here are the relevant parts of my config:
# $Id: openser.cfg,v 1.6 2006/02/15 18:23:46 bogdan_iancu Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=2 # 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"
fifo_db_url="mysql://ser:xxxxx@172.16.10.103:3306/ser"
#
# uncomment the following lines for TLS support
#disable_tls = 0
#listen = tls:your_IP:5061
listen=192.168.1.10:5060
#tls_verify = 1
#tls_require_certificate = 0
#tls_method = TLSv1
#tls_certificate = "/usr/local/etc/openser/tls/user/user-cert.pem"
#tls_private_key = "/usr/local/etc/openser/tls/user/user-privkey.pem"
#tls_ca_list = "/usr/local/etc/openser/tls/user/user-calist.pem"
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/openser/modules/mysql.so"
loadmodule "/usr/local/lib/openser/modules/sl.so"
loadmodule "/usr/local/lib/openser/modules/tm.so"
loadmodule "/usr/local/lib/openser/modules/rr.so"
loadmodule "/usr/local/lib/openser/modules/maxfwd.so"
loadmodule "/usr/local/lib/openser/modules/usrloc.so"
loadmodule "/usr/local/lib/openser/modules/textops.so"
loadmodule "/usr/local/lib/openser/modules/uri.so"
loadmodule "/usr/local/lib/openser/modules/uri_db.so"
loadmodule "/usr/local/lib/openser/modules/registrar.so"
loadmodule "/usr/local/lib/openser/modules/mediaproxy.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/local/lib/openser/modules/auth.so"
loadmodule "/usr/local/lib/openser/modules/auth_db.so"
loadmodule "/usr/local/lib/openser/modules/domain.so"
# ----------------- setting module-specific parameters ---------------
# -- usrloc params --
modparam("auth_db","db_url","mysql://ser:xxxxx@172.16.10.103:3306/ser")
modparam("uri_db","db_url","mysql://ser:xxxxx@172.16.10.103:3306/ser")
modparam("domain","db_url","mysql://ser:xxxxx@172.16.10.103:3306/ser")
modparam("dip","db_url","mysql://ser:xxxxx@172.16.10.103:3306/ser")
modparam("usrloc","db_url","mysql://ser:xxxxx@172.16.10.103:3306/ser")
modparam("domain","domain_table","domain")
modparam("domain","domain_col","domain")
modparam("domain","db_mode",0)
modparam("auth_db","use_domain",1)
#
modparam("usrloc", "db_mode", 2)
# 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)
modparam("auth_db", "load_credentials", "rpid,vm_timer")
modparam("tm", "fr_inv_timer_avp", "vm_timer")
#
# 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)
modparam("mediaproxy", "natping_interval", 60)
modparam("registrar" , "nat_flag", 2)
# ------------------------- 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");
return;
};
if (msg:len >= 2048 ) {
sl_send_reply("513", "Message too big");
return;
};
# 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
### Fix natted requests
if (client_nat_test("3")) {
log(1,"***** PERFORMING NAT FIXUP\n");
setflag(2);
force_rport();
fix_contact();
};
record_route();
if (client_nat_test("3") && !search("^Record-Route:")) {
# Mark call as being natted
force_rport();
fix_contact();
};
#### Process registrations
if (method=="REGISTER") {
log(1,"***** REGISTERING\n");
if (is_from_local()) {
log(1,"**** IS FROM LOCAL\n");
# Mark as NAT'ed
if (client_nat_test("3")) {
log(1,"***** PERFORMING NAT FIXUP\n");
setflag(2);
force_rport();
fix_contact();
};
if (!www_authorize("", "subscriber")) {
log(1,"**** ASKING FOR CREDS\n");
www_challenge("", "0");
return;
} else if (!check_to()) {
sl_send_reply("403", "Username!=To not allowed");
return;
};
log(1,"*** ATTEMPTING TO SAVE CONTACT\n");
if (!save("location")) {
sl_reply_error();
};
} else {
sl_send_reply("403", "This domain is not served here");
};
return;
};
### All invites must be authenticated.. do this first
if (method=="INVITE") {
if(!www_authorize("","subscriber")) {
log(1,"**** ASKING FOR CREDS\n");
www_challenge("","0");
return;
} else if (!check_from()) {
sl_send_reply("403", "Username must equal the from address");
return;
};
log(1,"**** APPENDING RPID\n");
append_rpid_hf("<sip:", "(a)192.168.1.10>;privacy=off")cy=off");
}
# make sure a leg is local somewhere
if (method=="INVITE") {
if (!(is_from_local() || is_uri_host_local())) {
sl_send_reply("403", "Relaying is forbidden");
return;
}
t_on_failure("1");
} else if (method == "BYE" || method == "CANCEL") {
log(1,"Ending session sec-1\n");
end_media_session();
};
# resolve aliases
if (!lookup("aliases")) {
log(1,"*** Call is not in aliases table\n");
}
# subsequent messages withing a dialog should take the
# path determined by record-routing
if (loose_route()) {
log(2,"**** PERFORMING LOOSE ROUTE\n");
if (method=="INVITE" || method=="ACK"){
use_media_proxy();
};
append_hf("P-hint: rr-enforced\r\n");
log(1," *** USE MEDIA PROXY\n");
t_relay();
return;
};
if (method == "INVITE") {
t_on_reply("1");
};
if (is_uri_host_local()) {
if (!lookup("location")) {
log(1," **** location lookup failed\n");
# lookup failed.. probably a pstn call
use_media_proxy();
rewritehostport("voip_gw");
if (!t_relay()) {
sl_reply_error();
return;
}
return;
}
}
if (method=="INVITE" || method =="ACK") {
log(1," *** USE MEDIA PROXY\n");
use_media_proxy();
}
if (method=="OPTIONS") {
sl_send_reply("404", "Pong - Go away");
return;
}
if (!t_relay()) {
if (method=="INVITE" || method=="ACK") {
end_media_session();
log (1," Ending session sec-2\n");
};
sl_reply_error();
return;
}
}
failure_route[1] {
end_media_session();
log(1,"Ending session sec-3\n");
}
onreply_route[1] {
end_media_session();
log(1,"******* In onreply route block\n");
if (status=~"(183)|(2[09][09])") {
if (client_nat_test("1")) {
fix_contact();
};
use_media_proxy();
}
}