[Asterisk-cvs] asterisk-addons/asterisk-ooh323c/ooh323c/src ooGkClient.c, 1.2, 1.3 ooSocket.c, 1.3, 1.4 ooSocket.h, 1.3, 1.4 oochannels.c, 1.5, 1.6 ooh323ep.c, 1.3, 1.4 ooh323ep.h, 1.4, 1.5 ooports.c, 1.3, 1.4 ooports.h, 1.3, 1.4 ooq931.c, 1.5, 1.6

vphirke at lists.digium.com vphirke at lists.digium.com
Fri Jun 24 17:01:22 CDT 2005


Update of /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src
In directory mongoose.digium.com:/tmp/cvs-serv30162/src

Modified Files:
	ooGkClient.c ooSocket.c ooSocket.h oochannels.c ooh323ep.c 
	ooh323ep.h ooports.c ooports.h ooq931.c 
Log Message:
Updated stack source

Index: ooGkClient.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooGkClient.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooGkClient.c	16 Jun 2005 19:41:23 -0000	1.2
+++ ooGkClient.c	24 Jun 2005 21:01:49 -0000	1.3
@@ -46,6 +46,7 @@
               char *szGkAddr, int iGkPort )
 {
    ooGkClient *pGkClient=NULL;
+   OOInterface *cur=NULL;
    pGkClient = (ooGkClient*)
                          memAlloc(&gH323ep.ctxt, sizeof(ooGkClient));
    if(!pGkClient)
@@ -62,7 +63,34 @@
    pGkClient->grqRetries = 0;
 
    strcpy(pGkClient->localRASIP, gH323ep.signallingIP);
-   
+#ifndef _WIN32
+   if(!strcmp(pGkClient->localRASIP, "0.0.0.0") ||
+      !strcmp(pGkClient->localRASIP, "127.0.0.1"))
+   {
+      if(!gH323ep.ifList)
+      {
+         if(ooSocketGetInterfaceList(&gH323ep.ctxt, &gH323ep.ifList)!= ASN_OK)
+         {
+            OOTRACEERR1("Error:Failed to retrieve interface addresses\n");
+            return OO_FAILED;
+         }
+      }
+      for(cur = gH323ep.ifList; cur; cur = cur->next)
+      {
+         if(!strcmp(cur->name, "lo") || !strcmp(cur->addr, "127.0.0.1"))
+            continue;
+         break;
+      }
+      if(cur)
+      {
+         OOTRACEINFO2("Using local RAS Ip address %s\n", cur->addr);
+         strcpy(pGkClient->localRASIP, cur->addr);
+      }else{
+         OOTRACEERR1("Error:Failed to assign a local RAS IP address\n");
+         return OO_FAILED;
+      }
+   }
+#endif   
    if(OO_OK != ooGkClientSetGkMode(pGkClient, eGkMode, szGkAddr, iGkPort))
    {
       OOTRACEERR1("Error:Failed to set Gk mode\n");
@@ -236,7 +264,7 @@
       }
    }
    else {
-      ret = ooBindPort (OOUDP, pGkClient->rasSocket);
+      ret = ooBindPort (OOUDP, pGkClient->rasSocket, pGkClient->localRASIP);
       if(ret == OO_FAILED)
       {
          OOTRACEERR1("ERROR: Failed to bind port to RAS socket\n");

Index: ooSocket.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooSocket.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooSocket.c	16 Jun 2005 19:41:23 -0000	1.3
+++ ooSocket.c	24 Jun 2005 21:01:49 -0000	1.4
@@ -37,6 +37,7 @@
 static LPFN_SHUTDOWN shutdown;
 
 
+static LPFN_IOCTLSOCKET ioctlsocket;
 static LPFN_SENDTO sendto;
 static LPFN_INET_NTOA inet_ntoa;
 static LPFN_RECVFROM recvfrom;
@@ -56,6 +57,8 @@
 #define closesocket close
 #endif
 
+
+
 int ooSocketsInit ()
 {
 #if defined(_WIN32_WCE)
@@ -136,6 +139,9 @@
    getsockname = (LPFN_GETSOCKNAME) GetProcAddress (ws32, "getsockname");
    if (getsockname == NULL) return ASN_E_NOTINIT;
    
+   ioctlsocket = (LPFN_IOCTLSOCKET) GetProcAddress(ws32, "ioctlsocket");
+   if(ioctlsocket == NULL) return ASN_E_NOTINIT;
+
    sendto = (LPFN_SENDTO) GetProcAddress (ws32, "sendto");
    if (sendto == NULL) return ASN_E_NOTINIT;
 
@@ -561,3 +567,153 @@
 {
    return htons(val);
 }
+
+#ifndef _WIN32
+int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList)
+{
+   OOSOCKET sock;
+   struct ifconf ifc;
+   int ifNum;
+   OOInterface *pIf=NULL;
+
+   OOTRACEDBGA1("Retrieving local interfaces\n");
+   if(ooSocketCreateUDP(&sock)!= ASN_OK)
+   {
+      OOTRACEERR1("Error:Failed to create udp socket - "
+                  "ooSocketGetInterfaceList\n");   
+      return -1;
+   }
+#ifdef SIOCGIFNUM
+   if(ioctl(sock, SIOCGIFNUM, &ifNum) >= 0)
+   {
+      OOTRACEERR1("Error: ioctl for ifNum failed\n");
+      return -1;
+   }
+#else
+   ifNum = 50;
+#endif
+ 
+   ifc.ifc_len = ifNum * sizeof(struct ifreq);
+   ifc.ifc_req = (struct ifreq *)memAlloc(pctxt, ifNum *sizeof(struct ifreq));
+   if(!ifc.ifc_req)
+   {
+      OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - ifc.ifc_req\n");
+      return -1;
+   }
+
+   if (ioctl(sock, SIOCGIFCONF, &ifc) >= 0) {
+      void * ifEndList = (char *)ifc.ifc_req + ifc.ifc_len;
+      struct ifreq *ifName;
+      struct ifreq ifReq;
+      int flags;
+      for (ifName = ifc.ifc_req; (void*)ifName < ifEndList; ifName++) {
+         char *pName=NULL;
+         char addr[50], mask[50];
+         
+         pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface));
+         pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1);
+         if(!pIf)
+         {
+            OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - "
+                        "pIf/pName\n");
+            return -1;
+         }
+         OOTRACEDBGA2("\tInterface name: %s\n", ifName->ifr_name);
+         
+         
+         strcpy(ifReq.ifr_name, ifName->ifr_name);
+         strcpy(pName, ifName->ifr_name);
+         pIf->name = pName;
+
+         /* Check whether the interface is up*/
+         if (ioctl(sock, SIOCGIFFLAGS, &ifReq) < 0) {
+            OOTRACEERR2("Error:Unable to determine status of interface %s\n", 
+                        pName);
+            memFreePtr(pctxt, pIf->name);
+            memFreePtr(pctxt, pIf);
+            continue;
+         }
+         flags = ifReq.ifr_flags;
+         if (!(flags & IFF_UP)) {
+            OOTRACEWARN2("Warn:Interface %s is not up\n", pName);
+            memFreePtr(pctxt, pIf->name);
+            memFreePtr(pctxt, pIf);
+            continue;
+         }
+
+	 /* Retrieve interface address */
+         if (ioctl(sock, SIOCGIFADDR, &ifReq) < 0) 
+         {
+            OOTRACEWARN2("Warn:Unable to determine address of interface %s\n", 
+                          pName);
+            memFreePtr(pctxt, pIf->name);
+            memFreePtr(pctxt, pIf);
+            continue;
+         }
+         strcpy(addr, inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr));
+         OOTRACEDBGA2("\tIP address is %s\n", addr);
+         pIf->addr = (char*)memAlloc(pctxt, strlen(addr)+1);
+         if(!pIf->addr)
+         {
+            OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - "
+                        "pIf->addr\n");
+            memFreePtr(pctxt, pIf->name);
+            memFreePtr(pctxt, pIf);
+            return -1;
+         }
+         strcpy(pIf->addr, addr);
+         
+
+         if (ioctl(sock, SIOCGIFNETMASK, &ifReq) < 0) 
+         {
+            OOTRACEWARN2("Warn:Unable to determine mask for interface %s\n", 
+                          pName);
+            memFreePtr(pctxt, pIf->name);
+            memFreePtr(pctxt, pIf->addr);
+            memFreePtr(pctxt, pIf);
+            continue;
+         }
+         strcpy(mask, inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr));
+         OOTRACEDBGA2("\tMask is %s\n", mask);
+         pIf->mask = (char*)memAlloc(pctxt, strlen(mask)+1);
+         if(!pIf->mask)
+         {
+            OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - "
+                        "pIf->mask\n");
+            memFreePtr(pctxt, pIf->name);
+            memFreePtr(pctxt, pIf->addr);
+            memFreePtr(pctxt, pIf);
+            return -1;
+         }
+         strcpy(pIf->mask, mask);
+
+         pIf->next = NULL;
+
+         /* Add to the list */
+         if(!*ifList)
+         {
+            *ifList = pIf;
+            pIf = NULL;
+         }else{
+            pIf->next = *ifList;
+            *ifList = pIf;
+            pIf=NULL;
+         }
+/*
+#if defined(OO_FREEBSD) || defined(OO_OPENBSD) || defined(OO_NETBSD) || defined(OO_MACOSX) || defined(OO_VXWORKS) || defined(OO_RTEMS) || defined(OO_QNX)
+#ifndef _SIZEOF_ADDR_IFREQ
+#define _SIZEOF_ADDR_IFREQ(ifr) \
+        ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
+         (sizeof(struct ifreq) - sizeof(struct sockaddr) + \
+          (ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
+#endif
+      ifName = (struct ifreq *)((char *)ifName + _SIZEOF_ADDR_IFREQ(*ifName));
+#else
+      ifName++;
+*/
+      }
+
+   }  
+   return ASN_OK;
+}
+#endif

Index: ooSocket.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooSocket.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooSocket.h	16 Jun 2005 19:41:23 -0000	1.3
+++ ooSocket.h	24 Jun 2005 21:01:49 -0000	1.4
@@ -33,10 +33,12 @@
 #include <sys/types.h>
 #include "sys/time.h"
 #include <sys/socket.h>
+#include <sys/ioctl.h>
 #include <netinet/in.h>
 #include <netdb.h>
 #include <unistd.h>
 #include <arpa/inet.h>
+#include <net/if.h>
 #endif
 
 #include "ooasn1.h"
@@ -81,6 +83,14 @@
 #define OOIPADDR_ANY   ((OOIPADDR)0)
 #define OOIPADDR_LOCAL ((OOIPADDR)0x7f000001UL) /* 127.0.0.1 */
 
+typedef struct OOInterface{
+   char *name;
+   char *addr;
+   char *mask;
+   struct OOInterface *next;
+}OOInterface;
+
+
 
 /**
  * This function permits an incoming connection attempt on a socket. It
@@ -379,6 +389,9 @@
  * @return        ASN_OK, on success; -ve on failed.
  */
 EXTERN int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port);
+
+
+EXTERN int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList);
 /** 
  * @} 
  */

Index: oochannels.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/oochannels.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- oochannels.c	16 Jun 2005 19:41:23 -0000	1.5
+++ oochannels.c	24 Jun 2005 21:01:49 -0000	1.6
@@ -48,7 +48,7 @@
                   "(%s, %s)\n", call->callType, call->callToken);
       return OO_FAILED;
    }
-   ret = ooBindPort (OOTCP, channelSocket); 
+   ret = ooBindPort (OOTCP, channelSocket, call->localIP); 
    if(ret == OO_FAILED)
    {
       OOTRACEERR3("Error:Unable to bind to a TCP port - H245 listener creation"
@@ -96,7 +96,7 @@
          bind socket to a port before connecting. Thus avoiding
          implicit bind done by a connect call.
       */
-      ret = ooBindPort(OOTCP, channelSocket); 
+      ret = ooBindPort(OOTCP, channelSocket, call->localIP); 
       if(ret == OO_FAILED)
       {
          OOTRACEERR3("Error:Unable to bind to a TCP port - h245 connection "
@@ -250,9 +250,9 @@
          to any random port.
       */
 #ifndef _WIN32
-      ret = ooBindPort(OOTCP,channelSocket); 
+      ret = ooBindPort(OOTCP,channelSocket, call->localIP); 
 #else
-      ret = ooBindOSAllocatedPort(channelSocket);
+      ret = ooBindOSAllocatedPort(channelSocket, call->localIP);
 #endif
       
       if(ret == OO_FAILED)

Index: ooh323ep.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh323ep.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooh323ep.c	3 Jun 2005 14:54:06 -0000	1.3
+++ ooh323ep.c	24 Jun 2005 21:01:49 -0000	1.4
@@ -143,6 +143,7 @@
    gH323ep.logicalChannelTimeout = DEFAULT_LOGICALCHAN_TIMEOUT;
 
    gH323ep.sessionTimeout = DEFAULT_ENDSESSION_TIMEOUT;
+   gH323ep.ifList = NULL;
 #ifdef HAVE_PIPE
    if(pipe(gH323ep.cmdPipe)<0){
       OOTRACEERR1("Error:Failed to create command pipe\n");

Index: ooh323ep.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh323ep.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- ooh323ep.h	16 Jun 2005 19:41:23 -0000	1.4
+++ ooh323ep.h	24 Jun 2005 21:01:49 -0000	1.5
@@ -141,6 +141,7 @@
    int cmdPipe[2];
    struct ooGkClient *gkClient;
    DList stkCmdList;	/* stack command list */
+   OOInterface *ifList; /* interface list for the host we are running on*/
 } OOH323EndPoint;
 
 #define ooEndPoint OOH323EndPoint

Index: ooports.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooports.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooports.c	16 Jun 2005 19:41:23 -0000	1.3
+++ ooports.c	24 Jun 2005 21:01:49 -0000	1.4
@@ -58,7 +58,7 @@
    return OO_FAILED;
 }
 
-int ooBindPort (OOH323PortType type, OOSOCKET socket)
+int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip)
 {
    int initialPort, bindPort, ret;
    OOIPADDR ipAddrs;
@@ -66,7 +66,7 @@
    initialPort = ooGetNextPort (type);
    bindPort = initialPort;
 
-   ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipAddrs);
+   ret= ooSocketStrToAddr (ip, &ipAddrs);
 
    while(1)
    {
@@ -83,13 +83,13 @@
 }
 
 #ifdef _WIN32        
-int ooBindOSAllocatedPort(OOSOCKET socket)
+int ooBindOSAllocatedPort(OOSOCKET socket, char *ip)
 {
    OOIPADDR ipAddrs;
    int size, ret;
    struct sockaddr_in name;
    size = sizeof(struct sockaddr_in);
-   ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipAddrs);
+   ret= ooSocketStrToAddr (ip, &ipAddrs);
    if((ret=ooSocketBind(socket, ipAddrs, 
                      0))==ASN_OK)
    {

Index: ooports.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooports.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooports.h	16 Jun 2005 19:41:23 -0000	1.3
+++ ooports.h	24 Jun 2005 21:01:49 -0000	1.4
@@ -60,22 +60,28 @@
  * @param ep        Reference to H323 Endpoint structure.
  * @param type      Type of the port required for the socket.
  * @param socket    The socket to be bound.
+ * @param ip        Dotted Ip address to bind to.
  *
  * @return          In case of success returns the port number to which
  *                  socket is bound and in case of failure just returns
  *                  a negative value.
 */
-EXTERN int ooBindPort (OOH323PortType type, OOSOCKET socket);
+EXTERN int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip);
 
 /**
  * This function is supported for windows version only. 
  *  Windows sockets have problem in reusing the addresses even after
  *  setting SO_REUSEADDR, hence in windows we just allow os to bind
  *  to any random port.
-*/
-
+ * @param socket    Socket to be bound.
+ * @param ip        Dotted ip address to bind to.
+ *
+ * @return          In case of success returns the port number to which
+ *                  socket is bound and in case of failure just returns
+ *                  a negative value.
+ */
 #ifdef _WIN32        
-EXTERN int ooBindOSAllocatedPort(OOSOCKET socket);
+EXTERN int ooBindOSAllocatedPort(OOSOCKET socket, char *ip);
 #endif
 
 #ifdef __cplusplus

Index: ooq931.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooq931.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- ooq931.c	23 Jun 2005 14:50:15 -0000	1.5
+++ ooq931.c	24 Jun 2005 21:01:49 -0000	1.6
@@ -1590,14 +1590,13 @@
    ret=ooSendH225Msg(call, q931msg);
    if(ret != OO_OK)
    {
-      OOTRACEERR3("Error:Failed to enqueue Connect message to outbound queue."
-                  "(%s, %s)\n", call->callType, call->callToken);
+      OOTRACEERR3("Error:Failed to enqueue Connect message to outbound queue.(%s, %s)\n", call->callType, call->callToken);
       memReset(&gH323ep.msgctxt);
       return OO_FAILED;
    }
    memReset(&gH323ep.msgctxt);
 
-
+#if 0
    if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))
    {
       /* Start terminal capability exchange and master slave determination */
@@ -1616,7 +1615,7 @@
          return ret;
       }   
    }
-
+#endif
    return OO_OK;
 }
 




More information about the svn-commits mailing list