Author: hselasky
Date: Thu Nov 26 16:36:50 2020
New Revision: 368058
URL: https://svnweb.freebsd.org/changeset/base/368058

Log:
  Ensure consistent error messages from ifconfig(8).
  
  If multiple threads are invoking "ifconfig XXX create" a race may occur
  which can lead to two different error messages for the same error.
  
  a) ifconfig: SIOCIFCREATE2: File exists
  b) ifconfig: interface XXX already exists
  
  This patch ensures ifconfig prints the same error code
  for the same case.
  
  Reviewed by:  imp@ and kib@
  Differential Revision:        https://reviews.freebsd.org/D27380
  MFC after:    1 week
  Sponsored by: Mellanox Technologies // NVIDIA Networking

Modified:
  head/sbin/ifconfig/ifclone.c
  head/sbin/ifconfig/ifconfig.c
  head/sbin/ifconfig/ifconfig.h
  head/sbin/ifconfig/ifieee80211.c
  head/sbin/ifconfig/iflagg.c
  head/sbin/ifconfig/ifvlan.c
  head/sbin/ifconfig/ifvxlan.c

Modified: head/sbin/ifconfig/ifclone.c
==============================================================================
--- head/sbin/ifconfig/ifclone.c        Thu Nov 26 14:57:30 2020        
(r368057)
+++ head/sbin/ifconfig/ifclone.c        Thu Nov 26 16:36:50 2020        
(r368058)
@@ -151,8 +151,7 @@ ifclonecreate(int s, void *arg)
        }
        if (clone_cb == NULL) {
                /* NB: no parameters */
-               if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
-                       err(1, "SIOCIFCREATE2");
+               ioctl_ifcreate(s, &ifr);
        } else {
                clone_cb(s, &ifr);
        }

Modified: head/sbin/ifconfig/ifconfig.c
==============================================================================
--- head/sbin/ifconfig/ifconfig.c       Thu Nov 26 14:57:30 2020        
(r368057)
+++ head/sbin/ifconfig/ifconfig.c       Thu Nov 26 16:36:50 2020        
(r368058)
@@ -198,6 +198,19 @@ usage(void)
        exit(1);
 }
 
+void
+ioctl_ifcreate(int s, struct ifreq *ifr)
+{
+       if (ioctl(s, SIOCIFCREATE2, ifr) < 0) {
+               switch (errno) {
+               case EEXIST:
+                       errx(1, "interface %s already exists", ifr->ifr_name);
+               default:
+                       err(1, "SIOCIFCREATE2");
+               }
+       }
+}
+
 #define ORDERS_SIZE(x) sizeof(x) / sizeof(x[0])
 
 static int

Modified: head/sbin/ifconfig/ifconfig.h
==============================================================================
--- head/sbin/ifconfig/ifconfig.h       Thu Nov 26 14:57:30 2020        
(r368057)
+++ head/sbin/ifconfig/ifconfig.h       Thu Nov 26 16:36:50 2020        
(r368058)
@@ -160,3 +160,4 @@ struct ifmediareq *ifmedia_getstate(int s);
 
 void print_vhid(const struct ifaddrs *, const char *);
 
+void ioctl_ifcreate(int s, struct ifreq *);

Modified: head/sbin/ifconfig/ifieee80211.c
==============================================================================
--- head/sbin/ifconfig/ifieee80211.c    Thu Nov 26 14:57:30 2020        
(r368057)
+++ head/sbin/ifconfig/ifieee80211.c    Thu Nov 26 16:36:50 2020        
(r368058)
@@ -5758,8 +5758,7 @@ wlan_create(int s, struct ifreq *ifr)
            memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0)
                errx(1, "no bssid specified for WDS (use wlanbssid)");
        ifr->ifr_data = (caddr_t) &params;
-       if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
-               err(1, "SIOCIFCREATE2");
+       ioctl_ifcreate(s, ifr);
 
        /* XXX preserve original name for ifclonecreate(). */
        strlcpy(orig_name, name, sizeof(orig_name));

Modified: head/sbin/ifconfig/iflagg.c
==============================================================================
--- head/sbin/ifconfig/iflagg.c Thu Nov 26 14:57:30 2020        (r368057)
+++ head/sbin/ifconfig/iflagg.c Thu Nov 26 16:36:50 2020        (r368058)
@@ -324,8 +324,7 @@ static void
 lagg_create(int s, struct ifreq *ifr)
 {
        ifr->ifr_data = (caddr_t) &params;
-       if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
-               err(1, "SIOCIFCREATE2");
+       ioctl_ifcreate(s, ifr);
 }
 
 static struct cmd lagg_cmds[] = {

Modified: head/sbin/ifconfig/ifvlan.c
==============================================================================
--- head/sbin/ifconfig/ifvlan.c Thu Nov 26 14:57:30 2020        (r368057)
+++ head/sbin/ifconfig/ifvlan.c Thu Nov 26 16:36:50 2020        (r368058)
@@ -162,8 +162,7 @@ vlan_create(int s, struct ifreq *ifr)
                        errx(1, "must specify a parent device for vlan create");
                ifr->ifr_data = (caddr_t) &params;
        }
-       if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
-               err(1, "SIOCIFCREATE2");
+       ioctl_ifcreate(s, ifr);
 }
 
 static void

Modified: head/sbin/ifconfig/ifvxlan.c
==============================================================================
--- head/sbin/ifconfig/ifvxlan.c        Thu Nov 26 14:57:30 2020        
(r368057)
+++ head/sbin/ifconfig/ifvxlan.c        Thu Nov 26 16:36:50 2020        
(r368058)
@@ -191,8 +191,7 @@ vxlan_create(int s, struct ifreq *ifr)
        vxlan_check_params();
 
        ifr->ifr_data = (caddr_t) &params;
-       if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
-               err(1, "SIOCIFCREATE2");
+       ioctl_ifcreate(s, ifr);
 }
 
 static
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to