Module: sip-router
Branch: master
Commit: b2ef844bfdcce46d6a1b88f60ff2fe4d1de30855
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b2ef844…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Sat Dec 22 09:24:11 2012 +0100
nathelper(k): added the select for rewriting the contact
- exsting in the ser flavour version
---
modules_k/nathelper/README | 41 +++++++++++---
modules_k/nathelper/doc/nathelper_admin.xml | 22 +++++++
modules_k/nathelper/nathelper.c | 80 +++++++++++++++++++++++++++
3 files changed, 135 insertions(+), 8 deletions(-)
diff --git a/modules_k/nathelper/README b/modules_k/nathelper/README
index b516c8d..a11f2f8 100644
--- a/modules_k/nathelper/README
+++ b/modules_k/nathelper/README
@@ -78,6 +78,10 @@ Ovidiu Sas
7.1. nh_enable_ping
+ 8. Selects
+
+ 8.1. @nathelper.rewrite_contact[n]
+
2. Frequently Asked Questions
List of Examples
@@ -102,6 +106,7 @@ Ovidiu Sas
1.18. $rr_count usage
1.19. $rr_top_count usage
1.20. nh_enable_ping usage
+ 1.21. @nathelper.rewrite_contact usage
Chapter 1. Admin Guide
@@ -148,6 +153,10 @@ Chapter 1. Admin Guide
7.1. nh_enable_ping
+ 8. Selects
+
+ 8.1. @nathelper.rewrite_contact[n]
+
1. Overview
This is a module to help with NAT traversal and reuse of tcp
@@ -396,7 +405,7 @@ modparam("nathelper", "keepalive_timeout", 120)
5.7. add_contact_alias([ip_addr, port, proto])
5.8. handle_ruri_alias()
-5.1. fix_nated_contact()
+5.1. fix_nated_contact()
Rewrites Contact HF to contain request's source address:port.
@@ -408,7 +417,7 @@ modparam("nathelper", "keepalive_timeout", 120)
if (search("User-Agent: Cisco ATA.*") {fix_nated_contact();};
...
-5.2. fix_nated_sdp(flags [, ip_address])
+5.2. fix_nated_sdp(flags [, ip_address])
Alters the SDP information in orer to facilitate NAT traversal. What
changes to be performed may be controled via the "flags" parameter.
@@ -436,7 +445,7 @@ if (search("User-Agent: Cisco ATA.*")
{fix_nated_contact();};
if (search("User-Agent: Cisco ATA.*") {fix_nated_sdp("3");};
...
-5.3. add_rcv_param([flag]),
+5.3. add_rcv_param([flag]),
Add received parameter to Contact header fields or Contact URI. The
parameter will contain URI created from the source IP, port, and
@@ -460,7 +469,7 @@ add_rcv_param(); # add the parameter to the Contact header
add_rcv_param("1"); # add the parameter to the Contact URI
...
-5.4. fix_nated_register()
+5.4. fix_nated_register()
The function creates a URI consisting of the source IP, port, and
protocol and stores the URI in an Attribute-Value-Pair. The URI will be
@@ -478,7 +487,7 @@ add_rcv_param("1"); # add the parameter to the Contact URI
fix_nated_register();
...
-5.5. nat_uac_test(flags)
+5.5. nat_uac_test(flags)
Tries to guess if client's request originated behind a nat. The
parameter determines what heuristics is used.
@@ -501,14 +510,14 @@ fix_nated_register();
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
FAILURE_ROUTE, BRANCH_ROUTE.
-5.6. is_rfc1918(ip_address)
+5.6. is_rfc1918(ip_address)
Determines if the address in the parameter is an rfc1918 address. The
parameter allows pseudo-variables usage.
This function can be used from ANY_ROUTE.
-5.7. add_contact_alias([ip_addr, port, proto])
+5.7. add_contact_alias([ip_addr, port, proto])
Adds ;alias=ip~port~transport parameter to contact URI containing
either received ip, port, and transport protocol or those given as
@@ -528,7 +537,7 @@ fix_nated_register();
};
...
-5.8. handle_ruri_alias()
+5.8. handle_ruri_alias()
Checks if Request URI has alias param and if so, removes it and sets
$du based on its value. Note that this means that routing of request is
@@ -607,6 +616,22 @@ fix_nated_register();
$ kamctl fifo nh_enable_ping 1
...
+8. Selects
+
+ 8.1. @nathelper.rewrite_contact[n]
+
+8.1. @nathelper.rewrite_contact[n]
+
+ Get n-th Contact value with IP:Port rewritten to source ip:port. N is
+ counted from 1. Only IP:port is rewritten, remaining part are left
+ unchanged. Full nameaddr is supported.
+
+ Example 1.21. @nathelper.rewrite_contact usage
+...
+$c = @nathelper.rewrite_contact[1];
+...
+$c2 = @nathelper.rewrite_contact[1].nameaddr.uri;
+
Chapter 2. Frequently Asked Questions
2.1. What happend with "rtpproxy_disable" parameter?
diff --git a/modules_k/nathelper/doc/nathelper_admin.xml
b/modules_k/nathelper/doc/nathelper_admin.xml
index 21f3b2b..bc4c8d7 100644
--- a/modules_k/nathelper/doc/nathelper_admin.xml
+++ b/modules_k/nathelper/doc/nathelper_admin.xml
@@ -736,5 +736,27 @@ $ &ctltool; fifo nh_enable_ping 1
</section>
+ <section>
+ <title>Selects</title>
+
+ <section id="nathelper.rewrite_contact">
+ <title>(a)nathelper.rewrite_contact[n]</title>
+ <para>
+ Get n-th Contact value with IP:Port rewritten to source ip:port. N is counted from 1.
+ Only IP:port is rewritten, remaining part are left unchanged. Full nameaddr is
supported.
+ </para>
+ <example>
+ <title>(a)nathelper.rewrite_contact usage</title>
+ <programlisting>
+...
+$c = @nathelper.rewrite_contact[1];
+...
+$c2 = @nathelper.rewrite_contact[1].nameaddr.uri;
+ </programlisting>
+ </example>
+ </section>
+
+ </section>
+
</chapter>
diff --git a/modules_k/nathelper/nathelper.c b/modules_k/nathelper/nathelper.c
index 27bc1d2..9f72795 100644
--- a/modules_k/nathelper/nathelper.c
+++ b/modules_k/nathelper/nathelper.c
@@ -220,6 +220,7 @@
#include "../../socket_info.h"
#include "../../mod_fix.h"
#include "../../dset.h"
+#include "../../select.h"
#include "../registrar/sip_msg.h"
#include "../usrloc/usrloc.h"
#include "nathelper.h"
@@ -440,6 +441,27 @@ struct module_exports exports = {
static int
+sel_nathelper(str* res, select_t* s, struct sip_msg* msg)
+{
+
+ /* dummy */
+ return 0;
+}
+
+static int sel_rewrite_contact(str* res, select_t* s, struct sip_msg* msg);
+
+SELECT_F(select_any_nameaddr)
+
+select_row_t sel_declaration[] = {
+ { NULL, SEL_PARAM_STR, STR_STATIC_INIT("nathelper"), sel_nathelper,
SEL_PARAM_EXPECTED},
+ { sel_nathelper, SEL_PARAM_STR, STR_STATIC_INIT("rewrite_contact"),
sel_rewrite_contact, CONSUME_NEXT_INT },
+
+ { sel_rewrite_contact, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"),
select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
+
+ { NULL, SEL_PARAM_INT, STR_NULL, NULL, 0}
+};
+
+static int
fixup_fix_sdp(void** param, int param_no)
{
pv_elem_t *model;
@@ -689,6 +711,8 @@ mod_init(void)
nets_1918[i].netaddr = ntohl(addr.s_addr) & nets_1918[i].mask;
}
+ register_select_table(sel_declaration);
+
return 0;
}
@@ -2292,3 +2316,59 @@ done:
/* let the core handle further the reply */
return 1;
}
+
+static int
+sel_rewrite_contact(str* res, select_t* s, struct sip_msg* msg)
+{
+ static char buf[500];
+ contact_t* c;
+ int n, def_port_fl, len;
+ char *cp;
+ str hostport;
+ struct sip_uri uri;
+
+ res->len = 0;
+ n = s->params[2].v.i;
+ if (n <= 0) {
+ LOG(L_ERR, "ERROR: rewrite_contact[%d]: zero or negative index not
supported\n", n);
+ return -1;
+ }
+ c = 0;
+ do {
+ if (contact_iterator(&c, msg, c) < 0 || !c)
+ return -1;
+ n--;
+ } while (n > 0);
+
+ if (parse_uri(c->uri.s, c->uri.len, &uri) < 0 || uri.host.len <= 0) {
+ LOG(L_ERR, "rewrite_contact[%d]: Error while parsing Contact URI\n",
s->params[2].v.i);
+ return -1;
+ }
+ len = c->len - uri.host.len;
+ if (uri.port.len > 0)
+ len -= uri.port.len;
+ def_port_fl = (msg->rcv.proto == PROTO_TLS && msg->rcv.src_port ==
SIPS_PORT) || (msg->rcv.proto != PROTO_TLS && msg->rcv.src_port ==
SIP_PORT);
+ if (!def_port_fl)
+ len += 1/*:*/+5/*port*/;
+ if (len > sizeof(buf)) {
+ LOG(L_ERR, "ERROR: rewrite_contact[%d]: contact too long\n",
s->params[2].v.i);
+ return -1;
+ }
+ hostport = uri.host;
+ if (uri.port.len > 0)
+ hostport.len = uri.port.s + uri.port.len - uri.host.s;
+
+ res->s = buf;
+ res->len = hostport.s - c->name.s;
+ memcpy(buf, c->name.s, res->len);
+ cp = ip_addr2a(&msg->rcv.src_ip);
+ if (def_port_fl) {
+ res->len+= snprintf(buf+res->len, sizeof(buf)-res->len, "%s", cp);
+ } else {
+ res->len+= snprintf(buf+res->len, sizeof(buf)-res->len, "%s:%d", cp,
msg->rcv.src_port);
+ }
+ memcpy(buf+res->len, hostport.s+hostport.len,
c->len-(hostport.s+hostport.len-c->name.s));
+ res->len+= c->len-(hostport.s+hostport.len-c->name.s);
+
+ return 0;
+}