PERFORCE change 66381 for review

Sam Leffler sam at FreeBSD.org
Fri Dec 3 18:30:23 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=66381

Change 66381 by sam at sam_ebb on 2004/12/04 02:30:04

	There are too many parameters for 802.11 devices so stop
	trying to use a fixed format and just bin-pack the output
	with special consideration for keys.  Not 100% happy with
	this; it'll likely need tweaking.

Affected files ...

.. //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#27 edit

Differences ...

==== //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#27 (text+ko) ====

@@ -1079,6 +1079,31 @@
 	return IEEE80211_M_STA;
 }
 
+static const struct ieee80211_channel *
+getchaninfo(int s, int chan)
+{
+	struct ieee80211req ireq;
+	static struct ieee80211req_chaninfo chans;
+	static struct ieee80211_channel undef;
+	const struct ieee80211_channel *c;
+	int i, freq;
+
+	(void) memset(&ireq, 0, sizeof(ireq));
+	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+	ireq.i_type = IEEE80211_IOC_CHANINFO;
+	ireq.i_data = &chans;
+	ireq.i_len = sizeof(chans);
+	if (ioctl(s, SIOCG80211, &ireq) < 0)
+		errx(1, "unable to get channel information");
+	freq = ieee80211_ieee2mhz(chan);
+	for (i = 0; i < chans.ic_nchans; i++) {
+		c = &chans.ic_chans[i];
+		if (c->ic_freq == freq)
+			return c;
+	}
+	return &undef;
+}
+
 #if 0
 static void
 printcipher(int s, struct ieee80211req *ireq, int keylenop)
@@ -1115,42 +1140,73 @@
 }
 #endif
 
-static int
+#define	MAXCOL	78
+int	col;
+char	spacer;
+
+#define	LINE_BREAK() do {			\
+	if (spacer != '\t') {			\
+		printf("\n");			\
+		spacer = '\t';			\
+	}					\
+	col = 8;	/* 8-col tab */		\
+} while (0)
+#define	LINE_CHECK(fmt, ...) do {		\
+	col += sizeof(fmt)-2;			\
+	if (col > MAXCOL) {			\
+		LINE_BREAK();			\
+		col += sizeof(fmt)-2;		\
+	}					\
+	printf(fmt, __VA_ARGS__);		\
+	spacer = ' ';				\
+} while (0)
+
+static void
 printkey(const struct ieee80211req_key *ik)
 {
 	static const uint8_t zerodata[IEEE80211_KEYBUF_SIZE];
 	int keylen = ik->ik_keylen;
+	int printcontents;
 
+	printcontents =
+		(memcmp(ik->ik_keydata, zerodata, keylen) != 0 || verbose);
+	if (printcontents)
+		LINE_BREAK();
 	switch (ik->ik_type) {
 	case IEEE80211_CIPHER_WEP:
 		/* compatibility */
-		printf("wepkey %u:%s", ik->ik_keyix+1,
+		LINE_CHECK("%cwepkey %u:%s", spacer, ik->ik_keyix+1,
 		    keylen <= 5 ? "40-bit" :
 		    keylen <= 13 ? "104-bit" : "128-bit");
 		break;
 	case IEEE80211_CIPHER_TKIP:
 		if (keylen > 128/8)
 			keylen -= 128/8;	/* ignore MIC for now */
-		printf("TKIP %u:%u-bit", ik->ik_keyix+1, 8*keylen);
+		LINE_CHECK("%cTKIP %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
 		break;
 	case IEEE80211_CIPHER_AES_OCB:
-		printf("AES-OCB %u:%u-bit", ik->ik_keyix+1, 8*keylen);
+		LINE_CHECK("%cAES-OCB %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
 		break;
 	case IEEE80211_CIPHER_AES_CCM:
-		printf("AES-CCM %u:%u-bit", ik->ik_keyix+1, 8*keylen);
+		LINE_CHECK("%cAES-CCM %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
 		break;
 	case IEEE80211_CIPHER_CKIP:
-		printf("CKIP %u:%u-bit", ik->ik_keyix+1, 8*keylen);
+		LINE_CHECK("%cCKIP %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
 		break;
 	case IEEE80211_CIPHER_NONE:
-		printf("NULL %u:%u-bit", ik->ik_keyix+1, 8*keylen);
+		LINE_CHECK("%cNULL %u:%u-bit",
+			spacer, ik->ik_keyix+1, 8*keylen);
 		break;
 	default:
-		printf("UNKNOWN (0x%x) %u:%u-bit", ik->ik_type,
-			ik->ik_keyix+1, 8*keylen);
+		LINE_CHECK("%cUNKNOWN (0x%x) %u:%u-bit", spacer,
+			ik->ik_type, ik->ik_keyix+1, 8*keylen);
 		break;
 	}
-	if (memcmp(ik->ik_keydata, zerodata, keylen) != 0 || verbose) {
+	if (printcontents) {
 		int i;
 
 		printf(" <");
@@ -1173,36 +1229,10 @@
 			if (ik->ik_flags & IEEE80211_KEY_DEFAULT)
 				printf("%sdef", sep), sep = "+";
 		}
-		return 1;		/* tell caller to do line break */
+		LINE_BREAK();
 	}
-	return 0;
 }
 
-static const struct ieee80211_channel *
-getchaninfo(int s, int chan)
-{
-	struct ieee80211req ireq;
-	static struct ieee80211req_chaninfo chans;
-	static struct ieee80211_channel undef;
-	const struct ieee80211_channel *c;
-	int i, freq;
-
-	(void) memset(&ireq, 0, sizeof(ireq));
-	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
-	ireq.i_type = IEEE80211_IOC_CHANINFO;
-	ireq.i_data = &chans;
-	ireq.i_len = sizeof(chans);
-	if (ioctl(s, SIOCG80211, &ireq) < 0)
-		errx(1, "unable to get channel information");
-	freq = ieee80211_ieee2mhz(chan);
-	for (i = 0; i < chans.ic_nchans; i++) {
-		c = &chans.ic_chans[i];
-		if (c->ic_freq == freq)
-			return c;
-	}
-	return &undef;
-}
-
 static void
 ieee80211_status(int s, const struct rt_addrinfo *info __unused)
 {
@@ -1212,7 +1242,6 @@
 	struct ieee80211req ireq;
 	u_int8_t data[32];
 	const struct ieee80211_channel *c;
-	char spacer;
 
 	(void) memset(&ireq, 0, sizeof(ireq));
 	(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
@@ -1259,33 +1288,29 @@
 	    memcmp(ireq.i_data, zerobssid, sizeof(zerobssid)) != 0)
 		printf(" bssid %s", ether_ntoa(ireq.i_data));
 
-	printf("\n");
-
 	ireq.i_type = IEEE80211_IOC_STATIONNAME;
 	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("\tstationname ");
+		printf("\n\tstationname ");
 		print_string(data, ireq.i_len);
-		printf("\n");
 	}
 
-	spacer = '\t';
+	spacer = ' ';		/* force first break */
+	LINE_BREAK();
 
 	ireq.i_type = IEEE80211_IOC_AUTHMODE;
 	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("%cauthmode ", spacer);
-		spacer = ' ';
 		switch (ireq.i_val) {
 			case IEEE80211_AUTH_NONE:
-				printf("NONE");
+				LINE_CHECK("%cauthmode NONE", spacer);
 				break;
 			case IEEE80211_AUTH_OPEN:
-				printf("OPEN");
+				LINE_CHECK("%cauthmode OPEN", spacer);
 				break;
 			case IEEE80211_AUTH_SHARED:
-				printf("SHARED");
+				LINE_CHECK("%cauthmode SHARED", spacer);
 				break;
 			case IEEE80211_AUTH_8021X:
-				printf("802.1x");
+				LINE_CHECK("%cauthmode 802.1x", spacer);
 				break;
 			case IEEE80211_AUTH_WPA:
 				ireq.i_type = IEEE80211_IOC_WPA;
@@ -1295,21 +1320,24 @@
 					wpa = 1;	/* default to WPA1 */
 				switch (wpa) {
 				case 2:
-					printf("WPA2/802.11i");
+					LINE_CHECK("%cauthmode WPA2/802.11i",
+						spacer);
 					break;
 				case 3:
-					printf("WPA1+WPA2/802.11i");
+					LINE_CHECK("%cauthmode WPA1+WPA2/802.11i",
+						spacer);
 					break;
 				default:
-					printf("WPA");
+					LINE_CHECK("%cauthmode WPA", spacer);
 					break;
 				}
 				break;
 			case IEEE80211_AUTH_AUTO:
-				printf("AUTO");
+				LINE_CHECK("%cauthmode AUTO", spacer);
 				break;
 			default:
-				printf("UNKNOWN (0x%x)", ireq.i_val);
+				LINE_CHECK("%cauthmode UNKNOWN (0x%x)",
+					spacer, ireq.i_val);
 				break;
 		}
 	}
@@ -1317,19 +1345,21 @@
 	ireq.i_type = IEEE80211_IOC_WEP;
 	if (ioctl(s, SIOCG80211, &ireq) != -1 &&
 	    ireq.i_val != IEEE80211_WEP_NOSUP) {
-		printf("%cprivacy ", spacer);
+		int firstkey;
+
 		switch (ireq.i_val) {
 			case IEEE80211_WEP_OFF:
-				printf("OFF");
+				LINE_CHECK("%cprivacy OFF", spacer);
 				break;
 			case IEEE80211_WEP_ON:
-				printf("ON");
+				LINE_CHECK("%cprivacy ON", spacer);
 				break;
 			case IEEE80211_WEP_MIXED:
-				printf("MIXED");
+				LINE_CHECK("%cprivacy MIXED", spacer);
 				break;
 			default:
-				printf("UNKNOWN (0x%x)", ireq.i_val);
+				LINE_CHECK("%cprivacy UNKNOWN (0x%x)",
+					spacer, ireq.i_val);
 				break;
 		}
 
@@ -1344,9 +1374,9 @@
 			goto end;
 		}
 		if (ireq.i_val != -1)
-			printf(" deftxkey %d", ireq.i_val+1);
+			LINE_CHECK("%cdeftxkey %d", spacer, ireq.i_val+1);
 		else if (verbose)
-			printf(" deftxkey UNDEF");
+			LINE_CHECK("%cdeftxkey UNDEF", spacer);
 
 		ireq.i_type = IEEE80211_IOC_NUMWEPKEYS;
 		if (ioctl(s, SIOCG80211, &ireq) < 0) {
@@ -1355,9 +1385,7 @@
 		}
 		num = ireq.i_val;
 
-		printf("\n");
-		spacer = '\t';
-
+		firstkey = 1;
 		for (i = 0; i < num; i++) {
 			struct ieee80211req_key ik;
 
@@ -1370,187 +1398,151 @@
 				warn("WEP support, but can get keys!");
 				goto end;
 			}
-			if (ik.ik_keylen == 0)
-				continue;
-			printf("%c", spacer);
-			if (printkey(&ik)) {
-				printf("\n");
-				spacer = '\t';
-			} else
-				spacer = ' ';
+			if (ik.ik_keylen != 0) {
+				if (verbose)
+					LINE_BREAK();
+				printkey(&ik);
+				firstkey = 0;
+			}
 		}
 	}
 
-	if (spacer != '\t')
-		printf("\n");
-	spacer = '\t';
-
 	ireq.i_type = IEEE80211_IOC_POWERSAVE;
 	if (ioctl(s, SIOCG80211, &ireq) != -1 &&
 	    ireq.i_val != IEEE80211_POWERSAVE_NOSUP ) {
 		if (ireq.i_val != IEEE80211_POWERSAVE_OFF || verbose) {
-			printf("%cpowersavemode", spacer);
 			switch (ireq.i_val) {
 				case IEEE80211_POWERSAVE_OFF:
-					printf(" OFF");
+					LINE_CHECK("%cpowersavemode OFF",
+						spacer);
 					break;
 				case IEEE80211_POWERSAVE_CAM:
-					printf(" CAM");
+					LINE_CHECK("%cpowersavemode CAM",
+						spacer);
 					break;
 				case IEEE80211_POWERSAVE_PSP:
-					printf(" PSP");
+					LINE_CHECK("%cpowersavemode PSP",
+						spacer);
 					break;
 				case IEEE80211_POWERSAVE_PSP_CAM:
-					printf(" PSP-CAM");
+					LINE_CHECK("%cpowersavemode PSP-CAM",
+						spacer);
 					break;
 			}
 			ireq.i_type = IEEE80211_IOC_POWERSAVESLEEP;
-			if (ioctl(s, SIOCG80211, &ireq) != -1) {
-				printf(" powersavesleep %d", ireq.i_val);
-			}
-			spacer = ' ';
+			if (ioctl(s, SIOCG80211, &ireq) != -1)
+				LINE_CHECK("%cpowersavesleep %d",
+					spacer, ireq.i_val);
 		}
 	}
 
 	ireq.i_type = IEEE80211_IOC_TXPOWMAX;
-	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("%ctxpowmax %d", spacer, ireq.i_val);
-		spacer = ' ';
-	}
+	if (ioctl(s, SIOCG80211, &ireq) != -1)
+		LINE_CHECK("%ctxpowmax %d", spacer, ireq.i_val);
 
 	if (verbose) {
 		ireq.i_type = IEEE80211_IOC_TXPOWER;
-		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			printf("%ctxpower %d", spacer, ireq.i_val);
-			spacer = ' ';
-		}
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			LINE_CHECK("%ctxpower %d", spacer, ireq.i_val);
 	}
 
-	if (spacer != '\t')
-		printf("\n");
-	spacer = '\t';
-
 	ireq.i_type = IEEE80211_IOC_RTSTHRESHOLD;
-	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		printf("%crtsthreshold %d", spacer, ireq.i_val);
-		spacer = ' ';
-	}
+	if (ioctl(s, SIOCG80211, &ireq) != -1)
+		LINE_CHECK("%crtsthreshold %d", spacer, ireq.i_val);
 
 	if (IEEE80211_IS_CHAN_G(c) || IEEE80211_IS_CHAN_PUREG(c) || verbose) {
 		ireq.i_type = IEEE80211_IOC_PROTMODE;
 		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			printf("%cprotmode ", spacer);
 			switch (ireq.i_val) {
 				case IEEE80211_PROTMODE_OFF:
-					printf("OFF");
+					LINE_CHECK("%cprotmode OFF", spacer);
 					break;
 				case IEEE80211_PROTMODE_CTS:
-					printf("CTS");
+					LINE_CHECK("%cprotmode CTS", spacer);
 					break;
 				case IEEE80211_PROTMODE_RTSCTS:
-					printf("RTSCTS");
+					LINE_CHECK("%cprotmode RTSCTS", spacer);
 					break;
 				default:
-					printf("UNKNOWN (0x%x)", ireq.i_val);
+					LINE_CHECK("%cprotmode UNKNOWN (0x%x)",
+						spacer, ireq.i_val);
 					break;
 			}
-			spacer = ' ';
 		}
 	}
 
 	ireq.i_type = IEEE80211_IOC_WME;
 	if (ioctl(s, SIOCG80211, &ireq) != -1) {
 		wme = ireq.i_val;
-		if (wme) {
-			printf("%cwme", spacer);
-			spacer = ' ';
-		} else if (verbose) {
-			printf("%c-wme", spacer);
-			spacer = ' ';
-		}
+		if (wme)
+			LINE_CHECK("%cwme", spacer);
+		else if (verbose)
+			LINE_CHECK("%c-wme", spacer);
 	} else
 		wme = 0;
 
 	if (opmode == IEEE80211_M_HOSTAP) {
 		ireq.i_type = IEEE80211_IOC_HIDESSID;
 		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			if (ireq.i_val) {
-				printf("%cssid HIDE", spacer);
-				spacer = ' ';
-			} else if (verbose) {
-				printf("%cssid SHOW", spacer);
-				spacer = ' ';
-			}
+			if (ireq.i_val)
+				LINE_CHECK("%cssid HIDE", spacer);
+			else if (verbose)
+				LINE_CHECK("%cssid SHOW", spacer);
 		}
 
 		ireq.i_type = IEEE80211_IOC_APBRIDGE;
 		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			if (!ireq.i_val) {
-				printf("%c-apbridge", spacer);
-				spacer = ' ';
-			} else if (verbose) {
-				printf("%capbridge", spacer);
-				spacer = ' ';
-			}
+			if (!ireq.i_val)
+				LINE_CHECK("%c-apbridge", spacer);
+			else if (verbose)
+				LINE_CHECK("%capbridge", spacer);
 		}
 
 		ireq.i_type = IEEE80211_IOC_DTIM_PERIOD;
-		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			printf("%cdtimperiod %u", spacer, ireq.i_val);
-			spacer = ' ';
-		}
+		if (ioctl(s, SIOCG80211, &ireq) != -1)
+			LINE_CHECK("%cdtimperiod %u", spacer, ireq.i_val);
 	} else {
 		ireq.i_type = IEEE80211_IOC_ROAMING;
 		if (ioctl(s, SIOCG80211, &ireq) != -1) {
 			if (ireq.i_val != IEEE80211_ROAMING_AUTO || verbose) {
-				printf("%croaming ", spacer);
 				switch (ireq.i_val) {
 				case IEEE80211_ROAMING_DEVICE:
-					printf("DEVICE");
+					LINE_CHECK("%croaming DEVICE", spacer);
 					break;
 				case IEEE80211_ROAMING_AUTO:
-					printf("AUTO");
+					LINE_CHECK("%croaming AUTO", spacer);
 					break;
 				case IEEE80211_ROAMING_MANUAL:
-					printf("MANUAL");
+					LINE_CHECK("%croaming MANUAL", spacer);
 					break;
 				default:
-					printf("UNKNOWN (0x%x)", ireq.i_val);
+					LINE_CHECK("%croaming UNKNOWN (0x%x)",
+						spacer, ireq.i_val);
 					break;
 				}
-				spacer = ' ';
 			}
 		}
 	}
 	ireq.i_type = IEEE80211_IOC_BEACON_INTERVAL;
 	if (ioctl(s, SIOCG80211, &ireq) != -1) {
-		if (ireq.i_val) {
-			printf("%cbintval %u", spacer, ireq.i_val);
-			spacer = ' ';
-		} else if (verbose) {
-			printf("%cbintval %u", spacer, ireq.i_val);
-			spacer = ' ';
-		}
+		if (ireq.i_val)
+			LINE_CHECK("%cbintval %u", spacer, ireq.i_val);
+		else if (verbose)
+			LINE_CHECK("%cbintval %u", spacer, ireq.i_val);
 	}
 
-	if (spacer != '\t')
-		printf("\n");
-	spacer = '\t';
-
-	if (wme && verbose)
+	if (wme && verbose) {
+		LINE_BREAK();
 		list_wme(s);
+	}
 
 	if (wpa) {
-		spacer = '\t';
 		ireq.i_type = IEEE80211_IOC_COUNTERMEASURES;
 		if (ioctl(s, SIOCG80211, &ireq) != -1) {
-			if (ireq.i_val) {
-				printf("%ccountermeasures", spacer);
-				spacer = ' ';
-			} else if (verbose) {
-				printf("%c-countermeasures", spacer);
-				spacer = ' ';
-			}
+			if (ireq.i_val)
+				LINE_CHECK("%ccountermeasures", spacer);
+			else if (verbose)
+				LINE_CHECK("%c-countermeasures", spacer);
 		}
 #if 0
 		/* XXX not interesting with WPA done in user space */
@@ -1583,9 +1575,9 @@
 		if (ioctl(s, SIOCG80211, &ireq) != -1) {
 		}
 #endif
-		if (spacer != '\t')
-			printf("\n");
+		LINE_BREAK();
 	}
+	LINE_BREAK();
 
 end:
 	return;


More information about the p4-projects mailing list