We will check it. Right now you can enable/disable "a=nortpproxy:yes"
when using fix_nated_sdp():
Hi list,
I have made a small patch to the nathelper module, that allows to
configure the "a=nortpproxy:yes\r\n" string.
Basically, as noticed in user documentation, you can add this to your
configuration file, once the patch is applied and OpenSER recompiled :
% modparam("nathelper", "nortpproxy_str",
"a=sdpmangled:yes")
I needed to do this because I have the following setup:
SoftPhone1_
\____
____NATing Proxy_______Registrar Proxy_______(outside)
_/
SoftPhone2
For some reason, the registrar also uses nathelper/rtpproxy. I first used
the "f" flag for force_rtp_proxy() in my NATing proxy, in order to
circumvent the nortpproxy flag that the registrar proxy has set. This
worked perfectly except if softphone1 tries to call softphone2. In this
case my NATing proxy would replace the SDP twice. With my patch, I simply
turn the nortpproxy string to something else that only my NATing proxy
cares about.
Please, commit it if you find it worth enough.
Thank you.
Best regards,
------------------------------------------------------------------------
diff -urNp openser-1.1.0-notls/modules/nathelper/doc/nathelper_user.sgml
openser-1.1.0-notls-nortpproxy_str/modules/nathelper/doc/nathelper_user.sgml
--- openser-1.1.0-notls/modules/nathelper/doc/nathelper_user.sgml 2006-06-07
15:29:07.000000000 +0200
+++
openser-1.1.0-notls-nortpproxy_str/modules/nathelper/doc/nathelper_user.sgml 2006-09-01
20:31:53.000000000 +0200
@@ -344,6 +344,26 @@ modparam("nathelper", "sipping_method",
</programlisting>
</example>
</section>
+ <section>
+ <title><varname>nortpproxy_str</varname> (string)</title>
+ <para>
+ The parameter sets the SDP attribute used by nathelper to mark
+ the packet SDP informations have already been mangled.
+ </para>
+ <para>
+ <emphasis>
+ Default value is <quote>a=nortpproxy:yes\r\n</quote>.
+ </emphasis>
+ </para>
+ <example>
+ <title>Set <varname>nortpproxy_str</varname>
parameter</title>
+ <programlisting format="linespecific">
+...
+modparam("nathelper", "nortpproxy_str",
"a=sdpmangled:yes")
+...
+</programlisting>
+ </example>
+ </section>
</section>
diff -urNp openser-1.1.0-notls/modules/nathelper/nathelper.c
openser-1.1.0-notls-nortpproxy_str/modules/nathelper/nathelper.c
--- openser-1.1.0-notls/modules/nathelper/nathelper.c 2006-06-07 15:52:44.000000000
+0200
+++ openser-1.1.0-notls-nortpproxy_str/modules/nathelper/nathelper.c 2006-09-01
20:31:47.000000000 +0200
@@ -286,6 +286,15 @@ static pid_t mypid;
static unsigned int myseqn = 0;
static int rcv_avp_no = 42;
+/*
+ * This should have been defined right above replace_sdp_ip() but
+ * it is needed here.
+ */
+#define ANORTPPROXY "a=nortpproxy:yes\r\n"
+#define ANORTPPROXY_LEN (sizeof(ANORTPPROXY) - 1)
+static str nortpproxy_str = { ANORTPPROXY, ANORTPPROXY_LEN };
+static char *nortpproxy = NULL;
+
struct rtpp_head {
struct rtpp_node *rn_first;
@@ -336,6 +345,7 @@ static cmd_export_t cmds[] = {
static param_export_t params[] = {
{"natping_interval", INT_PARAM, &natping_interval },
{"ping_nated_only", INT_PARAM, &ping_nated_only },
+ {"nortpproxy_str", STR_PARAM, &nortpproxy },
{"rtpproxy_sock", STR_PARAM, &rtpproxy_sock },
{"rtpproxy_disable", INT_PARAM, &rtpproxy_disable },
{"rtpproxy_disable_tout", INT_PARAM, &rtpproxy_disable_tout },
@@ -400,6 +410,11 @@ mod_init(void)
force_socket=grep_sock_info(&socket_str,0,0);
}
+ if (nortpproxy != NULL) {
+ nortpproxy_str.s = nortpproxy;
+ nortpproxy_str.len = strlen(nortpproxy);
+ }
+
if (natping_interval > 0) {
bind_usrloc = (bind_usrloc_t)find_export("ul_bind_usrloc", 1, 0);
if (!bind_usrloc) {
@@ -936,9 +951,6 @@ nat_uac_test_f(struct sip_msg* msg, char
#define AOLDMEDPRT "a=oldmediaport:"
#define AOLDMEDPRT_LEN (sizeof(AOLDMEDPRT) - 1)
-#define ANORTPPROXY "a=nortpproxy:yes\r\n"
-#define ANORTPPROXY_LEN (sizeof(ANORTPPROXY) - 1)
-
static inline int
replace_sdp_ip(struct sip_msg* msg, str *org_body, char *line, str *ip)
@@ -1031,13 +1043,13 @@ fix_nated_sdp_f(struct sip_msg* msg, cha
}
}
if (level & ADD_ANORTPPROXY) {
- buf = pkg_malloc(ANORTPPROXY_LEN * sizeof(char));
+ buf = pkg_malloc(nortpproxy_str.len * sizeof(char));
if (buf == NULL) {
LOG(L_ERR, "ERROR: fix_nated_sdp: out of memory\n");
return -1;
}
- memcpy(buf, ANORTPPROXY, ANORTPPROXY_LEN);
- if (insert_new_lump_after(anchor, buf, ANORTPPROXY_LEN, 0)==NULL) {
+ memcpy(buf, nortpproxy_str.s, nortpproxy_str.len);
+ if (insert_new_lump_after(anchor, buf, nortpproxy_str.len, 0)==NULL) {
LOG(L_ERR, "ERROR: fix_nated_sdp: insert_new_lump_after "
"failed\n");
pkg_free(buf);
@@ -1811,15 +1823,15 @@ force_rtp_proxy2_f(struct sip_msg* msg,
to_tag = tmp;
}
proxied = 0;
- for (cp = body.s; (len = body.s + body.len - cp) >= ANORTPPROXY_LEN;) {
- cp1 = ser_memmem(cp, ANORTPPROXY, len, ANORTPPROXY_LEN);
+ for (cp = body.s; (len = body.s + body.len - cp) >= nortpproxy_str.len;) {
+ cp1 = ser_memmem(cp, nortpproxy_str.s, len, nortpproxy_str.len);
if (cp1 == NULL)
break;
if (cp1[-1] == '\n' || cp1[-1] == '\r') {
proxied = 1;
break;
}
- cp = cp1 + ANORTPPROXY_LEN;
+ cp = cp1 + nortpproxy_str.len;
}
if (proxied != 0 && force == 0)
return -1;
@@ -2037,7 +2049,7 @@ force_rtp_proxy2_f(struct sip_msg* msg,
} /* Iterate sessions */
if (proxied == 0) {
- cp = pkg_malloc(ANORTPPROXY_LEN * sizeof(char));
+ cp = pkg_malloc(nortpproxy_str.len * sizeof(char));
if (cp == NULL) {
LOG(L_ERR, "ERROR: force_rtp_proxy2: out of memory\n");
return -1;
@@ -2048,8 +2060,8 @@ force_rtp_proxy2_f(struct sip_msg* msg,
pkg_free(cp);
return -1;
}
- memcpy(cp, ANORTPPROXY, ANORTPPROXY_LEN);
- if (insert_new_lump_after(anchor, cp, ANORTPPROXY_LEN, 0) == NULL) {
+ memcpy(cp, nortpproxy_str.s, nortpproxy_str.len);
+ if (insert_new_lump_after(anchor, cp, nortpproxy_str.len, 0) == NULL) {
LOG(L_ERR, "ERROR: force_rtp_proxy2: insert_new_lump_after failed\n");
pkg_free(cp);
return -1;
------------------------------------------------------------------------
_______________________________________________
Users mailing list
Users(a)openser.org
http://openser.org/cgi-bin/mailman/listinfo/users