Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rr: add enable_double_rr_always option #257

Merged
merged 1 commit into from Jul 30, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 19 additions & 0 deletions modules/rr/doc/rr_admin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,25 @@ modparam("rr", "append_fromtag", 0)
...
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>
Expand Down
14 changes: 7 additions & 7 deletions modules/rr/record.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions tcp_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down