Module: sip-router
Branch: andrei/blst_send_flags
Commit: 0f9e9908055fe15d26d953f5477559254ef37436
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0f9e990…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Mon Feb 15 21:37:28 2010 +0100
blst: global config variables for ignoring blacklist events
Blacklist events can now be ignored on a per protocol basis, by
setting the corresponding new config variable:
dst_blacklist_udp_imask
dst_blacklist_tcp_imask
dst_blacklist_tls_imask
dst_blacklist_sctp_imask
E.g.: sercmd cfg.set_now_int core dst_blacklist_tcp_imask 6
(ignore send and connect errors on tcp when deciding whether or
not to blacklist)
---
cfg_core.c | 15 ++++++++++++++-
cfg_core.h | 4 ++++
dst_blacklist.c | 36 ++++++++++++++++++++++++++++++++++++
dst_blacklist.h | 12 +++++++++---
4 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/cfg_core.c b/cfg_core.c
index edebb9b..6f91740 100644
--- a/cfg_core.c
+++ b/cfg_core.c
@@ -54,6 +54,10 @@ struct cfg_group_core default_core_cfg = {
0, /* dst blacklist is disabled by default */
DEFAULT_BLST_TIMEOUT,
DEFAULT_BLST_MAX_MEM,
+ 0, /* blst_udp_imask */
+ 0, /* blst_tcp_imask */
+ 0, /* blst_tls_imask */
+ 0, /* blst_sctp_imask */
#endif
/* resolver */
#ifdef USE_IPV6
@@ -114,7 +118,16 @@ cfg_def_t core_cfg_def[] = {
{"dst_blacklist_expire", CFG_VAR_INT, 0, 0, 0, 0,
"how much time (in s) a blacklisted destination is kept in the list"},
{"dst_blacklist_mem", CFG_VAR_INT, 0, 0, blst_max_mem_fixup, 0,
- "maximum shared memory amount (in KB) used for keeping the blacklisted
destinations"},
+ "maximum shared memory amount (in KB) used for keeping the blacklisted"
+ " destinations"},
+ {"dst_blacklist_udp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
+ "blacklist event ignore mask for UDP"},
+ {"dst_blacklist_tcp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
+ "blacklist event ignore mask for TCP"},
+ {"dst_blacklist_tls_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
+ "blacklist event ignore mask for TLS"},
+ {"dst_blacklist_sctp_imask", CFG_VAR_INT, 0, 0, 0, blst_reinit_ign_masks,
+ "blacklist event ignore mask for SCTP"},
#endif
/* resolver */
#ifdef USE_DNS_CACHE
diff --git a/cfg_core.h b/cfg_core.h
index b37aacc..9fa26f6 100644
--- a/cfg_core.h
+++ b/cfg_core.h
@@ -54,6 +54,10 @@ struct cfg_group_core {
unsigned int blst_timeout; /* blacklist entry ttl */
unsigned int blst_max_mem; /* maximum memory used for the
blacklist entries */
+ unsigned int blst_udp_imask; /* ignore mask for udp */
+ unsigned int blst_tcp_imask; /* ignore mask for tcp */
+ unsigned int blst_tls_imask; /* ignore mask for tls */
+ unsigned int blst_sctp_imask; /* ignore mask for sctp */
#endif
/* resolver */
int dns_try_ipv6;
diff --git a/dst_blacklist.c b/dst_blacklist.c
index 2c3653b..0e22727 100644
--- a/dst_blacklist.c
+++ b/dst_blacklist.c
@@ -136,6 +136,9 @@ struct dst_blst_lst_head* dst_blst_hash=0;
struct t_dst_blacklist_stats* dst_blacklist_stats=0;
#endif
+/* blacklist per protocol event ignore mask array */
+unsigned blst_proto_imask[PROTO_LAST+1];
+
#ifdef DST_BLACKLIST_HOOKS
/* there 2 types of callbacks supported: on add new entry to the blacklist
@@ -296,6 +299,26 @@ inline static int blacklist_run_hooks(struct blst_callbacks_lst
*cb_lst,
#endif /* DST_BLACKLIST_HOOKS */
+/** init per protocol blacklist event ignore masks.
+ * @return 0 on success, < 0 on error.
+ */
+int blst_init_ign_masks()
+{
+ if ((PROTO_UDP > PROTO_LAST) || (PROTO_TCP > PROTO_LAST) ||
+ (PROTO_TLS > PROTO_LAST) || (PROTO_SCTP > PROTO_LAST)){
+ BUG("protocol array too small\n");
+ return -1;
+ }
+ blst_proto_imask[PROTO_UDP]=cfg_get(core, core_cfg, blst_udp_imask);
+ blst_proto_imask[PROTO_TCP]=cfg_get(core, core_cfg, blst_tcp_imask);
+ blst_proto_imask[PROTO_TLS]=cfg_get(core, core_cfg, blst_tls_imask);
+ blst_proto_imask[PROTO_SCTP]=cfg_get(core, core_cfg, blst_sctp_imask);
+ blst_proto_imask[PROTO_NONE]=blst_proto_imask[PROTO_UDP];
+ return 0;
+}
+
+
+
inline static void blst_destroy_entry(struct dst_blst_entry* e)
{
shm_free(e);
@@ -478,6 +501,10 @@ int init_dst_blacklist()
goto error;
}
}
+ if (blst_init_ign_masks() < 0){
+ ret=E_BUG;
+ goto error;
+ }
return 0;
error:
destroy_dst_blacklist();
@@ -1197,5 +1224,14 @@ int blst_max_mem_fixup(void *handle, str *gname, str *name, void
**val)
return 0;
}
+
+
+/** re-inint per child blst_proto_ign_mask array. */
+void blst_reinit_ign_masks(str* gname, str* name)
+{
+ blst_init_ign_masks();
+}
+
+
#endif /* USE_DST_BLACKLIST */
diff --git a/dst_blacklist.h b/dst_blacklist.h
index 175ce78..c079167 100644
--- a/dst_blacklist.h
+++ b/dst_blacklist.h
@@ -65,6 +65,9 @@
#define DST_BLACKLIST_ADD_CB 1
#define DST_BLACKLIST_SEARCH_CB 2
+
+extern unsigned blst_proto_imask[PROTO_LAST+1];
+
#ifdef DST_BLACKLIST_HOOKS
struct blacklist_hook{
/* WARNING: msg might be NULL, and it might point to shared memory
@@ -109,14 +112,15 @@ int dst_blacklist_force_su_to( unsigned char err_flags,
/** checks if blacklist should be used.
* @param err_flags - blacklist reason
- * @param si - filled dst_info structure pointer.
+ * @param si - filled dest_info structure pointer.
* @return 1 if blacklist is enabled (core_cfg) and the event/error
* is not in the ignore list.
* 0 otherwise
*/
#define should_blacklist(err_flags, si) \
(cfg_get(core, core_cfg, use_dst_blacklist) && \
- ((err_flags) & (si)->send_flags.blst_imask))
+ ((err_flags) & ~blst_proto_imask[(unsigned)((si)->proto)] & \
+ ~(si)->send_flags.blst_imask ))
/** checks if blacklist should be used, long version.
@@ -130,7 +134,7 @@ int dst_blacklist_force_su_to( unsigned char err_flags,
*/
#define should_blacklist_su(err_flags, snd_flags, proto, su) \
(cfg_get(core, core_cfg, use_dst_blacklist) && \
- ((err_flags) & \
+ ((err_flags) & ~blst_proto_imask[(unsigned)(proto)] & \
~((snd_flags)?((snd_flags_t*)(snd_flags))->blst_imask:0)))
@@ -205,4 +209,6 @@ int use_dst_blacklist_fixup(void *handle, str *gname, str *name, void
**val);
/* KByte to Byte conversion */
int blst_max_mem_fixup(void *handle, str *gname, str *name, void **val);
+void blst_reinit_ign_masks(str* gname, str* name);
+
#endif