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;