static int diag_show_summary(const char *dev) { char buf[PRISM2_HOSTAPD_MAX_BUF_SIZE]; struct prism2_hostapd_param *param; int res; printf("Host AP driver diagnostics information for '%s'\n\n", dev); param = (struct prism2_hostapd_param *) buf; res = hostapd_get_rid(dev, param, HFA384X_RID_NICID, 1); if (res == EPERM) { printf("hostap_diag requires root privileges\n"); return -1; } if (res == ENODATA) { printf("NICID read did not return any data.\n"); } else if (res) { printf("Could not communicate with the kernel driver.\n"); return -1; } if (res == 0) hostap_show_nicid(param->u.rid.data, param->u.rid.len); if (!hostapd_get_rid(dev, param, HFA384X_RID_PRIID, 1)) hostap_show_priid(param->u.rid.data, param->u.rid.len); if (!hostapd_get_rid(dev, param, HFA384X_RID_STAID, 1)) hostap_show_staid(param->u.rid.data, param->u.rid.len); return 0; }
static int get_rid(const char *dev, u16 rid) { char buf[PRISM2_HOSTAPD_MAX_BUF_SIZE]; struct prism2_hostapd_param *param; int res, i; param = (struct prism2_hostapd_param *) buf; res = hostapd_get_rid(dev, param, rid, 1); if (res == EPERM) { printf("hostap_rid requires root privileges\n"); return -1; } if (res == ENODATA) { printf("Get RID did not return any data.\n"); return -1; } else if (res) { printf("Could not communicate with the kernel driver.\n"); return -1; } for (i = 0; i < param->u.rid.len; i++) printf("%02x ", param->u.rid.data[i]); printf("\n"); return 0; }
static void diag_show_unknown_rids(const char *dev) { char buf[PRISM2_HOSTAPD_MAX_BUF_SIZE]; struct prism2_hostapd_param *param; int res, j; u16 rid; int pos, rid_entries; printf("\nUnknown RIDs (Resource IDentifiers)\n\n"); param = (struct prism2_hostapd_param *) buf; pos = 0; rid_entries = sizeof(rid_table) / sizeof(rid_table[0]); for (rid = 0xfc00; rid <= 0xfdff; rid++) { if (pos < rid_entries) { if (rid_table[pos].rid == rid) { pos++; continue; } while (pos < rid_entries && rid_table[pos].rid < rid) pos++; } res = hostapd_get_rid(dev, param, rid, 0); if (res == ENODATA) continue; if (res) { printf("Could not read RID %04X (res=%d)\n", rid_table[pos].rid, res); break; } printf("%04X=", rid); for (j = 0; j < param->u.rid.len; j++) printf("<%02x>", param->u.rid.data[j]); printf("\n"); } }
static void diag_show_known_rids(const char *dev) { char buf[PRISM2_HOSTAPD_MAX_BUF_SIZE]; u8 *rid; struct prism2_hostapd_param *param; int res, i, j, k, len, slen; struct hfa384x_comp_ident *compid; struct hfa384x_sup_range *range; printf("\nKnown RIDs (Resource IDentifiers)\n\n"); param = (struct prism2_hostapd_param *) buf; for (i = 0; i < sizeof(rid_table) / sizeof(rid_table[0]); i++) { res = hostapd_get_rid(dev, param, rid_table[i].rid, 0); if (res == ENODATA) continue; if (res) { printf("Could not read RID %04X (res=%d)\n", rid_table[i].rid, res); break; } printf("%04X=%s=", rid_table[i].rid, rid_table[i].name); rid = param->u.rid.data; len = param->u.rid.len; switch (rid_table[i].type) { case RID_HEXDUMP: for (j = 0; j < len; j++) printf("<%02x>", rid[j]); printf("\n"); break; case RID_WORD: if (len != 2) { printf("<INVALID RID_WORD LEN %d>\n", len); } else { u16 val = le_to_host16(*(u16 *)rid); printf("%d\n", val); } break; case RID_HWADDR: if (len != 6) { printf("<INVALID RID_HWADDR LEN %d>\n", len); } else { printf(MACSTR "\n", MAC2STR(rid)); } break; case RID_STRING: slen = le_to_host16(*(u16 *)rid); if (slen > len) slen = len; for (j = 2; j < slen + 2; j++) { if (rid[j] >= 32 && rid[j] < 127) printf("%c", rid[j]); else printf("<%02x>", rid[j]); } printf("\n"); break; case RID_COMPID: if (len != sizeof(*compid)) { printf("<INVALID RID_COMPID LEN " "%d>\n", len); break; } compid = (struct hfa384x_comp_ident *) rid; printf("0x%02x v%d.%d.%d\n", le_to_host16(compid->id), le_to_host16(compid->major), le_to_host16(compid->minor), le_to_host16(compid->variant)); break; case RID_SUPRANGE: if (len != sizeof(*range)) { printf("<INVALID RID_SUPRANGE LEN " "%d>\n", len); break; } range = (struct hfa384x_sup_range *) rid; printf("%d 0x%02x %d %d-%d\n", le_to_host16(range->role), le_to_host16(range->id), le_to_host16(range->variant), le_to_host16(range->bottom), le_to_host16(range->top)); break; case RID_HEXSTRING: slen = le_to_host16(*(u16 *)rid); if (slen > len) slen = len; for (j = 2; j < slen + 2; j++) printf("<%02x>", rid[j]); printf("\n"); break; case RID_CIS: k = len; while (k > 0 && rid[k - 1] == 0xff) k--; for (j = 0; j < k; j++) printf("<%02x>", rid[j]); if (k != len) printf(" + %d*<ff>", len - k); printf("\n"); break; default: printf("<UNKNOWN TYPE %d>\n", rid_table[i].type); break; } } }