This makes ifconfig scan indicate the type of encryption used on a network.

To make this work, the kernel must fill in RSN info every time it runs
a scan, not just if wpa was already enabled (i.e. the IEEE80211_F_RSNON
flag is already set).

While here, add missing definition for IEEE80211_WPA_CIPHER_BIP.

I don't have an 802.1x (wpa enterprise) network in range, so I couldn't
test that part.

This is an ABI break since the ioctl node request data structure grows.

ok?

Index: sbin/ifconfig/ifconfig.c
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.284
diff -u -p -r1.284 ifconfig.c
--- sbin/ifconfig/ifconfig.c    23 Jun 2014 18:44:43 -0000      1.284
+++ sbin/ifconfig/ifconfig.c    8 Jul 2014 21:11:22 -0000
@@ -2281,6 +2281,18 @@ ieee80211_printnode(struct ieee80211_nod
        nr->nr_capinfo &= ~IEEE80211_CAPINFO_ESS;
        if (nr->nr_capinfo) {
                printb_status(nr->nr_capinfo, IEEE80211_CAPINFO_BITS);
+               if (nr->nr_capinfo & IEEE80211_CAPINFO_PRIVACY) {
+                       if (nr->nr_rsnciphers & IEEE80211_WPA_CIPHER_CCMP)
+                               fputs(",wpa2", stdout);
+                       else if (nr->nr_rsnciphers & IEEE80211_WPA_CIPHER_TKIP)
+                               fputs(",wpa1", stdout);
+                       else
+                               fputs(",wep", stdout);
+
+                       if (nr->nr_rsnakms & IEEE80211_WPA_AKM_8021X ||
+                           nr->nr_rsnakms & IEEE80211_WPA_AKM_SHA256_8021X)
+                               fputs(",802.1x", stdout);
+               }
                putchar(' ');
        }
 
Index: sys/net80211/ieee80211_input.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v
retrieving revision 1.123
diff -u -p -r1.123 ieee80211_input.c
--- sys/net80211/ieee80211_input.c      11 Jun 2013 18:15:53 -0000      1.123
+++ sys/net80211/ieee80211_input.c      8 Jul 2014 21:11:22 -0000
@@ -1579,11 +1579,11 @@ ieee80211_recv_probe_resp(struct ieee802
                        ieee80211_parse_wmm_params(ic, wmmie);
        }
 
-       if (ic->ic_state == IEEE80211_S_SCAN &&
+       if (ic->ic_state == IEEE80211_S_SCAN
 #ifndef IEEE80211_STA_ONLY
-           ic->ic_opmode != IEEE80211_M_HOSTAP &&
+           && ic->ic_opmode != IEEE80211_M_HOSTAP
 #endif
-           (ic->ic_flags & IEEE80211_F_RSNON)) {
+          ) {
                struct ieee80211_rsnparams rsn;
                const u_int8_t *saveie = NULL;
                /*
@@ -1613,8 +1613,7 @@ ieee80211_recv_probe_resp(struct ieee802
                        ni->ni_rsncaps = rsn.rsn_caps;
                } else
                        ni->ni_rsnprotos = IEEE80211_PROTO_NONE;
-       } else if (ic->ic_state == IEEE80211_S_SCAN)
-               ni->ni_rsnprotos = IEEE80211_PROTO_NONE;
+       }
 
        if (ssid[1] != 0 && ni->ni_esslen == 0) {
                ni->ni_esslen = ssid[1];
Index: sys/net80211/ieee80211_ioctl.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.c,v
retrieving revision 1.34
diff -u -p -r1.34 ieee80211_ioctl.c
--- sys/net80211/ieee80211_ioctl.c      29 Sep 2010 20:00:51 -0000      1.34
+++ sys/net80211/ieee80211_ioctl.c      8 Jul 2014 21:11:22 -0000
@@ -91,7 +91,18 @@ ieee80211_node2req(struct ieee80211com *
        nr->nr_inact = ni->ni_inact;
        nr->nr_txrate = ni->ni_txrate;
        nr->nr_state = ni->ni_state;
-       /* XXX RSN */
+
+       /* RSN */
+       nr->nr_rsnciphers = ni->ni_rsnciphers;
+       nr->nr_rsnakms = 0;
+       if (ni->ni_rsnakms & IEEE80211_AKM_8021X)
+               nr->nr_rsnakms |= IEEE80211_WPA_AKM_8021X;
+       if (ni->ni_rsnakms & IEEE80211_AKM_PSK)
+               nr->nr_rsnakms |= IEEE80211_WPA_AKM_PSK;
+       if (ni->ni_rsnakms & IEEE80211_AKM_SHA256_8021X)
+               nr->nr_rsnakms |= IEEE80211_WPA_AKM_SHA256_8021X;
+       if (ni->ni_rsnakms & IEEE80211_AKM_SHA256_PSK)
+               nr->nr_rsnakms |= IEEE80211_WPA_AKM_SHA256_PSK;
 
        /* Node flags */
        nr->nr_flags = 0;
Index: sys/net80211/ieee80211_ioctl.h
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.h,v
retrieving revision 1.18
diff -u -p -r1.18 ieee80211_ioctl.h
--- sys/net80211/ieee80211_ioctl.h      4 Mar 2011 23:48:15 -0000       1.18
+++ sys/net80211/ieee80211_ioctl.h      8 Jul 2014 21:11:22 -0000
@@ -230,6 +230,7 @@ struct ieee80211_wpapsk {
 #define IEEE80211_WPA_CIPHER_TKIP      0x04
 #define IEEE80211_WPA_CIPHER_CCMP      0x08
 #define IEEE80211_WPA_CIPHER_WEP104    0x10
+#define IEEE80211_WPA_CIPHER_BIP       0x20
 
 #define IEEE80211_WPA_AKM_PSK          0x01
 #define IEEE80211_WPA_AKM_8021X                0x02
@@ -311,7 +312,9 @@ struct ieee80211_nodereq {
        u_int8_t        nr_txrate;      /* index to nr_rates[] */
        u_int16_t       nr_state;       /* node state in the cache */
 
-       /* XXX RSN */
+       /* RSN */
+       u_int           nr_rsnciphers;
+       u_int           nr_rsnakms;
 
        /* Node flags */
        u_int8_t        nr_flags;

Reply via email to