aboutsummaryrefslogtreecommitdiffstats
path: root/addons/ooh323c/src
diff options
context:
space:
mode:
Diffstat (limited to 'addons/ooh323c/src')
-rw-r--r--addons/ooh323c/src/ooCalls.h2
-rw-r--r--addons/ooh323c/src/ooSocket.c7
-rw-r--r--addons/ooh323c/src/ooh245.c148
-rw-r--r--addons/ooh323c/src/ooh245.h7
-rw-r--r--addons/ooh323c/src/ooh323.c9
-rw-r--r--addons/ooh323c/src/ooq931.c9
-rw-r--r--addons/ooh323c/src/ootypes.h5
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