Module: sip-router
Branch: master
Commit: b05f7d8fac58035cddfea6341d4317c1bc26b0e6
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b05f7d8…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Mon Apr 27 14:25:31 2009 +0200
core: added function to count applied lumps
- new defines to set/test lump flag
---
data_lump.c | 19 ++++++++++++++++++
lump_struct.h | 10 ++++++--
msg_translator.c | 56 ++++++++++++++++++++++++++++++++++-------------------
3 files changed, 62 insertions(+), 23 deletions(-)
diff --git a/data_lump.c b/data_lump.c
index 1a6c484..4174e30 100644
--- a/data_lump.c
+++ b/data_lump.c
@@ -596,3 +596,22 @@ void del_nonshm_lump( struct lump** lump_list )
}
}
+unsigned int count_applied_lumps(struct lump *ll, int type)
+{
+ unsigned int n = 0;
+ struct lump *l = 0;
+
+ for(l=ll; l; l=l->next) {
+ if (l->op==LUMP_NOP && l->type==type) {
+ if (l->after && l->after->op==LUMP_ADD_OPT) {
+ if (LUMP_IS_COND_TRUE(l->after)) {
+ n++;
+ }
+ } else {
+ n++;
+ }
+ }
+ }
+ return n;
+}
+
diff --git a/lump_struct.h b/lump_struct.h
index 39f826b..c097c6e 100644
--- a/lump_struct.h
+++ b/lump_struct.h
@@ -75,8 +75,11 @@ enum lump_conditions { COND_FALSE, /* always false */
proto = protocol (tcp, udp, tls)
*/
-enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2, LUMPFLAG_BRANCH=4
};
+enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2,
+ LUMPFLAG_BRANCH=4, LUMPFLAG_COND_TRUE=8 };
+#define LUMP_SET_COND_TRUE(_lump) (_lump)->flags |= LUMPFLAG_COND_TRUE
+#define LUMP_IS_COND_TRUE(_lump) ((_lump)->flags & LUMPFLAG_COND_TRUE)
struct lump{
enum _hdr_types_t type; /* HDR_VIA_T, HDR_OTHER_T (0), ... */
@@ -123,7 +126,8 @@ struct lump{
/* frees the content of a lump struct */
void free_lump(struct lump* l);
-/*frees an entire lump list, recursively */
+/* frees an entire lump list, recursively */
void free_lump_list(struct lump* lump_list);
-
+/* count applied lumps in a list having a specific type */
+unsigned int count_applied_lumps(struct lump *ll, int type);
#endif
diff --git a/msg_translator.c b/msg_translator.c
index 86ae002..3256048 100644
--- a/msg_translator.c
+++ b/msg_translator.c
@@ -487,7 +487,7 @@ char* clen_builder( struct sip_msg* msg, int *clen_len, int diff,
/* checks if a lump opt condition
* returns 1 if cond is true, 0 if false */
-static inline int lump_check_opt( enum lump_conditions cond,
+static inline int lump_check_opt( struct lump *l,
struct sip_msg* msg,
struct dest_info* snd_i
)
@@ -511,10 +511,11 @@ static inline int lump_check_opt( enum lump_conditions cond,
proto=msg->rcv.proto; \
} \
- switch(cond){
+ switch(l->u.cond){
case COND_FALSE:
return 0;
case COND_TRUE:
+ LUMP_SET_COND_TRUE(l);
return 1;
case COND_IF_DIFF_REALMS:
get_ip_port_proto;
@@ -526,28 +527,43 @@ static inline int lump_check_opt( enum lump_conditions cond,
#endif
(ip_addr_cmp(ip, &snd_i->send_sock->address)))
return 0;
- else return 1;
+ else {
+ LUMP_SET_COND_TRUE(l);
+ return 1;
+ }
case COND_IF_DIFF_AF:
get_ip_port_proto;
- if (ip->af!=snd_i->send_sock->address.af) return 1;
- else return 0;
+ if (ip->af!=snd_i->send_sock->address.af) {
+ LUMP_SET_COND_TRUE(l);
+ return 1;
+ } else return 0;
case COND_IF_DIFF_PROTO:
get_ip_port_proto;
- if (proto!=snd_i->send_sock->proto) return 1;
- else return 0;
+ if (proto!=snd_i->send_sock->proto) {
+ LUMP_SET_COND_TRUE(l);
+ return 1;
+ } else return 0;
case COND_IF_DIFF_PORT:
get_ip_port_proto;
- if (port!=snd_i->send_sock->port_no) return 1;
- else return 0;
+ if (port!=snd_i->send_sock->port_no) {
+ LUMP_SET_COND_TRUE(l);
+ return 1;
+ } else return 0;
case COND_IF_DIFF_IP:
get_ip_port_proto;
if (ip_addr_cmp(ip, &snd_i->send_sock->address)) return 0;
- else return 1;
+ else {
+ LUMP_SET_COND_TRUE(l);
+ return 1;
+ }
case COND_IF_RAND:
- return (rand()>=RAND_MAX/2);
+ if(rand()>=RAND_MAX/2) {
+ LUMP_SET_COND_TRUE(l);
+ return 1;
+ } else return 0;
default:
LOG(L_CRIT, "BUG: lump:w_check_opt: unknown lump condition %d\n",
- cond);
+ l->u.cond);
}
return 0; /* false */
}
@@ -778,7 +794,7 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
for(t=lumps;t;t=t->next){
/* skip if this is an OPT lump and the condition is not satisfied */
- if ((t->op==LUMP_ADD_OPT)&& !lump_check_opt(t->u.cond, msg, send_info))
+ if ((t->op==LUMP_ADD_OPT)&& !lump_check_opt(t, msg, send_info))
continue;
for(r=t->before;r;r=r->before){
switch(r->op){
@@ -791,7 +807,7 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
case LUMP_ADD_OPT:
/* skip if this is an OPT lump and the condition is
* not satisfied */
- if (!lump_check_opt(r->u.cond, msg, send_info))
+ if (!lump_check_opt(r, msg, send_info))
goto skip_before;
break;
default:
@@ -847,7 +863,7 @@ skip_before:
case LUMP_ADD_OPT:
/* skip if this is an OPT lump and the condition is
* not satisfied */
- if (!lump_check_opt(r->u.cond, msg, send_info))
+ if (!lump_check_opt(r, msg, send_info))
goto skip_after;
break;
default:
@@ -1200,7 +1216,7 @@ static inline void process_lumps( struct sip_msg* msg,
/* skip if this is an OPT lump and the condition is
* not satisfied */
if ((t->op==LUMP_ADD_OPT) &&
- (!lump_check_opt(t->u.cond, msg, send_info)))
+ (!lump_check_opt(t, msg, send_info)))
continue;
/* just add it here! */
/* process before */
@@ -1217,7 +1233,7 @@ static inline void process_lumps( struct sip_msg* msg,
case LUMP_ADD_OPT:
/* skip if this is an OPT lump and the condition is
* not satisfied */
- if (!lump_check_opt(r->u.cond, msg, send_info))
+ if (!lump_check_opt(r, msg, send_info))
goto skip_before;
break;
default:
@@ -1258,7 +1274,7 @@ skip_before:
case LUMP_ADD_OPT:
/* skip if this is an OPT lump and the condition is
* not satisfied */
- if (!lump_check_opt(r->u.cond, msg, send_info))
+ if (!lump_check_opt(r, msg, send_info))
goto skip_after;
break;
default:
@@ -1299,7 +1315,7 @@ skip_after:
case LUMP_ADD_OPT:
/* skip if this is an OPT lump and the condition is
* not satisfied */
- if (!lump_check_opt(r->u.cond, msg, send_info))
+ if (!lump_check_opt(r, msg, send_info))
goto skip_nop_before;
break;
default:
@@ -1328,7 +1344,7 @@ skip_nop_before:
case LUMP_ADD_OPT:
/* skip if this is an OPT lump and the condition is
* not satisfied */
- if (!lump_check_opt(r->u.cond, msg, send_info))
+ if (!lump_check_opt(r, msg, send_info))
goto skip_nop_after;
break;
default: