diff --git addons/ooh323c/src/ooCalls.c addons/ooh323c/src/ooCalls.c index 350befd..82db53d 100644 --- addons/ooh323c/src/ooCalls.c +++ addons/ooh323c/src/ooCalls.c @@ -16,6 +16,7 @@ #include "asterisk.h" #include "asterisk/lock.h" +#include "asterisk/utils.h" #include "ootrace.h" #include "ootypes.h" @@ -225,36 +226,47 @@ int ooEndCall(OOH323CallData *call) call->callState = OO_CALL_CLEARED; } - if(call->callState == OO_CALL_CLEARED || ((strcmp(call->callType, "incoming")) && - call->callState == OO_CALL_CLEAR_RELEASESENT)) + if(call->callState == OO_CALL_CLEARED || /* ((strcmp(call->callType, "incoming")) && */ + call->callState == OO_CALL_CLEAR_RELEASESENT || call->callState == OO_CALL_CLEAR_RELEASERECVD) /* )*/ { ooCleanCall(call); call->callState = OO_CALL_REMOVED; return OO_OK; } - if(call->logicalChans) - { - OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType, - call->callToken); - ooClearAllLogicalChannels(call); + if(OO_TESTFLAG(call->flags, OO_M_ENDSESSION_BUILT)) { + if(call->h245SessionState == OO_H245SESSION_ACTIVE || + call->h245SessionState == OO_H245SESSION_ENDRECVD || call->h245SessionState == OO_H245SESSION_ENDSENT) { + return OO_OK; // h.245 close pending + } } if(!OO_TESTFLAG(call->flags, OO_M_ENDSESSION_BUILT)) { + OOTRACEINFO4("Closing H.245 sessions. %d (%s, %s)\n", call->h245SessionState, call->callType, call->callToken); if(call->h245SessionState == OO_H245SESSION_ACTIVE || call->h245SessionState == OO_H245SESSION_ENDRECVD) { - ooSendEndSessionCommand(call); - OO_SETFLAG(call->flags, OO_M_ENDSESSION_BUILT); + if(call->logicalChans) { + if (!OO_TESTFLAG(call->flags, OO_M_CLOSE_LC_SENT)) { + OOTRACEINFO3("Closing all logical channels. (%s, %s)\n", call->callType, + call->callToken); + ooCloseAllLogicalChannels(call, NULL); + OO_SETFLAG(call->flags, OO_M_CLOSE_LC_SENT); + } + return OO_OK; + } + ooSendEndSessionCommand(call); + OO_SETFLAG(call->flags, OO_M_ENDSESSION_BUILT); + return OO_OK; } } if(!OO_TESTFLAG(call->flags, OO_M_RELEASE_BUILT)) { - if(call->callState == OO_CALL_CLEAR || - call->callState == OO_CALL_CLEAR_RELEASERECVD) + if(call->callState == OO_CALL_CLEAR /* || + call->callState == OO_CALL_CLEAR_RELEASERECVD */) { ooSendReleaseComplete(call); OO_SETFLAG(call->flags, OO_M_RELEASE_BUILT); @@ -838,7 +850,7 @@ unsigned ooCallGenerateSessionID if(type == OO_CAP_TYPE_AUDIO) { - if(!ooGetLogicalChannel(call, 1, dir)) + if(ooGetLogicalChannel(call, 1, dir)) { sessionID = 1; } @@ -856,7 +868,7 @@ unsigned ooCallGenerateSessionID if(type == OO_CAP_TYPE_VIDEO) { - if(!ooGetLogicalChannel(call, 2, dir)) + if(ooGetLogicalChannel(call, 2, dir)) { sessionID = 2; } @@ -873,7 +885,7 @@ unsigned ooCallGenerateSessionID } if(type == OO_CAP_TYPE_DATA) { - if(!ooGetLogicalChannel(call, 3, dir)) + if(ooGetLogicalChannel(call, 3, dir)) { sessionID = 3; } diff --git addons/ooh323c/src/ooCalls.h addons/ooh323c/src/ooCalls.h index d05ccf0..ea1f43b 100644 --- addons/ooh323c/src/ooCalls.h +++ addons/ooh323c/src/ooCalls.h @@ -45,6 +45,7 @@ extern "C" { #define OO_M_ENDSESSION_BUILT ASN1UINTCNT(0x00800000) #define OO_M_RELEASE_BUILT ASN1UINTCNT(0x00400000) #define OO_M_FASTSTARTANSWERED ASN1UINTCNT(0x04000000) +#define OO_M_CLOSE_LC_SENT ASN1UINTCNT(0x40000000) #define OO_M_ENDPOINTCREATED ASN1UINTCNT(0x00010000) #define OO_M_GKROUTED ASN1UINTCNT(0x00200000) diff --git addons/ooh323c/src/ooLogChan.c addons/ooh323c/src/ooLogChan.c index 05b152a..e2a7efe 100644 --- addons/ooh323c/src/ooLogChan.c +++ addons/ooh323c/src/ooLogChan.c @@ -41,6 +41,10 @@ OOLogicalChannel* ooAddNewLogicalChannel(OOH323CallData *call, int channelNo, return NULL; } + if (ooFindLogicalChannelByLogicalChannelNo(call, channelNo)) { + ooClearLogicalChannel(call, channelNo); + } + memset(pNewChannel, 0, sizeof(OOLogicalChannel)); pNewChannel->channelNo = channelNo; pNewChannel->sessionID = sessionID; @@ -228,7 +232,7 @@ OOLogicalChannel* ooGetLogicalChannel pChannel = call->logicalChans; while(pChannel) { - if(pChannel->sessionID == sessionID && !strcmp(pChannel->dir, dir)) + if((pChannel->sessionID == sessionID || !pChannel->sessionID) && !strcmp(pChannel->dir, dir)) return pChannel; else pChannel = pChannel->next; @@ -248,8 +252,8 @@ OOLogicalChannel* ooGetTransmitLogicalChannel OOTRACEINFO6("Listing logical channel %d cap %d state %d for (%s, %s)\n", pChannel->channelNo, pChannel->chanCap->cap, pChannel->state, call->callType, call->callToken); - if(!strcmp(pChannel->dir, "transmit") && pChannel->state != OO_LOGICALCHAN_IDLE && - pChannel->state != OO_LOGICALCHAN_PROPOSEDFS) + if(!strcmp(pChannel->dir, "transmit") && pChannel->state != OO_LOGICALCHAN_IDLE /* && + pChannel->state != OO_LOGICALCHAN_PROPOSED */) return pChannel; else pChannel = pChannel->next; @@ -267,8 +271,8 @@ OOLogicalChannel* ooGetReceiveLogicalChannel OOTRACEINFO6("Listing logical channel %d cap %d state %d for (%s, %s)\n", pChannel->channelNo, pChannel->chanCap->cap, pChannel->state, call->callType, call->callToken); - if (!strcmp(pChannel->dir, "receive") && pChannel->state != OO_LOGICALCHAN_IDLE && - pChannel->state != OO_LOGICALCHAN_PROPOSEDFS) { + if (!strcmp(pChannel->dir, "receive") && pChannel->state != OO_LOGICALCHAN_IDLE /* && + pChannel->state != OO_LOGICALCHAN_PROPOSED */) { return pChannel; } else { pChannel = pChannel->next; @@ -398,14 +402,14 @@ int ooOnLogicalChannelEstablished (OOH323CallData *call, OOLogicalChannel * pChannel) { OOLogicalChannel * temp = NULL, *prev=NULL; - OOTRACEDBGC3("In ooOnLogicalChannelEstablished (%s, %s)\n", - call->callType, call->callToken); pChannel->state = OO_LOGICALCHAN_ESTABLISHED; + OOTRACEDBGC5("In ooOnLogicalChannelEstablished %d %d (%s, %s)\n", + pChannel->channelNo, pChannel->state, call->callType, call->callToken); temp = call->logicalChans; while(temp) { if(temp->channelNo != pChannel->channelNo && - temp->sessionID == pChannel->sessionID && + (temp->sessionID == pChannel->sessionID || !temp->sessionID) && !strcmp(temp->dir, pChannel->dir) ) { prev = temp; diff --git addons/ooh323c/src/oochannels.c addons/ooh323c/src/oochannels.c index f7dd7c5..5c832f0 100644 --- addons/ooh323c/src/oochannels.c +++ addons/ooh323c/src/oochannels.c @@ -225,9 +225,11 @@ int ooSendH225Msg(OOH323CallData *call, Q931Message *msg) if(encodebuf[0] == OOReleaseComplete || (encodebuf[0]==OOFacility && encodebuf[1]==OOEndSessionCommand)) { - dListFreeAll(call->pctxt, &call->pH225Channel->outQueue); + // dListFreeAll(call->pctxt, &call->pH225Channel->outQueue); dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf); - // ooSendMsg(call, OOQ931MSG); + while (call->pH225Channel->outQueue.count > 0) { + ooSendMsg(call, OOQ931MSG); + } } else{ dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf); @@ -1649,10 +1651,10 @@ int ooOnSendMsg } } - if(call->h245SessionState == OO_H245SESSION_CLOSED) + /* if(call->h245SessionState == OO_H245SESSION_CLOSED) { call->callState = OO_CALL_CLEARED; - } + }*/ break; case OOFacility: diff --git addons/ooh323c/src/ooh245.c addons/ooh323c/src/ooh245.c index fe8ff28..84f9e4b 100644 --- addons/ooh323c/src/ooh245.c +++ addons/ooh323c/src/ooh245.c @@ -272,9 +272,11 @@ int ooSendH245Msg(OOH323CallData *call, H245Message *msg) if(!OO_TESTFLAG(call->flags, OO_M_TUNNELING)){ if(encodebuf[0]== OOEndSessionCommand) /* High priority message */ { - dListFreeAll(call->pctxt, &call->pH245Channel->outQueue); + // dListFreeAll(call->pctxt, &call->pH245Channel->outQueue); dListAppend (call->pctxt, &call->pH245Channel->outQueue, encodebuf); - ooSendMsg(call, OOH245MSG); + while (call->pH245Channel && call->pH245Channel->outQueue.count > 0) { + ooSendMsg(call, OOH245MSG); + } } else{ dListAppend (call->pctxt, &call->pH245Channel->outQueue, encodebuf); @@ -1778,6 +1780,7 @@ int ooHandleOpenLogicalChannel_helper(OOH323CallData *call, return OO_FAILED; } pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; + ooOnLogicalChannelEstablished(call, pLogicalChannel); return ret; } @@ -1988,6 +1991,7 @@ int ooOnReceivedOpenLogicalChannelAck(OOH323CallData *call, return OO_FAILED; } pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; + ooOnLogicalChannelEstablished(call, pLogicalChannel); return OO_OK; } @@ -2179,7 +2183,7 @@ int ooHandleH245Command(OOH323CallData *call, call->callState = OO_CALL_CLEAR; } - + call->callEndReason = OO_REASON_REMOTE_CLEARED; break; case T_H245CommandMessage_sendTerminalCapabilitySet: OOTRACEWARN3("Warning: Received command Send terminal capability set " @@ -2247,7 +2251,9 @@ int ooCloseAllLogicalChannels(OOH323CallData *call, char* dir) temp = call->logicalChans; while(temp) { - if(temp->state == OO_LOGICALCHAN_ESTABLISHED && + if(temp->state != OO_LOGICALCHAN_ESTABLISHED) { + ooClearLogicalChannel(call, temp->channelNo); + } else if(temp->state == OO_LOGICALCHAN_ESTABLISHED && (dir == NULL || !strcmp(temp->dir,dir))) { /* Sending closelogicalchannel only for outgoing channels*/ @@ -3095,8 +3101,6 @@ int ooHandleH245Message(OOH323CallData *call, H245Message * pmsg) call->TCSPending = FALSE; call->localTermCapState = OO_LocalTermCapExchange_Idle; ooSendTermCapMsg(call); - } else if (!ooGetTransmitLogicalChannel(call)) { - ooOpenLogicalChannels(call); } break; case T_H245ResponseMessage_requestChannelCloseAck: @@ -3632,6 +3636,13 @@ int ooSendH245UserInputIndication_signal int ooOpenLogicalChannels(OOH323CallData *call) { int ret=0; + + if (call->callState >= OO_CALL_CLEAR) { + OOTRACEINFO3("Not open logical channels on closing call(%s, %s)\n", call->callType, + call->callToken); + return OO_OK; + + } OOTRACEINFO3("Opening logical channels (%s, %s)\n", call->callType, call->callToken); @@ -4300,7 +4311,8 @@ int ooBuildFastStartOLC state of all channels are proposed, for incoming calls, state is established. */ if(!outgoing) { - pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; + // pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; + pLogicalChannel->state = OO_LOGICALCHAN_PROPOSEDFS; } else { /* Calling other ep, with SETUP message */ @@ -4701,7 +4713,8 @@ int ooPrepareFastStartResponseOLC } - pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; + // pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED; + pLogicalChannel->state = OO_LOGICALCHAN_PROPOSEDFS; return OO_OK; } diff --git addons/ooh323c/src/ooh323.c addons/ooh323c/src/ooh323.c index be02f8f..ab96b27 100644 --- addons/ooh323c/src/ooh323.c +++ addons/ooh323c/src/ooh323.c @@ -212,7 +212,7 @@ int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility) /* Mark the current channel as established and close all other logical channels with same session id and in same direction. */ - ooOnLogicalChannelEstablished(call, pChannel); + // ooOnLogicalChannelEstablished(call, pChannel); } finishPrint(); removeEventHandler(call->pctxt); @@ -355,7 +355,7 @@ int ooOnReceivedReleaseComplete(OOH323CallData *call, Q931Message *q931Msg) ooCloseH245Connection(call); } - if(call->callState != OO_CALL_CLEAR_RELEASESENT) + if(call->callState < OO_CALL_CLEAR_RELEASESENT) { if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK)) { @@ -365,8 +365,8 @@ int ooOnReceivedReleaseComplete(OOH323CallData *call, Q931Message *q931Msg) ooGkClientSendDisengageRequest(gH323ep.gkClient, call); } } + call->callState = OO_CALL_CLEAR_RELEASERECVD; } - call->callState = OO_CALL_CLEARED; return ret; } @@ -799,7 +799,7 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg) /* Mark the current channel as established and close all other logical channels with same session id and in same direction. */ - ooOnLogicalChannelEstablished(call, pChannel); + // ooOnLogicalChannelEstablished(call, pChannel); } finishPrint(); removeEventHandler(call->pctxt); @@ -1036,12 +1036,13 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg) removeEventHandler(call->pctxt); return OO_FAILED; } - pChannel->chanCap->startTransmitChannel(call, pChannel); - /* Mark the current channel as established and close all other - logical channels with same session id and in same direction. - */ - ooOnLogicalChannelEstablished(call, pChannel); + pChannel->chanCap->startTransmitChannel(call, pChannel); } + OOTRACEINFO4("Before LC established: %d ((%s, %s)\n", pChannel->channelNo, call->callType, call->callToken); + /* Mark the current channel as established and close all other + logical channels with same session id and in same direction. + */ + // ooOnLogicalChannelEstablished(call, pChannel); } finishPrint(); removeEventHandler(call->pctxt); @@ -1292,7 +1293,7 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg) /* Mark the current channel as established and close all other logical channels with same session id and in same direction. */ - ooOnLogicalChannelEstablished(call, pChannel); + // ooOnLogicalChannelEstablished(call, pChannel); } finishPrint(); removeEventHandler(call->pctxt); @@ -1420,6 +1421,7 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg) OOTRACEINFO3("Remote endpoint has rejected fastStart. (%s, %s)\n", call->callType, call->callToken); OO_CLRFLAG (call->flags, OO_M_FASTSTART); + ooClearAllLogicalChannels(call); } } @@ -1555,7 +1557,7 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg) /* Mark the current channel as established and close all other logical channels with same session id and in same direction. */ - ooOnLogicalChannelEstablished(call, pChannel); + // ooOnLogicalChannelEstablished(call, pChannel); } finishPrint(); removeEventHandler(call->pctxt);