diff options
author | Alexandr Anikin <may@telecom-service.ru> | 2011-04-12 21:59:18 +0000 |
---|---|---|
committer | Alexandr Anikin <may@telecom-service.ru> | 2011-04-12 21:59:18 +0000 |
commit | e29ac9951c4edcae9364961425e5a74e58cbbd64 (patch) | |
tree | 3ca5da34da55aae1db8b238a24491f54585f43d4 /addons/ooh323c/src/oochannels.c | |
parent | 287ad27d7602c6dd4da729cf6e32c01ffd597657 (diff) |
IPv6 support for chan_ooh323
IPv6 support for ooh323,
bindaddr, peers and users ip can be IPv4 or IPv6 addr
correction for multi-homed mode (0.0.0.0 or :: bindaddr)
can work in dual 6/4 mode with :: bindaddr
gatekeeper mode isn't supported in v6 mode while
(issue #18278)
Reported by: may213
Patches:
ipv6-ooh323.patch uploaded by may213 (license 454)
Review: https://reviewboard.asterisk.org/r/1004/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@313482 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'addons/ooh323c/src/oochannels.c')
-rw-r--r-- | addons/ooh323c/src/oochannels.c | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c index e16fdcc06..891a12d17 100644 --- a/addons/ooh323c/src/oochannels.c +++ b/addons/ooh323c/src/oochannels.c @@ -16,6 +16,8 @@ #include "asterisk.h" #include "asterisk/lock.h" #include "asterisk/poll-compat.h" +#include "asterisk/config.h" +#include "asterisk/netsock2.h" #include "ooports.h" #include "oochannels.h" @@ -31,6 +33,7 @@ #include "ooh323ep.h" #include "ooStackCmds.h" #include "ooCmdChannel.h" +#include "ooSocket.h" #include "ootypes.h" @@ -60,7 +63,7 @@ int ooCreateH245Listener(OOH323CallData *call) int ret=0; OOSOCKET channelSocket=0; OOTRACEINFO1("Creating H245 listener\n"); - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + if((ret=ooSocketCreate (&channelSocket, call->versionIP))!=ASN_OK) { OOTRACEERR3("ERROR: Failed to create socket for H245 listener " "(%s, %s)\n", call->callType, call->callToken); @@ -97,7 +100,7 @@ int ooCreateH245Connection(OOH323CallData *call) ooTimerCallback *cbData=NULL; OOTRACEINFO1("Creating H245 Connection\n"); - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + if((ret=ooSocketCreate (&channelSocket, call->versionIP))!=ASN_OK) { OOTRACEERR3("ERROR:Failed to create socket for H245 connection " "(%s, %s)\n", call->callType, call->callToken); @@ -241,7 +244,7 @@ int ooCreateH225Connection(OOH323CallData *call) int ret=0, i; OOSOCKET channelSocket=0; for (i=0;i<3;i++) { - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + if((ret=ooSocketCreate (&channelSocket, call->versionIP))!=ASN_OK) { OOTRACEERR3("Failed to create socket for transmit H2250 channel (%s, %s)" "\n", call->callType, call->callToken); @@ -285,9 +288,9 @@ int ooCreateH225Connection(OOH323CallData *call) } call->pH225Channel->port = ret; - OOTRACEINFO5("Trying to connect to remote endpoint(%s:%d) to setup " + OOTRACEINFO6("Trying to connect to remote endpoint(%s:%d) (IPv%d) to setup " "H2250 channel (%s, %s)\n", call->remoteIP, - call->remotePort, call->callType, call->callToken); + call->remotePort, call->versionIP, call->callType, call->callToken); if((ret=ooSocketConnect(channelSocket, call->remoteIP, call->remotePort))==ASN_OK) @@ -298,13 +301,13 @@ int ooCreateH225Connection(OOH323CallData *call) "(%s, %s)\n", call->callType, call->callToken); /* If multihomed, get ip from socket */ - if(!strcmp(call->localIP, "0.0.0.0")) + if(!strcmp(call->localIP, "0.0.0.0") || !strcmp(call->localIP, "::")) { OOTRACEDBGA3("Determining IP address for outgoing call in " "multihomed mode. (%s, %s)\n", call->callType, call->callToken); - ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 20, - &call->pH225Channel->port); + ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 2+8*4+7, + &call->pH225Channel->port, NULL); if(ret != ASN_OK) { OOTRACEERR3("ERROR:Failed to retrieve local ip and port from " @@ -367,12 +370,13 @@ int ooCreateH323Listener() OOIPADDR ipaddrs; /* Create socket */ - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + ret = ast_parse_arg(gH323ep.signallingIP, PARSE_ADDR, &ipaddrs); + if((ret=ooSocketCreate (&channelSocket, ast_sockaddr_is_ipv6(&ipaddrs) ? 6 : 4)) + !=ASN_OK) { OOTRACEERR1("Failed to create socket for H323 Listener\n"); return OO_FAILED; } - ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipaddrs); if((ret=ooSocketBind (channelSocket, ipaddrs, gH323ep.listenPort))==ASN_OK) { @@ -397,9 +401,12 @@ int ooAcceptH225Connection() OOH323CallData * call; int ret; char callToken[20]; + char remoteIP[2+8*4+7]; OOSOCKET h225Channel=0; + + memset(remoteIP, 0, sizeof(remoteIP)); ret = ooSocketAccept (*(gH323ep.listener), &h225Channel, - NULL, NULL); + remoteIP, NULL); if(ret != ASN_OK) { OOTRACEERR1("Error:Accepting h225 connection\n"); @@ -421,29 +428,33 @@ int ooAcceptH225Connection() call->pH225Channel->sock = h225Channel; /* If multihomed, get ip from socket */ - if(!strcmp(call->localIP, "0.0.0.0")) + if(!strcmp(call->localIP, "0.0.0.0") || !strcmp(call->localIP,"::")) { OOTRACEDBGA3("Determining IP address for incoming call in multihomed " "mode (%s, %s)\n", call->callType, call->callToken); - ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 20, - &call->pH225Channel->port); - if(ret != ASN_OK) - { - OOTRACEERR3("Error:Failed to retrieve local ip and port from " - "socket for multihomed mode.(%s, %s)\n", - call->callType, call->callToken); - if(call->callState < OO_CALL_CLEAR) - { /* transport failure */ - call->callState = OO_CALL_CLEAR; - call->callEndReason = OO_REASON_TRANSPORTFAILURE; - } - ast_mutex_unlock(&call->Lock); - return OO_FAILED; + } + ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 2+8*4+7, + &call->pH225Channel->port, &call->versionIP); + if(ret != ASN_OK) + { + OOTRACEERR3("Error:Failed to retrieve local ip and port from " + "socket for multihomed mode.(%s, %s)\n", + call->callType, call->callToken); + if(call->callState < OO_CALL_CLEAR) + { /* transport failure */ + call->callState = OO_CALL_CLEAR; + call->callEndReason = OO_REASON_TRANSPORTFAILURE; } - OOTRACEDBGA4("Using Local IP address %s for incoming call in multihomed " - "mode. (%s, %s)\n", call->localIP, call->callType, - call->callToken); + ast_mutex_unlock(&call->Lock); + return OO_FAILED; + } + OOTRACEDBGA5("Using Local IP address %s (IPv%d) for incoming call " + "(%s, %s)\n", call->localIP, call->versionIP, call->callType, + call->callToken); + + if (remoteIP[0]) { + strncpy(call->remoteIP, remoteIP, strlen(remoteIP)); } ast_mutex_unlock(&call->Lock); @@ -658,7 +669,7 @@ int ooProcessCallFDSETsAndTimers "(%s, %s)\n", call->callType, call->callToken); if(call->callState < OO_CALL_CLEAR) { - call->callEndReason = OO_REASON_INVALIDMESSAGE; + if (!call->callEndReason) call->callEndReason = OO_REASON_INVALIDMESSAGE; call->callState = OO_CALL_CLEAR; } } @@ -1393,7 +1404,8 @@ int ooSendMsg(OOH323CallData *call, int type) { call->callEndReason = OO_REASON_TRANSPORTFAILURE; call->callState = OO_CALL_CLEAR; - } + } else if (call->callState == OO_CALL_CLEAR) + call->callState = OO_CALL_CLEAR_RELEASESENT; return OO_FAILED; } }/* end of type==OOQ931MSG */ |