Hello,

On 07/03/15 00:27, Armen Babikyan wrote:
Hi Daniel,

Thanks for the tip about disabling internal replies in the transaction module.

About the new feature in usrloc - it looks like close_expired_tcp feature disconnects the connection if contacts on it expire.  I'm hoping to achieve the reverse, where I get to clean up when a connection closes abruptly.  To this end, for websockets, will Kamailio allow me to use uac_req_send() from within event_route[websocket:closed]?  I'm looking for a way to generate a de-REGISTER packet to send on to my registrar when a client abruptly closes their SIP/WS connection.  If not, do you have any suggestions to achieve something similar?

if you want to avoid attempting to send the sip message when there is no connection, then the option is to use set_forward_no_connect() before relaying.

 https://www.kamailio.org/wiki/cookbooks/4.2.x/core#set_forward_no_connect

Otherwise, look inside the usrloc module for the option to remove the record when the connection associated with it is no longer available (this is done on a timer check). Then you can get the event route executed for expired contact and there you can trigger something to trigger an un-register to the other server.

uac_req_send() should work fine in event routes.

Cheers,
Daniel


Thanks again!

Armen


On Fri, Mar 6, 2015 at 12:32 PM, Daniel-Constantin Mierla <miconda@gmail.com> wrote:
Hello,

On 06/03/15 03:38, Armen Babikyan wrote:
> Hello,
>
> I am setting up this scenario using Kamailio 4.2.2:
>
> [UA] <-> [kamailio1] <-> [kamailio2] <-> [other stuff]
>
> UA connects to kamailio1 using SIP/WSS, kamailio1 proxies request
> along to kamailio2.  Note that my intent here is to have kamailio2
> provide the registrar functionality.  The kamailio2 (or something
> behind it) can also initiate transactions to UA, like OPTIONS, for
> example.
>
> I'm having an issue though: when the websocket connection between
> kamailio1 and UA dies, transaction requests from kamailio2 show up to
> kamailio1, and I get errors in kamailio1's logs because the WSS
> connection is gone.  I get messages as follows (debug=2):
>
> Mar  6 00:17:33 kamailio1 /usr/local/sbin/kamailio[5653]: WARNING:
> <core> [msg_translator.c:2778]: via_builder(): TCP/TLS connection (id:
> 0) for WebSocket could not be found
> Mar  6 00:17:33 kamailio1 /usr/local/sbin/kamailio[5653]: ERROR:
> <core> [msg_translator.c:1996]: build_req_buf_from_sip_req(): could
> not create Via header
> Mar  6 00:17:33 kamailio1 /usr/local/sbin/kamailio[5653]: ERROR: tm
> [t_fwd.c:527]: prepare_new_uac(): could not build request
> Mar  6 00:17:33 kamailio1 /usr/local/sbin/kamailio[5653]: ERROR: tm
> [t_fwd.c:1777]: t_forward_nonack(): ERROR: t_forward_nonack: failure
> to add branches
>
> At debug=4, I get the output here: http://pastebin.com/d3RumekG
>
> In a running tshark, I see kamailio1 responding to kamailio2 with a
> "SIP/2.0 500 No error (2/TM)".  It appears to me that this is
> happening before t_relay() even returns.
>
> Is there a way to prevent the SIP 500 from being sent back to the
> client?  I am calling t_on_branch_failure("kam2bf") and
> t_on_failure("kam2f"), with each of those handlers
> (event_route[tm:branch-failure:kam2bf] and failure_route[kam2f])
> written to print a log message, but it appears that neither of those
> handlers are being called.  I tried installing these handlers
> independently to no avail.
>
> I also tried registering a t_on_reply() handler, thinking it was an
> internally-generated SIP response that might make it through my
> handler on its way out to kam2, but that is also not getting invoked.
>
> I want to return a 404 or something similar instead of having a 500
> auto-returned for me.
>
> Related to this, is there a way to query kamailio's in-memory client
> connectivity data structure for the connectivity status of a client?
> Or is this something best done by keeping track of every client myself
> using (e.g.) localcache?
>
> Any pointers are appreciated.  Thanks!

If you want tm not to send an reply internally, see:

-
http://kamailio.org/docs/modules/4.2.x/modules/tm.html#tm.f.t_set_disable_internal_reply

Also, you can list the details of tcp connections via tcp -- see 'kamcmd
help' for the tcp related commands. Iirc, something similar should be
for websocket connections.

The usrloc module keeps the id of the tcp connection for the client, the
development version (master branch) has the option to delete the record
if the connection is gone. For older versions there is also an option to
remove those records with some delay
(http://kamailio.org/docs/modules/4.2.x/modules/usrloc.html#usrloc.p.handle_lost_tcp),
being a timer based cleanup.

Cheers,
Daniel

--
Daniel-Constantin Mierla
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Kamailio World Conference, May 27-29, 2015
Berlin, Germany - http://www.kamailioworld.com


_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users


-- 
Daniel-Constantin Mierla
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Kamailio World Conference, May 27-29, 2015
Berlin, Germany - http://www.kamailioworld.com