summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 f1ca18428..74a49b3cc 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");
@@ -1258,6 +1267,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"))) {
@@ -1332,6 +1342,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) {
@@ -1339,6 +1352,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);
}