Merge remote branch 'origin/andrei/raw_sock'
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Wed, 11 Aug 2010 20:49:04 +0000 (22:49 +0200)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Wed, 11 Aug 2010 20:53:03 +0000 (22:53 +0200)
Raw socket support for sending UDP IPv4 packets
(major performance increase on multi-cpu machines running linux:
 40-50% faster at least in stateless mode).

* origin/andrei/raw_sock:
  NEWS: notes about the new udp4_raw mode
  raw sockets: added info rpc
  core: compile raw socket support by default on freebsd
  raw sockets: freebsd support
  cfg: delay cfg_shmize to just before forking
  core: always compile the raw sockets code on linux
  raw sockets: ttl can be set from the config file
  raw sockets: ttl can be set or auto-detected
  core: include raw socket support in version info
  raw sockets: use BSD ip & udp structure versions
  raw sockets: config file support
  raw sockets: udp send will use now raw sockets if enabled
  raw sockets: runtime config support
  raw sockets: build ip header & fragmentation support
  raw socket: compilation fixes
  raw sockets: get dst. ip from the ip header
  core: basic support for receiving udp sip packets on raw sockets
  core: basic raw socket support functions

1  2 
Makefile.defs
NEWS
cfg.lex
cfg.y
cfg_core.c
cfg_core.h
core_cmd.c
main.c
ver_defs.h

diff --cc Makefile.defs
Simple merge
diff --cc NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -6,29 -6,48 +6,64 @@@ $Id
  sip-router 3.1 chages
  
  core:
 +  - Dragonfly BSD support
 +  - statistics / counters support for tcp and sctp (enable by default)
 +  - statistics / counters api
 +  - networks addresses support in ip comparisons (src_ip, dst_ip, to_ip)
 +    with strings or rvalue expressions.
 +    E.g.: $ip=10.0.0.0;  if (src_ip == $ip +"/8") ....
 +  - lots of module functions automatically support now expressions or
 +      variables in function parameters. This applies to all the module
 +      functions declared without a fixup, with a fixup and the corresponding
 +      free_fixup function or with a compatible ser or kamailio style standard
 +      fixup (declared in sr_module.h or mod_fix.h).
 +      E.g.: f($a, "b = " + $b);  t_set_fr($v + 2 + $x).
 +            t_set_fr($foo) (equivalent now with t_set_fr("$foo")).
 +  - all the module functions can now be called with any constant expression
 +      as parameters. E.g.: f("7 *" +" 6 = " + 7 * 6);
+   - major performance increase on Linux multi-cpu machines that send a lot
+      of UDP IPv4 packets (40-50% faster in stateless mode). For it to work
+      udp4_raw must be enabled or set into auto mode in sr.cfg and sr must be
+      started as root or with CAP_NET_RAW. Note that even if udp4_raw is
+      off (default), if sr was started with enough privileges, it can be
+      enabled at runtime.
+      The support for using raw sockets is also available on FreeBSD (compiled
+      by default but not tested for performance yet), NetBSD, OpenBSD and
+      Darwin (not tested and not compiled by default, needs
+      make cfg extra_defs=-DUSE_RAW_SOCKS). To check if the support is
+      compiled, use ser -V |grep --color RAW_SOCKS or for a running
+      ser: sercmd core.udp4_raw_info.
+      See udp4_raw, udp4_raw_mtu and udp4_raw_ttl below.
    - onreply_route {...} is now equivalent with onreply_route[0] {...}
    - global, per protocol blacklist ignore masks (via extended send_flags).
      See dst_blacklist_udp_imask a.s.o (dst_blacklist_*_imask).
    - per message blacklist ignore masks
    - route() now supports rvalue expressions (e.g. route("test"+$i))
 +  - support for permanent entries in the DNS cache.
  
  new config variables:
+   - udp4_raw - enables raw socket support for sending UDP IPv4 datagrams 
+       (40-50% performance increase on linux multi-cpu).
+       Possible values: 0 - disabled (default), 1 - enabled, -1 auto.
+       In "auto" mode it will be enabled if possible (sr started as root or
+       with CAP_NET_RAW).
+       udp4_raw can be used on Linux and FreeBSD. For other BSDs and Darwin
+       one must compile with -DUSE_RAW_SOCKS.
+       On Linux one should also set udp4_raw_mtu if the MTU on any network
+       interface that could be used for sending is smaller then 1500.
+       Can be set at runtime as long as sr was started with enough privileges
+       (core.udp4_raw).
+   - udp4_raw_mtu - MTU value used for UDP IPv4 packets when udp4_raw is
+       enabled.  It should be set to the minimum MTU of all the network
+       interfaces that could be used for sending. The default value is 1500.
+       Note that on BSDs it does not need to be set (if set it will be ignored,
+       the proper MTU will be used automatically by the kernel). On Linux it
+       should be set.
+       Can be set at runtime (core.udp4_raw_mtu).
+   - udp4_raw_ttl - TTL value used for UDP IPv4 packets when udp4_raw is
+       enabled. By default it is set to auto mode (-1), meaning that the
+       same TTL will be used as for normal UDP sockets.
+       Can be set at runtime (core.udp4_raw_ttl).
    - dst_blacklist_udp_imask - global blacklist events ignore mask for udp
      (a blacklist event/reason set in this variable will be ignored when 
      deciding whether or not to blacklist an udp destination). Can be set
diff --cc cfg.lex
Simple merge
diff --cc cfg.y
Simple merge
diff --cc cfg_core.c
@@@ -113,10 -113,12 +114,13 @@@ struct cfg_group_core default_core_cfg 
        DEFAULT_MAX_WHILE_LOOPS, /*!< max_while_loops */
        0, /*!< udp_mtu (disabled by default) */
        0, /*!< udp_mtu_try_proto -> default disabled */
+       0, /**< udp4_raw (disabled by default) */
+       1500, /**< udp4_raw_mtu (1500 by default) */
+       -1,  /**< udp4_raw_ttl (auto detect by default) */
        0,  /*!< force_rport */
        L_DBG, /*!< memlog */
 -      1 /*!< mem_summary -flags: 0 off, 1 shm/pkg_status, 2 shm/pkg_sums */
 +      3 /*!< mem_summary -flags: 0 off, 1 pkg_status, 2 shm_status,
 +              4 pkg_sums, 8 shm_sums */
  };
  
  void  *core_cfg = &default_core_cfg;
diff --cc cfg_core.h
Simple merge
diff --cc core_cmd.c
Simple merge
diff --cc main.c
--- 1/main.c
--- 2/main.c
+++ b/main.c
   * 2008-08-08  sctp support (andrei)
   * 2008-08-19  -l support for mmultihomed addresses/addresses lists
   *                (e.g. -l (eth0, 1.2.3.4, foo.bar) ) (andrei)
-  *  2010-04-19 added daemon_status_fd pipe to communicate the parent process
-  *             with the main process in daemonize mode, so the parent process
-  *             can return the proper exit status code (ibc)
+  * 2010-04-19  added daemon_status_fd pipe to communicate the parent process
+  *              with the main process in daemonize mode, so the parent process
+  *              can return the proper exit status code (ibc)
   */
  
 -/** intializations and startup.
 +/** main file (init, daemonize, startup) 
   * @file main.c
   * @ingroup core
 - * Module: @ref core
 + * Module: core
   */
  
 -/*! \defgroup core SIP-router core
 - *
 - * This modules implements a SIP server with a module interface
 - * for extendability.
 +/*! @defgroup core SIP-router core
   *
 + * sip router core part.
   */
  
  #include <stdio.h>
  #include "basex.h" /* init */
  #include "pvapi_init.h" /* init */
  #include "pv_core.h" /* register core pvars */
 +#include "ppcfg.h"
+ #include "sock_ut.h"
  
  #ifdef DEBUG_DMALLOC
  #include <dmalloc.h>
diff --cc ver_defs.h
Simple merge