[PATCH] net-tools 1.60: ifconfig delayed netmask

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This has been around for too long:

        [root@scox root]# ifconfig eth0:1 192.168.120.12/22
        SIOCSIFNETMASK: Cannot assign requested address
        [root@scox root]# ifconfig eth0:1 192.168.120.12/22
        [root@scox root]#

First time it fails to assign the specified netmask apparently because
it is attempting to do so before assigning the address. Second time it
succeeds as the interface already has an address.

OTOH: 
        [root@scox root]# ifconfig eth0:1 192.168.120.12 netmask
        255.255.252.0
        [root@scox root]#

succeeds the first time since the actions are executed in the right
order: SIOCSIFADDR _then_ SIOCSIFNETMASK.

This patch against net-tools-1.60 defers the netmask ioctl when using
implicit/CIDR notation till after the address has been assigned. IOW, it
makes the 2 commands equivalent (as some of us might expect ;).

-- 
Florin Malita <florin.malita@glenayre.com>


diff -aur net-tools-1.60.orig/ifconfig.c net-tools-1.60.new/ifconfig.c
--- net-tools-1.60.orig/ifconfig.c      2001-04-13 14:25:18.000000000
-0400
+++ net-tools-1.60.new/ifconfig.c       2004-08-31 17:07:38.362758712
-0400
@@ -23,6 +23,7 @@
  *         20001008 - Bernd Eckenfels, Patch from RH for setting mtu
  *                     (default AF was wrong)
  *          20010404 - Arnaldo Carvalho de Melo, use setlocale
+ *          20040831 - Florin Malita <fmalita@glenayre.com> delayed
CIDR netmask
  */    
           
#define DFLT_AF "inet"
@@ -227,13 +228,13 @@

int main(int argc, char **argv)
{              
-    struct sockaddr sa;
+    struct sockaddr sa, sa_netmask;
     struct sockaddr_in sin;
     char host[128];
     struct aftype *ap;
     struct hwtype *hw;
     struct ifreq ifr;
-    int goterr = 0, didnetmask = 0;
+    int goterr = 0, didnetmask = 0, donetmask = 0;
     char **spp;
     int fd;    
#if HAVE_AFINET6
@@ -903,16 +904,16 @@
        /* FIXME: sa is too small for INET6 addresses, inet6 should use
that too,
           broadcast is unexpected */
        if (ap->getmask) {
-           switch (ap->getmask(host, &sa, NULL)) {
+           switch (ap->getmask(host, &sa_netmask, NULL)) {
            case -1:
                usage();
                break;
            case 1:
                if (didnetmask)
                    usage();
-       
-               goterr = set_netmask(skfd, &ifr, &sa);
-               didnetmask++;
+               
+               /* delay setting the CIDR netmask till after setting the
addr */
+               donetmask = 1;
                break;
            }
        }
@@ -960,6 +961,13 @@
            }
        }

+       /* set CIDR netmask */
+       if (donetmask){
+           donetmask = 0;
+           goterr = set_netmask(skfd, &ifr, &sa_netmask);
+           didnetmask++;
+       }
+
        /*
         * Don't do the set_flag() if the address is an alias with a -
at the
         * end, since it's deleted already! - Roman

diff -aur net-tools-1.60.orig/ifconfig.c net-tools-1.60.new/ifconfig.c
--- net-tools-1.60.orig/ifconfig.c	2001-04-13 14:25:18.000000000 -0400
+++ net-tools-1.60.new/ifconfig.c	2004-08-31 17:07:38.362758712 -0400
@@ -23,6 +23,7 @@
  *	    20001008 - Bernd Eckenfels, Patch from RH for setting mtu 
  *			(default AF was wrong)
  *          20010404 - Arnaldo Carvalho de Melo, use setlocale
+ *          20040831 - Florin Malita <fmalita@glenayre.com> delayed CIDR netmask
  */
 
 #define DFLT_AF "inet"
@@ -227,13 +228,13 @@
 
 int main(int argc, char **argv)
 {
-    struct sockaddr sa;
+    struct sockaddr sa, sa_netmask;
     struct sockaddr_in sin;
     char host[128];
     struct aftype *ap;
     struct hwtype *hw;
     struct ifreq ifr;
-    int goterr = 0, didnetmask = 0;
+    int goterr = 0, didnetmask = 0, donetmask = 0;
     char **spp;
     int fd;
 #if HAVE_AFINET6
@@ -903,16 +904,16 @@
 	/* FIXME: sa is too small for INET6 addresses, inet6 should use that too, 
 	   broadcast is unexpected */
 	if (ap->getmask) {
-	    switch (ap->getmask(host, &sa, NULL)) {
+	    switch (ap->getmask(host, &sa_netmask, NULL)) {
 	    case -1:
 		usage();
 		break;
 	    case 1:
 		if (didnetmask)
 		    usage();
-
-		goterr = set_netmask(skfd, &ifr, &sa);
-		didnetmask++;
+		
+		/* delay setting the CIDR netmask till after setting the addr */
+		donetmask = 1;
 		break;
 	    }
 	}
@@ -960,6 +961,13 @@
 	    }
 	}
 
+	/* set CIDR netmask */
+	if (donetmask){
+	    donetmask = 0;
+	    goterr = set_netmask(skfd, &ifr, &sa_netmask);
+	    didnetmask++;
+	}
+
        /*
         * Don't do the set_flag() if the address is an alias with a - at the
         * end, since it's deleted already! - Roman

Attachment: signature.asc
Description: This is a digitally signed message part


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux