aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-27 17:52:36 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-27 17:52:36 +0000
commit52f9723e5df303f5eb4fed24ff5b81a2effd22f6 (patch)
tree13e8296f5198d383f9bf3fc915ebc0b3b774a975
parentda58d3c1f791db41f2226680cf8ab8d8fa7f80fa (diff)
Merged revisions 209132 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r209132 | mmichelson | 2009-07-27 12:50:04 -0500 (Mon, 27 Jul 2009) | 24 lines Merged revisions 209131 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r209131 | mmichelson | 2009-07-27 12:44:06 -0500 (Mon, 27 Jul 2009) | 18 lines Allow for UDPTL to use only even-numbered ports if desired. There are some VoIP providers out there that will not accept SDP offers with odd numbered UDPTL ports. While it is my personal opinion that these VoIP providers are misinterpreting RFC 2327, it really is not a big deal to play along with their silly little games. Of course, since restricting UDPTL ports to only even numbers reduces the range of available ports by half, so the option to use only even port numbers is off by default. A user can enable the behavior by setting use_even_ports=yes in udptl.conf. (closes issue #15182) Reported by: CGMChris Patches: 15182.patch uploaded by mmichelson (license 60) Tested by: CGMChris ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@209133 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--configs/udptl.conf.sample5
-rw-r--r--main/udptl.c23
2 files changed, 27 insertions, 1 deletions
diff --git a/configs/udptl.conf.sample b/configs/udptl.conf.sample
index 05a38d54e..706994c6e 100644
--- a/configs/udptl.conf.sample
+++ b/configs/udptl.conf.sample
@@ -28,3 +28,8 @@ udptlfecentries = 3
; The span over which parity is calculated for FEC in a UDPTL packet
;
udptlfecspan = 3
+;
+; Some VoIP providers will only accept an offer with an even-numbered
+; UDPTL port. Set this option so that Asterisk will only attempt to use
+; even-numbered ports when negotiating T.38. Default is no.
+use_even_ports = no
diff --git a/main/udptl.c b/main/udptl.c
index 5c33cc494..3079da223 100644
--- a/main/udptl.c
+++ b/main/udptl.c
@@ -85,6 +85,7 @@ static enum ast_t38_ec_modes udptlfectype;
static int udptlfecentries;
static int udptlfecspan;
static int udptlmaxdatagram;
+static int use_even_ports;
#define LOCAL_FAX_MAX_DATAGRAM 1400
#define MAX_FEC_ENTRIES 5
@@ -889,6 +890,9 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct sched_context *sched, struc
#endif
/* Find us a place */
x = (udptlstart == udptlend) ? udptlstart : (ast_random() % (udptlend - udptlstart)) + udptlstart;
+ if (use_even_ports && (x & 1)) {
+ ++x;
+ }
startplace = x;
for (;;) {
udptl->us.sin_port = htons(x);
@@ -901,7 +905,12 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct sched_context *sched, struc
ast_free(udptl);
return NULL;
}
- if (++x > udptlend)
+ if (use_even_ports) {
+ x += 2;
+ } else {
+ ++x;
+ }
+ if (x > udptlend)
x = udptlstart;
if (x == startplace) {
ast_log(LOG_WARNING, "No UDPTL ports remaining\n");
@@ -1317,6 +1326,7 @@ static void __ast_udptl_reload(int reload)
udptlfecentries = 0;
udptlfecspan = 0;
udptlmaxdatagram = 0;
+ use_even_ports = 0;
if (cfg) {
if ((s = ast_variable_retrieve(cfg, "general", "udptlstart"))) {
@@ -1391,6 +1401,9 @@ static void __ast_udptl_reload(int reload)
udptlfecspan = MAX_FEC_SPAN;
}
}
+ if ((s = ast_variable_retrieve(cfg, "general", "use_even_ports"))) {
+ use_even_ports = ast_true(s);
+ }
ast_config_destroy(cfg);
}
if (udptlstart >= udptlend) {
@@ -1398,6 +1411,14 @@ static void __ast_udptl_reload(int reload)
udptlstart = 4500;
udptlend = 4999;
}
+ if (use_even_ports && (udptlstart & 1)) {
+ ++udptlstart;
+ ast_log(LOG_NOTICE, "Odd numbered udptlstart specified but use_even_ports enabled. udptlstart is now %d\n", udptlstart);
+ }
+ if (use_even_ports && (udptlend & 1)) {
+ --udptlend;
+ ast_log(LOG_NOTICE, "Odd numbered udptlend specified but use_event_ports enabled. udptlend is now %d\n", udptlend);
+ }
ast_verb(2, "UDPTL allocating from port range %d -> %d\n", udptlstart, udptlend);
}