aboutsummaryrefslogtreecommitdiffstats
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.c144
1 files changed, 107 insertions, 37 deletions
diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c
index 33751067a..349c21f29 100644
--- a/addons/ooh323c/src/ooh323.c
+++ b/addons/ooh323c/src/ooh323.c
@@ -226,7 +226,7 @@ int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility)
if(ret != OO_OK)
{
OOTRACEERR3("Error: Unknown H245 address type in received "
- "CallProceeding message (%s, %s)", call->callType,
+ "Facility message (%s, %s)", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
@@ -368,8 +368,10 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg)
H245OpenLogicalChannel* olc;
ASN1OCTET msgbuf[MAXMSGLEN];
H225TransportAddress_ipAddress_ip *ip = NULL;
+ H225TransportAddress_ip6Address_ip *ip6 = NULL;
Q931InformationElement* pDisplayIE=NULL;
OOAliases *pAlias=NULL;
+ char remoteIP[2+8*4+7];
call->callReference = q931Msg->callReference;
@@ -507,18 +509,26 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg)
"setup (%s, %s)\n", call->callType, call->callToken);
}
else{
-
- if(setup->sourceCallSignalAddress.t != T_H225TransportAddress_ipAddress)
- {
- OOTRACEERR3("ERROR: Source call signalling address type not ip "
+ if(setup->sourceCallSignalAddress.t == T_H225TransportAddress_ip6Address) {
+ ip6 = &setup->sourceCallSignalAddress.u.ip6Address->ip;
+ inet_ntop(AF_INET6, ip6->data, remoteIP, INET6_ADDRSTRLEN);
+ call->remotePort = setup->sourceCallSignalAddress.u.ip6Address->port;
+ } else if(setup->sourceCallSignalAddress.t == T_H225TransportAddress_ipAddress) {
+ ip = &setup->sourceCallSignalAddress.u.ipAddress->ip;
+ sprintf(remoteIP, "%d.%d.%d.%d", ip->data[0], ip->data[1],
+ ip->data[2], ip->data[3]);
+ call->remotePort = setup->sourceCallSignalAddress.u.ipAddress->port;
+ } else {
+ OOTRACEERR3("ERROR: Source call signalling address type not ip4 nor ip6 "
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
+ }
- ip = &setup->sourceCallSignalAddress.u.ipAddress->ip;
- sprintf(call->remoteIP, "%d.%d.%d.%d", ip->data[0], ip->data[1],
- ip->data[2], ip->data[3]);
- call->remotePort = setup->sourceCallSignalAddress.u.ipAddress->port;
+ if (strncmp(remoteIP, call->remoteIP, strlen(remoteIP))) {
+ OOTRACEERR5("ERROR: Security denial remote sig IP isn't a socket ip, %s not %s "
+ "(%s, %s)\n", remoteIP, call->remoteIP, call->callType,
+ call->callToken);
}
/* check for fast start */
@@ -1814,6 +1824,7 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg)
H225Facility_UUIE * facility = NULL;
int ret;
H225TransportAddress_ipAddress_ip *ip = NULL;
+ H225TransportAddress_ip6Address_ip *ip6 = NULL;
OOTRACEDBGC3("Received Facility Message.(%s, %s)\n", call->callType,
call->callToken);
@@ -1899,6 +1910,21 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg)
call->pCallFwdData->aliases = NULL;
if(facility->m.alternativeAddressPresent)
{
+ if (call->versionIP == 6) {
+ if(facility->alternativeAddress.t !=
+ T_H225TransportAddress_ip6Address)
+ {
+ OOTRACEERR3("ERROR: Source call signalling address type not ip6 "
+ "(%s, %s)\n", call->callType, call->callToken);
+
+ return OO_FAILED;
+ }
+
+ ip6 = &facility->alternativeAddress.u.ip6Address->ip;
+ inet_ntop(AF_INET6, ip6->data, call->pCallFwdData->ip, INET6_ADDRSTRLEN);
+ call->pCallFwdData->port =
+ facility->alternativeAddress.u.ip6Address->port;
+ } else {
if(facility->alternativeAddress.t !=
T_H225TransportAddress_ipAddress)
{
@@ -1913,6 +1939,7 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg)
ip->data[1], ip->data[2], ip->data[3]);
call->pCallFwdData->port =
facility->alternativeAddress.u.ipAddress->port;
+ }
}
if(facility->m.alternativeAliasAddressPresent)
@@ -1969,6 +1996,7 @@ int ooHandleStartH245FacilityMessage
(OOH323CallData *call, H225Facility_UUIE *facility)
{
H225TransportAddress_ipAddress *ipAddress = NULL;
+ H225TransportAddress_ip6Address *ip6Address = NULL;
int ret;
/* Extract H245 address */
@@ -1978,25 +2006,43 @@ int ooHandleStartH245FacilityMessage
"address (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
- if(facility->h245Address.t != T_H225TransportAddress_ipAddress)
- {
+ if (call->versionIP == 6) {
+ if(facility->h245Address.t != T_H225TransportAddress_ip6Address)
+ {
OOTRACEERR3("ERROR:Unknown H245 address type in received startH245 "
"facility message (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
- }
- ipAddress = facility->h245Address.u.ipAddress;
- if(!ipAddress)
- {
+ }
+ ip6Address = facility->h245Address.u.ip6Address;
+ if(!ip6Address)
+ {
+ OOTRACEERR3("ERROR:Invalid startH245 facility message. No H245 ip6 "
+ "address found. (%s, %s)\n", call->callType, call->callToken);
+ return OO_FAILED;
+ }
+ inet_ntop(AF_INET6, ip6Address->ip.data, call->remoteIP, INET6_ADDRSTRLEN);
+ call->remoteH245Port = ip6Address->port;
+ } else {
+ if(facility->h245Address.t != T_H225TransportAddress_ipAddress)
+ {
+ OOTRACEERR3("ERROR:Unknown H245 address type in received startH245 "
+ "facility message (%s, %s)\n", call->callType, call->callToken);
+ return OO_FAILED;
+ }
+ ipAddress = facility->h245Address.u.ipAddress;
+ if(!ipAddress)
+ {
OOTRACEERR3("ERROR:Invalid startH245 facility message. No H245 ip "
"address found. (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
- }
+ }
- sprintf(call->remoteIP, "%d.%d.%d.%d", ipAddress->ip.data[0],
+ sprintf(call->remoteIP, "%d.%d.%d.%d", ipAddress->ip.data[0],
ipAddress->ip.data[1],
ipAddress->ip.data[2],
ipAddress->ip.data[3]);
- call->remoteH245Port = ipAddress->port;
+ call->remoteH245Port = ipAddress->port;
+ }
/* disable tunneling for this call */
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
@@ -2178,15 +2224,16 @@ int ooH323RetrieveAliases
newAlias->value[strlen(pAliasAddress->u.url_ID)*sizeof(char)]='\0';
break;
case T_H225AliasAddress_transportID:
- newAlias->type = T_H225AliasAddress_transportID;
- pTransportAddrss = pAliasAddress->u.transportID;
- if(pTransportAddrss->t != T_H225TransportAddress_ipAddress)
- {
- OOTRACEERR3("Error:Alias transportID not an IP address"
- "(%s, %s)\n", call->callType, call->callToken);
- memFreePtr(call->pctxt, newAlias);
- break;
- }
+ newAlias->type = T_H225AliasAddress_transportID;
+ pTransportAddrss = pAliasAddress->u.transportID;
+ if(pTransportAddrss->t == T_H225TransportAddress_ip6Address) {
+ /* hopefully ip:port value can't exceed more than 30
+ characters */
+ newAlias->value = (char*)memAlloc(call->pctxt,
+ INET6_ADDRSTRLEN*sizeof(char)*2);
+ inet_ntop(AF_INET6, pTransportAddrss->u.ip6Address->ip.data, newAlias->value, INET6_ADDRSTRLEN);
+ sprintf(newAlias->value+strlen(newAlias->value), ":%d", pTransportAddrss->u.ip6Address->port);
+ } else if(pTransportAddrss->t == T_H225TransportAddress_ipAddress) {
/* hopefully ip:port value can't exceed more than 30
characters */
newAlias->value = (char*)memAlloc(call->pctxt,
@@ -2197,7 +2244,12 @@ int ooH323RetrieveAliases
pTransportAddrss->u.ipAddress->ip.data[2],
pTransportAddrss->u.ipAddress->ip.data[3],
pTransportAddrss->u.ipAddress->port);
- break;
+ } else {
+ OOTRACEERR3("Error:Alias transportID not an IP4 nor IP6 address"
+ "(%s, %s)\n", call->callType, call->callToken);
+ memFreePtr(call->pctxt, newAlias);
+ }
+ break;
case T_H225AliasAddress_email_ID:
newAlias->type = T_H225AliasAddress_email_ID;
newAlias->value = (char*)memAlloc(call->pctxt,
@@ -2471,22 +2523,29 @@ OOAliases* ooH323AddAliasToList
case T_H225AliasAddress_transportID:
newAlias->type = T_H225AliasAddress_transportID;
pTransportAddrss = pAliasAddress->u.transportID;
- if(pTransportAddrss->t != T_H225TransportAddress_ipAddress)
- {
- OOTRACEERR1("Error:Alias transportID not an IP address\n");
- memFreePtr(pctxt, newAlias);
- return NULL;
- }
- /* hopefully ip:port value can't exceed more than 30
+ if(pTransportAddrss->t == T_H225TransportAddress_ip6Address) {
+ /* hopefully ip:port value can't exceed more than 30
characters */
- newAlias->value = (char*)memAlloc(pctxt,
+ newAlias->value = (char*)memAlloc(pctxt,
+ INET6_ADDRSTRLEN*sizeof(char)*2);
+ inet_ntop(AF_INET6, pTransportAddrss->u.ip6Address->ip.data, newAlias->value, INET6_ADDRSTRLEN);
+ sprintf(newAlias->value+strlen(newAlias->value), ":%d", pTransportAddrss->u.ip6Address->port);
+ } else if(pTransportAddrss->t == T_H225TransportAddress_ipAddress) {
+ /* hopefully ip:port value can't exceed more than 30
+ characters */
+ newAlias->value = (char*)memAlloc(pctxt,
30*sizeof(char));
- sprintf(newAlias->value, "%d.%d.%d.%d:%d",
+ sprintf(newAlias->value, "%d.%d.%d.%d:%d",
pTransportAddrss->u.ipAddress->ip.data[0],
pTransportAddrss->u.ipAddress->ip.data[1],
pTransportAddrss->u.ipAddress->ip.data[2],
pTransportAddrss->u.ipAddress->ip.data[3],
pTransportAddrss->u.ipAddress->port);
+ } else {
+ OOTRACEERR1("Error:Alias transportID not an IP4 nor IP6 address\n");
+ memFreePtr(pctxt, newAlias);
+ return NULL;
+ }
break;
case T_H225AliasAddress_email_ID:
newAlias->type = T_H225AliasAddress_email_ID;
@@ -2509,6 +2568,17 @@ OOAliases* ooH323AddAliasToList
int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call,
H225TransportAddress *h225Address, char *ip, int *port)
{
+ if (call->versionIP == 6) {
+ if(h225Address->t != T_H225TransportAddress_ip6Address)
+ {
+ OOTRACEERR3("Error: Unknown H225 address type. (%s, %s)", call->callType,
+ call->callToken);
+ return OO_FAILED;
+ }
+ inet_ntop(AF_INET6, h225Address->u.ip6Address->ip.data, ip, INET6_ADDRSTRLEN);
+ *port = h225Address->u.ip6Address->port;
+ return OO_OK;
+ }
if(h225Address->t != T_H225TransportAddress_ipAddress)
{
OOTRACEERR3("Error: Unknown H225 address type. (%s, %s)", call->callType,