summaryrefslogtreecommitdiff
path: root/addons/chan_ooh323.c
diff options
context:
space:
mode:
authorAlexandr Anikin <may@telecom-service.ru>2010-03-14 14:42:59 +0000
committerAlexandr Anikin <may@telecom-service.ru>2010-03-14 14:42:59 +0000
commitfa9d6969d6a7b19024bc62f62da28e599bf7a1ee (patch)
treed32d83fa23c3d5dccbf98b37a0a25256fe550b72 /addons/chan_ooh323.c
parentf72c83684ba98b7e8bd4ea8d5a69bcf1773f50c7 (diff)
generate roundtrip delay requests and responses
added response to roundtrip delay requests from opposite side added roundtrip delay request sending to opposite side after answer, added options for sending request (interval between request and count of unreplied requests before forced call hangup) (closes issue #16976) Reported by: vmikhelson Patches: rtdr-1.6.0-2.patch uploaded by may213 (license 454) Tested by: vmikhelson, may213 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@252277 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'addons/chan_ooh323.c')
-rw-r--r--addons/chan_ooh323.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c
index 7724c21d4..2ae95fae4 100644
--- a/addons/chan_ooh323.c
+++ b/addons/chan_ooh323.c
@@ -187,6 +187,7 @@ static struct ooh323_pvt {
struct ast_dsp *vad;
struct OOH323Regex *rtpmask; /* rtp ip regexp */
char rtpmaskstr[120];
+ int rtdrcount, rtdrinterval; /* roundtripdelayreq */
struct ooh323_pvt *next; /* Next entity */
} *iflist = NULL;
@@ -212,6 +213,7 @@ struct ooh323_user{
char mIP[20];
struct OOH323Regex *rtpmask;
char rtpmaskstr[120];
+ int rtdrcount, rtdrinterval;
struct ooh323_user *next;
};
@@ -238,6 +240,7 @@ struct ooh323_peer{
int rtptimeout;
struct OOH323Regex *rtpmask;
char rtpmaskstr[120];
+ int rtdrcount,rtdrinterval;
struct ooh323_peer *next;
};
@@ -302,6 +305,7 @@ static int gIncomingLimit = 1024;
static int gOutgoingLimit = 1024;
OOBOOL gH323Debug = FALSE;
static int gTRCLVL = OOTRCLVLERR;
+static int gRTDRCount = 0, gRTDRInterval = 0;
static int t35countrycode = 0;
static int t35extensions = 0;
@@ -502,6 +506,8 @@ static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken)
pvt->faxmode = 0;
pvt->t38support = gT38Support;
pvt->rtptimeout = gRTPTimeout;
+ pvt->rtdrinterval = gRTDRInterval;
+ pvt->rtdrcount = gRTDRCount;
pvt->call_reference = callref;
if (callToken)
@@ -627,6 +633,12 @@ static struct ast_channel *ooh323_request(const char *type, format_t format,
p->rtpmask = peer->rtpmask;
ast_copy_string(p->rtpmaskstr, peer->rtpmaskstr, sizeof(p->rtpmaskstr));
}
+
+ if (peer->rtdrinterval) {
+ p->rtdrinterval = peer->rtdrinterval;
+ p->rtdrcount = peer->rtdrcount;
+ }
+
ast_copy_string(p->accountcode, peer->accountcode, sizeof(p->accountcode));
p->amaflags = peer->amaflags;
} else {
@@ -635,6 +647,8 @@ static struct ast_channel *ooh323_request(const char *type, format_t format,
p->t38support = gT38Support;
p->rtptimeout = gRTPTimeout;
p->capability = gCapability;
+ p->rtdrinterval = gRTDRInterval;
+ p->rtdrcount = gRTDRCount;
memcpy(&p->prefs, &gPrefs, sizeof(struct ast_codec_pref));
p->username = strdup(dest);
@@ -1721,6 +1735,10 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg)
ast_copy_string(p->rtpmaskstr, user->rtpmaskstr,
sizeof(p->rtpmaskstr));
}
+ if (user->rtdrcount > 0 && user->rtdrinterval > 0) {
+ p->rtdrcount = user->rtdrcount;
+ p->rtdrinterval = user->rtdrinterval;
+ }
if (user->incominglimit) user->inUse++;
ast_mutex_unlock(&user->lock);
} else {
@@ -2129,6 +2147,8 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v)
} else if (!strcasecmp(v->name, "accountcode")) {
strncpy(user->accountcode, v->value,
sizeof(user->accountcode)-1);
+ } else if (!strcasecmp(v->name, "roundtrip")) {
+ sscanf(v->value, "%d,%d", &user->rtdrcount, &user->rtdrinterval);
} else if (!strcasecmp(v->name, "rtptimeout")) {
user->rtptimeout = atoi(v->value);
if (user->rtptimeout < 0)
@@ -2288,6 +2308,8 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v,
tcodecs, 1);
} else if (!strcasecmp(v->name, "amaflags")) {
peer->amaflags = ast_cdr_amaflags2int(v->value);
+ } else if (!strcasecmp(v->name, "roundtrip")) {
+ sscanf(v->value, "%d,%d", &peer->rtdrcount, &peer->rtdrinterval);
} else if (!strcasecmp(v->name, "dtmfmode")) {
if (!strcasecmp(v->value, "rfc2833"))
peer->dtmfmode = H323_DTMF_RFC2833;
@@ -2431,6 +2453,8 @@ int reload_config(int reload)
gRasGkMode = RasNoGatekeeper;
gGatekeeper[0] = '\0';
gRTPTimeout = 60;
+ gRTDRInterval = 0;
+ gRTDRCount = 0;
strcpy(gAccountcode, DEFAULT_H323ACCNT);
gFastStart = 1;
gTunneling = 1;
@@ -2488,6 +2512,8 @@ int reload_config(int reload)
ooH323EpEnableH245Tunneling();
else
ooH323EpDisableH245Tunneling();
+ } else if (!strcasecmp(v->name, "roundtrip")) {
+ sscanf(v->value, "%d,%d", &gRTDRCount, &gRTDRInterval);
} else if (!strcasecmp(v->name, "trybemaster")) {
gBeMaster = ast_true(v->value);
if (gBeMaster)
@@ -2757,6 +2783,8 @@ static char *handle_cli_ooh323_show_peer(struct ast_cli_entry *e, int cmd, struc
ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout);
if (peer->rtpmaskstr[0])
ast_cli(a->fd, "%-15.15s%s\n", "rtpmask: ", peer->rtpmaskstr);
+ if (peer->rtdrcount && peer->rtdrinterval)
+ ast_cli(a->fd, "%-15.15s%d,%d\n", "RoundTrip: ", peer->rtdrcount, peer->rtdrinterval);
ast_mutex_unlock(&peer->lock);
} else {
ast_cli(a->fd, "Peer %s not found\n", a->argv[3]);
@@ -2900,6 +2928,8 @@ static char *handle_cli_ooh323_show_user(struct ast_cli_entry *e, int cmd, struc
if (user->rtpmaskstr[0])
ast_cli(a->fd, "%-15.15s%s\n", "rtpmask: ", user->rtpmaskstr);
ast_mutex_unlock(&user->lock);
+ if (user->rtdrcount && user->rtdrinterval)
+ ast_cli(a->fd, "%-15.15s%d,%d\n", "RoundTrip: ", user->rtdrcount, user->rtdrinterval);
} else {
ast_cli(a->fd, "User %s not found\n", a->argv[3]);
ast_cli(a->fd, "\n");
@@ -3066,6 +3096,9 @@ static char *handle_cli_ooh323_show_config(struct ast_cli_entry *e, int cmd, str
else if (gT38Support == T38_FAXGW)
ast_cli(a->fd, "%s\n", "faxgw/chan_sip compatible");
+ if (gRTDRCount && gRTDRInterval)
+ ast_cli(a->fd, "%-15.15s%d,%d\n", "RoundTrip: ", gRTDRCount, gRTDRInterval);
+
ast_cli(a->fd, "%-20s%ld\n", "Call counter: ", callnumber);
ast_cli(a->fd, "%-20s%s\n", "AccountCode: ", gAccountcode);
@@ -3811,6 +3844,13 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call)
}
+ if (p->rtdrcount) {
+ if (gH323Debug)
+ ast_verbose("Setup RTDR info: %d, %d\n", p->rtdrinterval, p->rtdrcount);
+ call->rtdrInterval = p->rtdrinterval;
+ call->rtdrCount = p->rtdrcount;
+ }
+
ast_copy_string(mediaInfo.lMediaIP, ast_inet_ntoa(us.sin_addr), sizeof(mediaInfo.lMediaIP));
mediaInfo.lMediaPort = ntohs(us.sin_port);