[sr-dev] [kamailio] lookup_branches and rtpengine_manage (#53)

ovoshlook notifications at github.com
Wed Jan 28 16:55:41 CET 2015


Hello. I need parallel forking calls with the  same username. (Call to all contacts with name for example User123), my endpoints may be  WebSocket based and standart UDP endpoints. And I use rtpengine_manage for managing calls wor webphones and standart softh/hard phones.

I get all contacts manually and than at the branch route set rtpengine_manage settings for every call.

It works fine but it works for one kamailio server. 

When I use 2 kamailio servers as load balansers Server that handle call get all endpoints from location but call to only one, that registred only at ths server

for example I call user123
I have 3 contacts
user123 at 1.2.3.4 - was registered at kamailio 1
user123 at 3.2.1.4 - was registered at kamailio 2
user123 at 4.3.2.1 - was registered at kamailio 1

So if call goes through kamailio 1 it call only to user123 at 1.2.3.4 and user123 at 4.3.2.1

I use this settings for usrloc  at 2 kamailios to share all table between 2 servers

modparam("usrloc", "db_url", DBURL)
modparam("usrloc", "db_mode", 3)
modparam("usrloc", "user_column", "username")
modparam("usrloc", "contact_column", "contact")
modparam("usrloc", "expires_column", "expires")
modparam("usrloc", "q_column", "q")
modparam("usrloc", "callid_column", "callid")
modparam("usrloc", "cseq_column", "cseq")
modparam("usrloc", "methods_column", "methods")
modparam("usrloc", "cflags_column", "cflags")
modparam("usrloc", "user_agent_column", "user_agent")
modparam("usrloc", "received_column", "received")
modparam("usrloc", "socket_column", "socket")
modparam("usrloc", "path_column", "path")
modparam("usrloc", "ruid_column", "ruid")
modparam("usrloc", "instance_column", "instance")
modparam("usrloc", "use_domain", 1)

and this code for calling them

[GET_CONTACTS]
{
			sql_query("ca", "select contact from location where username='$tU'", "ra");
			xlog("rows: $dbr(ra=>rows) cols: $dbr(ra=>cols)\n");
			if($dbr(ra=>rows)>0){
				$var(i)=0;
				 while($var(i)<$dbr(ra=>rows)){
			
					xlog("L_INFO","SQL query return contact {$dbr(ra=>[$var(i),0])} for {$tU} at step {$var(i)}\n");
					
					if ($dbr(ra=>[$var(i),0])=~"transport=ws"){	
						xlog("L_INFO", "This is a Websocket call to endpoint");
						sql_pvquery("ca", "select received from location where contact='$dbr(ra=>[$var(i),0])'","$var(recieved)");
						
						$du=$var(recieved);
						xlog("L_INFO","SQL query return recieved {$var(recieved)} for {$tU}. Destination is {$du}\n");
						append_branch("sip:$tU@$(du{s.select,1,:})");
						
						
					}
			
					else
					{	
						xlog("L_INFO", "This is a classic UDP call to endpoint");
						$var(recieved)='';
						sql_pvquery("ca", "select received from location where contact='$dbr(ra=>[$var(i),0])'","$var(recieved)");
						xlog("L_INFO", "SQL query return RECIEVED {$var(recieved)}");
						if ($var(recieved)==0){
							xlog("L_INFO", "Recieved string is EMPTY");
							$du="sip:"+$(dbr(ra=>[$var(i),0]){s.select,1,@});
						}
						else {
							xlog("L_INFO", "Recieved string is {$var(recieved)}");
							$du=$var(recieved);
						}
						$var(UDP_contact)="sip:"+$(dbr(ra=>[$var(i),0]){s.select,1,@});						
			
						append_branch("sip:$tU@$(du{s.select,1,:})");
						
						xlog("L_INFO","Classic Destination URI is {$dbr(ra=>[$var(i),0])} for {$tU}}. Destination is {$du}\n");
					}
					$var(i) = $var(i) + 1;
					
				}
				
			}
			t_on_branch("1");
			return;
			
		}
	}
 
}


branch_route[1]{

	if($du=~"transport=ws"){
			xlog("L_INFO","Websocket Branch is {$du} for {$tU}\n");
			rtpengine_manage("internal extenal force trust-address replace-origin replace-session-connection ICE=force RTP/SAVPF");
			t_on_reply("REPLY_FROM_WS");
			
			}
	else{
			xlog("L_INFO","UDP Branch is {$du)} for {$tU}\n");
			rtpengine_manage("replace-origin replace-session-connection ICE=remove RTP/AVP");
			t_on_reply("MANAGE_CLASSIC_REPLY");
	}
}


When it try to branch endpoint without registration at server that handle call I get errors that tm module can not build Via header 

*via_builder(): TCP/TLS connection (id: 0) for WebSocket could not be
 found*
 *ERROR: <core> [msg_translator.c:1725]: build_req_buf_from_sip_req():
 could not create Via header*
 *ERROR: <core> [forward.c:607]: forward_request(): ERROR:
 forward_request: building failed*

UDP calls get errors something like above (sorry than can not share error code, This situation not often).

So I think I have this trouble because I use manually handling call and tried to substitute to lookup_branches function. but I have no Idea how to set rtpengine_manage paraments for each endpoint depending this is websocket or standart call.

IF there is write problem for callings thhrough 2 kamailios as load balansers please let me know about how to set rtpengine_manage parametrs wor endpoints for every fork.  If not- can you tell me how I can call to all endpoints endepending of registration server (kamailio 1 or 2).

But with another side I can not understand why kamailio 2 don't see registrations at kamailio1 (or 1 from 2). May be this is trouble of usrloc module. That's why I write this problem here.
Thanks.


---
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/53
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-dev/attachments/20150128/543bd121/attachment-0001.html>


More information about the sr-dev mailing list