Module: sip-router Branch: master Commit: c1ab03dd1f1d9166df0df1f20e61db0f47ffd37b URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c1ab03dd...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Tue Apr 29 22:35:46 2014 +0200
pipelimit: added pl_check(pipeid, alg, limit)
- when alg and limit parameters are given, pl_check() creates the pipe if it doesn't exists - if exists, then no change is done to existing pipe (alg and limit are not changed)
---
modules/pipelimit/pipelimit.c | 109 +++++++++++++++++++++++++++++++++++------ 1 files changed, 93 insertions(+), 16 deletions(-)
diff --git a/modules/pipelimit/pipelimit.c b/modules/pipelimit/pipelimit.c index 5aeb071..a2a39b5 100644 --- a/modules/pipelimit/pipelimit.c +++ b/modules/pipelimit/pipelimit.c @@ -111,20 +111,24 @@ int _pl_cfg_setpoint; /* desired load, used when reading modparams */ static int mod_init(void); static ticks_t pl_timer_handle(ticks_t, struct timer_ln*, void*); static int w_pl_check(struct sip_msg*, char *, char *); +static int w_pl_check3(struct sip_msg*, char *, char *, char *); static int w_pl_drop_default(struct sip_msg*, char *, char *); static int w_pl_drop_forced(struct sip_msg*, char *, char *); static int w_pl_drop(struct sip_msg*, char *, char *); static void destroy(void); +static int fixup_pl_check3(void** param, int param_no);
static cmd_export_t cmds[]={ {"pl_check", (cmd_function)w_pl_check, 1, fixup_spve_null, - 0, REQUEST_ROUTE|LOCAL_ROUTE}, + 0, REQUEST_ROUTE|CORE_ONREPLY_ROUTE}, + {"pl_check", (cmd_function)w_pl_check3, 3, fixup_pl_check3, + 0, REQUEST_ROUTE|CORE_ONREPLY_ROUTE}, {"pl_drop", (cmd_function)w_pl_drop_default, 0, 0, - 0, REQUEST_ROUTE|LOCAL_ROUTE}, + 0, REQUEST_ROUTE}, {"pl_drop", (cmd_function)w_pl_drop_forced, 1, fixup_uint_null, - 0, REQUEST_ROUTE|LOCAL_ROUTE}, + 0, REQUEST_ROUTE}, {"pl_drop", (cmd_function)w_pl_drop, 2, fixup_uint_uint, - 0, REQUEST_ROUTE|LOCAL_ROUTE}, + 0, REQUEST_ROUTE}, {0,0,0,0,0,0} }; static param_export_t params[]={ @@ -513,24 +517,16 @@ int hash[100] = {18, 50, 51, 39, 49, 68, 8, 78, 61, 75, 53, 32, 45, 77, 31, * (expects pl_lock to be taken), TODO revert to "return" instead of "ret =" * \return -1 if drop needed, 1 if allowed */ -static int pipe_push(struct sip_msg * msg, str *pipeid) +static int pipe_push_direct(pl_pipe_t *pipe) { int ret; - pl_pipe_t *pipe = NULL; - - pipe = pl_pipe_get(pipeid, 1); - if(pipe==NULL) - { - LM_ERR("pipe not found [%.*s]\n", pipeid->len, pipeid->s); - return -2; - }
pipe->counter++;
switch (pipe->algo) { case PIPE_ALGO_NOP: LM_ERR("no algorithm defined for pipe %.*s\n", - pipeid->len, pipeid->s); + pipe->name.len, pipe->name.s); ret = 2; break; case PIPE_ALGO_TAILDROP: @@ -554,16 +550,29 @@ static int pipe_push(struct sip_msg * msg, str *pipeid) } LM_DBG("pipe=%.*s algo=%d limit=%d pkg_load=%d counter=%d " "load=%2.1lf network_load=%d => %s\n", - pipeid->len, pipeid->s, + pipe->name.len, pipe->name.s, pipe->algo, pipe->limit, pipe->load, pipe->counter, *load_value, *network_load_value, (ret == 1) ? "ACCEPT" : "DROP");
- pl_pipe_release(pipeid); + pl_pipe_release(&pipe->name);
return ret; }
+static int pipe_push(struct sip_msg * msg, str *pipeid) +{ + pl_pipe_t *pipe = NULL; + + pipe = pl_pipe_get(pipeid, 1); + if(pipe==NULL) + { + LM_ERR("pipe not found [%.*s]\n", pipeid->len, pipeid->s); + return -2; + } + return pipe_push_direct(pipe); +} + /** * runs the current request through the queues * \param msg @@ -579,6 +588,9 @@ static int pl_check(struct sip_msg * msg, str *pipeid) return ret; }
+/** + * limit checking with exiting pipes + */ static int w_pl_check(struct sip_msg* msg, char *p1, char *p2) { str pipeid = {0, 0}; @@ -594,6 +606,71 @@ static int w_pl_check(struct sip_msg* msg, char *p1, char *p2) }
+/** + * limit checking with creation of pipe if it doesn't exist + */ +static int w_pl_check3(struct sip_msg* msg, char *p1pipe, char *p2alg, + char *p3limit) +{ + int limit; + str pipeid = {0, 0}; + str alg = {0, 0}; + pl_pipe_t *pipe = NULL; + + if(msg==NULL) + return -1; + + if(fixup_get_ivalue(msg, (gparam_t*)p3limit, &limit)!=0 || limit<=0) + { + LM_ERR("invalid limit value\n"); + return -1; + } + + if(fixup_get_svalue(msg, (gparam_t*)p1pipe, &pipeid)!=0 + || pipeid.s == 0) + { + LM_ERR("invalid pipeid parameter"); + return -1; + } + + if(fixup_get_svalue(msg, (gparam_t*)p2alg, &alg)!=0 + || alg.s == 0) + { + LM_ERR("invalid algoritm parameter"); + return -1; + } + + pipe = pl_pipe_get(&pipeid, 1); + if(pipe==NULL) + { + LM_DBG("pipe not found [%.*s] - trying to add it\n", + pipeid.len, pipeid.s); + if(pl_pipe_add(&pipeid, &alg, limit)<0) + { + LM_ERR("failed to add pipe [%.*s]\n", + pipeid.len, pipeid.s); + return -2; + } + pipe = pl_pipe_get(&pipeid, 1); + if(pipe==NULL) + { + LM_ERR("failed to retrieve pipe [%.*s]\n", + pipeid.len, pipeid.s); + return -2; + } + } + + return 1; +} + +static int fixup_pl_check3(void** param, int param_no) +{ + if(param_no==1) return fixup_spve_null(param, 1); + if(param_no==2) return fixup_spve_null(param, 1); + if(param_no==3) return fixup_igp_null(param, 1); + return 0; +} + /* timer housekeeping, invoked each timer interval to reset counters */ static ticks_t pl_timer_handle(ticks_t ticks, struct timer_ln* tl, void* data) {