Index: addons/ooh323c/src/ooh323.c =================================================================== --- addons/ooh323c/src/ooh323.c (revision 287466) +++ addons/ooh323c/src/ooh323.c (working copy) @@ -751,8 +751,16 @@ } - /* Retrieve the H.245 control channel address from the connect msg */ - if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + /* 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); + } + } + else if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && callProceeding->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." @@ -970,8 +978,16 @@ } - /* Retrieve the H.245 control channel address from the connect msg */ - if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + /* 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); + } + } + else if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && alerting->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." @@ -1195,7 +1211,16 @@ } /* Retrieve the H.245 control channel address from the connect msg */ - if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + /* 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); + } + } + else if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && progress->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." @@ -1444,8 +1469,16 @@ OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED); } - /* Retrieve the H.245 control channel address from the CONNECT msg */ - if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + /* 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); + } + } + else if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && connect->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." Index: addons/ooh323c/src/oochannels.c =================================================================== --- addons/ooh323c/src/oochannels.c (revision 287466) +++ addons/ooh323c/src/oochannels.c (working copy) @@ -982,7 +982,7 @@ ASN1OCTET message[MAXMSGLEN], message1[MAXMSGLEN]; int len; Q931Message *pmsg; - OOCTXT *pctxt = call->pctxt; + OOCTXT *pctxt = call->msgctxt; struct timeval timeout; @@ -1116,6 +1116,7 @@ initializePrintHandler(&printHandler, "Received H.2250 Message"); setEventHandler (pctxt, &printHandler); + setPERBuffer (pctxt, message, len, TRUE); ret = ooQ931Decode (call, pmsg, len, message, 1); if(ret != OO_OK) { OOTRACEERR3("Error:Failed to decode received H.2250 message. (%s, %s)\n", Index: addons/chan_ooh323.c =================================================================== --- addons/chan_ooh323.c (revision 287466) +++ addons/chan_ooh323.c (working copy) @@ -188,6 +188,7 @@ 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 OOH323Regex *rtpmask; char rtpmaskstr[120]; int rtdrcount, rtdrinterval; + int faststart, h245tunneling; struct ooh323_user *next; }; @@ -241,6 +243,7 @@ struct OOH323Regex *rtpmask; char rtpmaskstr[120]; int rtdrcount,rtdrinterval; + int faststart, h245tunneling; struct ooh323_peer *next; }; @@ -636,6 +639,8 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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");