Module: kamailio
Branch: master
Commit: 1980c79d4fb2111c8c245045035f4ecb5d17fd7f
URL: 
https://github.com/kamailio/kamailio/commit/1980c79d4fb2111c8c245045035f4ecb5d17fd7f

Author: Armen Babikyan <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2016-01-04T23:05:30+01:00

core: trigger event_route execution for unexpectedly-closed and client-closed 
tcp connections

---

Modified: tcp_read.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/1980c79d4fb2111c8c245045035f4ecb5d17fd7f.diff
Patch: 
https://github.com/kamailio/kamailio/commit/1980c79d4fb2111c8c245045035f4ecb5d17fd7f.patch

---

diff --git a/tcp_read.c b/tcp_read.c
index bf07574..84ddf90 100644
--- a/tcp_read.c
+++ b/tcp_read.c
@@ -186,6 +186,25 @@ int tcp_http11_continue(struct tcp_connection *c)
 }
 #endif /* HTTP11 */
 
+static int tcp_make_closed_event(struct receive_info* rcv_info, struct 
tcp_connection* con)
+{
+       int ret;
+       tcp_event_info_t tev;
+
+       ret = 0;
+       LM_DBG("TCP closed event creation triggered\n");
+       if(likely(sr_event_enabled(SREV_TCP_CLOSED))) {
+               memset(&tev, 0, sizeof(tcp_event_info_t));
+               tev.type = SREV_TCP_CLOSED;
+               tev.rcv = rcv_info;
+               tev.con = con;
+               ret = sr_event_exec(SREV_TCP_CLOSED, (void*)(&tev));
+       } else {
+               LM_DBG("no callback registering for handling TCP closed event - 
dropping!\n");
+       }
+       return ret;
+}
+
 
 /** reads data from an existing tcp connection.
  * Side-effects: blacklisting, sets connection state to S_CONN_OK, tcp stats.
@@ -272,12 +291,20 @@ int tcp_read_data(int fd, struct tcp_connection *c,
                                                strerror(errno), errno,
                                                ip_addr2a(&c->rcv.src_ip), 
c->rcv.src_port,
                                                ip_addr2a(&c->rcv.dst_ip), 
c->rcv.dst_port);
+
+                               if((errno == ECONNRESET || errno == ETIMEDOUT) 
&& likely(c->rcv.proto_reserved1 != 0)){
+                                       tcp_make_closed_event(&c->rcv, c);
+                               }
+
                                return -1;
                        }
                }else if (unlikely((bytes_read==0) || 
                                        (*flags & RD_CONN_FORCE_EOF))){
                        c->state=S_CONN_EOF;
                        *flags|=RD_CONN_EOF;
+                       if (likely(c->rcv.proto_reserved1 != 0)){
+                               tcp_make_closed_event(&c->rcv, c);
+                       }
                        LM_DBG("EOF on %p, FD %d ([%s]:%u -> [%s]:%u)\n", c, fd,
                                        ip_addr2a(&c->rcv.src_ip), 
c->rcv.src_port,
                                        ip_addr2a(&c->rcv.dst_ip), 
c->rcv.dst_port);


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

Reply via email to