On Thu, Sep 29, 2016 at 01:53:14PM +0530, Infinicalls Infinicalls wrote:
You can either figure out which host was used to register by looking at the socket value in the location table (using sqlops/avp_db_query) and send the INVITE to the other host if socket doesn't contain a local ipadress (by simply setting $rd to the other host and setting $du to null)
The socket value I get here is the internal IP only. For eg. 10.0.0.4:5060. Can you tell me how do I get the static IP here? I am behind NAT and use rtpproxy and advertised it.
In that case there is no direct way to get the external ip as far as I know. As far as location is concerned that information is lost. You might want to look into the Path module to store information about the REGISTER (you might have to fake a Path header before save from available info during the REGISTER).
or just wait for a failure route (which adds a delay) to trigger and send the invite to the other host (again setting $du to null and $rd to the other host).
# uncomment the following lines if you want to redirect the failed # calls to a different new destination ## if (t_check_status("486|408")) { ## sethostport("MySecondIP:5061"); ## append_branch(); ## # do not set the missed call flag again ## t_relay(); ##}
Is this sufficient? In my case, if calls are only sent to the second IP, how do I add a mesh of servers (I have 5 of them now). Will that add more delay time? Any idea? Thanks.
It is the correct idea, but it might be a little bit fragile. There might be no response (in which case you get a local generated 408), but if a device is listening it might decide to send any 4/5/6xx code.
You might want to take a look at you solution though. For example you might want to introduce edge proxies, clients connect with those directly, but they forward the requests to a (specific or loadbalanced) registrar (essentially the machines you have up and running now). These proxies insert Path information about themselves in any messages coming from the outside world (add_path_received()) , the registrar saves the Path info: modparam("registrar", "use_path", 1) modparam("registrar", "path_use_received", 1)
Now any registrar looking at the shared location data knows which edge proxy to sent the request for the enduser to directly.