+
+/*------------------------------------------------------------------*/
+/*
+ * Print the number of available bitrates for the device
+ */
+static void
+print_keys_info(int skfd,
+ char * ifname)
+{
+ struct iwreq wrq;
+ struct iw_range range;
+ unsigned char key[IW_ENCODING_TOKEN_MAX];
+ int k;
+
+ strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
+ wrq.u.data.pointer = (caddr_t) ⦥
+ wrq.u.data.length = 0;
+ wrq.u.data.flags = 0;
+ if(ioctl(skfd, SIOCGIWRANGE, &wrq) < 0)
+ fprintf(stderr, "%-8.8s no encryption keys information.\n\n",
+ ifname);
+ else
+ {
+ printf("%-8.8s ", ifname);
+ if((range.num_encoding_sizes > 0) &&
+ (range.num_encoding_sizes < IW_MAX_ENCODING_SIZES))
+ {
+ printf("%d key sizes : %d", range.num_encoding_sizes,
+ range.encoding_size[0] * 8);
+ /* Print them all */
+ for(k = 1; k < range.num_encoding_sizes; k++)
+ printf(", %d", range.encoding_size[k] * 8);
+ printf("bits\n ");
+ }
+ printf("%d keys available :\n", range.max_encoding_tokens);
+ for(k = 1; k <= range.max_encoding_tokens; k++)
+ {
+ strcpy(wrq.ifr_name, ifname);
+ wrq.u.data.pointer = (caddr_t) key;
+ wrq.u.data.length = 0;
+ wrq.u.data.flags = k;
+ if(ioctl(skfd, SIOCGIWENCODE, &wrq) < 0)
+ {
+ fprintf(stderr, "SIOCGIWENCODE: %s\n", strerror(errno));
+ break;
+ }
+ if((wrq.u.data.flags & IW_ENCODE_DISABLED) ||
+ (wrq.u.data.length == 0))
+ printf("\t\t[%d]: off\n", k);
+ else
+ {
+ int i;
+
+ printf("\t\t[%d]: %.2X", k, key[0]);
+ for(i = 1; i < wrq.u.data.length; i++)
+ {
+ if((i & 0x1) == 0)
+ printf("-");
+ printf("%.2X", key[i]);
+ }
+
+ /* Other info... */
+ printf(" (%d bits)", wrq.u.data.length * 8);
+ printf("\n");
+ }
+ }
+
+ printf("\n\n");
+ }
+}
+
+/*------------------------------------------------------------------*/
+/*
+ * Get bit-rate info on all devices and print it on the screen
+ */
+static void
+print_keys_devices(int skfd)
+{
+ char buff[1024];
+ struct ifconf ifc;
+ struct ifreq *ifr;
+ int i;
+
+ /* Get list of active devices */
+ ifc.ifc_len = sizeof(buff);
+ ifc.ifc_buf = buff;
+ if(ioctl(skfd, SIOCGIFCONF, &ifc) < 0)
+ {
+ fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));
+ return;
+ }
+ ifr = ifc.ifc_req;
+
+ /* Print them */
+ for(i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++)
+ print_keys_info(skfd, ifr->ifr_name);
+}