wm_oneshot_lsd.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. #include "wm_oneshot_lsd.h"
  2. #if LSD_ONESHOT_DEBUG
  3. #define LSD_ONESHOT_DBG printf
  4. #else
  5. #define LSD_ONESHOT_DBG(s, ...)
  6. #endif
  7. #define LSD_GUIDE_DATUM 1
  8. #define LSD_DATA_OFFSET 20
  9. #define LSD_REPLY_PORT 65534
  10. #define LSD_REPLY_MAX_CNT 20
  11. #define LSD_DATA_MAX 256
  12. struct lsd_data_t{
  13. u8 data[LSD_DATA_MAX];
  14. u8 used[LSD_DATA_MAX];
  15. };
  16. struct lsd_data_coding_t{
  17. u8 data1;
  18. u8 data2;
  19. u8 seq;
  20. u8 crc;
  21. };
  22. lsd_printf_fn lsd_printf = NULL;
  23. static u8 *lsd_scan_bss;
  24. const u8 lsd_dst_addr[3] = {0x01,0x00,0x5e};
  25. u8 lsd_last_num[2] = {0,0};
  26. u16 lsd_head[2][4] = {{0,0,0,0},{0,0,0,0}};
  27. u16 lsd_byte[2][4] = {{0,0,0,0},{0,0,0,0}};
  28. u8 lsd_state = 0;
  29. u16 lsd_data_datum = 0;
  30. u8 lsd_head_cnt[2] = {0,0};
  31. u8 lsd_head_bw20 = 0;
  32. u8 lsd_byte_cnt[2] = {0,0};
  33. u8 lsd_sync_cnt = 0;
  34. u8 lsd_src_mac[6] = {0};
  35. u8 lsd_data_cnt = 0;
  36. u16 lsd_last_seq[2] = {0,0};
  37. u16 lsd_last_len = 0;
  38. u8 lsd_temp_lock = 0;
  39. struct lsd_data_t lsd_data;
  40. struct lsd_param_t lsd_param;
  41. u8 lsd_crc_value = 0;
  42. const u8 lsd_crc_table[256] = {
  43. 0x0 ,0x91 ,0xe3 ,0x72 ,0x7 ,0x96 ,0xe4 ,0x75 ,0xe ,0x9f ,0xed ,0x7c ,0x9 ,
  44. 0x98 ,0xea ,0x7b ,0x1c ,0x8d ,0xff ,0x6e ,0x1b ,0x8a ,0xf8 ,0x69 ,0x12 ,0x83 ,
  45. 0xf1 ,0x60 ,0x15 ,0x84 ,0xf6 ,0x67 ,0x38 ,0xa9 ,0xdb ,0x4a ,0x3f ,0xae ,0xdc ,
  46. 0x4d ,0x36 ,0xa7 ,0xd5 ,0x44 ,0x31 ,0xa0 ,0xd2 ,0x43 ,0x24 ,0xb5 ,0xc7 ,0x56 ,
  47. 0x23 ,0xb2 ,0xc0 ,0x51 ,0x2a ,0xbb ,0xc9 ,0x58 ,0x2d ,0xbc ,0xce ,0x5f ,0x70 ,
  48. 0xe1 ,0x93 ,0x2 ,0x77 ,0xe6 ,0x94 ,0x5 ,0x7e ,0xef ,0x9d ,0xc ,0x79 ,0xe8 ,0x9a ,
  49. 0xb ,0x6c ,0xfd ,0x8f ,0x1e ,0x6b ,0xfa ,0x88 ,0x19 ,0x62 ,0xf3 ,0x81 ,0x10 ,0x65 ,
  50. 0xf4 ,0x86 ,0x17 ,0x48 ,0xd9 ,0xab ,0x3a ,0x4f ,0xde ,0xac ,0x3d ,0x46 ,0xd7 ,0xa5 ,
  51. 0x34 ,0x41 ,0xd0 ,0xa2 ,0x33 ,0x54 ,0xc5 ,0xb7 ,0x26 ,0x53 ,0xc2 ,0xb0 ,0x21 ,0x5a ,
  52. 0xcb ,0xb9 ,0x28 ,0x5d ,0xcc ,0xbe ,0x2f ,0xe0 ,0x71 ,0x3 ,0x92 ,0xe7 ,0x76 ,0x4 ,
  53. 0x95 ,0xee ,0x7f ,0xd ,0x9c ,0xe9 ,0x78 ,0xa ,0x9b ,0xfc ,0x6d ,0x1f ,0x8e ,0xfb ,
  54. 0x6a ,0x18 ,0x89 ,0xf2 ,0x63 ,0x11 ,0x80 ,0xf5 ,0x64 ,0x16 ,0x87 ,0xd8 ,0x49 ,
  55. 0x3b ,0xaa ,0xdf ,0x4e ,0x3c ,0xad ,0xd6 ,0x47 ,0x35 ,0xa4 ,0xd1 ,0x40 ,0x32 ,
  56. 0xa3 ,0xc4 ,0x55 ,0x27 ,0xb6 ,0xc3 ,0x52 ,0x20 ,0xb1 ,0xca ,0x5b ,0x29 ,0xb8 ,
  57. 0xcd ,0x5c ,0x2e ,0xbf ,0x90 ,0x1 ,0x73 ,0xe2 ,0x97 ,0x6 ,0x74 ,0xe5 ,0x9e ,0xf ,
  58. 0x7d ,0xec ,0x99 ,0x8 ,0x7a ,0xeb ,0x8c ,0x1d ,0x6f ,0xfe ,0x8b ,0x1a ,0x68 ,0xf9 ,
  59. 0x82 ,0x13 ,0x61 ,0xf0 ,0x85 ,0x14 ,0x66 ,0xf7 ,0xa8 ,0x39 ,0x4b ,0xda ,0xaf ,0x3e ,
  60. 0x4c ,0xdd ,0xa6 ,0x37 ,0x45 ,0xd4 ,0xa1 ,0x30 ,0x42 ,0xd3 ,0xb4 ,0x25 ,0x57 ,0xc6 ,
  61. 0xb3 ,0x22 ,0x50 ,0xc1 ,0xba ,0x2b ,0x59 ,0xc8 ,0xbd ,0x2c ,0x5e ,0xcf };
  62. void lsd_crc8_init(u8 data)
  63. {
  64. lsd_crc_value = data;
  65. }
  66. void lsd_crc8_update(u8 data)
  67. {
  68. lsd_crc_value = lsd_crc_table[data ^ lsd_crc_value];
  69. }
  70. u8 lsd_crc8_get(void)
  71. {
  72. return lsd_crc_value;
  73. }
  74. u8 lsd_crc8_calc(u8 *buf, u16 len)
  75. {
  76. u16 i;
  77. lsd_crc8_init(0);
  78. for(i=0; i<len; i++)
  79. {
  80. lsd_crc8_update(buf[i]);
  81. }
  82. return lsd_crc8_get();
  83. }
  84. static int lsd_ssid_bssid_crc_match(u8 ssidCrc, u8 bssidCrc, u8 ssidLen, u8 *ssid, u8 *bssid)
  85. {
  86. int i = 0;
  87. struct tls_scan_bss_t *bss = NULL;
  88. bss = (struct tls_scan_bss_t *)lsd_scan_bss;
  89. if(bss == NULL)
  90. {
  91. return -1;
  92. }
  93. for (i = 0; i < bss->count; i++)
  94. {
  95. if ((ssidLen == bss->bss[i].ssid_len)
  96. && (ssidCrc == lsd_crc8_calc(bss->bss[i].ssid, bss->bss[i].ssid_len))
  97. && (bssidCrc == lsd_crc8_calc(bss->bss[i].bssid, 6)))
  98. {
  99. if(ssid != NULL)
  100. {
  101. memcpy(ssid, bss->bss[i].ssid, bss->bss[i].ssid_len);
  102. }
  103. memcpy(bssid, bss->bss[i].bssid, 6);
  104. return 0;
  105. }
  106. }
  107. return -1;
  108. }
  109. int tls_lsd_recv(u8 *buf, u16 data_len)
  110. {
  111. struct ieee80211_hdr *hdr = (struct ieee80211_hdr*)buf;
  112. struct lsd_data_coding_t data_coding;
  113. u8 *multicast = NULL;
  114. u8 *SrcMac = NULL;
  115. u16 i;
  116. u8 totalCrc, totalLen, pwdLen, ssidLen, ssidCrc, bssidCrc, pwdCrc, userLen;
  117. int ret;
  118. u16 frm_len;
  119. u16 guide_len;
  120. u8 tods = 0;
  121. u32 crcValue;
  122. multicast = ieee80211_get_DA(hdr);
  123. if(hdr->duration_id & 0x02) //normal mode stbc 不处理
  124. {
  125. return LSD_ONESHOT_CONTINUE;
  126. }
  127. if(0 == ieee80211_has_tods(hdr->frame_control))
  128. {
  129. return LSD_ONESHOT_CONTINUE;
  130. }
  131. //for LSD only tods
  132. if (ieee80211_is_data_qos(hdr->frame_control))
  133. {
  134. frm_len = data_len - 2;
  135. }
  136. else
  137. {
  138. frm_len = data_len;
  139. }
  140. tods = ieee80211_has_tods(hdr->frame_control);
  141. SrcMac = ieee80211_get_SA(hdr);
  142. if(memcmp(multicast, lsd_dst_addr, 3) && hdr->duration_id)
  143. {
  144. return LSD_ONESHOT_CONTINUE;
  145. }
  146. switch(lsd_state)
  147. {
  148. case 0:
  149. if ((frm_len < 60) || (frm_len > 86))
  150. {
  151. return LSD_ONESHOT_CONTINUE;
  152. }
  153. if(is_zero_ether_addr(lsd_src_mac))
  154. {
  155. memcpy(lsd_src_mac, SrcMac, 6);
  156. lsd_head_cnt[0] = lsd_head_cnt[1] = 0;
  157. lsd_head_bw20 = 0;
  158. lsd_sync_cnt = 0;
  159. lsd_last_seq[0] = lsd_last_seq[1] = 0;
  160. lsd_temp_lock = 0;
  161. memset(lsd_head, 0, sizeof(lsd_head));
  162. }
  163. else
  164. {
  165. if(memcmp(lsd_src_mac, SrcMac, 6))
  166. {
  167. memcpy(lsd_src_mac, SrcMac, 6);
  168. lsd_head_cnt[0] = lsd_head_cnt[1] = 0;
  169. lsd_head_bw20 = 0;
  170. lsd_sync_cnt = 0;
  171. lsd_last_seq[0] = lsd_last_seq[1] = 0;
  172. memset(lsd_head, 0, sizeof(lsd_head));
  173. }else{
  174. if(lsd_printf)
  175. lsd_printf("tods:%d,%d,"MACSTR"\n", tods, frm_len, MAC2STR(SrcMac));
  176. }
  177. }
  178. if (ieee80211_has_retry(hdr->frame_control) && (lsd_last_seq[tods] == hdr->seq_ctrl))
  179. {
  180. return LSD_ONESHOT_CONTINUE;
  181. }
  182. lsd_last_seq[tods] = hdr->seq_ctrl;
  183. lsd_head[tods][lsd_head_cnt[tods]] = frm_len;
  184. if(lsd_head_cnt[tods] > 0)
  185. {
  186. if(((lsd_head[tods][lsd_head_cnt[tods]]+1) != lsd_head[tods][lsd_head_cnt[tods]-1])
  187. && ((lsd_head[tods][lsd_head_cnt[tods]]-3) != lsd_head[tods][lsd_head_cnt[tods]-1]))
  188. {
  189. lsd_temp_lock = 0;
  190. lsd_head_cnt[tods] = 0;
  191. lsd_head_bw20 = 0;
  192. lsd_head[tods][0] = frm_len;
  193. }else{
  194. lsd_temp_lock = 1;
  195. }
  196. }
  197. lsd_head_cnt[tods] ++;
  198. if(0 == (hdr->duration_id&0x01))
  199. {
  200. lsd_head_bw20 ++;
  201. }
  202. if(lsd_head_cnt[tods] >= 4)
  203. {
  204. lsd_sync_cnt ++;
  205. lsd_head_cnt[tods] = 0;
  206. }
  207. if(lsd_sync_cnt >= 1)
  208. {
  209. guide_len = lsd_head[tods][0];
  210. for(i=1; i<=3; i++)
  211. {
  212. if(guide_len > lsd_head[tods][i])
  213. guide_len = lsd_head[tods][i]; //取出同步头中最小值
  214. }
  215. lsd_state = 1; //同步完成, 锁定源MAC和信道
  216. lsd_data_datum = guide_len - LSD_GUIDE_DATUM + LSD_DATA_OFFSET; //获取到基准长度
  217. if(lsd_printf)
  218. lsd_printf("lsd lock:%d\n", lsd_data_datum);
  219. if(lsd_head_bw20 >= 4)
  220. {
  221. lsd_head_bw20 = 0;
  222. return LSD_ONESHOT_CHAN_LOCKED_BW20;
  223. }
  224. else
  225. {
  226. return LSD_ONESHOT_CHAN_LOCKED_BW40;
  227. }
  228. }
  229. if(lsd_temp_lock == 1)
  230. {
  231. return LSD_ONESHOT_CHAN_TEMP_LOCKED;
  232. }
  233. break;
  234. case 1:
  235. if((frm_len >= 1024) || (frm_len < lsd_data_datum))
  236. {
  237. return LSD_ONESHOT_CONTINUE;
  238. }
  239. if(memcmp(lsd_src_mac, SrcMac, 6))
  240. {
  241. return LSD_ONESHOT_CONTINUE;
  242. }
  243. if (ieee80211_has_retry(hdr->frame_control) && (lsd_last_seq[tods] == hdr->seq_ctrl))
  244. {
  245. return LSD_ONESHOT_CONTINUE;
  246. }
  247. lsd_last_seq[tods] = hdr->seq_ctrl;
  248. if(lsd_last_num[tods] != multicast[5])
  249. {
  250. memset((u8 *)&lsd_byte[tods][0], 0, 4);
  251. lsd_byte_cnt[tods] = 0;
  252. lsd_last_num[tods] = multicast[5];
  253. }
  254. lsd_byte[tods][lsd_byte_cnt[tods]] = frm_len - lsd_data_datum;
  255. if((lsd_byte_cnt[tods]==0) && (lsd_byte[tods][0]>=256))
  256. {
  257. lsd_byte_cnt[tods] = 0;
  258. }
  259. else if((lsd_byte_cnt[tods]==1) && (0x100!=(lsd_byte[tods][1]&0x300)))
  260. {
  261. lsd_byte_cnt[tods] = 0;
  262. }
  263. else if((lsd_byte_cnt[tods]==2) && (lsd_byte[tods][2]>=256))
  264. {
  265. lsd_byte_cnt[tods] = 0;
  266. }
  267. else if((lsd_byte_cnt[tods]==3) && (0x200!=(lsd_byte[tods][3]&0x300)))
  268. {
  269. lsd_byte_cnt[tods] = 0;
  270. }
  271. else
  272. {
  273. lsd_byte_cnt[tods] ++;
  274. }
  275. if(lsd_byte_cnt[tods] >= 4)
  276. {
  277. data_coding.data1 = lsd_byte[tods][0]&0xFF;
  278. data_coding.crc = lsd_byte[tods][1]&0xFF;
  279. data_coding.data2 = lsd_byte[tods][2]&0xFF;
  280. data_coding.seq = lsd_byte[tods][3]&0xFF;
  281. if(lsd_data.used[data_coding.seq<<1] == 0)
  282. {
  283. crcValue = lsd_crc8_calc((u8 *)&data_coding, 3);
  284. if(data_coding.crc == (u8)crcValue)
  285. {
  286. if(lsd_printf)
  287. lsd_printf("%d\n", data_coding.seq);
  288. lsd_data.data[data_coding.seq<<1] = data_coding.data1;
  289. lsd_data.used[data_coding.seq<<1] = 1;
  290. lsd_data_cnt ++;
  291. lsd_data.data[(data_coding.seq<<1)+1] = data_coding.data2;
  292. lsd_data.used[(data_coding.seq<<1)+1] = 1;
  293. lsd_data_cnt ++;
  294. if(lsd_data_cnt >= LSD_DATA_MAX)
  295. {
  296. return LSD_ONESHOT_ERR;
  297. }
  298. }
  299. }
  300. lsd_byte_cnt[tods] = 0;
  301. }
  302. if(lsd_data.used[0] && lsd_data.used[1] && lsd_data.used[2])
  303. {
  304. totalLen = lsd_data.data[0];
  305. pwdLen = lsd_data.data[1];
  306. ssidLen = lsd_data.data[2];
  307. if((ssidLen > 32) || (pwdLen > 64))
  308. {
  309. return LSD_ONESHOT_ERR;
  310. }
  311. if((pwdLen==0) && (ssidLen==0) && (totalLen<=2))
  312. {
  313. if(lsd_printf)
  314. lsd_printf("totalLen:%d, ssidLen:%d, pwdLen:%d, err\n", totalLen, ssidLen, pwdLen);
  315. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  316. return LSD_ONESHOT_CONTINUE;
  317. }
  318. else if((ssidLen>0) && (pwdLen>0))
  319. {
  320. if(totalLen < pwdLen + ssidLen + 5)
  321. {
  322. if(lsd_printf)
  323. lsd_printf("totalLen:%d, ssidLen:%d, pwdLen:%d, err\n", totalLen, ssidLen, pwdLen);
  324. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  325. return LSD_ONESHOT_CONTINUE;
  326. }
  327. }
  328. else if((ssidLen>0) && (pwdLen==0))
  329. {
  330. if(totalLen < pwdLen + ssidLen + 4)
  331. {
  332. if(lsd_printf)
  333. lsd_printf("totalLen:%d, ssidLen:%d, pwdLen:%d, err\n", totalLen, ssidLen, pwdLen);
  334. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  335. return LSD_ONESHOT_CONTINUE;
  336. }
  337. }
  338. else if((ssidLen==0) && (pwdLen>0))
  339. {
  340. if(lsd_printf)
  341. lsd_printf("ssidLen:%d, pwdLen:%d, err\n", ssidLen, pwdLen);
  342. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  343. return LSD_ONESHOT_CONTINUE;
  344. }
  345. else if((ssidLen>32) || (pwdLen>64))
  346. {
  347. if(lsd_printf)
  348. lsd_printf("ssidLen:%d, pwdLen:%d, err\n", ssidLen, pwdLen);
  349. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  350. return LSD_ONESHOT_CONTINUE;
  351. }
  352. if(lsd_data_cnt >= totalLen + 2)
  353. {
  354. if(lsd_printf)
  355. lsd_printf("get all\n");
  356. totalCrc = lsd_data.data[totalLen+1];
  357. if(totalCrc != lsd_crc8_calc(&lsd_data.data[0], totalLen+1))
  358. {
  359. if(lsd_printf)
  360. lsd_printf("totalCrc err\n");
  361. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  362. return LSD_ONESHOT_CONTINUE;
  363. }
  364. if((ssidLen==0) && (pwdLen==0)) //only userData
  365. {
  366. lsd_param.ssid_len = 0;
  367. lsd_param.pwd_len = 0;
  368. lsd_param.user_len = totalLen - 2;
  369. if(lsd_param.user_len > 128)
  370. {
  371. return LSD_ONESHOT_ERR;
  372. }
  373. memcpy(lsd_param.user_data, &lsd_data.data[3], lsd_param.user_len);
  374. if(lsd_printf)
  375. lsd_printf("user data:%s\n", lsd_param.user_data);
  376. return LSD_ONESHOT_COMPLETE;
  377. }
  378. bssidCrc = lsd_data.data[3];
  379. if(pwdLen > 0)
  380. {
  381. memcpy(lsd_param.pwd, &lsd_data.data[4], pwdLen);
  382. memcpy(lsd_param.ssid, &lsd_data.data[5+pwdLen], ssidLen);
  383. ssidCrc = lsd_data.data[5+ssidLen+pwdLen];
  384. lsd_param.user_len = totalLen - pwdLen - ssidLen - 5;
  385. if(lsd_param.user_len > 128)
  386. {
  387. return LSD_ONESHOT_ERR;
  388. }
  389. memcpy(lsd_param.user_data, &lsd_data.data[6+ssidLen+pwdLen], lsd_param.user_len);
  390. }
  391. else
  392. {
  393. memcpy(lsd_param.ssid, &lsd_data.data[4+pwdLen], ssidLen);
  394. ssidCrc = lsd_data.data[4+ssidLen+pwdLen];
  395. lsd_param.user_len = totalLen - ssidLen - 4;
  396. if(lsd_param.user_len > 128)
  397. {
  398. return LSD_ONESHOT_ERR;
  399. }
  400. memcpy(lsd_param.user_data, &lsd_data.data[5+ssidLen], lsd_param.user_len);
  401. }
  402. lsd_param.ssid_len = ssidLen;
  403. lsd_param.pwd_len = pwdLen;
  404. lsd_param.total_len = totalLen;
  405. if(lsd_printf)
  406. lsd_printf("user data:%s\n", lsd_param.user_data);
  407. if(lsd_printf)
  408. lsd_printf("ssidLen:%d, ssidCrc:%02X, bssidCrc:%02X\n", ssidLen, ssidCrc, bssidCrc);
  409. lsd_ssid_bssid_crc_match(ssidCrc, bssidCrc, ssidLen, NULL, lsd_param.bssid);
  410. if(lsd_printf)
  411. lsd_printf("bssid:%02X%02X%02X%02X%02X%02X\n", lsd_param.bssid[0], lsd_param.bssid[1], lsd_param.bssid[2]
  412. , lsd_param.bssid[3], lsd_param.bssid[4], lsd_param.bssid[5]);
  413. return LSD_ONESHOT_COMPLETE;
  414. } //have no userData
  415. else if(ssidLen > 0)
  416. {
  417. if(pwdLen > 0)
  418. {
  419. userLen = totalLen - pwdLen - ssidLen - 5;
  420. if(0 == lsd_data.used[5+ssidLen+pwdLen])
  421. {
  422. return LSD_ONESHOT_CONTINUE;
  423. }
  424. ssidCrc = lsd_data.data[5+ssidLen+pwdLen];
  425. }
  426. else
  427. {
  428. userLen = totalLen - ssidLen - 4;
  429. if(0 == lsd_data.used[4+ssidLen+pwdLen])
  430. {
  431. return LSD_ONESHOT_CONTINUE;
  432. }
  433. ssidCrc = lsd_data.data[4+ssidLen+pwdLen];
  434. }
  435. if(userLen > 0) //have userData, must recv all
  436. {
  437. return LSD_ONESHOT_CONTINUE;
  438. }
  439. if(lsd_data.used[3]) //bssidCrc
  440. {
  441. bssidCrc = lsd_data.data[3];
  442. if(pwdLen > 0)
  443. {
  444. if(0 == lsd_data.used[4+pwdLen])
  445. {
  446. return LSD_ONESHOT_CONTINUE;
  447. }
  448. pwdCrc = lsd_data.data[4+pwdLen];
  449. for(i=0; i<pwdLen; i++)
  450. {
  451. if(lsd_data.used[4+i])
  452. {
  453. lsd_param.pwd[i] = lsd_data.data[4+i];
  454. }
  455. else
  456. {
  457. break;
  458. }
  459. }
  460. if(i != pwdLen)
  461. {
  462. return LSD_ONESHOT_CONTINUE;
  463. }
  464. if(pwdCrc != lsd_crc8_calc(&lsd_data.data[4], pwdLen))
  465. {
  466. if(lsd_printf)
  467. lsd_printf("pwdCrc err\n");
  468. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  469. memset(lsd_param.pwd, 0, 65);
  470. return LSD_ONESHOT_CONTINUE;
  471. }
  472. }
  473. ret = lsd_ssid_bssid_crc_match(ssidCrc, bssidCrc, ssidLen, lsd_param.ssid, lsd_param.bssid);
  474. if(ret == 0)
  475. {
  476. if(lsd_printf)
  477. lsd_printf("lsd_ssid_bssid_crc_match sucess\n");
  478. lsd_param.ssid_len = ssidLen;
  479. lsd_param.pwd_len = pwdLen;
  480. lsd_param.total_len = totalLen;
  481. return LSD_ONESHOT_COMPLETE;
  482. }
  483. }
  484. }
  485. }
  486. break;
  487. }
  488. return LSD_ONESHOT_CONTINUE;
  489. }
  490. void tls_lsd_init(u8 *scanBss)
  491. {
  492. memset((u8 *)&lsd_data, 0, sizeof(struct lsd_data_t));
  493. memset(lsd_head, 0, sizeof(lsd_head));
  494. memset(lsd_byte, 0, sizeof(lsd_byte));
  495. memset(lsd_src_mac, 0, 6);
  496. memset(&lsd_param, 0, sizeof(struct lsd_param_t));
  497. memset(lsd_last_num, 0, sizeof(lsd_last_num));
  498. lsd_temp_lock = 0;
  499. lsd_state = 0;
  500. lsd_data_datum = 0;
  501. lsd_head_bw20 = 0;
  502. memset(lsd_head_cnt, 0, sizeof(lsd_head_cnt));
  503. memset(lsd_byte_cnt, 0, sizeof(lsd_byte_cnt));
  504. lsd_sync_cnt = 0;
  505. lsd_data_cnt = 0;
  506. memset(lsd_last_seq, 0, sizeof(lsd_last_seq));
  507. lsd_scan_bss = scanBss;
  508. if(lsd_printf)
  509. lsd_printf("tls_lsd_init\n");
  510. }