Module: sip-router
Branch: andrei/tcp_tls_changes
Commit: e316312628e61cbded9b991d21385b4e8180b538
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e316312…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Mon Jul 5 14:44:14 2010 +0200
tcp: support for tls partial encoding
The tls_encode() callback supports now partial encoding. It can
encode only part of the input buffer (e.g. tls partial write
enabled and not enough space in the internal buffers for all the
tls records) and ask to be called back later with the remaining
un-encoded part.
The send flags are also passed to it, so that it can modify them
if needed (e.g. reset SND_F_CON_CLOSE on partial tls write or when
reading some data is needed before continuing the tls write).
---
tcp_main.c | 230 +++++++++++++++++++++++++++++++++++++++++++++++------------
tls_hooks.h | 19 ++++--
2 files changed, 199 insertions(+), 50 deletions(-)
Diff: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=e31…
Module: sip-router
Branch: andrei/tcp_tls_changes
Commit: a08385f531dd0bf1044c8495e6e47c9aabfebd8a
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=a08385f…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Mon Jul 5 15:23:02 2010 +0200
tls: support for partial encoding and reseting send_flags
Support for the extended version of the tls_encode() callback.
On partial tls write and no more space in the internal static
buffers for more records, return what records were encoded so far
and ask to be called again after they are sent.
When exiting after a partial write or after postponing the encode
until more data has been read (WANT_READ), make sure that any
request to close the connection after the first successful tcp
level write will be postponed (reset SND_F_CON_CLOSE).
---
modules/tls/tls_server.c | 56 ++++++++++++++++++++++++++++++++++++++-------
modules/tls/tls_server.h | 4 ++-
2 files changed, 50 insertions(+), 10 deletions(-)
diff --git a/modules/tls/tls_server.c b/modules/tls/tls_server.c
index 600653c..f6d822c 100644
--- a/modules/tls/tls_server.c
+++ b/modules/tls/tls_server.c
@@ -607,16 +607,31 @@ typedef int (*tcp_low_level_send_t)(int fd, struct tcp_connection *c,
* It is a callback that will be called by the tcp code, before a send
* on TLS would be attempted. It should replace the input buffer with a
* new static buffer containing the TLS processed data.
+ * If the input buffer could not be fully encoded (e.g. run out of space
+ * in the internal static buffer), it should set rest_buf and rest_len to
+ * the remaining part, so that it could be called again once the output has
+ * been used (sent). The send_flags used are also passed and they can be
+ * changed (e.g. to disallow a close() after a partial encode).
* WARNING: it must always be called with c->write_lock held!
* @param c - tcp connection
* @param pbuf - pointer to buffer (value/result, on success it will be
* replaced with a static buffer).
* @param plen - pointer to buffer size (value/result, on success it will be
* replaced with the size of the replacement buffer.
+ * @param rest_buf - (result) should be filled with a pointer to the
+ * remaining unencoded part of the original buffer if any,
+ * 0 otherwise.
+ * @param rest_len - (result) should be filled with the length of the
+ * remaining unencoded part of the original buffer (0 if
+ * the original buffer was fully encoded).
+ * @param send_flags - pointer to the send_flags that will be used for sending
+ * the message.
* @return *plen on success (>=0), < 0 on error.
*/
int tls_encode_f(struct tcp_connection *c,
- const char* *pbuf, unsigned int* plen)
+ const char** pbuf, unsigned int* plen,
+ const char** rest_buf, unsigned int* rest_len,
+ snd_flags_t* send_flags)
{
int n, offs;
SSL* ssl;
@@ -631,8 +646,11 @@ int tls_encode_f(struct tcp_connection *c,
buf = *pbuf;
len = *plen;
- TLS_WR_TRACE("(%p, %p, %d) start (%s:%d* -> %s)\n",
- c, buf, len, ip_addr2a(&c->rcv.dst_ip), c->rcv.dst_port,
+ *rest_buf = 0;
+ *rest_len = 0;
+ TLS_WR_TRACE("(%p, %p, %d, ... 0x%0x) start (%s:%d* -> %s)\n",
+ c, buf, len, send_flags->f,
+ ip_addr2a(&c->rcv.dst_ip), c->rcv.dst_port,
su2a(&c->rcv.src_su, sizeof(c->rcv.src_su)));
n = 0;
offs = 0;
@@ -656,6 +674,10 @@ int tls_encode_f(struct tcp_connection *c,
c, tls_c->ct_wq?tls_c->ct_wq->queued:0);
goto error_wq_full;
}
+ /* buffer queued for a future send attempt, after first reading
+ some data (key exchange) => don't allow immediate closing of
+ the connection */
+ send_flags->f &= ~SND_F_CON_CLOSE;
goto end;
}
if (unlikely(tls_set_mbufs(c, &rd, &wr) < 0)) {
@@ -718,12 +740,28 @@ redo_wr:
goto error_wq_full;
}
tls_c->flags |= F_TLS_CON_WR_WANTS_RD;
+ /* buffer queued for a future send attempt, after first
+ reading some data (key exchange) => don't allow immediate
+ closing of the connection */
+ send_flags->f &= ~SND_F_CON_CLOSE;
break; /* or goto end */
case SSL_ERROR_WANT_WRITE:
- /* error, no record fits in the buffer */
- BUG("write buffer too small (%d/%d bytes)\n",
- wr.used, wr.size);
- goto bug;
+ if (unlikely(offs == 0)) {
+ /* error, no record fits in the buffer or
+ no partial write enabled and buffer to small to fit
+ all the records */
+ BUG("write buffer too small (%d/%d bytes)\n",
+ wr.used, wr.size);
+ goto bug;
+ } else {
+ /* offs != 0 => something was "written" */
+ *rest_buf = buf + offs;
+ *rest_len = len - offs;
+ /* this function should be called again => disallow
+ immediate closing of the connection */
+ send_flags->f &= ~SND_F_CON_CLOSE;
+ }
+ break; /* or goto end */
#if OPENSSL_VERSION_NUMBER >= 0x00907000L /*0.9.7*/
case SSL_ERROR_WANT_CONNECT:
/* only if the underlying BIO is not yet connected
@@ -772,8 +810,8 @@ redo_wr:
end:
*pbuf = (const char*)wr.buf;
*plen = wr.used;
- TLS_WR_TRACE("(%p) end (offs %d) => %d \n",
- c, offs, *plen);
+ TLS_WR_TRACE("(%p) end (offs %d, rest_buf=%p rest_len=%d 0x%0x) => %d \n",
+ c, offs, *rest_buf, *rest_len, send_flags->f, *plen);
return *plen;
error:
/*error_send:*/
diff --git a/modules/tls/tls_server.h b/modules/tls/tls_server.h
index ba28067..62047d5 100644
--- a/modules/tls/tls_server.h
+++ b/modules/tls/tls_server.h
@@ -84,7 +84,9 @@ void tls_h_tcpconn_clean(struct tcp_connection *c);
void tls_h_close(struct tcp_connection *c, int fd);
int tls_encode_f(struct tcp_connection *c,
- const char ** pbuf, unsigned int* plen);
+ const char ** pbuf, unsigned int* plen,
+ const char** rest_buf, unsigned int* rest_len,
+ snd_flags_t* send_flags) ;
int tls_read_f(struct tcp_connection *c, int* flags);
Hello list,
under special circumstances I have a problem with the DIALOG module of SIP-Router/Kamailio version 3.0.2. The dialog module is used in combination with presence, presence_xml, pua, pua_usrloc and pua_dialoginfo modules + db_mysql modules. The db_mode is set to "write_through", because of redundancy requirements.
>From my point of view this problem has something to do with timing in general. E.g. a so called "data call" has a duration of about 50 ms only; INVITE....BYE). That problem occurs on this short calls only. Because of the problems in the dialog state machine, NOTIFY messages are incorrect. Even when the call is already finished, the NOTIFY message includes the state "confirmed" and causes a wrong status indication....
The detailed error message can be seen here:
"Jun 9 16:00:39 debian /usr/sbin/kamailio[14992]: CRITICAL: dialog [dlg_hash.c:591]: bogus event 6 in state 2 for dlg [dialog-ID] with clid [Call-ID] and tags '1299370188-28358304-1276092068837' ''"
I found in old mails of the developer list another error that looked nearly the same, but it differed in the event and state of the dialog state machine (the thread can be found under the link http://www.mail-archive.com/devel@lists.kamailio.org/msg03234.html). That bug should - according the information that I've found in the list - be solved. Therefore I will ask you: is the error as displayed above another well known error / bug, which (maybe) should already be solved? Is it a new bug?
Thanks for any information.
regards,
Klaus Feichtinger
--
GMX DSL: Internet-, Telefon- und Handy-Flat ab 19,99 EUR/mtl.
Bis zu 150 EUR Startguthaben inklusive! http://portal.gmx.net/de/go/dsl
Hello all,
I have been working on the seas module to make it work on sip-router. I have
my own git branch locally, but I'd like to share it on the sip-router public
git so that others can take a look and finally push it to the master branch.
it needs some transaction-module changes, so it needs good review from other
more tm-knowledgable coders before it can be finally merged.
where do I need to send my public ssh key to get commit access to the
sip-router git ?
thanks
Elias
Heya,
I've been trying to build sip-router statically, that is, create a
single binary that includes a few selected modules from the modules/ and
modules_k/ directories only (ser modules aren't required in my case).
So far, I haven't had much luck: I tried passing various combinations of
modules, include_modules, and static_modules parameters to `make' but to
no avail. The Makefile jungle is quite vast too -- I couldn't make much
sense out of it either in order to debug what I was doing wrong.
Any help is appreciated.
Cheers,
--Timo
Revision: 6014
http://openser.svn.sourceforge.net/openser/?rev=6014&view=rev
Author: mariuszbihlei
Date: 2010-07-05 14:46:48 +0000 (Mon, 05 Jul 2010)
Log Message:
-----------
Do not consider in-early-dialog BYE requests to be bogus.
Patch from Timo Reimann (timo.reimann at 1und1 dot de )
Modified Paths:
--------------
branches/1.5/modules/dialog/dlg_hash.c
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.