Module: kamailio
Branch: master
Commit: 6532c8b45f403e973e2d66543132553166b180ab
URL:
https://github.com/kamailio/kamailio/commit/6532c8b45f403e973e2d66543132553…
Author: Andrey Utkin <andrey.krieger.utkin(a)gmail.com>
Committer: Andrey Utkin <andrey.krieger.utkin(a)gmail.com>
Date: 2015-07-23T01:05:09+03:00
rr: add enable_double_rr_always option
---
Modified: modules/rr/doc/rr_admin.xml
Modified: modules/rr/record.c
Modified: tcp_read.c
---
Diff:
https://github.com/kamailio/kamailio/commit/6532c8b45f403e973e2d66543132553…
Patch:
https://github.com/kamailio/kamailio/commit/6532c8b45f403e973e2d66543132553…
---
diff --git a/modules/rr/doc/rr_admin.xml b/modules/rr/doc/rr_admin.xml
index 5108165..4d1b904 100644
--- a/modules/rr/doc/rr_admin.xml
+++ b/modules/rr/doc/rr_admin.xml
@@ -175,6 +175,25 @@ modparam("rr", "enable_double_rr", 0)
...
</programlisting>
</example>
+ <para>Some useragents (e. g. Linphone) incorrectly use UDP transport for
+ subsequent requests in dialog, despite being configured to use another
+ SIP transport protocol. This can be worked around by setting Record-Route
+ header with explicit transport attribute. But enable_double_rr enabled in
+ default mode omits transport attribute from being added to header if it
+ detects that both sender and receiver use same protocol (e. g. TCP or
+ TLS), and this results in UDP being used by such broken clients. Set
+ enable_double_rr to value 2 to always have two RR headers with transport
+ attributes expicitly set.</para>
+
+ <example>
+ <title>Set <varname>enable_double_rr</varname> to 2 to always
have two explicit RR headers</title>
+
+ <programlisting format="linespecific">
+...
+modparam("rr", "enable_double_rr", 2)
+...
+</programlisting>
+ </example>
</section>
<section>
diff --git a/modules/rr/record.c b/modules/rr/record.c
index d335748..9fdd157 100644
--- a/modules/rr/record.c
+++ b/modules/rr/record.c
@@ -283,7 +283,7 @@ static inline int build_rr(struct lump* _l, struct lump* _l2, str*
user,
if (_l ==0 )
goto lump_err;
if (enable_double_rr) {
- if (!(_l = insert_cond_lump_after(_l, COND_IF_DIFF_REALMS, 0)))
+ if (!(_l = insert_cond_lump_after(_l, enable_double_rr == 2 ? COND_TRUE :
COND_IF_DIFF_REALMS, 0)))
goto lump_err;
if (!(_l = insert_new_lump_after(_l, r2, RR_R2_LEN, 0)))
goto lump_err;
@@ -429,8 +429,8 @@ int record_route(struct sip_msg* _m, str *params)
ret = -5;
goto error;
}
- l = insert_cond_lump_after(l, COND_IF_DIFF_REALMS, 0);
- l2 = insert_cond_lump_before(l2, COND_IF_DIFF_REALMS, 0);
+ l = insert_cond_lump_after(l, enable_double_rr == 2 ? COND_TRUE : COND_IF_DIFF_REALMS,
0);
+ l2 = insert_cond_lump_before(l2, enable_double_rr == 2 ? COND_TRUE :
COND_IF_DIFF_REALMS, 0);
if (!l || !l2) {
LM_ERR("failed to insert conditional lump\n");
ret = -6;
@@ -706,14 +706,14 @@ static inline int build_advertised_rr(struct lump* _l, struct lump*
_l2, str *_d
goto lump_err;
}
hdr = NULL;
- if (!(_l = insert_cond_lump_after(_l, COND_IF_DIFF_PROTO, 0)))
+ if (!(_l = insert_cond_lump_after(_l, enable_double_rr == 2 ? COND_TRUE :
COND_IF_DIFF_PROTO, 0)))
goto lump_err;
if (!(_l = insert_new_lump_after(_l, trans, RR_TRANS_LEN, 0)))
goto lump_err;
if (!(_l = insert_subst_lump_after(_l, _inbound?SUBST_RCV_PROTO:SUBST_SND_PROTO, 0)))
goto lump_err;
if (enable_double_rr) {
- if (!(_l = insert_cond_lump_after(_l, COND_IF_DIFF_REALMS, 0)))
+ if (!(_l = insert_cond_lump_after(_l, enable_double_rr == 2 ? COND_TRUE :
COND_IF_DIFF_REALMS, 0)))
goto lump_err;
if (!(_l = insert_new_lump_after(_l, r2, RR_R2_LEN, 0)))
goto lump_err;
@@ -790,8 +790,8 @@ int record_route_advertised_address(struct sip_msg* _m, str* _data)
ret = -3;
goto error;
}
- l = insert_cond_lump_after(l, COND_IF_DIFF_PROTO, 0);
- l2 = insert_cond_lump_before(l2, COND_IF_DIFF_PROTO, 0);
+ l = insert_cond_lump_after(l, enable_double_rr == 2 ? COND_TRUE : COND_IF_DIFF_PROTO,
0);
+ l2 = insert_cond_lump_before(l2, enable_double_rr == 2 ? COND_TRUE :
COND_IF_DIFF_PROTO, 0);
if (!l || !l2) {
LM_ERR("failed to insert conditional lump\n");
ret = -4;
diff --git a/tcp_read.c b/tcp_read.c
index 2e1d3f2..f6ffb7b 100644
--- a/tcp_read.c
+++ b/tcp_read.c
@@ -1663,6 +1663,7 @@ inline static int handle_io(struct fd_map* fm, short events, int
idx)
return ret;
con_error:
con->state=S_CONN_BAD;
+ LM_WARN("%s:%d %s releasing\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
release_tcpconn(con, CONN_ERROR, tcpmain_sock);
return ret;
error: