aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2003-07-28 03:10:58 (GMT)
committerJouni Malinen <j@w1.fi>2003-07-28 03:10:58 (GMT)
commit60f043a91836b0efc919ae5ff2551657d302e22a (patch)
treeae24776a9430c18904f7b963d309f690621d61ed
parent8a890bea6d4407704bc963ed6a846b059ba42774 (diff)
downloadhostap-history-60f043a91836b0efc919ae5ff2551657d302e22a.zip
hostap-history-60f043a91836b0efc919ae5ff2551657d302e22a.tar.gz
hostap-history-60f043a91836b0efc919ae5ff2551657d302e22a.tar.bz2
Moved PDA loading into common utility file.
-rw-r--r--utils/prism2_srec.c141
-rw-r--r--utils/util.c104
-rw-r--r--utils/util.h16
3 files changed, 135 insertions, 126 deletions
diff --git a/utils/prism2_srec.c b/utils/prism2_srec.c
index 6b1c058..2442b0e 100644
--- a/utils/prism2_srec.c
+++ b/utils/prism2_srec.c
@@ -96,74 +96,16 @@ struct srec_data {
};
-#define PRISM2_PDA_SIZE 1024
-
-struct pdr {
- unsigned int pdr, len;
- unsigned char *data;
-};
struct wlan_info {
struct s3_info_platform nicid, priid, staid;
struct s3_info_compatibility mfi_pri_sup, cfi_pri_sup,
pri_sup, sta_sup,
mfi_sta_act, cfi_pri_act, cfi_sta_act;
-
- char pda_buf[PRISM2_PDA_SIZE];
- struct pdr *pdrs;
- int pdr_count;
-};
-
-
-const u16 crc16_table[256] =
-{
- 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
- 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
- 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
- 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
- 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
- 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
- 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
- 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
- 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
- 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
- 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
- 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
- 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
- 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
- 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
- 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
- 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
- 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
- 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
- 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
- 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
- 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
- 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
- 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
- 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
- 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
- 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
- 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
- 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
- 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
- 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
- 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
+ struct prism2_pda pda;
};
-int crc16(u8 *buf, int len)
-{
- u16 crc;
- int i;
-
- crc = 0;
- for (i = 0; i < len; i++)
- crc = (crc >> 8) ^ crc16_table[(crc & 0xff) ^ *buf++];
- return crc;
-}
-
-
static int s3_comp(const void *a, const void *b)
{
const struct s3_record *aa = a, *bb = b;
@@ -1017,59 +959,6 @@ int read_wlan_rids(const char *dev, struct wlan_info *wlan)
}
-int read_wlan_pda(const char *fname, struct wlan_info *wlan)
-{
- FILE *f;
- int pos;
- u16 *pda, len, pdr;
-
- f = fopen(fname, "r");
- if (f == NULL)
- return 1;
-
- if (fread(wlan->pda_buf, 1, PRISM2_PDA_SIZE, f) != PRISM2_PDA_SIZE) {
- fclose(f);
- return 1;
- }
-
- fclose(f);
-
-
- pda = (u16 *) wlan->pda_buf;
- pos = 0;
- while (pos + 1 < PRISM2_PDA_SIZE / 2) {
- len = le_to_host16(pda[pos]);
- pdr = le_to_host16(pda[pos + 1]);
- if (len == 0 || pos + len > PRISM2_PDA_SIZE / 2)
- return 1;
-
- wlan->pdrs = (struct pdr *)
- realloc(wlan->pdrs,
- (wlan->pdr_count + 1) * sizeof(struct pdr));
- assert(wlan->pdrs != NULL);
- wlan->pdrs[wlan->pdr_count].pdr = pdr;
- wlan->pdrs[wlan->pdr_count].len = (len - 1) * 2;
- wlan->pdrs[wlan->pdr_count].data =
- (unsigned char *) (&pda[pos + 2]);
- wlan->pdr_count++;
-
- if (pdr == 0x0000 && len == 2) {
- /* PDA end found */
- if (crc16(wlan->pda_buf, (pos + 3) * 2) != 0)
- {
- printf("PDA checksum incorrect.\n");
- return 1;
- }
- return 0;
- }
-
- pos += len + 1;
- }
-
- return 1;
-}
-
-
void show_wlan(struct wlan_info *wlan)
{
printf("Wireless LAN card information:\n");
@@ -1096,11 +985,11 @@ void show_wlan(struct wlan_info *wlan)
if (verbose > 1) {
int i, j;
- for (i = 0; i < wlan->pdr_count; i++) {
+ for (i = 0; i < wlan->pda.pdr_count; i++) {
printf("PDR 0x%04x len=%i:",
- wlan->pdrs[i].pdr, wlan->pdrs[i].len);
- for (j = 0; j < wlan->pdrs[i].len; j++)
- printf(" %02x", wlan->pdrs[i].data[j]);
+ wlan->pda.pdrs[i].pdr, wlan->pda.pdrs[i].len);
+ for (j = 0; j < wlan->pda.pdrs[i].len; j++)
+ printf(" %02x", wlan->pda.pdrs[i].data[j]);
printf("\n");
}
}
@@ -1109,8 +998,8 @@ void show_wlan(struct wlan_info *wlan)
void free_wlan(struct wlan_info *wlan)
{
- if (wlan->pdrs)
- free(wlan->pdrs);
+ if (wlan->pda.pdrs)
+ free(wlan->pda.pdrs);
}
@@ -1249,18 +1138,18 @@ int combine_info(struct wlan_info *wlan, struct srec_data *srec,
}
found = 0;
- for (j = 0; j < wlan->pdr_count; j++) {
- if (wlan->pdrs[j].pdr == p->pdr) {
- if (wlan->pdrs[j].len != p->plug_len) {
+ for (j = 0; j < wlan->pda.pdr_count; j++) {
+ if (wlan->pda.pdrs[j].pdr == p->pdr) {
+ if (wlan->pda.pdrs[j].len != p->plug_len) {
printf("Plug record length mismatch "
"(PDR=0x%04x): %i != %i\n",
- p->pdr, wlan->pdrs[j].len,
+ p->pdr, wlan->pda.pdrs[j].len,
p->plug_len);
if (ignore_incompatible_interface) {
printf("==> use default\n");
break;
} else if (p->pdr == 1 &&
- wlan->pdrs[j].len <
+ wlan->pda.pdrs[j].len <
p->plug_len) {
/* PDR 0x0001 - 'manufacturing
* part number' seems to be
@@ -1271,8 +1160,8 @@ int combine_info(struct wlan_info *wlan, struct srec_data *srec,
} else
return 1;
}
- memcpy(pos, wlan->pdrs[j].data,
- wlan->pdrs[j].len);
+ memcpy(pos, wlan->pda.pdrs[j].data,
+ wlan->pda.pdrs[j].len);
found = 1;
break;
}
@@ -1508,7 +1397,7 @@ int main(int argc, char *argv[])
}
snprintf(fname, sizeof(fname), "/proc/net/hostap/%s/pda", iface);
- if (read_wlan_pda(fname, &wlan)) {
+ if (read_wlan_pda(fname, &wlan.pda)) {
printf("Could not read wlan PDA. This requires "
"PRISM2_DOWNLOAD_SUPPORT definition in\n"
"driver/module/hostap_config.h.\n");
diff --git a/utils/util.c b/utils/util.c
index 49f343e..cd54914 100644
--- a/utils/util.c
+++ b/utils/util.c
@@ -16,6 +16,7 @@
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <errno.h>
+#include <assert.h>
#include "wireless_copy.h"
#include "util.h"
@@ -251,3 +252,106 @@ int hostap_ioctl_readmif(const char *dev, int cr)
val = iwr.u.name[0];
return (int) val;
}
+
+
+static const u16 crc16_table[256] =
+{
+ 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
+ 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
+ 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
+ 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
+ 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
+ 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
+ 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
+ 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
+ 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
+ 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
+ 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
+ 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
+ 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
+ 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
+ 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
+ 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
+ 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
+ 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
+ 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
+ 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
+ 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
+ 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
+ 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
+ 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
+ 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
+ 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
+ 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
+ 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
+ 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
+ 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
+ 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
+ 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
+};
+
+
+static int crc16(u8 *buf, int len)
+{
+ u16 crc;
+ int i;
+
+ crc = 0;
+ for (i = 0; i < len; i++)
+ crc = (crc >> 8) ^ crc16_table[(crc & 0xff) ^ *buf++];
+ return crc;
+}
+
+
+int read_wlan_pda(const char *fname, struct prism2_pda *pda_info)
+{
+ FILE *f;
+ int pos;
+ u16 *pda, len, pdr;
+
+ memset(pda_info, 0, sizeof(struct prism2_pda));
+ f = fopen(fname, "r");
+ if (f == NULL)
+ return 1;
+
+ if (fread(pda_info->pda_buf, 1, PRISM2_PDA_SIZE, f) !=
+ PRISM2_PDA_SIZE) {
+ fclose(f);
+ return 1;
+ }
+
+ fclose(f);
+
+ pda = (u16 *) pda_info->pda_buf;
+ pos = 0;
+ while (pos + 1 < PRISM2_PDA_SIZE / 2) {
+ len = le_to_host16(pda[pos]);
+ pdr = le_to_host16(pda[pos + 1]);
+ if (len == 0 || pos + len > PRISM2_PDA_SIZE / 2)
+ return 1;
+
+ pda_info->pdrs = (struct prism2_pdr *)
+ realloc(pda_info->pdrs,
+ (pda_info->pdr_count + 1) *
+ sizeof(struct prism2_pdr));
+ assert(pda_info->pdrs != NULL);
+ pda_info->pdrs[pda_info->pdr_count].pdr = pdr;
+ pda_info->pdrs[pda_info->pdr_count].len = (len - 1) * 2;
+ pda_info->pdrs[pda_info->pdr_count].data =
+ (unsigned char *) (&pda[pos + 2]);
+ pda_info->pdr_count++;
+
+ if (pdr == 0x0000 && len == 2) {
+ /* PDA end found */
+ if (crc16(pda_info->pda_buf, (pos + 3) * 2) != 0) {
+ printf("PDA checksum incorrect.\n");
+ return 1;
+ }
+ return 0;
+ }
+
+ pos += len + 1;
+ }
+
+ return 1;
+}
diff --git a/utils/util.h b/utils/util.h
index 7f30f6c..7d7719a 100644
--- a/utils/util.h
+++ b/utils/util.h
@@ -18,4 +18,20 @@ int hostapd_set_rid(const char *dev, u16 rid, u8 *data, size_t len,
int show_err);
int hostap_ioctl_readmif(const char *dev, int cr);
+
+#define PRISM2_PDA_SIZE 1024
+
+struct prism2_pdr {
+ unsigned int pdr, len;
+ unsigned char *data;
+};
+
+struct prism2_pda {
+ char pda_buf[PRISM2_PDA_SIZE];
+ struct prism2_pdr *pdrs;
+ int pdr_count;
+};
+
+int read_wlan_pda(const char *fname, struct prism2_pda *pda_info);
+
#endif /* UTIL_H */