<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.E-MailFormatvorlage19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="DE" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hi Andrey,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">as you know, there is an RPC command ws.close() and also a script function to close sessions remotely. So, it should be certainly possible to close the sessions over RPC.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Not being the author of this particular module, it is hard to say why it crashes. Try the usual debugging techniques, e.g. gdb to find more clues.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">If you have a working version, please open a pull request. In case of more questions, just ask on this list again.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Cheers,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Henning<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">-- <o:p>
</o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Henning Westerholt –
</span><span style="mso-fareast-language:EN-US"><a href="https://skalatan.de/blog/"><span lang="EN-GB" style="color:#0563C1">https://skalatan.de/blog/</span></a></span><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US">Kamailio services –
</span><span style="mso-fareast-language:EN-US"><a href="https://gilawa.com/"><span lang="EN-GB" style="color:#0563C1">https://gilawa.com</span></a></span><span style="mso-fareast-language:EN-US">
<span lang="EN-GB"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-left:35.4pt"><b>From:</b> sr-dev <sr-dev-bounces@lists.kamailio.org>
<b>On Behalf Of </b>Andrey Deykunov<br>
<b>Sent:</b> Monday, May 18, 2020 1:02 PM<br>
<b>To:</b> Kamailio (SER) - Development Mailing List <sr-dev@lists.kamailio.org><br>
<b>Subject:</b> [sr-dev] Fwd: RPC command to close all WS connections.<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:35.4pt">
<o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">---------- Forwarded message ---------<br>
От: <strong><span style="font-family:"Calibri",sans-serif">Andrey Deykunov</span></strong> <<a href="mailto:deykunov@gmail.com">deykunov@gmail.com</a>><br>
Date: пн, 18 мая 2020 г. в 12:24<br>
Subject: RPC command to close all WS connections.<br>
To: Daniel-Constantin Mierla <<a href="mailto:miconda@gmail.com">miconda@gmail.com</a>><o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:35.4pt">
<o:p> </o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">Hi Daniel,<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">We're using two nodes (active and passive) of our PBX server in production. When an active node becomes passive, we should forcibly close all WS connections, established by clients on this node. So, I've added
 'ws.close_all' command to websocket module to let our failover service be able closing WS connections remotely.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">I've added the following code to ws_frame.c:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">void</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">ws_rpc_close_all</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">rpc_t</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> *</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">rpc</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">void</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> *</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">ctx</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">{<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    </span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">ws_connection_t</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> **list = </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">NULL</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, **list_head = </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">NULL</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    </span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">ws_connection_t</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> *wsc = </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">NULL</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">int</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> ret;<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    list_head = </span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">wsconn_get_list</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">();<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    </span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">if</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(!list_head)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">        </span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">return</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    list = list_head;<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    wsc = *list_head;<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    </span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">while</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(wsc) {<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">        </span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">LM_WARN</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"Closing connection</span><span style="font-size:10.5pt;font-family:Consolas;color:#D7BA7D">\n</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">);<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">        ret = </span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">close_connection</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(&wsc, LOCAL_CLOSE, </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">1000</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, str_status_normal_closure);<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">        wsc = *(++list);<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    }<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">    </span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">wsconn_put_list</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(list_head);<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;line-height:14.25pt;background:#1E1E1E">
<span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">}<o:p></o:p></span></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">but I think this code may be unsafe and could corrupt shared memory, because I've got some segfaults during failovers after adding this command.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">What do you think? Is it possible to close connections properly and safety for shared memory?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">Thanks,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">Andrey<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>