aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-05-16 02:50:46 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-05-16 02:50:46 +0000
commitdd5109df85bea6488cfc0a382049b06a5b9d1cb5 (patch)
tree39c8cada755920170ead80735399ae198b7d23ae
parenta03b20a405bfe3d0e78b3276b3133f4968774d12 (diff)
Make RTP ports configurable
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1026 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xCHANGES1
-rwxr-xr-xasterisk.c2
-rwxr-xr-xconfigs/rtp.conf.sample9
-rwxr-xr-xinclude/asterisk/rtp.h4
-rwxr-xr-xloader.c2
-rwxr-xr-xrtp.c59
6 files changed, 74 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index 7535071ab..2ca1a3e1a 100755
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,4 @@
+ -- Make RTP ports configurable
-- Add RDNIS support to SIP and IAX2
-- Add transfer app (implement in SIP and IAX2)
-- Make voicemail segmentable by context (app_voicemail2)
diff --git a/asterisk.c b/asterisk.c
index 70cd1a88d..933ab5594 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -27,6 +27,7 @@
#include <asterisk/manager.h>
#include <asterisk/pbx.h>
#include <asterisk/enum.h>
+#include <asterisk/rtp.h>
#include <sys/resource.h>
#include <fcntl.h>
#include <stdio.h>
@@ -1317,6 +1318,7 @@ int main(int argc, char *argv[])
printf(term_quit());
exit(1);
}
+ ast_rtp_init();
if (ast_image_init()) {
printf(term_quit());
exit(1);
diff --git a/configs/rtp.conf.sample b/configs/rtp.conf.sample
new file mode 100755
index 000000000..01a6dea89
--- /dev/null
+++ b/configs/rtp.conf.sample
@@ -0,0 +1,9 @@
+;
+; RTP Configuration
+;
+[general]
+;
+; RTP start and RTP end configure start and end addresses
+;
+rtpstart=10000
+rtpend=20000
diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h
index e0b83bb0f..c183cb1bd 100755
--- a/include/asterisk/rtp.h
+++ b/include/asterisk/rtp.h
@@ -99,6 +99,10 @@ void ast_rtp_proto_unregister(struct ast_rtp_protocol *proto);
void ast_rtp_stop(struct ast_rtp *rtp);
+void ast_rtp_init(void);
+
+void ast_rtp_reload(void);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
diff --git a/loader.c b/loader.c
index b10a90387..757352f78 100755
--- a/loader.c
+++ b/loader.c
@@ -24,6 +24,7 @@
#include <asterisk/term.h>
#include <asterisk/manager.h>
#include <asterisk/enum.h>
+#include <asterisk/rtp.h>
#include <dlfcn.h>
#include <asterisk/md5.h>
#include <pthread.h>
@@ -146,6 +147,7 @@ void ast_module_reload(void)
/* We'll do the logger and manager the favor of calling its reload here first */
reload_manager();
ast_enum_reload();
+ ast_rtp_reload();
time(&ast_lastreloadtime);
ast_pthread_mutex_lock(&modlock);
diff --git a/rtp.c b/rtp.c
index 90266f837..63cb6c415 100755
--- a/rtp.c
+++ b/rtp.c
@@ -32,6 +32,7 @@
#include <asterisk/channel.h>
#include <asterisk/acl.h>
#include <asterisk/channel_pvt.h>
+#include <asterisk/config.h>
#define TYPE_HIGH 0x0
#define TYPE_LOW 0x1
@@ -41,6 +42,9 @@
static int dtmftimeout = 300; /* 300 samples */
+static int rtpstart = 0;
+static int rtpend = 0;
+
// The value of each payload format mapping:
struct rtpPayloadType {
int isAstFormat; // whether the following code is an AST_FORMAT
@@ -567,6 +571,7 @@ struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io)
struct ast_rtp *rtp;
int x;
int flags;
+ int startplace;
rtp = malloc(sizeof(struct ast_rtp));
if (!rtp)
return NULL;
@@ -583,11 +588,12 @@ struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io)
}
flags = fcntl(rtp->s, F_GETFL);
fcntl(rtp->s, F_SETFL, flags | O_NONBLOCK);
+ /* Find us a place */
+ x = (rand() % (rtpend-rtpstart)) + rtpstart;
+ x = x & ~1;
+ startplace = x;
for (;;) {
- /* Find us a place */
- x = (rand() % (65000-1025)) + 1025;
/* Must be an even port number by RTP spec */
- x = x & ~1;
rtp->us.sin_port = htons(x);
if (!bind(rtp->s, &rtp->us, sizeof(rtp->us)))
break;
@@ -597,6 +603,15 @@ struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io)
free(rtp);
return NULL;
}
+ x += 2;
+ if (x > rtpend)
+ x = (rtpstart + 1) & ~1;
+ if (x == startplace) {
+ ast_log(LOG_WARNING, "No RTP ports remaining\n");
+ close(rtp->s);
+ free(rtp);
+ return NULL;
+ }
}
if (io && sched) {
/* Operate this one in a callback mode */
@@ -1081,3 +1096,41 @@ int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, st
}
return -1;
}
+
+void ast_rtp_reload(void)
+{
+ struct ast_config *cfg;
+ char *s;
+ rtpstart = 5000;
+ rtpend = 31000;
+ cfg = ast_load("rtp.conf");
+ if (cfg) {
+ if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
+ rtpstart = atoi(s);
+ if (rtpstart < 1024)
+ rtpstart = 1024;
+ if (rtpstart > 65535)
+ rtpstart = 65535;
+ }
+ if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
+ rtpend = atoi(s);
+ if (rtpend < 1024)
+ rtpend = 1024;
+ if (rtpend > 65535)
+ rtpend = 65535;
+ }
+ ast_destroy(cfg);
+ }
+ if (rtpstart >= rtpend) {
+ ast_log(LOG_WARNING, "Unreasonable values for RTP start/end\n");
+ rtpstart = 5000;
+ rtpend = 31000;
+ }
+ if (option_verbose > 1)
+ ast_verbose(VERBOSE_PREFIX_2 "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
+}
+
+void ast_rtp_init(void)
+{
+ ast_rtp_reload();
+}