On Mon, Apr 19, 2010 at 02:34:55PM +0300, Gregory Edigarov wrote:
> Hello,
> 
> This diff adds possibility for the network interfaces to have an arbitrary 
> names.
> this is done via ifconfig <oldname> name <newname>
> 

Neat idea, but you do no sanity checking at all. So you could end up with
two interfaces with the same name (very bad) or an interface with a name
that violates the naming scheme.
Since if_xname is used in various places to identify interfaces changing
their name is dangerous. e.g. pf and the routing daemons use interface
names in the config. So it is important to do at least a bit of sanity
checking.

> Please test. 
> Thank you.
> 
> 
> --- /usr/src/sys/net/if.c.orig        Sat Apr 17 12:42:06 2010
> +++ /usr/src/sys/net/if.c     Sat Apr 17 13:27:12 2010
> @@ -1416,6 +1416,17 @@
>                       strlcpy(ifp->if_description, ifdescrbuf, IFDESCRSIZE);
>               }
>               break;
> +     
> +     case SIOCSIFNAME:
> +             if ((error = suser (p,0)) != 0)
> +                     return (error);
> +             error = copyinstr(ifr->ifr_data, ifnamebuf, 
> +                     IFNAMSIZ,&bytesdone);
> +             if (error == 0) {
> +                     (void)memset (ifp->if_xname, 0, IFNAMSIZ);
> +                     strlcpy(ifp->if_xname, ifnamebuf,IFNAMSIZ); 
> +             }
> +             break;
>  
>       case SIOCGIFRTLABEL:
>               if (ifp->if_rtlabelid &&
> --- /usr/src/sbin/ifconfig/ifconfig.c.orig    Sat Apr 17 13:43:47 2010
> +++ /usr/src/sbin/ifconfig/ifconfig.c Sat Apr 17 14:34:15 2010
> @@ -149,6 +149,7 @@
>  void setifbroadaddr(const char *, int);
>  void setifdesc(const char *, int);
>  void unsetifdesc(const char *, int);
> +void setifname(const char *, int);
>  void setifipdst(const char *, int);
>  void setifmetric(const char *, int);
>  void setifmtu(const char *, int);
> @@ -465,6 +466,7 @@
>       { "descr",      NEXTARG,        0,              setifdesc },
>       { "-description", 1,            0,              unsetifdesc },
>       { "-descr",     1,              0,              unsetifdesc },
> +     { "name",       1,              0,              setifname},     
>       { NULL, /*src*/ 0,              0,              setifaddr },
>       { NULL, /*dst*/ 0,              0,              setifdstaddr },
>       { NULL, /*illegal*/0,           0,              NULL },
> @@ -1118,6 +1120,14 @@
>  
>  /* ARGSUSED */
>  void
> +setifname(const char *val, int ignored)
> +{
> +     ifr.ifr_data = (caddr_t)val;
> +     if (ioctl(s, SIOCSIFNAME, &ifr) < 0)
> +             warn("SIOCSIFNAME");
> +} 
> +/* ARGSUSED */
> +void
>  setifipdst(const char *addr, int ignored)
>  {
>       in_getaddr(addr, DSTADDR);
> --- /usr/include/sys/sockio.h.orig    Sat Apr 17 14:33:11 2010
> +++ /usr/include/sys/sockio.h Sat Apr 17 14:32:41 2010
> @@ -179,6 +179,8 @@
>  #define      SIOCSLIFPHYRTABLEID _IOW('i', 161, struct ifreq) /* set tunnel 
> VRF id */
>  #define      SIOCGLIFPHYRTABLEID _IOWR('i', 162, struct ifreq) /* get tunnel 
> id */
>  
> +#define SIOCSIFNAME   _IOW('i', 163, struct ifreq) /* set interface name */
> +
>  #define      SIOCSVH         _IOWR('i', 245, struct ifreq)   /* set carp 
> param */
>  #define      SIOCGVH         _IOWR('i', 246, struct ifreq)   /* get carp 
> param */
>  

-- 
:wq Claudio

Reply via email to