Hi all, I have three Registrar-only proxies DMQ interconnected [1]. I'm attempting to use a client to register to one of them and replicate REGISTRAR message to the other two.
* What it works: - Clients registration to proxy1 - Proxy1 replication of REGISTRAR message to proxy2
* What does not work: - Proxy replication of REGISTRAR message to proxy3
* Error message of proxy1: ERROR: tm [t_fwd.c:1770]: t_forward_nonack(): ERROR: t_forward_nonack: no branches for forwarding ERROR: dmq [dmq_funcs.c:410]: cfg_dmq_t_replicate(): error calling t_replicate
append_branch() did't help me and a search on the ML either.
What am I doing wrong?
Thanks!
- leonardo
[1]
#-------------------------------------------------------- # Global Definitions #-------------------------------------------------------- debug = 2 fork = yes log_stderror = no # listen = 0.0.0.0 port = 5060 children = 4
dns = no rev_dns = no use_dns_failover = on dns_srv_lb = yes #dns_try_naptr = no
mpath = "/usr/lib/kamailio/modules_k/:/usr/lib/kamailio/modules/"
#-------------------------------------------------------- # Modules #--------------------------------------------------------
loadmodule "tm.so" loadmodule "sl.so" loadmodule "tmx.so" loadmodule "maxfwd.so" loadmodule "usrloc.so" loadmodule "registrar.so" loadmodule "pv.so" loadmodule "xlog.so" loadmodule "ctl.so" #loadmodule "db_text.so" loadmodule "db_sqlite.so" loadmodule "auth.so" loadmodule "auth_db.so" loadmodule "memcached.so" loadmodule "dmq.so" loadmodule "corex.so"
#-------------------------------------------------------- # Module Configuration #--------------------------------------------------------
modparam ( "usrloc", "db_mode", 0 ) modparam ( "usrloc", "use_domain", 1 ) modparam ( "usrloc", "hash_size", 20 ) #modparam ( "ctl", "binrpc_max_body_size", 10000 ) #modparam ( "ctl", "binrpc_struct_max_body_size", 200 ) #default #modparam ( "db_text", "db_mode", 0 ) modparam ( "auth", "use_domain", 1 ) #modparam ( "auth_db", "db_url", "text:///etc/kamailio/dbtext/" ) modparam ( "auth_db", "db_url", "sqlite:///etc/kamailio/kamailiodb" ) modparam ( "auth_db", "use_domain", 1 ) #use plaintext passwords for testing modparam ( "auth_db", "calculate_ha1", 1 ) modparam ( "auth_db", "version_table", 0 ) modparam ( "auth_db", "password_column", "password" ) modparam ( "auth_db", "load_credentials", "$avp(s:username)=username; $avp(s:domain)=domain;$avp(s:password)=password" )
modparam( "memcached", "servers", "localhost:11211" )
modparam( "dmq", "server_address", "sip:10.0.0.1:5060" ) modparam( "dmq", "notification_address", "sip:dmq.my.domain.net" ) #modparam( "dmq", "num_threads", 4 ) # modparam( "dmq", "ping_interval", 60 )
#-------------------------------------------------------- # Main Route Block #--------------------------------------------------------
include_file "kamailio-errors.cfg"
route { # Uncomment next line if you want to see # each incoming message xlog( "L_INFO", "$rm: $fu -> $ru" );
if (!mf_process_maxfwd_header("20")) { route(ERROR_TOO_MANY_HOPS); }
if (msg:len > 4096) { route(ERROR_MESSAGE_OVERFLOW); }
if ($rm == "REGISTER" ) { if ( dmq_is_from_node() ) { xlog( "L_INFO", "REGISTER from node" ); route(REGISTER); exit; } else { # if we don't have credentials in cache authenticate against DB if ( $mct($tU@$td) == $null ) { if (!www_authenticate("$td", "subscriber")) { www_challenge("$td", "1"); exit; } else { route(REGISTER); xlog( "L_INFO", "Authenticated user $tU for domain $td against DB" ); # store credentials into cache $mct($avp(s:username)@$avp(s:domain)) = $avp(s:password); exit; }
} # credentials are in cache, authenticate against it else { if (!pv_www_authenticate("$td", "$mct($tU@$td)", "0")) { # turn last param to "1" if using ha1 passwords # keep a counter of authentication attempts # if above 1 user is denied auth from cache so we discard the cache and force auth from DB at next attempt if ( $mct(count_$tU@$td) ) == $null { $mct(count_$tU@$td) = 1; } else { $mct(count_$tU@$td) = $null; $mct($tU@$td) = $null; xlog( "L_INFO", "Authentication count limit for user $tU for domain $td against cache reached. Cache discarded" ); } www_challenge("$td", "1"); exit; } else { route(REGISTER); $mct( count_$tU@$td ) = $null; xlog( "L_INFO", "Authenticated user $tU for domain $td against cache" ); exit; } } } }
if ( $rm == "KDMQ" ) { dmq_handle_message(); }
route(ERROR_INVALID_METHOD);
}
route[REGISTER] { if (!save("location")) { sl_reply_error(); } else { append_branch(); dmq_t_replicate(); } }