[sr-dev] git:master: pipelimit: added pl_check(pipeid, alg, limit)

Daniel-Constantin Mierla miconda at gmail.com
Tue Apr 29 22:53:32 CEST 2014


Module: sip-router
Branch: master
Commit: c1ab03dd1f1d9166df0df1f20e61db0f47ffd37b
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c1ab03dd1f1d9166df0df1f20e61db0f47ffd37b

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at 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)
 {




More information about the sr-dev mailing list