diff options
Diffstat (limited to 'addons/ooh323c/src/ooh323.c')
-rw-r--r-- | addons/ooh323c/src/ooh323.c | 75 |
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; } |