mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-02 03:48:02 +00:00
Corrections for properly work with H.323v2 (older) endpoints and other
small fixes. Interpret remote side H.225 version. Corrections for H.323v2 endpoints: don't start TCS and MSD before connect, don't start TCS and MSD by accepting H.245 connection, start TCS and MSD by StartH245 facility message. Other fixes: fix non zeroended remoteDisplayName issue, small fixes in call clearing by closing H.245 connection, tcp keepalive introduced on TCP connections (now is hardcoded, will be configurable in the future), don't force H.245tunneling if FastStart is active, don't send Alerting singal more than once per call. (closes issue #18542) Reported by: vmikhelson Patches: issue18542-final-3.patch uploaded by may213 (license 454) Tested by: vmikhelson git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@307396 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -40,6 +40,7 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg);
|
||||
int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg);
|
||||
int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg);
|
||||
int ooHandleDisplayIE(OOH323CallData *call, Q931Message *q931Msg);
|
||||
int ooHandleH2250ID (OOH323CallData *call, H225ProtocolIdentifier protocolIdentifier);
|
||||
|
||||
int ooHandleDisplayIE(OOH323CallData *call, Q931Message *q931Msg) {
|
||||
Q931InformationElement* pDisplayIE;
|
||||
@@ -57,6 +58,17 @@ int ooHandleDisplayIE(OOH323CallData *call, Q931Message *q931Msg) {
|
||||
return OO_OK;
|
||||
}
|
||||
|
||||
int ooHandleH2250ID (OOH323CallData *call, H225ProtocolIdentifier protocolIdentifier) {
|
||||
if (!call->h225version && (protocolIdentifier.numids >= 6) &&
|
||||
(protocolIdentifier.subid[3] == 2250)) {
|
||||
call->h225version = protocolIdentifier.subid[5];
|
||||
OOTRACEDBGC4("Extract H.225 remote version, it's %d, (%s, %s)\n", call->h225version,
|
||||
call->callType, call->callToken);
|
||||
|
||||
}
|
||||
return OO_OK;
|
||||
}
|
||||
|
||||
int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility)
|
||||
{
|
||||
H245OpenLogicalChannel* olc;
|
||||
@@ -241,7 +253,9 @@ int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility)
|
||||
}
|
||||
}
|
||||
} else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
|
||||
ret =ooSendTCSandMSD(call);
|
||||
if (call->h225version >= 4) {
|
||||
ret =ooSendTCSandMSD(call);
|
||||
}
|
||||
if (ret != OO_OK)
|
||||
return ret;
|
||||
}
|
||||
@@ -372,6 +386,7 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg)
|
||||
"%s\n", call->callType, call->callToken);
|
||||
return OO_FAILED;
|
||||
}
|
||||
ooHandleH2250ID(call, setup->protocolIdentifier);
|
||||
memcpy(call->callIdentifier.guid.data, setup->callIdentifier.guid.data,
|
||||
setup->callIdentifier.guid.numocts);
|
||||
call->callIdentifier.guid.numocts = setup->callIdentifier.guid.numocts;
|
||||
@@ -384,9 +399,9 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg)
|
||||
pDisplayIE = ooQ931GetIE(q931Msg, Q931DisplayIE);
|
||||
if(pDisplayIE)
|
||||
{
|
||||
call->remoteDisplayName = (char *) memAlloc(call->pctxt,
|
||||
call->remoteDisplayName = (char *) memAllocZ(call->pctxt,
|
||||
pDisplayIE->length*sizeof(ASN1OCTET)+1);
|
||||
strcpy(call->remoteDisplayName, (char *)pDisplayIE->data);
|
||||
strncpy(call->remoteDisplayName, (char *)pDisplayIE->data, pDisplayIE->length*sizeof(ASN1OCTET));
|
||||
}
|
||||
/*Extract Remote Aliases, if present*/
|
||||
if(setup->m.sourceAddressPresent)
|
||||
@@ -618,6 +633,7 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg)
|
||||
return OO_FAILED;
|
||||
}
|
||||
|
||||
ooHandleH2250ID(call, callProceeding->protocolIdentifier);
|
||||
/* Handle fast-start */
|
||||
if(OO_TESTFLAG (call->flags, OO_M_FASTSTART))
|
||||
{
|
||||
@@ -846,6 +862,7 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg)
|
||||
}
|
||||
return OO_FAILED;
|
||||
}
|
||||
ooHandleH2250ID(call, alerting->protocolIdentifier);
|
||||
/*Handle fast-start */
|
||||
if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&
|
||||
!OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED))
|
||||
@@ -996,7 +1013,9 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg)
|
||||
OOTRACEINFO3("Tunneling and h245address provided."
|
||||
"Giving preference to Tunneling (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
ret =ooSendTCSandMSD(call);
|
||||
if (call->h225version >= 4) {
|
||||
ret =ooSendTCSandMSD(call);
|
||||
}
|
||||
if (ret != OO_OK)
|
||||
return ret;
|
||||
|
||||
@@ -1038,6 +1057,10 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg)
|
||||
call->callState = OO_CALL_CLEAR;
|
||||
}
|
||||
return OO_FAILED;
|
||||
} else {
|
||||
if (call->h225version >= 4) {
|
||||
ret =ooSendTCSandMSD(call);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1076,6 +1099,7 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg)
|
||||
}
|
||||
return OO_FAILED;
|
||||
}
|
||||
ooHandleH2250ID(call, progress->protocolIdentifier);
|
||||
/*Handle fast-start */
|
||||
if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&
|
||||
!OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED))
|
||||
@@ -1227,7 +1251,9 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg)
|
||||
OOTRACEINFO3("Tunneling and h245address provided."
|
||||
"Giving preference to Tunneling (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
ret =ooSendTCSandMSD(call);
|
||||
if (call->h225version >= 4) {
|
||||
ret =ooSendTCSandMSD(call);
|
||||
}
|
||||
if (ret != OO_OK)
|
||||
return ret;
|
||||
} else if(progress->m.h245AddressPresent) {
|
||||
@@ -1268,6 +1294,10 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg)
|
||||
call->callState = OO_CALL_CLEAR;
|
||||
}
|
||||
return OO_FAILED;
|
||||
} else {
|
||||
if (call->h225version >= 4) {
|
||||
ret =ooSendTCSandMSD(call);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1313,7 +1343,7 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg)
|
||||
}
|
||||
return OO_FAILED;
|
||||
}
|
||||
|
||||
ooHandleH2250ID(call, connect->protocolIdentifier);
|
||||
/*Handle fast-start */
|
||||
if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&
|
||||
!OO_TESTFLAG (call->flags, OO_M_FASTSTARTANSWERED))
|
||||
@@ -1548,24 +1578,24 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg)
|
||||
OOTRACEDBGB3("Finished tunneled messages in Connect. (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
|
||||
/*
|
||||
}
|
||||
/*
|
||||
Send TCS as call established and no capability exchange has yet
|
||||
started. This will be true only when separate h245 connection is not
|
||||
established and tunneling is being used.
|
||||
*/
|
||||
if(call->localTermCapState == OO_LocalTermCapExchange_Idle)
|
||||
{
|
||||
/*Start terminal capability exchange and master slave determination */
|
||||
ret = ooSendTermCapMsg(call);
|
||||
if(ret != OO_OK)
|
||||
{
|
||||
OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
if(call->localTermCapState == OO_LocalTermCapExchange_Idle)
|
||||
{
|
||||
/*Start terminal capability exchange and master slave determination */
|
||||
ret = ooSendTermCapMsg(call);
|
||||
if(ret != OO_OK)
|
||||
{
|
||||
OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
call->callState = OO_CALL_CONNECTED;
|
||||
if (call->rtdrCount > 0 && call->rtdrInterval > 0) {
|
||||
return ooSendRoundTripDelayRequest(call);
|
||||
@@ -1786,6 +1816,9 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg)
|
||||
H225TransportAddress_ipAddress_ip *ip = NULL;
|
||||
OOTRACEDBGC3("Received Facility Message.(%s, %s)\n", call->callType,
|
||||
call->callToken);
|
||||
|
||||
ooHandleDisplayIE(call, pQ931Msg);
|
||||
|
||||
/* Get Reference to H323_UU_PDU */
|
||||
if(!pQ931Msg->userInfo)
|
||||
{
|
||||
@@ -1803,6 +1836,7 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg)
|
||||
facility = pH323UUPdu->h323_message_body.u.facility;
|
||||
if(facility)
|
||||
{
|
||||
ooHandleH2250ID(call, facility->protocolIdentifier);
|
||||
/* Depending on the reason of facility message handle the message */
|
||||
if(facility->reason.t == T_H225FacilityReason_transportedInformation)
|
||||
{
|
||||
@@ -1980,6 +2014,7 @@ int ooHandleStartH245FacilityMessage
|
||||
OOTRACEINFO3("INFO: H.245 connection already established with remote"
|
||||
" endpoint (%s, %s)\n", call->callType, call->callToken);
|
||||
}
|
||||
ooSendTCSandMSD(call);
|
||||
return OO_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user