/kern_2.6.32/drivers/staging/otus/apdbg.c

http://omnia2droid.googlecode.com/ · C · 457 lines · 358 code · 60 blank · 39 comment · 90 complexity · 15dd6a33611d6979e2333aff038eb8f1 MD5 · raw file

  1. /*
  2. * Copyright (c) 2007-2008 Atheros Communications Inc.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /* */
  17. /* Module Name : apdbg.c */
  18. /* */
  19. /* Abstract */
  20. /* Debug tools */
  21. /* */
  22. /* NOTES */
  23. /* None */
  24. /* */
  25. /************************************************************************/
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <unistd.h>
  29. #include <string.h>
  30. #include <errno.h>
  31. #include <ctype.h>
  32. #include <sys/types.h>
  33. #include <sys/socket.h>
  34. #include <sys/ioctl.h>
  35. #include <net/if.h>
  36. #include <netinet/in.h>
  37. #include <linux/sockios.h>
  38. #define ZM_IOCTL_REG_READ 0x01
  39. #define ZM_IOCTL_REG_WRITE 0x02
  40. #define ZM_IOCTL_MEM_DUMP 0x03
  41. #define ZM_IOCTL_REG_DUMP 0x05
  42. #define ZM_IOCTL_TXD_DUMP 0x06
  43. #define ZM_IOCTL_RXD_DUMP 0x07
  44. #define ZM_IOCTL_MEM_READ 0x0B
  45. #define ZM_IOCTL_MEM_WRITE 0x0C
  46. #define ZM_IOCTL_DMA_TEST 0x10
  47. #define ZM_IOCTL_REG_TEST 0x11
  48. #define ZM_IOCTL_TEST 0x80
  49. #define ZM_IOCTL_TALLY 0x81 //CWYang(+)
  50. #define ZM_IOCTL_RTS 0xA0
  51. #define ZM_IOCTL_MIX_MODE 0xA1
  52. #define ZM_IOCTL_FRAG 0xA2
  53. #define ZM_IOCTL_SCAN 0xA3
  54. #define ZM_IOCTL_KEY 0xA4
  55. #define ZM_IOCTL_RATE 0xA5
  56. #define ZM_IOCTL_ENCRYPTION_MODE 0xA6
  57. #define ZM_IOCTL_GET_TXCNT 0xA7
  58. #define ZM_IOCTL_GET_DEAGG_CNT 0xA8
  59. #define ZM_IOCTL_DURATION_MODE 0xA9
  60. #define ZM_IOCTL_SET_AES_KEY 0xAA
  61. #define ZM_IOCTL_SET_AES_MODE 0xAB
  62. #define ZM_IOCTL_SIGNAL_STRENGTH 0xAC //CWYang(+)
  63. #define ZM_IOCTL_SIGNAL_QUALITY 0xAD //CWYang(+)
  64. #define ZM_IOCTL_SET_PIBSS_MODE 0xAE
  65. #define ZDAPIOCTL SIOCDEVPRIVATE
  66. struct zdap_ioctl {
  67. unsigned short cmd; /* Command to run */
  68. unsigned int addr; /* Length of the data buffer */
  69. unsigned int value; /* Pointer to the data buffer */
  70. unsigned char data[0x100];
  71. };
  72. /* Declaration of macro and function for handling WEP Keys */
  73. #if 0
  74. #define SKIP_ELEM { \
  75. while(isxdigit(*p)) \
  76. p++; \
  77. }
  78. #define SKIP_DELIMETER { \
  79. if(*p == ':' || *p == ' ') \
  80. p++; \
  81. }
  82. #endif
  83. char hex(char);
  84. unsigned char asctohex(char *str);
  85. char *prgname;
  86. int set_ioctl(int sock, struct ifreq *req)
  87. {
  88. if (ioctl(sock, ZDAPIOCTL, req) < 0) {
  89. fprintf(stderr, "%s: ioctl(SIOCGIFMAP): %s\n",
  90. prgname, strerror(errno));
  91. return -1;
  92. }
  93. return 0;
  94. }
  95. int read_reg(int sock, struct ifreq *req)
  96. {
  97. struct zdap_ioctl *zdreq = 0;
  98. if (!set_ioctl(sock, req))
  99. return -1;
  100. //zdreq = (struct zdap_ioctl *)req->ifr_data;
  101. //printf( "reg = %4x, value = %4x\n", zdreq->addr, zdreq->value);
  102. return 0;
  103. }
  104. int read_mem(int sock, struct ifreq *req)
  105. {
  106. struct zdap_ioctl *zdreq = 0;
  107. int i;
  108. if (!set_ioctl(sock, req))
  109. return -1;
  110. /*zdreq = (struct zdap_ioctl *)req->ifr_data;
  111. printf( "dump mem from %x, length = %x\n", zdreq->addr, zdreq->value);
  112. for (i=0; i<zdreq->value; i++) {
  113. printf("%02x", zdreq->data[i]);
  114. printf(" ");
  115. if ((i>0) && ((i+1)%16 == 0))
  116. printf("\n");
  117. }*/
  118. return 0;
  119. }
  120. int main(int argc, char **argv)
  121. {
  122. int sock;
  123. int addr, value;
  124. struct ifreq req;
  125. char *action = NULL;
  126. struct zdap_ioctl zdreq;
  127. prgname = argv[0];
  128. if (argc < 3) {
  129. fprintf(stderr,"%s: usage is \"%s <ifname> <operation> [<address>] [<value>]\"\n",
  130. prgname, prgname);
  131. fprintf(stderr,"valid operation: read, write, mem, reg,\n");
  132. fprintf(stderr," : txd, rxd, rmem, wmem\n");
  133. fprintf(stderr," : dmat, regt, test\n");
  134. fprintf(stderr," scan, Channel Scan\n");
  135. fprintf(stderr," rts <decimal>, Set RTS Threshold\n");
  136. fprintf(stderr," frag <decimal>, Set Fragment Threshold\n");
  137. fprintf(stderr," rate <0-28>, 0:AUTO, 1-4:CCK, 5-12:OFDM, 13-28:HT\n");
  138. fprintf(stderr," TBD mix <0 or 1>, Set 1 to enable mixed mode\n");
  139. fprintf(stderr," enc, <0-3>, 0=>OPEN, 1=>WEP64, 2=>WEP128, 3=>WEP256\n");
  140. fprintf(stderr," skey <key>, Set WEP key\n");
  141. fprintf(stderr," txcnt, Get TxQ Cnt\n");
  142. fprintf(stderr," dagcnt, Get Deaggregate Cnt\n");
  143. fprintf(stderr," durmode <mode>, Set Duration Mode 0=>HW, 1=>SW\n");
  144. fprintf(stderr," aeskey <user> <key>\n");
  145. fprintf(stderr," aesmode <mode>\n");
  146. fprintf(stderr," wlanmode <0,1> 0:Station mode, 1:PIBSS mode\n");
  147. fprintf(stderr," tal <0,1>, Get Current Tally Info, 0=>read, 1=>read and reset\n");
  148. exit(1);
  149. }
  150. strcpy(req.ifr_name, argv[1]);
  151. zdreq.addr = 0;
  152. zdreq.value = 0;
  153. /* a silly raw socket just for ioctl()ling it */
  154. sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  155. if (sock < 0) {
  156. fprintf(stderr, "%s: socket(): %s\n", argv[0], strerror(errno));
  157. exit(1);
  158. }
  159. if (argc >= 4)
  160. {
  161. sscanf(argv[3], "%x", &addr);
  162. }
  163. if (argc >= 5)
  164. {
  165. sscanf(argv[4], "%x", &value);
  166. }
  167. zdreq.addr = addr;
  168. zdreq.value = value;
  169. if (!strcmp(argv[2], "read"))
  170. {
  171. zdreq.cmd = ZM_IOCTL_REG_READ;
  172. }
  173. else if (!strcmp(argv[2], "mem"))
  174. {
  175. zdreq.cmd = ZM_IOCTL_MEM_DUMP;
  176. }
  177. else if (!strcmp(argv[2], "write"))
  178. {
  179. zdreq.cmd = ZM_IOCTL_REG_WRITE;
  180. }
  181. else if (!strcmp(argv[2], "reg"))
  182. {
  183. zdreq.cmd = ZM_IOCTL_REG_DUMP;
  184. }
  185. else if (!strcmp(argv[2], "txd"))
  186. {
  187. zdreq.cmd = ZM_IOCTL_TXD_DUMP;
  188. }
  189. else if (!strcmp(argv[2], "rxd"))
  190. {
  191. zdreq.cmd = ZM_IOCTL_RXD_DUMP;
  192. }
  193. else if (!strcmp(argv[2], "rmem"))
  194. {
  195. zdreq.cmd = ZM_IOCTL_MEM_READ;
  196. }
  197. else if (!strcmp(argv[2], "wmem"))
  198. {
  199. zdreq.cmd = ZM_IOCTL_MEM_WRITE;
  200. }
  201. else if (!strcmp(argv[2], "dmat"))
  202. {
  203. zdreq.cmd = ZM_IOCTL_DMA_TEST;
  204. }
  205. else if (!strcmp(argv[2], "regt"))
  206. {
  207. zdreq.cmd = ZM_IOCTL_REG_TEST;
  208. }
  209. else if (!strcmp(argv[2], "test"))
  210. {
  211. zdreq.cmd = ZM_IOCTL_TEST;
  212. }
  213. else if (!strcmp(argv[2], "tal"))
  214. {
  215. sscanf(argv[3], "%d", &addr);
  216. zdreq.addr = addr;
  217. zdreq.cmd = ZM_IOCTL_TALLY;
  218. }
  219. else if (!strcmp(argv[2], "rts"))
  220. {
  221. sscanf(argv[3], "%d", &addr);
  222. zdreq.addr = addr;
  223. zdreq.cmd = ZM_IOCTL_RTS;
  224. }
  225. else if (!strcmp(argv[2], "mix"))
  226. {
  227. zdreq.cmd = ZM_IOCTL_MIX_MODE;
  228. }
  229. else if (!strcmp(argv[2], "frag"))
  230. {
  231. sscanf(argv[3], "%d", &addr);
  232. zdreq.addr = addr;
  233. zdreq.cmd = ZM_IOCTL_FRAG;
  234. }
  235. else if (!strcmp(argv[2], "scan"))
  236. {
  237. zdreq.cmd = ZM_IOCTL_SCAN;
  238. }
  239. else if (!strcmp(argv[2], "skey"))
  240. {
  241. zdreq.cmd = ZM_IOCTL_KEY;
  242. if (argc >= 4)
  243. {
  244. unsigned char temp[29];
  245. int i;
  246. int keyLen;
  247. int encType;
  248. keyLen = strlen(argv[3]);
  249. if (keyLen == 10)
  250. {
  251. sscanf(argv[3], "%02x%02x%02x%02x%02x", &temp[0], &temp[1],
  252. &temp[2], &temp[3], &temp[4]);
  253. }
  254. else if (keyLen == 26)
  255. {
  256. sscanf(argv[3], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
  257. &temp[0], &temp[1], &temp[2], &temp[3], &temp[4],
  258. &temp[5], &temp[6], &temp[7], &temp[8], &temp[9],
  259. &temp[10], &temp[11], &temp[12]);
  260. }
  261. else if (keyLen == 58)
  262. {
  263. sscanf(argv[3], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
  264. &temp[0], &temp[1], &temp[2], &temp[3], &temp[4],
  265. &temp[5], &temp[6], &temp[7], &temp[8], &temp[9],
  266. &temp[10], &temp[11], &temp[12], &temp[13], &temp[14],
  267. &temp[15], &temp[16], &temp[17], &temp[18], &temp[19],
  268. &temp[20], &temp[21], &temp[22], &temp[23], &temp[24],
  269. &temp[25], &temp[26], &temp[27], &temp[28]);
  270. }
  271. else
  272. {
  273. fprintf(stderr, "Invalid key length\n");
  274. exit(1);
  275. }
  276. zdreq.addr = keyLen/2;
  277. for(i=0; i<zdreq.addr; i++)
  278. {
  279. zdreq.data[i] = temp[i];
  280. }
  281. }
  282. else
  283. {
  284. printf("Error : Key required!\n");
  285. }
  286. }
  287. else if (!strcmp(argv[2], "rate"))
  288. {
  289. sscanf(argv[3], "%d", &addr);
  290. if (addr > 28)
  291. {
  292. fprintf(stderr, "Invalid rate, range:0~28\n");
  293. exit(1);
  294. }
  295. zdreq.addr = addr;
  296. zdreq.cmd = ZM_IOCTL_RATE;
  297. }
  298. else if (!strcmp(argv[2], "enc"))
  299. {
  300. sscanf(argv[3], "%d", &addr);
  301. if (addr > 3)
  302. {
  303. fprintf(stderr, "Invalid encryption mode, range:0~3\n");
  304. exit(1);
  305. }
  306. if (addr == 2)
  307. {
  308. addr = 5;
  309. }
  310. else if (addr == 3)
  311. {
  312. addr = 6;
  313. }
  314. zdreq.addr = addr;
  315. zdreq.cmd = ZM_IOCTL_ENCRYPTION_MODE;
  316. }
  317. else if (!strcmp(argv[2], "txcnt"))
  318. {
  319. zdreq.cmd = ZM_IOCTL_GET_TXCNT;
  320. }
  321. else if (!strcmp(argv[2], "dagcnt"))
  322. {
  323. sscanf(argv[3], "%d", &addr);
  324. if (addr != 0 && addr != 1)
  325. {
  326. fprintf(stderr, "The value should be 0 or 1\n");
  327. exit(0);
  328. }
  329. zdreq.addr = addr;
  330. zdreq.cmd = ZM_IOCTL_GET_DEAGG_CNT;
  331. }
  332. else if (!strcmp(argv[2], "durmode"))
  333. {
  334. sscanf(argv[3], "%d", &addr);
  335. if (addr != 0 && addr != 1)
  336. {
  337. fprintf(stderr, "The Duration mode should be 0 or 1\n");
  338. exit(0);
  339. }
  340. zdreq.addr = addr;
  341. zdreq.cmd = ZM_IOCTL_DURATION_MODE;
  342. }
  343. else if (!strcmp(argv[2], "aeskey"))
  344. {
  345. unsigned char temp[16];
  346. int i;
  347. sscanf(argv[3], "%d", &addr);
  348. sscanf(argv[4], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5], &temp[6], &temp[7], &temp[8], &temp[9], &temp[10], &temp[11], &temp[12], &temp[13], &temp[14], &temp[15]);
  349. for(i = 0; i < 16; i++)
  350. {
  351. zdreq.data[i] = temp[i];
  352. }
  353. zdreq.addr = addr;
  354. zdreq.cmd = ZM_IOCTL_SET_AES_KEY;
  355. }
  356. else if (!strcmp(argv[2], "aesmode"))
  357. {
  358. sscanf(argv[3], "%d", &addr);
  359. zdreq.addr = addr;
  360. zdreq.cmd = ZM_IOCTL_SET_AES_MODE;
  361. }
  362. else if (!strcmp(argv[2], "wlanmode"))
  363. {
  364. sscanf(argv[3], "%d", &addr);
  365. zdreq.addr = addr;
  366. zdreq.cmd = ZM_IOCTL_SET_PIBSS_MODE;
  367. }
  368. else
  369. {
  370. fprintf(stderr, "error action\n");
  371. exit(1);
  372. }
  373. req.ifr_data = (char *)&zdreq;
  374. set_ioctl(sock, &req);
  375. fail:
  376. exit(0);
  377. }
  378. unsigned char asctohex(char *str)
  379. {
  380. unsigned char value;
  381. value = hex(*str) & 0x0f;
  382. value = value << 4;
  383. str++;
  384. value |= hex(*str) & 0x0f;
  385. return value;
  386. }
  387. char hex(char v)
  388. {
  389. if(isdigit(v))
  390. return v - '0';
  391. else if(isxdigit(v))
  392. return (tolower(v) - 'a' + 10);
  393. else
  394. return 0;
  395. }