This is the mail archive of the cygwin-patches@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Multiple IP adresses on one interface


Hi, 

I prepared a patch to support multiple IP adresses on one network
interface. 

The current implementation assumes that one interface has one IP addr.
attached and therefore can't return the second. The code works like

foreach interface
    copy interface data
    foreach ip
        if ip belongs to interface
            copy ip data

I changed the order of searching

foreach ip
    foreach interface
        if ip belongs to interface
            copy interface data
            copy ip data

The curent implementation has still some small bugs, since it returns
eth0 for the first ip, and eth1 for the second. It should better be
eth0 and eth0:1.

bye
    ago
-- 
 Alexander.Gottwald@informatik.tu-chemnitz.de 
 http://www.gotti.org           ICQ: 126018723
 phone: +49 3725 349 80 80	mobile: +49 172 7854017
Sun Oct 21 19:04:37 2001 Alexander Gottwald <ago@informatik.tu-chemnitz.de>

    * net.cc (get_2k_ifconf): Added support for multiple IP addresses on 
    one interface.
--- net.cc.orig	Wed Sep 12 07:31:56 2001
+++ net.cc	Sun Oct 21 00:19:24 2001
@@ -1573,85 +1573,94 @@ get_2k_ifconf (struct ifconf *ifc, int w
       !GetIfTable(ift, &siz_if_table, TRUE) &&
       !GetIpAddrTable(ipt, &siz_ip_table, TRUE))
     {
-      for (if_cnt = 0; if_cnt < ift->dwNumEntries; ++if_cnt)
-	{
-	  switch (ift->table[if_cnt].dwType)
-	    {
-	    case MIB_IF_TYPE_ETHERNET:
-	      ++*eth;
-	      strcpy (ifr->ifr_name, "eth");
-	      strcat (ifr->ifr_name, eth);
-	      break;
-	    case MIB_IF_TYPE_PPP:
-	      ++*ppp;
-	      strcpy (ifr->ifr_name, "ppp");
-	      strcat (ifr->ifr_name, ppp);
-	      break;
-	    case MIB_IF_TYPE_SLIP:
-	      ++*slp;
-	      strcpy (ifr->ifr_name, "slp");
-	      strcat (ifr->ifr_name, slp);
-	      break;
-	    case MIB_IF_TYPE_LOOPBACK:
-	      strcpy (ifr->ifr_name, "lo");
-	      break;
-	    default:
-	      continue;
-	    }
-	  for (ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt)
-	    if (ipt->table[ip_cnt].dwIndex == ift->table[if_cnt].dwIndex)
-	      {
-		switch (what)
-		  {
-		  case SIOCGIFCONF:
-		  case SIOCGIFADDR:
-		    sa = (struct sockaddr_in *) &ifr->ifr_addr;
-		    sa->sin_addr.s_addr = ipt->table[ip_cnt].dwAddr;
-		    sa->sin_family = AF_INET;
-		    sa->sin_port = 0;
-		    break;
-		  case SIOCGIFBRDADDR:
-		    sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
+
+
+      /* Iterate over all configured IP-addresses */
+      for (ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt) 
+      {
+        /* Iterate over all known interfaces */
+        for (if_cnt = 0; if_cnt < ift->dwNumEntries; ++if_cnt)
+        {
+          /* Does the IP address belong to the interface? */
+          if (ipt->table[ip_cnt].dwIndex == ift->table[if_cnt].dwIndex)
+          {
+            /* Setup the interface name */
+            switch (ift->table[if_cnt].dwType)
+            {
+              case MIB_IF_TYPE_ETHERNET:
+                ++*eth;
+                strcpy (ifr->ifr_name, "eth");
+                strcat (ifr->ifr_name, eth);
+                break;
+              case MIB_IF_TYPE_PPP:
+                ++*ppp;
+                strcpy (ifr->ifr_name, "ppp");
+                strcat (ifr->ifr_name, ppp);
+                break;
+              case MIB_IF_TYPE_SLIP:
+                ++*slp;
+                strcpy (ifr->ifr_name, "slp");
+                strcat (ifr->ifr_name, slp);
+                break;
+              case MIB_IF_TYPE_LOOPBACK:
+                strcpy (ifr->ifr_name, "lo");
+                break;
+              default:
+                continue;
+            }
+            /* setup sockaddr struct */
+            switch (what)
+            {
+              case SIOCGIFCONF:
+              case SIOCGIFADDR:
+                sa = (struct sockaddr_in *) &ifr->ifr_addr;
+                sa->sin_addr.s_addr = ipt->table[ip_cnt].dwAddr;
+                sa->sin_family = AF_INET;
+                sa->sin_port = 0;
+                break;
+              case SIOCGIFBRDADDR:
+                sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;
 #if 0
-		    /* Unfortunately, the field returns only crap. */
-		    sa->sin_addr.s_addr = ipt->table[ip_cnt].dwBCastAddr;
+                /* Unfortunately, the field returns only crap. */
+                sa->sin_addr.s_addr = ipt->table[ip_cnt].dwBCastAddr;
 #else
-		    lip = ipt->table[ip_cnt].dwAddr;
-		    lnp = ipt->table[ip_cnt].dwMask;
-		    sa->sin_addr.s_addr = lip & lnp | ~lnp;
-		    sa->sin_family = AF_INET;
-		    sa->sin_port = 0;
+                lip = ipt->table[ip_cnt].dwAddr;
+                lnp = ipt->table[ip_cnt].dwMask;
+                sa->sin_addr.s_addr = lip & lnp | ~lnp;
+                sa->sin_family = AF_INET;
+                sa->sin_port = 0;
 #endif
-		    break;
-		  case SIOCGIFNETMASK:
-		    sa = (struct sockaddr_in *) &ifr->ifr_netmask;
-		    sa->sin_addr.s_addr = ipt->table[ip_cnt].dwMask;
-		    sa->sin_family = AF_INET;
-		    sa->sin_port = 0;
-		    break;
-		  case SIOCGIFHWADDR:
-		    so = &ifr->ifr_hwaddr;
-		    for (UINT i = 0; i < IFHWADDRLEN; ++i)
-		      if (i >= ift->table[if_cnt].dwPhysAddrLen)
-			so->sa_data[i] = '\0';
-		      else
-			so->sa_data[i] = ift->table[if_cnt].bPhysAddr[i];
-		    so->sa_family = AF_INET;
-		    break;
-		  case SIOCGIFMETRIC:
-		    ifr->ifr_metric = 1;
-		    break;
-		  case SIOCGIFMTU:
-		    ifr->ifr_mtu = ift->table[if_cnt].dwMtu;
-		    break;
-		  }
-		++cnt;
-		if ((caddr_t) ++ifr >
-		    ifc->ifc_buf + ifc->ifc_len - sizeof (struct ifreq))
-		  goto done;
-		break;
-	      }
-	}
+                break;
+              case SIOCGIFNETMASK:
+                sa = (struct sockaddr_in *) &ifr->ifr_netmask;
+                sa->sin_addr.s_addr = ipt->table[ip_cnt].dwMask;
+                sa->sin_family = AF_INET;
+                sa->sin_port = 0;
+                break;
+              case SIOCGIFHWADDR:
+                so = &ifr->ifr_hwaddr;
+                for (UINT i = 0; i < IFHWADDRLEN; ++i)
+                  if (i >= ift->table[if_cnt].dwPhysAddrLen)
+                    so->sa_data[i] = '\0';
+                  else
+                    so->sa_data[i] = ift->table[if_cnt].bPhysAddr[i];
+                so->sa_family = AF_INET;
+                break;
+              case SIOCGIFMETRIC:
+                ifr->ifr_metric = 1;
+                break;
+              case SIOCGIFMTU:
+                ifr->ifr_mtu = ift->table[if_cnt].dwMtu;
+                break;
+            }
+            ++cnt;
+            if ((caddr_t) ++ifr >
+                ifc->ifc_buf + ifc->ifc_len - sizeof (struct ifreq))
+              goto done;
+            break;
+          }
+        }
+      }
     }
 done:
   /* Set the correct length */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]