summaryrefslogtreecommitdiff
path: root/addons/ooh323c/src/ooh323.c
diff options
context:
space:
mode:
Diffstat (limited to 'addons/ooh323c/src/ooh323.c')
-rw-r--r--addons/ooh323c/src/ooh323.c75
1 files changed, 55 insertions, 20 deletions
diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c
index 09df3c9c1..33751067a 100644
--- a/addons/ooh323c/src/ooh323.c
+++ b/addons/ooh323c/src/ooh323.c
@@ -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;
}