summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Anikin <may213@yandex.ru>2018-04-17 13:33:36 +0300
committerAlexander Anikin <may213@yandex.ru>2018-04-18 13:46:30 +0300
commit95e8450194a4c6a1272ed738fedaabb7baa438f8 (patch)
tree61c88d14b720c6dc52b5a2fb760ef7290714c441
parent2a6072a9c414a8fb7ecb1b6598873e60ef8cadf2 (diff)
chan_ooh323: introduce localras config parameter
Introduce localras parameter that specify source IP for connecting to Gatekeeper. Useful for multihome configurations. ASTERISK-25129 #close Reported by: Dmitry Melekhov Tested by: Dmitry Melekhov Change-Id: I0b604b01793f3e02a776502659e07cd3fc7e3097
-rw-r--r--addons/chan_ooh323.c13
-rw-r--r--addons/ooh323c/src/ooGkClient.c10
-rw-r--r--addons/ooh323c/src/ooGkClient.h2
3 files changed, 17 insertions, 8 deletions
diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c
index ffdbf6721..06096507f 100644
--- a/addons/chan_ooh323.c
+++ b/addons/chan_ooh323.c
@@ -355,6 +355,7 @@ static int gDTMFCodec = 101;
static int gFAXdetect = FAXDETECT_CNG;
static int gT38Support = T38_FAXGW;
static char gGatekeeper[100];
+static char gRASIP[2+8*4+7]; /* Max for IPv6 addr */
static enum RasGatekeeperMode gRasGkMode = RasNoGatekeeper;
static int gIsGateway = 0;
@@ -2726,7 +2727,7 @@ static int ooh323_do_reload(void)
if (gRasGkMode == RasUseSpecificGatekeeper ||
gRasGkMode == RasDiscoverGatekeeper) {
ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ?
- gGatekeeper : 0, 0);
+ gGatekeeper : 0, gRASIP, 0);
ooGkClientStart(gH323ep.gkClient);
}
@@ -2869,6 +2870,7 @@ int reload_config(int reload)
gTRCLVL = OOTRCLVLERR;
gRasGkMode = RasNoGatekeeper;
gGatekeeper[0] = '\0';
+ gRASIP[0] = '\0';
gRTPTimeout = 60;
gNat = FALSE;
gRTDRInterval = 0;
@@ -3029,6 +3031,9 @@ int reload_config(int reload)
gRasGkMode = RasUseSpecificGatekeeper;
ast_copy_string(gGatekeeper, v->value, sizeof(gGatekeeper));
}
+ } else if (!strcasecmp(v->name, "localras")) {
+ ast_copy_string(gRASIP, v->value, sizeof(gRASIP));
+ ast_verb(3, " == Setting RAS IP to %s\n", gRASIP);
} else if (!strcasecmp(v->name, "logfile")) {
ast_copy_string(gLogFile, v->value, sizeof(gLogFile));
} else if (!strcasecmp(v->name, "context")) {
@@ -3924,9 +3929,9 @@ static int load_module(void)
/* Gatekeeper */
if (gRasGkMode == RasUseSpecificGatekeeper)
- ooGkClientInit(gRasGkMode, gGatekeeper, 0);
+ ooGkClientInit(gRasGkMode, gGatekeeper, gRASIP, 0);
else if (gRasGkMode == RasDiscoverGatekeeper)
- ooGkClientInit(gRasGkMode, 0, 0);
+ ooGkClientInit(gRasGkMode, 0, gRASIP, 0);
/* Register callbacks */
ooH323EpSetH323Callbacks(h323Callbacks);
@@ -4013,7 +4018,7 @@ static void *do_monitor(void *data)
ooGkClientDestroy();
ast_verb(0, "Restart stopped gatekeeper client\n");
ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ?
- gGatekeeper : 0, 0);
+ gGatekeeper : 0, gRASIP, 0);
ooGkClientStart(gH323ep.gkClient);
}
diff --git a/addons/ooh323c/src/ooGkClient.c b/addons/ooh323c/src/ooGkClient.c
index a307f4eef..4f7883833 100644
--- a/addons/ooh323c/src/ooGkClient.c
+++ b/addons/ooh323c/src/ooGkClient.c
@@ -49,7 +49,7 @@ static ASN1OBJID gProtocolID = {
};
int ooGkClientInit(enum RasGatekeeperMode eGkMode,
- char *szGkAddr, int iGkPort )
+ char *szGkAddr, char *szRasAddr, int iGkPort )
{
ooGkClient *pGkClient=NULL;
OOInterface *cur=NULL;
@@ -69,7 +69,11 @@ int ooGkClientInit(enum RasGatekeeperMode eGkMode,
pGkClient->rrqRetries = 0;
pGkClient->grqRetries = 0;
- strcpy(pGkClient->localRASIP, gH323ep.signallingIP);
+ if (szRasAddr && *szRasAddr) {
+ strcpy(pGkClient->localRASIP, szRasAddr);
+ } else {
+ strcpy(pGkClient->localRASIP, gH323ep.signallingIP);
+ }
#ifndef _WIN32
if(!strcmp(pGkClient->localRASIP, "0.0.0.0") ||
!strcmp(pGkClient->localRASIP, "127.0.0.1"))
@@ -90,7 +94,6 @@ int ooGkClientInit(enum RasGatekeeperMode eGkMode,
}
if(cur)
{
- OOTRACEINFO2("Using local RAS Ip address %s\n", cur->addr);
strcpy(pGkClient->localRASIP, cur->addr);
}
else{
@@ -98,6 +101,7 @@ int ooGkClientInit(enum RasGatekeeperMode eGkMode,
return OO_FAILED;
}
}
+ OOTRACEINFO2("Using local RAS Ip address %s\n", pGkClient->localRASIP);
#endif
if(OO_OK != ooGkClientSetGkMode(pGkClient, eGkMode, szGkAddr, iGkPort))
{
diff --git a/addons/ooh323c/src/ooGkClient.h b/addons/ooh323c/src/ooGkClient.h
index 017380b5f..e529b4a98 100644
--- a/addons/ooh323c/src/ooGkClient.h
+++ b/addons/ooh323c/src/ooGkClient.h
@@ -223,7 +223,7 @@ struct OOH323CallData;
*
*/
EXTERN int ooGkClientInit
- (enum RasGatekeeperMode eGkMode, char *szGkAddr, int iGkPort );
+ (enum RasGatekeeperMode eGkMode, char *szGkAddr, char *szRasAddr, int iGkPort );
/**
* This function is used to print the gatekeeper client configuration