diff options
Diffstat (limited to 'addons/ooh323c/src')
-rw-r--r-- | addons/ooh323c/src/ooCalls.h | 2 | ||||
-rw-r--r-- | addons/ooh323c/src/ooSocket.c | 7 | ||||
-rw-r--r-- | addons/ooh323c/src/ooh245.c | 148 | ||||
-rw-r--r-- | addons/ooh323c/src/ooh245.h | 7 | ||||
-rw-r--r-- | addons/ooh323c/src/ooh323.c | 9 | ||||
-rw-r--r-- | addons/ooh323c/src/ooq931.c | 9 | ||||
-rw-r--r-- | addons/ooh323c/src/ootypes.h | 5 |
7 files changed, 181 insertions, 6 deletions
diff --git a/addons/ooh323c/src/ooCalls.h b/addons/ooh323c/src/ooCalls.h index 68dd3bfbd..05494296e 100644 --- a/addons/ooh323c/src/ooCalls.h +++ b/addons/ooh323c/src/ooCalls.h @@ -219,6 +219,8 @@ typedef struct OOH323CallData { char rtpMaskStr[120]; char lastDTMF; ASN1UINT nextDTMFstamp; + int rtdrInterval, rtdrCount; /* roundTripDelay interval and unreplied count */ + ASN1UINT rtdrSend, rtdrRecv; /* last sended/replied RTD request */ void *usrData; /*!<User can set this to user specific data*/ struct OOH323CallData* next; struct OOH323CallData* prev; diff --git a/addons/ooh323c/src/ooSocket.c b/addons/ooh323c/src/ooSocket.c index 590536550..7c1b000a4 100644 --- a/addons/ooh323c/src/ooSocket.c +++ b/addons/ooh323c/src/ooSocket.c @@ -611,6 +611,7 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList) struct ifconf ifc; int ifNum; OOInterface *pIf=NULL; + struct sockaddr_in sin; OOTRACEDBGA1("Retrieving local interfaces\n"); if(ooSocketCreateUDP(&sock)!= ASN_OK) @@ -686,7 +687,8 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList) memFreePtr(pctxt, pIf); continue; } - strcpy(addr, ast_inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr)); + memcpy(&sin, &ifReq.ifr_addr, sizeof(struct sockaddr_in)); + strcpy(addr, ast_inet_ntoa(sin.sin_addr)); OOTRACEDBGA2("\tIP address is %s\n", addr); pIf->addr = (char*)memAlloc(pctxt, strlen(addr)+1); if(!pIf->addr) @@ -709,7 +711,8 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList) memFreePtr(pctxt, pIf); continue; } - strcpy(mask, ast_inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr)); + memcpy(&sin, &ifReq.ifr_netmask, sizeof(struct sockaddr_in)); + strcpy(mask, ast_inet_ntoa(sin.sin_addr)); OOTRACEDBGA2("\tMask is %s\n", mask); pIf->mask = (char*)memAlloc(pctxt, strlen(mask)+1); if(!pIf->mask) diff --git a/addons/ooh323c/src/ooh245.c b/addons/ooh323c/src/ooh245.c index 920df770f..9eee54316 100644 --- a/addons/ooh323c/src/ooh245.c +++ b/addons/ooh323c/src/ooh245.c @@ -2409,6 +2409,132 @@ int ooOnReceivedRequestChannelClose(OOH323CallData *call, return ret; } +int ooSendRoundTripDelayRequest(OOH323CallData *call) +{ + int ret=0; + H245Message *ph245msg=NULL; + H245RequestMessage *request = NULL; + OOCTXT *pctxt=NULL; + H245RoundTripDelayRequest *rtdr; + ooTimerCallback *cbData=NULL; + + if (call->rtdrSend > call->rtdrRecv + call->rtdrCount) { + if(call->callState < OO_CALL_CLEAR) { + call->callState = OO_CALL_CLEAR; + call->callEndReason = OO_REASON_UNKNOWN; + call->q931cause = Q931RecoveryOnTimerExpiry; + } + return OO_FAILED; + } + + ret = ooCreateH245Message(call, &ph245msg, + T_H245MultimediaSystemControlMessage_request); + if(ret != OO_OK) + { + OOTRACEERR3("ERROR:Memory allocation for RoundTripDelayResponse message " + "failed (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + + pctxt = call->msgctxt; + ph245msg->msgType = OORequestDelayRequest; + request = ph245msg->h245Msg.u.request; + request->t = T_H245RequestMessage_roundTripDelayRequest; + request->u.roundTripDelayRequest = (H245RoundTripDelayRequest *)ASN1MALLOC + (pctxt, sizeof(H245RoundTripDelayRequest)); + if(!request->u.roundTripDelayRequest) + { + OOTRACEERR3("ERROR:Failed to allocate memory for H245RoundTripDelayRequest " + "message (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + rtdr = request->u.roundTripDelayRequest; + memset(rtdr, 0, sizeof(H245RoundTripDelayRequest)); + rtdr->sequenceNumber = ++call->rtdrSend; + + OOTRACEDBGA3("Built RoundTripDelayRequest message (%s, %s)\n", + call->callType, call->callToken); + ret = ooSendH245Msg(call, ph245msg); + if(ret != OO_OK) + { + OOTRACEERR3("Error:Failed to enqueue RoundTripDelayRequest to outbound queue. (%s, %s)\n", + call->callType, call->callToken); + return OO_FAILED; + } else { + cbData = (ooTimerCallback*) memAlloc(call->pctxt, + sizeof(ooTimerCallback)); + if(!cbData) + { + OOTRACEERR3("Error:Unable to allocate memory for timer callback data." + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + cbData->call = call; + cbData->timerType = OO_RTD_TIMER; + if(!ooTimerCreate(call->pctxt, &call->timerList, &ooRTDTimerExpired, + call->rtdrInterval, cbData, FALSE)) + { + OOTRACEERR3("Error:Unable to create RTDR timer. " + "(%s, %s)\n", call->callType, call->callToken); + memFreePtr(call->pctxt, cbData); + return OO_FAILED; + } + + } + + ooFreeH245Message(call, ph245msg); + + return ret; +} + +int ooOnReceivedRoundTripDelayRequest(OOH323CallData *call, + H245SequenceNumber sequenceNumber) +{ + int ret=0; + H245Message *ph245msg=NULL; + H245ResponseMessage *response = NULL; + OOCTXT *pctxt=NULL; + H245RoundTripDelayResponse *rtdr; + + ret = ooCreateH245Message(call, &ph245msg, + T_H245MultimediaSystemControlMessage_response); + if(ret != OO_OK) + { + OOTRACEERR3("ERROR:Memory allocation for RoundTripDelayResponse message " + "failed (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + + pctxt = call->msgctxt; + ph245msg->msgType = OORequestDelayResponse; + response = ph245msg->h245Msg.u.response; + response->t = T_H245ResponseMessage_roundTripDelayResponse; + response->u.roundTripDelayResponse = (H245RoundTripDelayResponse *)ASN1MALLOC + (pctxt, sizeof(H245RoundTripDelayResponse)); + if(!response->u.roundTripDelayResponse) + { + OOTRACEERR3("ERROR:Failed to allocate memory for H245RoundTripDelayResponse " + "message (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + rtdr = response->u.roundTripDelayResponse; + memset(rtdr, 0, sizeof(H245RoundTripDelayResponse)); + rtdr->sequenceNumber = sequenceNumber; + + OOTRACEDBGA3("Built RoundTripDelayResponse message (%s, %s)\n", + call->callType, call->callToken); + ret = ooSendH245Msg(call, ph245msg); + if(ret != OO_OK) + { + OOTRACEERR3("Error:Failed to enqueue RoundTripDelayResponse to outbound queue. (%s, %s)\n", + call->callType, call->callToken); + } + + ooFreeH245Message(call, ph245msg); + + return ret; +} + /* We clear channel here. Ideally the remote endpoint should send CloseLogicalChannel and then the channel should be cleared. But there's no @@ -2609,6 +2735,11 @@ int ooHandleH245Message(OOH323CallData *call, H245Message * pmsg) ooOnReceivedRequestChannelClose(call, request->u.requestChannelClose); break; + case T_H245RequestMessage_roundTripDelayRequest: + OOTRACEINFO4("Received roundTripDelayRequest - %d (%s, %s)\n", + request->u.roundTripDelayRequest->sequenceNumber, call->callType, call->callToken); + ooOnReceivedRoundTripDelayRequest(call, request->u.roundTripDelayRequest->sequenceNumber); + break; default: ; } /* End of Request Message */ @@ -2833,6 +2964,11 @@ int ooHandleH245Message(OOH323CallData *call, H245Message * pmsg) ooOnReceivedRequestChannelCloseReject(call, response->u.requestChannelCloseReject); break; + case T_H245ResponseMessage_roundTripDelayResponse: + OOTRACEINFO4("Received roundTripDelayResponse - %d (%s, %s)\n", + response->u.roundTripDelayResponse->sequenceNumber, call->callType, call->callToken); + call->rtdrRecv = response->u.roundTripDelayResponse->sequenceNumber; + break; default: ; } @@ -3932,6 +4068,18 @@ int ooTCSTimerExpired(void *data) return OO_OK; } +int ooRTDTimerExpired(void *data) +{ + ooTimerCallback *cbData = (ooTimerCallback*)data; + OOH323CallData *call = cbData->call; + OOTRACEINFO3("Time to send new RTD request. (%s, %s)\n", + call->callType, call->callToken); + ASN1MEMFREEPTR(call->pctxt, cbData); + ooSendRoundTripDelayRequest(call); + return OO_OK; + +} + int ooOpenLogicalChannelTimerExpired(void *pdata) { ooTimerCallback *cbData = (ooTimerCallback*)pdata; diff --git a/addons/ooh323c/src/ooh245.h b/addons/ooh323c/src/ooh245.h index 353441bde..e8bce3fb9 100644 --- a/addons/ooh323c/src/ooh245.h +++ b/addons/ooh323c/src/ooh245.h @@ -631,6 +631,7 @@ int ooSessionTimerExpired(void *pdata); /** * @} */ +int ooRTDTimerExpired(void *pdata); int ooHandleRequestMode(OOH323CallData* call, H245RequestMode *requestMode); @@ -643,6 +644,12 @@ int ooSendRequestModeReject(OOH323CallData* call, void ooOnReceivedRequestModeAck(OOH323CallData* call, H245RequestModeAck * requestModeAck); +int ooOnReceivedRoundTripDelayRequest(OOH323CallData *call, + H245SequenceNumber sequenceNumber); + +int ooSendRoundTripDelayRequest(OOH323CallData *call); + + #ifdef __cplusplus } #endif diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c index 02c925b84..104e0bf0d 100644 --- a/addons/ooh323c/src/ooh323.c +++ b/addons/ooh323c/src/ooh323.c @@ -1543,6 +1543,10 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg) } } + call->callState = OO_CALL_CONNECTED; + if (call->rtdrCount > 0 && call->rtdrInterval > 0) { + return ooSendRoundTripDelayRequest(call); + } return OO_OK; } @@ -2239,7 +2243,8 @@ int ooPopulateAliasList(OOCTXT *pctxt, OOAliases *pAliases, } switch(pAlias->type) { - case T_H225AliasAddress_dialedDigits: + /* Don't populate DialedDigits as alias they populate as prefixes + case T_H225AliasAddress_dialedDigits: pAliasEntry->t = T_H225AliasAddress_dialedDigits; pAliasEntry->u.dialedDigits = (ASN1IA5String)memAlloc(pctxt, strlen(pAlias->value)+1); @@ -2252,7 +2257,7 @@ int ooPopulateAliasList(OOCTXT *pctxt, OOAliases *pAliases, } strcpy(*(char**)&pAliasEntry->u.dialedDigits, pAlias->value); bValid = TRUE; - break; + break; */ case T_H225AliasAddress_h323_ID: pAliasEntry->t = T_H225AliasAddress_h323_ID; pAliasEntry->u.h323_ID.nchars = strlen(pAlias->value); diff --git a/addons/ooh323c/src/ooq931.c b/addons/ooh323c/src/ooq931.c index 06748b6d9..3f25885db 100644 --- a/addons/ooh323c/src/ooq931.c +++ b/addons/ooh323c/src/ooq931.c @@ -2003,6 +2003,11 @@ int ooAcceptCall(OOH323CallData *call) /* memReset(&gH323ep.msgctxt); */ memReset(call->msgctxt); + call->callState = OO_CALL_CONNECTED; + + if (call->rtdrCount > 0 && call->rtdrInterval > 0) { + return ooSendRoundTripDelayRequest(call); + } return OO_OK; } @@ -3669,7 +3674,9 @@ const char* ooGetMsgTypeText (int msgType) "OOUserInputIndication", "OORequestModeAck", "OORequestModeReject", - "OORequestMode" + "OORequestMode", + "OORequestDelayResponse", + "OORequestDelayRequest" }; int idx = msgType - OO_MSGTYPE_MIN; return ooUtilsGetText (idx, msgTypeText, OONUMBEROF(msgTypeText)); diff --git a/addons/ooh323c/src/ootypes.h b/addons/ooh323c/src/ootypes.h index 24bb6a2db..83c20fa45 100644 --- a/addons/ooh323c/src/ootypes.h +++ b/addons/ooh323c/src/ootypes.h @@ -188,8 +188,10 @@ typedef enum OOCallClearReason { #define OORequestModeAck 131 #define OORequestModeReject 132 #define OORequestMode 133 +#define OORequestDelayResponse 134 +#define OORequestDelayRequest 135 -#define OO_MSGTYPE_MAX 133 +#define OO_MSGTYPE_MAX 135 /* Timer types */ #define OO_CALLESTB_TIMER (1<<0) @@ -200,6 +202,7 @@ typedef enum OOCallClearReason { #define OO_RCC_TIMER (1<<5) #define OO_SESSION_TIMER (1<<6) #define OO_H245CONNECT_TIMER (1<<7) +#define OO_RTD_TIMER (1<<8) /** Maximum length for received messages */ #define MAXMSGLEN 4096 |