]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_ooh323: introduce localras config parameter
authorAlexander Anikin <may213@yandex.ru>
Tue, 17 Apr 2018 10:33:36 +0000 (13:33 +0300)
committerAlexander Anikin <may213@yandex.ru>
Wed, 18 Apr 2018 10:46:30 +0000 (13:46 +0300)
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

addons/chan_ooh323.c
addons/ooh323c/src/ooGkClient.c
addons/ooh323c/src/ooGkClient.h

index ffdbf67211f8168bf39860bb5b99b6ebd6cd5b56..06096507f1187a3f2b604c584523307954de77a6 100644 (file)
@@ -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);
                }
 
index a307f4eefddd76c22876a032911ce81bb369efdc..4f788383379fb3f0fc4897ecddeb8db70a7c6aa4 100644 (file)
@@ -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))
    {
index 017380b5f03469448d247ef9079ea9d3d5303ad0..e529b4a9876480110083de7a5128150f8a02e08a 100644 (file)
@@ -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