Module: sip-router
Branch: pd/websocket
Commit: 7d35945ec66caa286db66cd55ef56c78f29c434c
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7d35945ec66caa286db66cd55ef56c78f29c434c

Author: Peter Dunkley <[email protected]>
Committer: Peter Dunkley <[email protected]>
Date:   Thu Jun 21 13:50:53 2012 +0100

modules/websocket: Added connection close code and tidied up MI commands

---

 modules/websocket/ws_frame.c |   14 ++++++++------
 modules/websocket/ws_mod.c   |   41 +++++++++++++++++++++++++++--------------
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/modules/websocket/ws_frame.c b/modules/websocket/ws_frame.c
index fba01f5..4e36b59 100644
--- a/modules/websocket/ws_frame.c
+++ b/modules/websocket/ws_frame.c
@@ -202,7 +202,7 @@ static int decode_and_validate_ws_frame(ws_frame_t *frame)
        return frame->opcode;
 }
 
-static int encode_and_send_ws_frame(ws_frame_t *frame)
+static int encode_and_send_ws_frame(ws_frame_t *frame, int conn_close)
 {
        int pos = 0, extended_length;
        unsigned int frame_length;
@@ -291,6 +291,8 @@ static int encode_and_send_ws_frame(ws_frame_t *frame)
        memcpy(&send_buf[pos], frame->payload_data, frame->payload_len);
 
        init_dst_from_rcv(&dst, &frame->tcpinfo->con->rcv);
+       if (conn_close) dst.send_flags.f |= SND_F_CON_CLOSE;
+
        if (tcp_send(&dst, NULL, send_buf, frame_length) < 0)
        {
                LM_ERR("sending WebSocket frame\n");
@@ -335,7 +337,9 @@ static int handle_close(ws_frame_t *frame)
 
        LM_INFO("Close: %hu %.*s\n", code, reason.len, reason.s); 
 
-       /* TODO: cleanly close TCP/TLS connection */
+       /* Close socket */
+       frame->tcpinfo->con->state = S_CONN_BAD;
+       frame->tcpinfo->con->timeout = get_ticks_raw();
 
        return 0;
 }
@@ -347,7 +351,7 @@ static int handle_ping(ws_frame_t *frame)
        frame->opcode = OPCODE_PONG;
        frame->mask = 0;
 
-       encode_and_send_ws_frame(frame);
+       encode_and_send_ws_frame(frame, 0);
 
        return 0;
 }
@@ -470,15 +474,13 @@ struct mi_root *ws_mi_close(struct mi_root *cmd, void 
*param)
        frame.payload_data = data;
        frame.tcpinfo = &tcpinfo;
 
-       if (encode_and_send_ws_frame(&frame) < 0)
+       if (encode_and_send_ws_frame(&frame, 1) < 0)
        {
                LM_ERR("sending WebSocket close\n");
                pkg_free(data);
                return init_mi_tree(500,"Sending WebSocket close", 23);
        }
 
-       /* TODO: cleanly close TCP/TLS connection */
-
        update_stat(ws_local_closed_connections, 1);
        update_stat(ws_current_connections, -1);
 
diff --git a/modules/websocket/ws_mod.c b/modules/websocket/ws_mod.c
index 1bf1dc0..fb86069 100644
--- a/modules/websocket/ws_mod.c
+++ b/modules/websocket/ws_mod.c
@@ -91,12 +91,12 @@ static stat_export_t stats[] =
 
 static mi_export_t mi_cmds[] =
 {
-       { "ws_close",   ws_mi_close,   0, 0, 0 },
-       { "ws_disable", ws_mi_disable, 0, 0, 0 },
-       { "ws_dump",    mi_dump,       0, 0, 0 },
-       { "ws_enable",  ws_mi_enable,  0, 0, 0 },
-       { "ws_ping",    ws_mi_ping,    0, 0, 0 },
-       { "ws_pong",    ws_mi_pong,    0, 0, 0 },
+       { "ws.close",   ws_mi_close,   0, 0, 0 },
+       { "ws.disable", ws_mi_disable, 0, 0, 0 },
+       { "ws.dump",    mi_dump,       0, 0, 0 },
+       { "ws.enable",  ws_mi_enable,  0, 0, 0 },
+       { "ws.ping",    ws_mi_ping,    0, 0, 0 },
+       { "ws.pong",    ws_mi_pong,    0, 0, 0 },
        { 0, 0, 0, 0, 0 }
 };
 
@@ -181,6 +181,10 @@ static struct mi_root *mi_dump(struct mi_root *cmd, void 
*param)
        char *src_proto, *dst_proto;
        char src_ip[IP6_MAX_STR_SIZE + 1], dst_ip[IP6_MAX_STR_SIZE + 1];
        struct tcp_connection *c;
+       struct mi_root *rpl_tree = init_mi_tree(200, MI_OK_S, MI_OK_LEN);
+
+       if (!rpl_tree)
+               return 0;
 
        TCPCONN_LOCK;
        for (h = 0; h < TCP_ID_HASH_SIZE; h++)
@@ -202,12 +206,18 @@ static struct mi_root *mi_dump(struct mi_root *cmd, void 
*param)
                                ip_addr2sbuf(&c->rcv.dst_ip, src_ip,
                                                IP6_MAX_STR_SIZE);
 
-                               LM_ERR("id - %d, "
-                                       "src - %s:%s:%hu, "
-                                       "dst - %s:%s:%hu\n",
-                                       c->id,
-                                       src_proto, src_ip, c->rcv.src_port,
-                                       dst_proto, dst_ip, c->rcv.dst_port);
+                               if (addf_mi_node_child(&rpl_tree->node, 0, 0, 0,
+                                               "id - %d, "
+                                               "src - %s:%s:%hu, "
+                                               "dst - %s:%s:%hu",
+                                               c->id,
+                                               src_proto,
+                                               strlen(src_ip) ? src_ip : "*",
+                                               c->rcv.src_port,
+                                               dst_proto,
+                                               strlen(dst_ip) ? dst_ip : "*",
+                                               c->rcv.dst_port) == 0)
+                                       return 0;
 
                                connections++;
                        }
@@ -217,7 +227,10 @@ static struct mi_root *mi_dump(struct mi_root *cmd, void 
*param)
        }
        TCPCONN_UNLOCK;
 
-       LM_ERR("%d WebSocket connections found\n", connections);
+       if (addf_mi_node_child(&rpl_tree->node, 0, 0, 0,
+                               "%d WebSocket connection%s found",
+                               connections, connections == 1 ? "" : "s") == 0)
+               return 0;
 
-       return init_mi_tree(200, MI_OK_S, MI_OK_LEN);
+       return rpl_tree;
 }


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to