Module: sip-router
Branch: master
Commit: b477f413dd740862de642790f6b3d80acc61dae0
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b477f41…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu May 7 22:23:12 2009 +0200
sercmd: doc added (README)
---
utils/sercmd/EXAMPLES | 2 +-
utils/sercmd/README | 217 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 218 insertions(+), 1 deletions(-)
diff --git a/utils/sercmd/EXAMPLES b/utils/sercmd/EXAMPLES
index b46542d..079dc6a 100644
--- a/utils/sercmd/EXAMPLES
+++ b/utils/sercmd/EXAMPLES
@@ -4,7 +4,7 @@ sercmd usage examples
help:
- sercmd unixd:/tmp/unix_dgram -h
+ sercmd -h
use an udp ser control socket:
ser config:
diff --git a/utils/sercmd/README b/utils/sercmd/README
new file mode 100644
index 0000000..1c9c823
--- /dev/null
+++ b/utils/sercmd/README
@@ -0,0 +1,217 @@
+# $Id$
+#
+# History:
+# --------
+# 2009-05-07 created by Andrei Pelinescu-Onciul <andrei(a)iptel.org>
+
+
+Overview
+========
+
+sercmd is a unix tool for interfacing with sip-router using ser exported RPCs.
+It uses binrpc (a proprietary protocol, designed for minimal packet size and
+fast parsing) over a variety of transports (unix stream sockets, unix datagram
+ sockets, udp or tcp).
+For more details on binrpc see the ctl module documentation
+(modules_s/ctl/README).
+
+sercmd can work in command line mode (the RPC or command name is just another
+command line parameter) or in interactive mode. The interactive mode supports
+history and tab-completion (if sercmd was compiled with libreadline support).
+
+On ser side the ctl module must be loaded.
+
+
+Usage
+=====
+
+ sercmd [options][-s address] [ cmd ]
+
+Options:
+ -s address unix socket name or host name to send the commands on
+ -R name force reply socket name, for the unix datagram socket mode
+ -D dir create the reply socket in the directory <dir> if no reply
+ socket is forced (-R) and an unix datagram socket is selected
+ as the transport
+ -f format print the result using format. Format is a string containing
+ %v at the places where values read from the reply should be
+ substituted. To print '%v', escape it using '%': %%v.
+ -v Verbose
+ -V Version number
+ -h Help message
+address:
+ [proto:]name[:port] where proto is one of tcp, udp, unixs, unix or unixd
+ e.g.: tcp:localhost:2048 , unixs:/tmp/ser_ctl
+ If the protocol is not specified, unixs will be
+ used if name is a filesystem path and udp if not.
+ "unixs" or "unix" stand for unix stream sockets
+ and "unixd" for unix datagram sockets.
+cmd:
+ method [arg1 [arg2...]]
+arg:
+ string or number; to force a number to be interpreted as string
+ prefix it by "s:", e.g. s:1
+
+If no address is specified (no -s), sercmd will use by default
+unixs:/tmp/ser_ctl. This is also the default for the ctl module (if no
+ "binrpc" module parameters are present in the config).
+
+
+Command Types
+=============
+
+There are 3 types of commands: "raw" ser RPC, sercmd aliases and sercmd
+ builtins.
+
+The "raw" RPC commands work directly with ser with no change on the input or
+ the output.
+All the RPCs can be seen using sercmd ls.
+
+The aliases are just other easier to remember names for some ser RPCs, which
+some time include nicer formatting of the rpc result.
+One can see all the defined aliases using: sercmd help|grep alias: .
+Example:
+ ps is an alias for core.ps with the output formatted in a more readable way.
+ sercmd ps is equivalent to sercmd -f"%v\t%v\n" core.ps.
+ Without the formatting, the output of sercmd core.ps looks like:
+
+11262
+attendant
+11268
+udp receiver child=0 sock=127.0.0.1:5060
+...
+ Using sercmd ps (or sercmd -f"%v\t%v\n" core.ps) the output looks like:
+
+11262 attendant
+11268 udp receiver child=0 sock=127.0.0.1:5060
+...
+
+The built-in commands can combine several different rpcs.
+One can see all the built-in commands using: sercmd help|grep builtin: .
+
+
+Getting help on a command
+=========================
+
+To get the help message associated with a command use
+sercmd help <command_name>.
+Example:
+$ sercmd help ps
+ps is an alias for core.ps with reply formatting: "%v\t%v\n"
+$ sercmd help core.ps
+Returns the description of running SER processes.
+
+
+Listing all the commands
+========================
+
+To see all the available commands (ser RPCs, aliases and bultins) use
+ sercmd help.
+To see only the "raw" RPCs, user sercmd ls.
+Note: since each module can define its own RPCs, the available RPCs depend
+ on the loaded modules.
+
+
+Examples
+========
+
+Using the default socket (requires only loadmodule "ctl" in ser.cfg):
+
+$ sercmd ps
+11262 attendant
+11268 udp receiver child=0 sock=127.0.0.1:5060
+11269 udp receiver child=1 sock=127.0.0.1:5060
+11270 udp receiver child=0 sock=192.168.1.101:5060
+11271 udp receiver child=1 sock=192.168.1.101:5060
+11272 slow timer
+11273 timer
+11274 ctl handler
+11275 tcp receiver child=0
+11276 tcp receiver child=1
+11277 tcp main process
+
+$ sercmd help # list all the supported commands
+dst_blacklist.add
+ctl.who
+...
+
+$ sercmd help core.uptime # help for the core.uptime rpc
+Returns uptime of SER server.
+
+$ sercmd cfg.cfg_set_int_now debug 5 # turn debug level to 5 (needs cfg)
+
+$ sercmd # enters interactive mode
+
+Using a tcp socket
+(assumes modparam("ctl", "binrpc", "tcp:localhost:2048") in ser.cfg)
+
+$ sercmd -s tcp:localhost:2048 core.version
+Server: Sip EXpress router (2.1.0-dev23-make (i386/linux))
+
+$ sercmd -s tcp:localhost:2048 SRV _sip._udp.iptel.org
+ name: _sip._udp.iptel.org
+ type: SRV
+ size (bytes): 104
+ reference counter: 2
+ expires in (s): 67693
+ last used (s): 0
+ error flags: 0
+ rr name: sip.iptel.org
+ rr port: 5060
+ rr priority: 0
+ rr weight: 0
+ rr expires in (s): 67693
+ rr error flags: 0
+
+sercmd -s tcp:127.0.0.1:2048 # enters interactive mode over tcp
+
+For more examples see utils/sercmd/EXAMPLES
+ [http://git.sip-router.org/cgi-bin/gitweb.cgi?p=sip-router;a=blob;f=utils/se…].
+
+
+Interactive Mode
+================
+
+To enter the interactive mode start sercmd without specifying a command name
+ on the command line.
+If sercmd was compiled with libreadline support (automatically if
+libreadline dev files are installed), the interactive mode will have tab
+completion and history support.
+
+Example:
+
+$ sercmd
+sercmd 0.1
+Copyright 2006 iptelorg GmbH
+This is free software with ABSOLUTELY NO WARRANTY.
+For details type `warranty'.
+sercmd> core.s<tab>
+core.sctp_info core.sctp_options core.shmmem
+sercmd> help core.shmmem
+Returns shared memory info.
+sercmd> core.shmmem
+{
+ total: 33554432
+ free: 33147816
+ used: 190644
+ real_used: 406616
+ max_used: 406616
+ fragments: 2
+}
+sercmd> quit
+
+
+Related Stuff
+=============
+
+
+ctl module: required, implements binrpc on ser side, without it sercmd
+doesn't work.
+See modules_s/ctl/README
+ [http://git.sip-router.org/cgi-bin/gitweb.cgi?p=sip-router;a=blob;f=modules_…].
+
+cfg_rpc module: allows setting or reading configuration parameters on-the-fly.
+For example one could change the tcp connection lifetime to 180s using:
+$ sercmd cfg.set_now_int tcp.connection_lifetime 180
+See modules_s/cfg_rpc/README
+ [http://git.sip-router.org/cgi-bin/gitweb.cgi?p=sip-router;a=blob;f=modules_…].
(forwarding to sr-dev).
Jan.
On 07-05 14:34, Jan Janak wrote:
> On 07-05 14:22, Henning Westerholt wrote:
> > On Sonntag, 3. Mai 2009, Daniel-Constantin Mierla wrote:
> > > 1. Admin Guide
> > >
> > > - 1.1. Overview
> > > - 1.2. Dependencies
> > > [..]
> > > + 1. Overview
> > > + 2. Dependencies
> >
> > Hi Jan,
> >
> > i noticed that the READMEs generated for modules_k looks now a bit
> > different then the ones generated for the modules_s. The k ones uses "1.",
> > the s ones "1.1", for the first chapter for example.
>
> This is because docbook documents in ser modules start with <section>, not
> <book>, we do not use <book> and <chapter> tags anymore in our docbook
> documents because it makes it hard to include such documents into other
> documents.
>
> > Another thing that is
> > missing both of them is modules_s READMEs, is the list of the examples. Is
> > this a bug or do you wanted to change this?
>
> This was intentional. I think it makes no sense to have lists of examples in
> short plain-text documents like the READMEs (there are no page numbers
> anyway).
>
> I have also removed the list of functions and parameters. I think such lists
> are only useful if you have page numbers, so that you can jump to the
> corresponding function/parameter/example quickly, but READMEs have no page
> numbers and the less boilerplate we have at the beginning of the document the
> better, IMHO.
>
> Nevertheless, if people think that READMEs should have lists of functions and
> parameters at the beginning, I can modify the templates and put it back.
>
> Jan.
Module: sip-router
Branch: master
Commit: 030e80b538e6ec3f29a73fcc5660af86cb385926
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=030e80b…
Author: Henning Westerholt <henning.westerholt(a)1und1.de>
Committer: Henning Westerholt <henning.westerholt(a)1und1.de>
Date: Thu May 7 18:09:11 2009 +0200
test: port r5833 from kamailio
---
test/unit/3.sh | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/test/unit/3.sh b/test/unit/3.sh
index b336d8d..a5f808f 100755
--- a/test/unit/3.sh
+++ b/test/unit/3.sh
@@ -19,8 +19,9 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Needs a mysql database, the root user password must be given
-# in the file 'dbrootpw' in the test directory
+# Needs a mysql database, the root user password must be assigned to
+# the 'PW' variable in the file 'dbrootpw' in the test directory, e.g.:
+# PW=sql_root_passwd
source include/common
@@ -46,7 +47,7 @@ sed -i "s/TEST=\"false\"/TEST=\"true\"/g" $DBCTL
# set the mysql root password
cp $DBCTL.mysql $DBCTL.mysql.bak
-sed -i "s/#PW=""/PW="$PW"/g" $DBCTL.mysql
+sed -i "s/#PW=\"\"/PW=\"$PW\"/g" $DBCTL.mysql
./$DBCTL create $tmp_name > /dev/null
ret=$?
@@ -62,4 +63,4 @@ mv $DBCTL.mysql.bak $DBCTL.mysql
mv $DBCTL.bak $DBCTL
cd ../test
-exit $ret
\ No newline at end of file
+exit $ret
Module: sip-router
Branch: master
Commit: 7c79fc7a29d4a9509f69f7aca55a992c6b4cbff7
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7c79fc7…
Author: Henning Westerholt <henning.westerholt(a)1und1.de>
Committer: Henning Westerholt <henning.westerholt(a)1und1.de>
Date: Thu May 7 15:26:38 2009 +0200
dialog(k): refine change ffcf29e66d, we need to take care only of PROC_MAIN
---
modules_k/dialog/dialog.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/modules_k/dialog/dialog.c b/modules_k/dialog/dialog.c
index caae794..7a5d198 100644
--- a/modules_k/dialog/dialog.c
+++ b/modules_k/dialog/dialog.c
@@ -583,10 +583,9 @@ static int child_init(int rank)
* for the rest of the processes will be the same as DB_MODE_NONE */
if (dlg_db_mode==DB_MODE_SHUTDOWN && rank!=PROC_MAIN)
dlg_db_mode = DB_MODE_NONE;
- /* in DB_MODE_REALTIME and DB_MODE_DELAYED the PROC_MAIN or the ones
- * with negative rank will have no db connection */
+ /* in DB_MODE_REALTIME and DB_MODE_DELAYED the PROC_MAIN have no DB handle */
if ( (dlg_db_mode==DB_MODE_REALTIME || dlg_db_mode==DB_MODE_DELAYED) &&
- (rank<0 || rank==PROC_MAIN))
+ rank==PROC_MAIN)
dlg_db_mode = DB_MODE_NONE;
return 0;
Module: sip-router
Branch: master
Commit: ffcf29e66d0e78fed90d25fb70425c8ad002d6c0
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ffcf29e…
Author: Henning Westerholt <henning.westerholt(a)1und1.de>
Committer: Henning Westerholt <henning.westerholt(a)1und1.de>
Date: Thu May 7 15:09:09 2009 +0200
dialog(k): port db setup to different child_init behaviour on sr
- port db setup to different child_init behaviour on sr, here child_init
is called two times for PROC_MAIN
- don't open a DB connection in PROC_MAIN in DB_MODE_DELAYED
- don't close the connection during mod_destroy if nothing was opened
---
modules_k/dialog/dialog.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/modules_k/dialog/dialog.c b/modules_k/dialog/dialog.c
index 1e6c5de..caae794 100644
--- a/modules_k/dialog/dialog.c
+++ b/modules_k/dialog/dialog.c
@@ -570,10 +570,9 @@ static int child_init(int rank)
if_update_stat(dlg_enable_stats, early_dlgs, early_dlgs_cnt);
}
- if ( (dlg_db_mode==DB_MODE_REALTIME && (rank>0 || rank==PROC_TIMER)) ||
- (dlg_db_mode==DB_MODE_SHUTDOWN && (rank==PROC_MAIN)) ||
- (dlg_db_mode==DB_MODE_DELAYED && (rank==PROC_MAIN || rank==PROC_TIMER ||
- rank>0) )){
+ if ( ((dlg_db_mode==DB_MODE_REALTIME || DB_MODE_DELAYED) &&
+ (rank>0 || rank==PROC_TIMER)) ||
+ (dlg_db_mode==DB_MODE_SHUTDOWN && (rank==PROC_MAIN)) ) {
if ( dlg_connect_db(&db_url) ) {
LM_ERR("failed to connect to database (rank=%d)\n",rank);
return -1;
@@ -584,6 +583,11 @@ static int child_init(int rank)
* for the rest of the processes will be the same as DB_MODE_NONE */
if (dlg_db_mode==DB_MODE_SHUTDOWN && rank!=PROC_MAIN)
dlg_db_mode = DB_MODE_NONE;
+ /* in DB_MODE_REALTIME and DB_MODE_DELAYED the PROC_MAIN or the ones
+ * with negative rank will have no db connection */
+ if ( (dlg_db_mode==DB_MODE_REALTIME || dlg_db_mode==DB_MODE_DELAYED) &&
+ (rank<0 || rank==PROC_MAIN))
+ dlg_db_mode = DB_MODE_NONE;
return 0;
}
Module: sip-router
Branch: ser_core_cvs
Commit: 7a66235b9f972d735575ebb839f87f2eaa1b0c61
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7a66235…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Apr 30 16:38:54 2009 +0000
sctp: internal macro-hooks for stats
Added macros for sctp statistics. (for now empty, keeping
more statistics will only involve redefining them):
SCTP_STATS_ESTABLISHED() - new association is opened successfully
SCTP_STATS_CONNECT_FAILED() - attempt to open new assoc. failed
SCTP_STATS_LOCAL_REJECT() - local reject of a "connect" attempt
(unused for now)
SCTP_STATS_REMOTE_SHUTDOWN()
SCTP_STATS_COMM_LOST() - error on open association
SCTP_STATS_SENDQ_FULL() - send failed due to full buffers (kernel)
SCTP_STATS_SEND_FAILED() - send failed for some other reason
SCTP_STATS_SEND_FORCE_RETRY() - send failed and retried
(sctp_send_retries!=0)
---
sctp_server.c | 14 ++++++++
sctp_stats.h | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 113 insertions(+), 0 deletions(-)
diff --git a/sctp_server.c b/sctp_server.c
index ff2e778..b4aed18 100644
--- a/sctp_server.c
+++ b/sctp_server.c
@@ -23,6 +23,7 @@
* --------
* 2008-08-07 initial version (andrei)
* 2009-02-27 blacklist support (andrei)
+ * 2009-04-28 sctp stats & events macros (andrei)
*/
#ifdef USE_SCTP
@@ -57,6 +58,7 @@
#include "clist.h"
#include "error.h"
#include "timer.h"
+#include "sctp_stats.h"
@@ -1496,6 +1498,10 @@ int init_sctp()
int ret;
ret=0;
+ if (INIT_SCTP_STATS()!=0){
+ ERR("sctp init: failed to intialize sctp stats\n");
+ goto error;
+ }
/* sctp options must be initialized before calling this function */
sctp_conn_no=shm_malloc(sizeof(*sctp_conn_tracked));
if ( sctp_conn_no==0){
@@ -1522,6 +1528,7 @@ void destroy_sctp()
#ifdef SCTP_CONN_REUSE
destroy_sctp_con_tracking();
#endif
+ DESTROY_SCTP_STATS();
}
@@ -1613,6 +1620,7 @@ static int sctp_handle_send_failed(struct socket_info* si,
int ret;
ret=-1;
+ SCTP_STATS_SEND_FAILED();
snp=(union sctp_notification*) buf;
retries=snp->sn_send_failed.ssf_info.sinfo_context;
@@ -1623,6 +1631,7 @@ static int sctp_handle_send_failed(struct socket_info* si,
*/
if (retries && (snp->sn_send_failed.ssf_error==0)) {
DBG("sctp: RETRY-ing (%d)\n", retries);
+ SCTP_STATS_SEND_FORCE_RETRY();
retries--;
data=(char*)snp->sn_send_failed.ssf_data;
data_len=snp->sn_send_failed.ssf_length -
@@ -1685,6 +1694,7 @@ static int sctp_handle_assoc_change(struct socket_info* si,
ret=-1;
switch(state){
case SCTP_COMM_UP:
+ SCTP_STATS_ESTABLISHED();
atomic_inc(sctp_conn_no);
#ifdef SCTP_CONN_REUSE
/* new connection, track it */
@@ -1707,6 +1717,7 @@ again:
#endif /* SCTP_CONN_REUSE */
break;
case SCTP_COMM_LOST:
+ SCTP_STATS_COMM_LOST();
#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) */
@@ -1732,6 +1743,7 @@ again:
/* do nothing on restart */
break;
case SCTP_CANT_STR_ASSOC:
+ SCTP_STATS_CONNECT_FAILED();
/* do nothing when failing to start an assoc
(in this case we never see SCTP_COMM_UP so we never
track the assoc) */
@@ -1816,6 +1828,7 @@ static int sctp_handle_notification(struct socket_info* si,
);
break;
case SCTP_SHUTDOWN_EVENT:
+ SCTP_STATS_REMOTE_SHUTDOWN();
ERR_LEN_TOO_SMALL(len, sizeof(struct sctp_shutdown_event), si, su,
"SCTP_SHUTDOWN_EVENT");
SNOT("sctp notification from %s on %.*s:%d: SCTP_SHUTDOWN_EVENT:"
@@ -2162,6 +2175,7 @@ again:
"one possible reason is the server is bound to localhost and\n"
"attempts to send to the net\n");
}else if (errno==EAGAIN || errno==EWOULDBLOCK){
+ SCTP_STATS_SENDQ_FULL();
LOG(L_ERR, "ERROR: sctp_msg_send: failed to send, send buffers"
" full\n");
}
diff --git a/sctp_stats.h b/sctp_stats.h
new file mode 100644
index 0000000..e895ce8
--- /dev/null
+++ b/sctp_stats.h
@@ -0,0 +1,99 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2009 iptelorg GmbH
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * sctp_stats.h - sctp statistics macros
+ */
+/*
+ * History:
+ * --------
+ * 2009-04-28 initial version (andrei)
+*/
+
+#ifndef __sctp_stats_h
+#define __sctp_stats_h
+
+
+#ifndef USE_SCTP_STATS
+
+#define INIT_SCTP_STATS() 0 /* success */
+#define DESTROY_SCTP_STATS()
+
+#define SCTP_STATS_ESTABLISHED()
+#define SCTP_STATS_CONNECT_FAILED()
+#define SCTP_STATS_LOCAL_REJECT()
+#define SCTP_STATS_REMOTE_SHUTDOWN()
+#define SCTP_STATS_COMM_LOST()
+#define SCTP_STATS_SENDQ_FULL()
+#define SCTP_STATS_SEND_FAILED()
+#define SCTP_STATS_SEND_FORCE_RETRY()
+
+#else /* USE_SCTP_STATS */
+
+#define INIT_SCTP_STATS() 0 /* success */
+
+#define DESTROY_SCTP_STATS()
+
+
+/** called each time a new sctp assoc. is established.
+ * sctp notification: SCTP_COMM_UP.
+ */
+#define SCTP_STATS_ESTABLISHED()
+
+/** called each time a new outgoing connection/assoc open fails.
+ * sctp notification: SCTP_CANT_STR_ASSOC
+ */
+#define SCTP_STATS_CONNECT_FAILED()
+
+/** called each time a new incoming connection is rejected. */
+#define SCTP_STATS_LOCAL_REJECT()
+
+
+/** called each time a connection is closed by the peer.
+ * sctp notification: SCTP_SHUTDOWN_EVENT
+ */
+#define SCTP_STATS_REMOTE_SHUTDOWN()
+
+
+/** called each time an established connection is closed due to some error.
+ * sctp notification: SCTP_COMM_LOST
+ */
+#define SCTP_STATS_COMM_LOST()
+
+
+/** called each time a send fails due to the buffering capacity being exceeded.
+ * (send fails due to full kernel buffers)
+ */
+#define SCTP_STATS_SENDQ_FULL()
+
+
+/** called each time a send fails.
+ * (send fails for any reason except buffers full)
+ * sctp notification: SCTP_SEND_FAILED
+ */
+#define SCTP_STATS_SEND_FAILED()
+
+/** called each time a failed send is force-retried.
+ * (possible only if sctp_send_retries is != 0)
+ */
+#define SCTP_STATS_SEND_FORCE_RETRY()
+
+#endif /* USE_SCTP_STATS */
+
+#endif /*__sctp_stats_h*/
+
+/* vi: set ts=4 sw=4 tw=79:ai:cindent: */