[sr-dev] git:master: evapi: execute cfg event routes
Daniel-Constantin Mierla
miconda at gmail.com
Mon Mar 31 09:42:05 CEST 2014
Module: sip-router
Branch: master
Commit: 0abf67a47450f0350a7826ec0719e66f4fc61022
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0abf67a47450f0350a7826ec0719e66f4fc61022
Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: Sun Mar 30 15:27:53 2014 +0200
evapi: execute cfg event routes
- event_route[evapi:connection-new] - new client connected
- event_route[evapi:connection-closed] - client connection closed
- event_route[evapi:message-received] - message received from client
---
modules/evapi/Makefile | 1 +
modules/evapi/evapi_dispatch.c | 105 ++++++++++++++++++++++++++++++++++++----
modules/evapi/evapi_dispatch.h | 2 +
modules/evapi/evapi_mod.c | 9 ++++
4 files changed, 108 insertions(+), 9 deletions(-)
diff --git a/modules/evapi/Makefile b/modules/evapi/Makefile
index cd6d856..097c552 100644
--- a/modules/evapi/Makefile
+++ b/modules/evapi/Makefile
@@ -32,5 +32,6 @@ DEFS+=-DKAMAILIO_MOD_INTERFACE
SERLIBPATH=../../lib
SER_LIBS+=$(SERLIBPATH)/srutils/srutils
+SER_LIBS+=$(SERLIBPATH)/kcore/kcore
include ../../Makefile.modules
diff --git a/modules/evapi/evapi_dispatch.c b/modules/evapi/evapi_dispatch.c
index 59297e2..5a13ae4 100644
--- a/modules/evapi/evapi_dispatch.c
+++ b/modules/evapi/evapi_dispatch.c
@@ -36,6 +36,7 @@
#include "../../sr_module.h"
#include "../../dprint.h"
#include "../../ut.h"
+#include "../../lib/kcore/faked_msg.h"
static int _evapi_notify_sockets[2];
@@ -51,6 +52,77 @@ typedef struct _evapi_client {
#define EVAPI_MAX_CLIENTS 8
static evapi_client_t _evapi_clients[EVAPI_MAX_CLIENTS];
+typedef struct _evapi_evroutes {
+ int con_new;
+ int con_closed;
+ int msg_received;
+} evapi_evroutes_t;
+
+static evapi_evroutes_t _evapi_rts;
+
+static int _evapi_con_idx = -1;
+
+/**
+ *
+ */
+void evapi_init_event_routes(void)
+{
+ memset(&_evapi_rts, 0, sizeof(evapi_evroutes_t));
+
+ _evapi_rts.con_new = route_get(&event_rt, "evapi:connection-new");
+ if (_evapi_rts.con_new < 0 || event_rt.rlist[_evapi_rts.con_new] == NULL)
+ _evapi_rts.con_new = -1;
+ _evapi_rts.con_closed = route_get(&event_rt, "evapi:connection-closed");
+ if (_evapi_rts.con_closed < 0 || event_rt.rlist[_evapi_rts.con_closed] == NULL)
+ _evapi_rts.con_closed = -1;
+ _evapi_rts.msg_received = route_get(&event_rt, "evapi:message-received");
+ if (_evapi_rts.msg_received < 0 || event_rt.rlist[_evapi_rts.msg_received] == NULL)
+ _evapi_rts.msg_received = -1;
+}
+
+/**
+ *
+ */
+int evapi_run_cfg_route(int conidx, int rt)
+{
+ int backup_rt;
+ struct run_act_ctx ctx;
+ sip_msg_t *fmsg;
+
+ if(conidx<0)
+ return -1;
+
+ if(rt<0)
+ return 0;
+
+ fmsg = faked_msg_next();
+ backup_rt = get_route_type();
+ _evapi_con_idx = conidx;
+ set_route_type(REQUEST_ROUTE);
+ init_run_actions_ctx(&ctx);
+ run_top_route(event_rt.rlist[rt], fmsg, 0);
+ _evapi_con_idx = -1;
+ set_route_type(backup_rt);
+ return 0;
+}
+
+/**
+ *
+ */
+int evapi_cfg_close_connection(void)
+{
+ if(_evapi_con_idx<0 || _evapi_con_idx>=EVAPI_MAX_CLIENTS)
+ return -1;
+ if(_evapi_clients[_evapi_con_idx].connected==1
+ && _evapi_clients[_evapi_con_idx].sock > 0) {
+ close(_evapi_clients[_evapi_con_idx].sock);
+ _evapi_clients[_evapi_con_idx].connected = 0;
+ _evapi_clients[_evapi_con_idx].sock = 0;
+ return 0;
+ }
+ return -2;
+}
+
/**
*
*/
@@ -129,22 +201,32 @@ void evapi_recv_client(struct ev_loop *loop, struct ev_io *watcher, int revents)
return;
}
+ for(i=0; i<EVAPI_MAX_CLIENTS; i++) {
+ if(_evapi_clients[i].connected==1 && _evapi_clients[i].sock==watcher->fd) {
+ break;
+ }
+ }
+ if(i==EVAPI_MAX_CLIENTS) {
+ LM_ERR("cannot lookup client socket %d\n", watcher->fd);
+ return;
+ }
+
if(rlen == 0) {
/* client is gone */
- for(i=0; i<EVAPI_MAX_CLIENTS; i++) {
- if(_evapi_clients[i].connected==1 && _evapi_clients[i].sock==watcher->fd) {
- _evapi_clients[i].connected = 0;
- _evapi_clients[i].sock = 0;
- break;
- }
- }
+ evapi_run_cfg_route(i, _evapi_rts.con_closed);
+ _evapi_clients[i].connected = 0;
+ _evapi_clients[i].sock = 0;
ev_io_stop(loop, watcher);
free(watcher);
- LM_INFO("client closing connection\n");
+ LM_INFO("client closing connection - pos [%d] addr [%s:%d]\n",
+ i, _evapi_clients[i].src_addr, _evapi_clients[i].src_port);
return;
}
- LM_NOTICE("received [%.*s]\n", (int)rlen, rbuffer);
+ LM_NOTICE("{%d} [%s:%d] - received [%.*s]\n",
+ i, _evapi_clients[i].src_addr, _evapi_clients[i].src_port,
+ (int)rlen, rbuffer);
+ evapi_run_cfg_route(i, _evapi_rts.msg_received);
}
/**
@@ -212,6 +294,11 @@ void evapi_accept_client(struct ev_loop *loop, struct ev_io *watcher, int revent
LM_DBG("new connection - pos[%d] from: [%s:%d]\n", i,
_evapi_clients[i].src_addr, _evapi_clients[i].src_port);
+ evapi_run_cfg_route(i, _evapi_rts.con_new);
+
+ if(_evapi_clients[i].connected == 0)
+ return;
+
/* start watcher to read messages from whatchers */
ev_io_init(evapi_client, evapi_recv_client, csock, EV_READ);
ev_io_start(loop, evapi_client);
diff --git a/modules/evapi/evapi_dispatch.h b/modules/evapi/evapi_dispatch.h
index 33afdef..5db3bd7 100644
--- a/modules/evapi/evapi_dispatch.h
+++ b/modules/evapi/evapi_dispatch.h
@@ -35,4 +35,6 @@ int evapi_run_worker(int prank);
int evapi_relay(str *evdata);
+void evapi_init_event_routes(void);
+
#endif
diff --git a/modules/evapi/evapi_mod.c b/modules/evapi/evapi_mod.c
index 9a999d1..089be86 100644
--- a/modules/evapi/evapi_mod.c
+++ b/modules/evapi/evapi_mod.c
@@ -35,6 +35,7 @@
#include "../../mem/shm_mem.h"
#include "../../mod_fix.h"
#include "../../cfg/cfg_struct.h"
+#include "../../lib/kcore/faked_msg.h"
#include "../../modules/tm/tm_load.h"
@@ -95,6 +96,12 @@ static int mod_init(void)
{
char *p;
+ /* init faked sip msg */
+ if(faked_msg_init()<0) {
+ LM_ERR("failed to init faked sip msg\n");
+ return -1;
+ }
+
if(load_tm_api( &tmb ) < 0) {
LM_INFO("cannot load the TM-functions - async relay disabled\n");
memset(&tmb, 0, sizeof(tm_api_t));
@@ -119,6 +126,8 @@ static int mod_init(void)
/* add child to update local config framework structures */
cfg_register_child(1 + _evapi_workers);
+ evapi_init_event_routes();
+
return 0;
}
More information about the sr-dev
mailing list