[sr-dev] git:4.2: pipelimit: fix dynamic pipe limit check

Daniel-Constantin Mierla miconda at gmail.com
Fri Oct 17 09:44:16 CEST 2014


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Oct 17 09:40:33 2014 +0200

pipelimit: fix dynamic pipe limit check

- proper add and check at the same time

(cherry picked from commit b76afe7c0699b936bec3d7bb1c3a740bf08fdb1c)

---

 modules/pipelimit/doc/pipelimit_admin.xml |   18 +++++++++++++++++-
 modules/pipelimit/pipelimit.c             |    6 +++---
 modules/pipelimit/pl_ht.c                 |    2 +-
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/modules/pipelimit/doc/pipelimit_admin.xml b/modules/pipelimit/doc/pipelimit_admin.xml
index d2ae537..0983f60 100644
--- a/modules/pipelimit/doc/pipelimit_admin.xml
+++ b/modules/pipelimit/doc/pipelimit_admin.xml
@@ -302,7 +302,15 @@ modparam("pipelimit", "reply_reason", "Limiting")
 		<para>Meaning of the parameters is as follows:</para>
 		<itemizedlist>
 			<listitem><para>
-			<emphasis>name</emphasis> - the pseudovariable holding the pipe name.
+			<emphasis>name</emphasis> - the string or pseudovariable with the pipe name.
+			</para></listitem>
+			<listitem><para>
+			<emphasis>algorithm</emphasis> - the string or pseudovariable with the
+			algorithm. The values can be: taildrop, red, network or feedback - see
+			readme of ratelimit module for details on each algorithm.
+			</para></listitem>
+			<listitem><para>
+			<emphasis>limit</emphasis> - the integer or pseudovariable with the limit value.
 			</para></listitem>
 		</itemizedlist>
 		<para>
@@ -345,6 +353,14 @@ with unexpected retcode=$var(check_result)\n");
 		exit;
 	}
 ...
+	# perform pipe match for authenticated user
+	$var(limit) = 20;
+	if (!pl_check("$au", "traildrop", "$var(limit)")) {
+		pl_drop();
+		exit;
+	}
+...
+
 </programlisting>
 		</example>
 	</section>
diff --git a/modules/pipelimit/pipelimit.c b/modules/pipelimit/pipelimit.c
index b76ba0d..3e6b918 100644
--- a/modules/pipelimit/pipelimit.c
+++ b/modules/pipelimit/pipelimit.c
@@ -645,7 +645,7 @@ static int w_pl_check3(struct sip_msg* msg, char *p1pipe, char *p2alg,
 		return -1;
 	}
 
-	pipe = pl_pipe_get(&pipeid, 1);
+	pipe = pl_pipe_get(&pipeid, 0);
 	if(pipe==NULL)
 	{
 		LM_DBG("pipe not found [%.*s] - trying to add it\n",
@@ -656,7 +656,7 @@ static int w_pl_check3(struct sip_msg* msg, char *p1pipe, char *p2alg,
 				pipeid.len, pipeid.s);
 			return -2;
 		}
-		pipe = pl_pipe_get(&pipeid, 1);
+		pipe = pl_pipe_get(&pipeid, 0);
 		if(pipe==NULL)
 		{
 			LM_ERR("failed to retrieve pipe [%.*s]\n",
@@ -665,7 +665,7 @@ static int w_pl_check3(struct sip_msg* msg, char *p1pipe, char *p2alg,
 		}
 	}
 
-	return 1;
+	return pl_check(msg, &pipeid);
 }
 
 static int fixup_pl_check3(void** param, int param_no)
diff --git a/modules/pipelimit/pl_ht.c b/modules/pipelimit/pl_ht.c
index 3b4a3bd..6e48bb4 100644
--- a/modules/pipelimit/pl_ht.c
+++ b/modules/pipelimit/pl_ht.c
@@ -240,7 +240,7 @@ pl_pipe_t* pl_pipe_get(str *pipeid, int mode)
 		if(pipeid->len==it->name.len 
 				&& strncmp(pipeid->s, it->name.s, pipeid->len)==0)
 		{
-			 /* lock_release(&_pl_pipes_ht->slots[idx].lock);*/
+			 if(mode==0) lock_release(&_pl_pipes_ht->slots[idx].lock);
 			 return it;
 		}
 		it = it->next;




More information about the sr-dev mailing list