Merge remote branch 'origin/andrei/blst_send_flags'
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Fri, 19 Feb 2010 15:37:51 +0000 (16:37 +0100)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Fri, 19 Feb 2010 15:46:18 +0000 (16:46 +0100)
Support for blacklist ignore flags, both global and on a per
message basis.
E.g.:
per message:
if (method=~"MESSAGE")
blst_set_ignore(6);

global:
sercmd cfg.set_now_int core dst_blacklist_tcp_imask 16

* origin/andrei/blst_send_flags:
  NEWS: minor blacklist flag number correction
  tm: blacklist on 503 reply fixed for send flags
  NEWS: mentioned blacklist ignore masks
  core: cfg script support for blacklist ignore masks
  blst: global config variables for ignoring blacklist events
  blst: docs for blst_{set,clear}_ignore script functions
  blst: functions for ignoring blacklist events
  blst: use dst_blacklist_force_add
  tm: simplified blacklist add code
  blacklist: ignore mask support
  tm: updated to the new snd_flags_t structure
  core: send_flags preliminary blacklist support

Conflicts:
NEWS
cfg.lex
cfg.y
dst_blacklist.h

17 files changed:
1  2 
NEWS
action.c
cfg.lex
cfg.y
cfg_core.c
cfg_core.h
dst_blacklist.c
dst_blacklist.h
forward.c
ip_addr.h
modules/tm/t_reply.c
modules/tm/timer.c
modules/tm/uac.c
parser/msg_parser.h
sctp_server.c
tcp_main.c
tcp_read.c

diff --cc NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -64,8 -100,8 +100,10 @@@ config script changes
    - while()
    - include file support: include_file "somefile"
    - event route support: event_route[module_name:eventid]
 +  - user and shm_force_alloc must now appear prior to any modparam() or route
 +     block.
+   - per message send_flags support (see set_forward_no_connect(),
+      set_forward_reply_no_connect(), set_forward_close() & set_reply_close())
  
  build system:
    - multiple modules directories are now supported (defined in Makefile.dirs)
diff --cc action.c
Simple merge
diff --cc cfg.lex
+++ b/cfg.lex
@@@ -80,7 -80,7 +80,8 @@@
   *  2009-03-10  added SET_USERPHONE action (Miklos)
   *  2009-04-24  add strlen, strempty and defined operators (andrei)
   *  2009-03-07  RETCODE, it's now  a core pvar (andrei)
 + *  2010-01-10  added SHM_MEM_SZ (andrei)
+  *  2010-02-17 added DST_BLST_{UDP,TCP,TLS,SCTP}_IMASK (andrei)
  */
  
  
diff --cc cfg.y
--- 1/cfg.y
--- 2/cfg.y
+++ b/cfg.y
@@@ -96,8 -96,7 +96,9 @@@
   * 2009-01-26  case/switch() support (andrei)
   * 2009-03-10  added SET_USERPHONE action (Miklos)
   * 2009-05-04  switched if to rval_expr (andrei)
 + * 2010-01-10  init shm on first mod_param or route block;
 + *             added SHM_MEM_SZ (andrei)
+  * 2010-02-17  added blacklist imask (DST_BLST_*_IMASK) support (andrei)
  */
  
  %{
diff --cc cfg_core.c
  #include "cfg_core.h"
  
  struct cfg_group_core default_core_cfg = {
 -      L_WARN,         /*  print only msg. < L_WARN */
 -      LOG_DAEMON,     /* log_facility -- see syslog(3) */
 -      L_DBG,  /* memdbg */
 +      L_WARN,         /*!<  print only msg. < L_WARN */
 +      LOG_DAEMON,     /*!< log_facility -- see syslog(3) */
 +      L_DBG,  /*!< memdbg */
  #ifdef USE_DST_BLACKLIST
        /* blacklist */
 -      0, /* dst blacklist is disabled by default */
 +      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
diff --cc cfg_core.h
@@@ -56,13 -47,17 +56,17 @@@ extern void        *core_cfg
  struct cfg_group_core {
        int     debug;
        int     log_facility;
 -      int memdbg; /*< log level for memory debugging messages */
 +      int memdbg; /*!< log level for memory debugging messages */
  #ifdef USE_DST_BLACKLIST
        /* blacklist */
 -      int     use_dst_blacklist; /* 1 if blacklist is enabled */
 -      unsigned int    blst_timeout; /* blacklist entry ttl */
 -      unsigned int    blst_max_mem; /* maximum memory used for the
 +      int     use_dst_blacklist; /*!< 1 if blacklist is enabled */
 +      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 --cc dst_blacklist.c
Simple merge
diff --cc dst_blacklist.h
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
- /**
 +
-  * @brief SIP-router core :: Destination blacklists
++/** SIP-router core :: Destination blacklists.
 + * @file
 + * @ingroup core
 + * Module: @ref core
 + */
 +
  /* History:
   * --------
   *  2006-07-29  created by andrei
@@@ -89,41 -90,125 +93,127 @@@ int init_dst_blacklist_stats(int iproc_
  void destroy_dst_blacklist();
  
  
- /** @brief like dst_blacklist_add, but the timeout can be also set */
- int dst_blacklist_add_to(unsigned char err_flags, struct dest_info* si,
-                                               struct sip_msg* msg, ticks_t timeout);
- /** @brief like above, but using a differnt way of passing the target */
- int dst_blacklist_su_to(unsigned char err_flags, unsigned char proto,
                                                      union sockaddr_union* dst,
-                                                       struct sip_msg* msg, ticks_t timeout);
+ /** force add to the blacklist.
+  * like @function dst_blacklist_add_to, but no ignore mask or
+  * blacklist enabled checks are made.
+  * @see dst_blacklist_add_to for the parameters and return value.
+  */
int dst_blacklist_force_add_to(unsigned char err_flags, struct dest_info* si,
+                                                               struct sip_msg* msg, ticks_t timeout);
  
- /** @brief adds a dst to the blacklist with default timeout.
-  * @see dst_blacklist_add_to for more details.
+ /** force add to the blacklist, long version.
+  * like @function dst_blacklist_su_to, but no ignore mask or
+  * blacklist enabled checks are made.
+  * @see dst_blacklist_su_to for the parameters and return value.
   */
- #define dst_blacklist_add(err_flags, si, msg) \
-       dst_blacklist_add_to((err_flags), (si), (msg), \
-               S_TO_TICKS(cfg_get(core, core_cfg, blst_timeout)))
+ int dst_blacklist_force_su_to(        unsigned char err_flags,
+                                                               unsigned char proto,
+                                                               union sockaddr_union* dst,
+                                                               struct sip_msg* msg,
+                                                               ticks_t timeout);
+ /** checks if blacklist should be used.
+   * @param  err_flags - blacklist reason
+   * @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) & ~blst_proto_imask[(unsigned)((si)->proto)] & \
+                                          ~(si)->send_flags.blst_imask ))
+ /** checks if blacklist should be used, long version.
+   * @param  err_flags - blacklist reason
+   * @param snd_flags - snd_flags pointer, can be 0.
+   * @param proto - protocol, can be 0 (PROTO_NONE).
+   * @param si  - sockaddr_union pointer, can be 0.
+   * @return 1 if blacklist is enabled (core_cfg) and the event/error
+   *           is not in the ignore list.
+   *         0 otherwise
+   */
+ #define should_blacklist_su(err_flags, snd_flags, proto, su) \
+       (cfg_get(core, core_cfg, use_dst_blacklist) && \
+               ((err_flags) & ~blst_proto_imask[(unsigned)(proto)] & \
+                                       ~((snd_flags)?((snd_flags_t*)(snd_flags))->blst_imask:0)))
+ /** adds a dst to the blacklist.
+  *
+  * @param  err_flags - blacklist reason
+  * @param si  - dest_info structure (dst).
+  * @param msg - sip msg struct. pointer if known, 0 otherwise.
+  * @param timeout - timeout in ticks.
+  * @return >=0 on success, -1 on error.
+  */
+ #define dst_blacklist_add_to(err_flags, si, msg, timeout) \
+       (should_blacklist(err_flags, si)? \
+               dst_blacklist_force_add_to((err_flags), (si), (msg), (timeout))\
+               : 0)
+ /** adds a dst to the blacklist, long version.
+  * Similar to dst_blacklist_add_to, but uses "unpacked" parameters.
+  * @param  err_flags - blacklist reason
+  * @param proto - protocol.
+  * @param dst  - sockaddr_union pointer.
+  * @param snd_flags - snd_flags pointer, can be 0.
+  * @param msg - sip msg struct. pointer if known, 0 otherwise.
+  * @param timeout - timeout in ticks.
+  * @return >=0 on success, -1 on error.
+  */
+ #define dst_blacklist_su_to(err_flags, proto, dst, snd_flags, msg, timeout) \
+       (should_blacklist_su(err_flags, snd_flags, proto, dst) ? \
+               dst_blacklist_force_su_to((err_flags), (proto), (dst), (msg), \
+                                                                       (timeout))\
+               : 0)
  
- /** @brief adds a dst to the blacklist with default timeout.
-  * @see dst_blacklist_su_to for more details.
+ /** adds a dst to the blacklist with default timeout.
+  *
+  * @param  err_flags - blacklist reason
+  * @param si  - dest_info structure (dst).
+  * @param msg - sip msg struct. pointer if known, 0 otherwise.
+  * @return >=0 on success, -1 on error.
+  * @see dst_blacklist_add_to.
   */
- #define dst_blacklist_su(err_flags, proto, dst, msg) \
-       dst_blacklist_su_to((err_flags), (proto), (dst), (msg), \
-               S_TO_TICKS(cfg_get(core, core_cfg, blst_timeout)))
+ #define dst_blacklist_add(err_flags, si, msg) \
+       dst_blacklist_add_to(err_flags, si, msg, \
+                                                       S_TO_TICKS(cfg_get(core, core_cfg, blst_timeout)))
+ /** adds a dst to the blacklist with default timeout, long version.
+  * Similar to dst_blacklist_add_to, but uses "unpacked" parameters.
+  * @param  err_flags - blacklist reason
+  * @param proto - protocol.
+  * @param dst  - sockaddr_union pointer.
+  * @param snd_flags - snd_flags pointer, can be 0.
+  * @param msg - sip msg struct. pointer if known, 0 otherwise.
+  * @return >=0 on success, -1 on error.
+  * @see dst_blacklist_su_to.
+  */
+ #define dst_blacklist_su(err_flags, proto, dst, snd_flags, msg) \
+       dst_blacklist_su_to(err_flags, proto, dst, snd_flags, msg, \
+                                                       S_TO_TICKS(cfg_get(core, core_cfg, blst_timeout)))
  
  int dst_is_blacklisted(struct dest_info* si, struct sip_msg* msg);
 -/* delete an entry from the blacklist */
 +
- /** @brief  delete an entry from the blacklist */
++/** delete an entry from the blacklist. */
  int dst_blacklist_del(struct dest_info* si, struct sip_msg* msg);
  
- /** @brief deletes all the entries from the blacklist except the permanent ones
 -/* deletes all the entries from the blacklist except the permanent ones
++/** deletes all the entries from the blacklist except the permanent ones.
   * (which are marked with BLST_PERMANENT)
   */
  void dst_blst_flush(void);
  
  int use_dst_blacklist_fixup(void *handle, str *gname, str *name, void **val);
 -/* KByte to Byte conversion */
 +
- /** @brief KByte to Byte conversion */
++/** 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
diff --cc forward.c
Simple merge
diff --cc ip_addr.h
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc sctp_server.c
@@@ -2220,16 -2212,11 +2219,15 @@@ again
  #ifdef USE_DST_BLACKLIST
                        /* blacklist only if send_retries is turned off (if on we don't
                           know here if we did retry or we are at the first error) */
-                       if (cfg_get(core, core_cfg, use_dst_blacklist) &&
-                                       (cfg_get(sctp, sctp_cfg, send_retries)==0))
-                                               dst_blacklist_su(BLST_ERR_SEND, PROTO_SCTP, su, 0);
+                       if (cfg_get(sctp, sctp_cfg, send_retries)==0)
+                                               dst_blacklist_su(BLST_ERR_SEND, PROTO_SCTP, su, 0, 0);
  #endif /* USE_DST_BLACKLIST */
                        /* no break */
 +                      goto comm_lost_cont;    /* do not increment counters for
 +                                                                         SCTP_SHUTDOWN_COMP */
                case SCTP_SHUTDOWN_COMP:
 +                      SCTP_STATS_ASSOC_SHUTDOWN();
 +comm_lost_cont:
                        atomic_dec(sctp_conn_no);
  #ifdef SCTP_CONN_REUSE
                        /* connection down*/
diff --cc tcp_main.c
Simple merge
diff --cc tcp_read.c
Simple merge