From adbf7db7985c81a1c32120077b8c5cb41fe8aeff Mon Sep 17 00:00:00 2001 From: may Date: Sat, 9 Oct 2010 14:04:35 +0000 Subject: Added fast start and h.245 tunneling options per user and peer. Added options for faststart/h.245 tunneling per user/peer, properly handle these and global options, correction of handling fs/tunneling fields in signalling responses (closes issue #17972) Reported by: salecha Patches: fs-tunnel-per-point-3.patch uploaded by may213 (license 454) Tested by: may213, salecha git-svn-id: http://svn.digium.com/svn/asterisk/trunk@291006 f38db490-d61c-443f-a65b-d21fe96a405b --- addons/chan_ooh323.c | 42 +++++++++++++++++++++-- addons/ooh323c/src/ooh245.c | 18 ++++------ addons/ooh323c/src/ooh323.c | 84 +++++++++++++++++++++++++++++++++------------ 3 files changed, 107 insertions(+), 37 deletions(-) diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index fc674ad2c..af9a711e4 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -188,6 +188,7 @@ static struct ooh323_pvt { struct OOH323Regex *rtpmask; /* rtp ip regexp */ char rtpmaskstr[120]; int rtdrcount, rtdrinterval; /* roundtripdelayreq */ + int faststart, h245tunneling; /* faststart & h245 tunneling */ struct ooh323_pvt *next; /* Next entity */ } *iflist = NULL; @@ -214,6 +215,7 @@ struct ooh323_user{ struct OOH323Regex *rtpmask; char rtpmaskstr[120]; int rtdrcount, rtdrinterval; + int faststart, h245tunneling; struct ooh323_user *next; }; @@ -241,6 +243,7 @@ struct ooh323_peer{ struct OOH323Regex *rtpmask; char rtpmaskstr[120]; int rtdrcount,rtdrinterval; + int faststart, h245tunneling; struct ooh323_peer *next; }; @@ -636,6 +639,8 @@ static struct ast_channel *ooh323_request(const char *type, format_t format, p->dtmfcodec = peer->dtmfcodec; p->t38support = peer->t38support; p->rtptimeout = peer->rtptimeout; + p->faststart = peer->faststart; + p->h245tunneling = peer->h245tunneling; if (peer->rtpmask && peer->rtpmaskstr[0]) { p->rtpmask = peer->rtpmask; ast_copy_string(p->rtpmaskstr, peer->rtpmaskstr, sizeof(p->rtpmaskstr)); @@ -665,6 +670,8 @@ static struct ast_channel *ooh323_request(const char *type, format_t format, p->capability = gCapability; p->rtdrinterval = gRTDRInterval; p->rtdrcount = gRTDRCount; + p->faststart = gFastStart; + p->h245tunneling = gTunneling; memcpy(&p->prefs, &gPrefs, sizeof(struct ast_codec_pref)); p->username = strdup(dest); @@ -914,10 +921,9 @@ static int ooh323_call(struct ast_channel *ast, char *dest, int timeout) ast_verbose("--- ooh323_call- %s\n", dest); - if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) - { + if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) { ast_log(LOG_WARNING, "ooh323_call called on %s, neither down nor " - "reserved\n", ast->name); + "reserved\n", ast->name); return -1; } ast_mutex_lock(&p->lock); @@ -972,6 +978,8 @@ static int ooh323_call(struct ast_channel *ast, char *dest, int timeout) destination[sizeof(destination)-1]='\0'; opts.transfercap = ast->transfercapability; + opts.fastStart = p->faststart; + opts.tunneling = p->h245tunneling; for (i=0;i<480 && !isRunning(p->callToken);i++) usleep(12000); @@ -1758,6 +1766,18 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg) p->dtmfcodec = user->dtmfcodec; p->t38support = user->t38support; p->rtptimeout = user->rtptimeout; + p->h245tunneling = user->h245tunneling; + p->faststart = user->faststart; + + if (p->faststart) + OO_SETFLAG(call->flags, OO_M_FASTSTART); + else + OO_CLRFLAG(call->flags, OO_M_FASTSTART); + if (p->h245tunneling) + OO_SETFLAG(call->flags, OO_M_TUNNELING); + else + OO_CLRFLAG(call->flags, OO_M_TUNNELING); + if (user->rtpmask && user->rtpmaskstr[0]) { p->rtpmask = user->rtpmask; ast_copy_string(p->rtpmaskstr, user->rtpmaskstr, @@ -2165,6 +2185,8 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v) user->dtmfmode = gDTMFMode; user->dtmfcodec = gDTMFCodec; user->t38support = gT38Support; + user->faststart = gFastStart; + user->h245tunneling = gTunneling; /* set default context */ ast_copy_string(user->context, gContext, sizeof(user->context)); ast_copy_string(user->accountcode, gAccountcode, sizeof(user->accountcode)); @@ -2182,6 +2204,10 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v) sizeof(user->accountcode)-1); } else if (!strcasecmp(v->name, "roundtrip")) { sscanf(v->value, "%d,%d", &user->rtdrcount, &user->rtdrinterval); + } else if (!strcasecmp(v->name, "faststart")) { + user->faststart = ast_true(v->value); + } else if (!strcasecmp(v->name, "h245tunneling")) { + user->h245tunneling = ast_true(v->value); } else if (!strcasecmp(v->name, "rtptimeout")) { user->rtptimeout = atoi(v->value); if (user->rtptimeout < 0) @@ -2270,6 +2296,8 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v, peer->dtmfmode = gDTMFMode; peer->dtmfcodec = gDTMFCodec; peer->t38support = gT38Support; + peer->faststart = gFastStart; + peer->h245tunneling = gTunneling; peer->port = 1720; if (0 == friend_type) { peer->mFriend = 1; @@ -2316,6 +2344,10 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v, peer->outgoinglimit = 0; } else if (!strcasecmp(v->name, "accountcode")) { ast_copy_string(peer->accountcode, v->value, sizeof(peer->accountcode)); + } else if (!strcasecmp(v->name, "faststart")) { + peer->faststart = ast_true(v->value); + } else if (!strcasecmp(v->name, "h245tunneling")) { + peer->h245tunneling = ast_true(v->value); } else if (!strcasecmp(v->name, "rtptimeout")) { peer->rtptimeout = atoi(v->value); if(peer->rtptimeout < 0) @@ -2779,6 +2811,8 @@ static char *handle_cli_ooh323_show_peer(struct ast_cli_entry *e, int cmd, struc if (peer) { sprintf(ip_port, "%s:%d", peer->ip, peer->port); ast_cli(a->fd, "%-15.15s%s\n", "Name: ", peer->name); + ast_cli(a->fd, "%s:%s,%s\n", "FastStart/H.245 Tunneling", peer->faststart?"yes":"no", + peer->h245tunneling?"yes":"no"); ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); print_codec_to_cli(a->fd, &peer->prefs); ast_cli(a->fd, ")\n"); @@ -2922,6 +2956,8 @@ static char *handle_cli_ooh323_show_user(struct ast_cli_entry *e, int cmd, struc if (user) { ast_cli(a->fd, "%-15.15s%s\n", "Name: ", user->name); + ast_cli(a->fd, "%s:%s,%s\n", "FastStart/H.245 Tunneling", user->faststart?"yes":"no", + user->h245tunneling?"yes":"no"); ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); print_codec_to_cli(a->fd, &user->prefs); ast_cli(a->fd, ")\n"); diff --git a/addons/ooh323c/src/ooh245.c b/addons/ooh323c/src/ooh245.c index d42f8bbc1..adbe1842e 100644 --- a/addons/ooh323c/src/ooh245.c +++ b/addons/ooh323c/src/ooh245.c @@ -957,10 +957,8 @@ int ooHandleMasterSlave(OOH323CallData *call, void * pmsg, /*Since Cap exchange and MasterSlave Procedures are done */ if(gH323ep.h323Callbacks.openLogicalChannels) gH323ep.h323Callbacks.openLogicalChannels(call); - else{ - if(!ooGetTransmitLogicalChannel(call)) - ooOpenLogicalChannels(call); - } + if(!ooGetTransmitLogicalChannel(call)) + ooOpenLogicalChannels(call); #if 0 if(!call->logicalChans){ if(!gH323ep.h323Callbacks.openLogicalChannels) @@ -2114,10 +2112,8 @@ int ooOnReceivedTerminalCapabilitySetAck(OOH323CallData* call) { if(gH323ep.h323Callbacks.openLogicalChannels) gH323ep.h323Callbacks.openLogicalChannels(call); - else{ - if(!ooGetTransmitLogicalChannel(call)) - ooOpenLogicalChannels(call); - } + if(!ooGetTransmitLogicalChannel(call)) + ooOpenLogicalChannels(call); #if 0 if(!call->logicalChans){ if(!gH323ep.h323Callbacks.openLogicalChannels) @@ -3141,10 +3137,8 @@ int ooOnReceivedTerminalCapabilitySet(OOH323CallData *call, H245Message *pmsg) if(gH323ep.h323Callbacks.openLogicalChannels) gH323ep.h323Callbacks.openLogicalChannels(call); - else{ - if(!ooGetTransmitLogicalChannel(call)) - ooOpenLogicalChannels(call); - } + if(!ooGetTransmitLogicalChannel(call)) + ooOpenLogicalChannels(call); #if 0 if(!call->logicalChans){ if(!gH323ep.h323Callbacks.openLogicalChannels) diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c index c266b19eb..ed097d95e 100644 --- a/addons/ooh323c/src/ooh323.c +++ b/addons/ooh323c/src/ooh323.c @@ -751,9 +751,18 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg) } - /* Retrieve the H.245 control channel address from the connect msg */ + /* Retrieve tunneling info/H.245 control channel address from the connect msg */ + if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) { + if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + OO_CLRFLAG (call->flags, OO_M_TUNNELING); + OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling" + " (%s, %s)\n", call->callType, call->callToken); + } + } if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && + OO_TESTFLAG (call->flags, OO_M_TUNNELING) && callProceeding->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." "Using Tunneling for H.245 messages (%s, %s)\n", @@ -801,6 +810,7 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg) } } } + return OO_OK; } @@ -970,16 +980,27 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg) } - /* Retrieve the H.245 control channel address from the connect msg */ + /* Retrieve tunneling info/H.245 control channel address from the connect msg */ + if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) { + if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + OO_CLRFLAG (call->flags, OO_M_TUNNELING); + OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling" + " (%s, %s)\n", call->callType, call->callToken); + } + } if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && - alerting->m.h245AddressPresent) { - OOTRACEINFO3("Tunneling and h245address provided." - "Giving preference to Tunneling (%s, %s)\n", - call->callType, call->callToken); - } - else if(alerting->m.h245AddressPresent) - { + OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + if (alerting->m.h245AddressPresent) + OOTRACEINFO3("Tunneling and h245address provided." + "Giving preference to Tunneling (%s, %s)\n", + call->callType, call->callToken); + ret =ooSendTCSandMSD(call); + if (ret != OO_OK) + return ret; + + } else if(alerting->m.h245AddressPresent) { if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { OO_CLRFLAG (call->flags, OO_M_TUNNELING); @@ -1019,13 +1040,12 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg) return OO_FAILED; } } - } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { - ret =ooSendTCSandMSD(call); + } else if (!call->pH245Channel && !call->h245listener) { + ret = ooSendStartH245Facility(call); if (ret != OO_OK) return ret; } - return OO_OK; } @@ -1195,15 +1215,26 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg) } /* Retrieve the H.245 control channel address from the connect msg */ + /* Retrieve tunneling info/H.245 control channel address from the connect msg */ + if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) { + if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + OO_CLRFLAG (call->flags, OO_M_TUNNELING); + OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling" + " (%s, %s)\n", call->callType, call->callToken); + } + } if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && - progress->m.h245AddressPresent) { - OOTRACEINFO3("Tunneling and h245address provided." - "Giving preference to Tunneling (%s, %s)\n", - call->callType, call->callToken); - } - else if(progress->m.h245AddressPresent) - { + OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + if (progress->m.h245AddressPresent) + OOTRACEINFO3("Tunneling and h245address provided." + "Giving preference to Tunneling (%s, %s)\n", + call->callType, call->callToken); + ret =ooSendTCSandMSD(call); + if (ret != OO_OK) + return ret; + } else if(progress->m.h245AddressPresent) { if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { OO_CLRFLAG (call->flags, OO_M_TUNNELING); @@ -1243,8 +1274,8 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg) return OO_FAILED; } } - } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { - ret =ooSendTCSandMSD(call); + } else if (!call->pH245Channel && !call->h245listener) { + ret = ooSendStartH245Facility(call); if (ret != OO_OK) return ret; } @@ -1444,9 +1475,18 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg) OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED); } - /* Retrieve the H.245 control channel address from the CONNECT msg */ + /* Retrieve tunneling info/H.245 control channel address from the connect msg */ + if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) { + if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + OO_CLRFLAG (call->flags, OO_M_TUNNELING); + OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling" + " (%s, %s)\n", call->callType, call->callToken); + } + } if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && + OO_TESTFLAG (call->flags, OO_M_TUNNELING) && connect->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." "Giving preference to Tunneling (%s, %s)\n", -- cgit v1.2.3