From b0760f8006153d3db23a2026777ada3a10bf8f9c Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Fri, 16 May 2003 02:50:46 +0000 Subject: [PATCH] Make RTP ports configurable git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1026 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 1 + asterisk.c | 2 ++ configs/rtp.conf.sample | 9 +++++++ include/asterisk/rtp.h | 4 +++ loader.c | 2 ++ rtp.c | 59 ++++++++++++++++++++++++++++++++++++++--- 6 files changed, 74 insertions(+), 3 deletions(-) create mode 100755 configs/rtp.conf.sample diff --git a/CHANGES b/CHANGES index 7535071abb..2ca1a3e1af 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 70cd1a88d4..933ab55947 100755 --- a/asterisk.c +++ b/asterisk.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -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 0000000000..01a6dea891 --- /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 e0b83bb0f3..c183cb1bdb 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 b10a903875..757352f78e 100755 --- a/loader.c +++ b/loader.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -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 90266f837e..63cb6c415d 100755 --- a/rtp.c +++ b/rtp.c @@ -32,6 +32,7 @@ #include #include #include +#include #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(); +}