Do not require users to type 'media autoselect mode ...' if all
they want is to force a particular operating mode.

This allows 11n support to be disabled by typing short commands like:

  ifconfig iwn0 mode 11a
  ifconfig iwn0 mode 11g
  ifconfig iwn0 mode 11b

The new -mode command restores the default behaviour (mode autoselect).

ok?

Index: ifconfig.8
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.8,v
retrieving revision 1.264
diff -u -p -r1.264 ifconfig.8
--- ifconfig.8  6 Dec 2015 12:50:05 -0000       1.264
+++ ifconfig.8  12 Jan 2016 11:59:16 -0000
@@ -373,16 +373,21 @@ The routing metric can be used by routin
 Higher metrics have the effect of making a route less favorable.
 .It Cm mode Ar mode
 If the driver for the interface supports the media selection system,
-set the specified operating mode on the interface to the given
+force the operating mode of the interface to the given
 .Ar mode .
 For IEEE 802.11 wireless interfaces that support multiple operating modes,
 this directive is used to select between 802.11a
 .Pq Dq 11a ,
 802.11b
 .Pq Dq 11b ,
-and 802.11g
-.Pq Dq 11g
+802.11g
+.Pq Dq 11g,
+and 802.11n
+.Pq Dq 11n
 operating modes.
+.It Fl mode
+Select the operating mode automatically.
+This is the default for IEEE 802.11 wireless interfaces.
 .It Cm mpls
 Enable Multiprotocol Label Switching (MPLS) on the interface,
 allowing it to send and receive MPLS traffic.
Index: ifconfig.c
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.314
diff -u -p -r1.314 ifconfig.c
--- ifconfig.c  6 Jan 2016 21:37:00 -0000       1.314
+++ ifconfig.c  12 Jan 2016 11:40:26 -0000
@@ -193,6 +193,7 @@ void        unsetkeepalive(const char *, int);
 void   setmedia(const char *, int);
 void   setmediaopt(const char *, int);
 void   setmediamode(const char *, int);
+void   unsetmediamode(const char *, int);
 void   clone_create(const char *, int);
 void   clone_destroy(const char *, int);
 void   unsetmediaopt(const char *, int);
@@ -517,6 +518,7 @@ const struct        cmd {
        { "mediaopt",   NEXTARG,        A_MEDIAOPTSET,  setmediaopt },
        { "-mediaopt",  NEXTARG,        A_MEDIAOPTCLR,  unsetmediaopt },
        { "mode",       NEXTARG,        A_MEDIAMODE,    setmediamode },
+       { "-mode",      0,              A_MEDIAMODE,    unsetmediamode },
        { "instance",   NEXTARG,        A_MEDIAINST,    setmediainst },
        { "inst",       NEXTARG,        A_MEDIAINST,    setmediainst },
        { "lladdr",     NEXTARG,        0,              setiflladdr },
@@ -2367,7 +2369,7 @@ void
 process_media_commands(void)
 {
 
-       if ((actions & (A_MEDIA|A_MEDIAOPT)) == 0) {
+       if ((actions & (A_MEDIA|A_MEDIAOPT|A_MEDIAMODE)) == 0) {
                /* Nothing to do. */
                return;
        }
@@ -2450,6 +2452,26 @@ setmediamode(const char *val, int d)
        if ((mode = get_media_mode(type, val)) == -1)
                errx(1, "invalid media mode: %s", val);
        media_current = IFM_MAKEWORD(type, subtype, options, inst) | mode;
+       /* Media will be set after other processing is complete. */
+}
+
+void
+unsetmediamode(const char *val, int d)
+{
+       uint64_t type, subtype, options, inst;
+
+       init_current_media();
+
+       /* Can only issue `mode' once. */
+       if (actions & A_MEDIAMODE)
+               errx(1, "only one `mode' command may be issued");
+
+       type = IFM_TYPE(media_current);
+       subtype = IFM_SUBTYPE(media_current);
+       options = IFM_OPTIONS(media_current);
+       inst = IFM_INST(media_current);
+
+       media_current = IFM_MAKEWORD(type, subtype, options, inst) | IFM_AUTO;
        /* Media will be set after other processing is complete. */
 }
 

Reply via email to