net_update.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include "FreeRTOS.h"
  4. #include "task.h"
  5. #include "queue.h"
  6. #include "board.h"
  7. #include "chip.h"
  8. #include "animation.h"
  9. #include "sfud.h"
  10. #include "romfile.h"
  11. #include "sysinfo.h"
  12. #include "mmcsd_core.h"
  13. #include "ff_stdio.h"
  14. #include "ota_update.h"
  15. #include "md5.h"
  16. #include "unzip.h"
  17. #include "FreeRTOS_Sockets.h"
  18. #include "FreeRTOS_IP.h"
  19. #include "FreeRTOS_DHCP.h"
  20. #include "iperf_task.h"
  21. #include "iot_wifi.h"
  22. #include "FreeRTOS_DHCP_Server.h"
  23. #if DEVICE_TYPE_SELECT == EMMC_FLASH
  24. #include "ff_sddisk.h"
  25. extern FF_Disk_t *sdmmc_disk;
  26. #else
  27. #include "ff_sfdisk.h"
  28. FF_Disk_t *sf_disk;
  29. #endif
  30. #ifdef NCM_UPDATE_SUPPORT
  31. #define FRAME_HEADER_MAGIC 0xA5FF5AFF
  32. #define FRAME_TAIL_MAGIC 0x5AFFA5FF
  33. #define VERSION_LEN 64
  34. #define FILENAME_LEN 128
  35. #define MD5_LEN 32
  36. #define MAX_PATH 256
  37. typedef enum {
  38. IP_CANNOT_FILE_TFR = 7111,
  39. IP_FW_CANNOT_TFR = 7121,
  40. IP_ERR_DATA_LEN = 7122,
  41. IP_ERR_OFFSET = 7123,
  42. IP_ERR_FILE_CHECK = 7141,
  43. IP_SPEED_FAIL = 7301,
  44. IP_POWER_FAIL = 7302,
  45. IP_GEAR_FAIL = 7304,
  46. IP_UPDATE_ABORT = 7411,
  47. IP_ROLL_BACK_FAIL = 7511,
  48. } ENegCode;
  49. typedef struct {
  50. uint32_t header;
  51. uint32_t type;
  52. uint32_t sub_type;
  53. uint32_t len;
  54. } HUFrame;
  55. typedef struct {
  56. uint32_t header;
  57. uint32_t type;
  58. uint32_t sub_type;
  59. uint32_t rsp_flag;
  60. uint32_t len;
  61. } IPFrame;
  62. typedef struct {
  63. char hard_partnumber[VERSION_LEN];
  64. char hard_version[VERSION_LEN];
  65. char soft_partnumber[VERSION_LEN];
  66. char soft_version[VERSION_LEN];
  67. } ReqVersionPosiRsp;
  68. typedef struct {
  69. uint32_t negative_code;
  70. } ReqVersionNegRsp;
  71. typedef struct {
  72. char file_name[FILENAME_LEN];
  73. uint32_t file_length;
  74. char file_md5[MD5_LEN];
  75. } ReqFileCheckRsp;
  76. typedef struct {
  77. char file_name[FILENAME_LEN];
  78. uint32_t file_length;
  79. char file_md5[MD5_LEN];
  80. uint32_t offset;
  81. } ReqFileWriteRsp;
  82. static Socket_t net_client_socket;
  83. #define FRAME_MAX_LEN 0x100000
  84. static int net_rev_state = 0;
  85. static int net_state_len = 0;
  86. static int net_rev_len = 0;
  87. static uint32_t net_frame_type = 0;
  88. static uint32_t net_frame_subtype = 0;
  89. static uint32_t net_frame_len = 0;
  90. static int net_toolong_frame = 0;
  91. static uint8_t *net_frame_buf;
  92. static char cur_file_md5[MD5_LEN];
  93. static char cur_file_name[MAX_PATH];
  94. static void netSendFrame(uint32_t type, uint32_t subtype, uint32_t rsp_flag, void *data, uint32_t len)
  95. {
  96. IPFrame *ipframe = NULL;
  97. uint8_t *tmp;
  98. int32_t leftsize;
  99. BaseType_t ret;
  100. u32 errcnt = 0;
  101. printf("send frame type=0x%x, subtype=0x%x, rsp_flag=%d, data=0x%x, len=%d.\n",
  102. type, subtype, rsp_flag, data, len);
  103. ipframe = (IPFrame*)pvPortMalloc(sizeof(IPFrame) + len + 4);
  104. if (ipframe) {
  105. ipframe->header = FRAME_HEADER_MAGIC;
  106. ipframe->type = type;
  107. ipframe->sub_type = subtype;
  108. ipframe->rsp_flag = rsp_flag;
  109. ipframe->len = len;
  110. tmp = (uint8_t*)ipframe + sizeof(IPFrame);
  111. if (len) {
  112. memcpy(tmp, data, len);
  113. tmp += len;
  114. }
  115. *(uint32_t *)tmp = FRAME_TAIL_MAGIC;
  116. }
  117. leftsize = sizeof(IPFrame) + len + 4;
  118. tmp = (uint8_t *)ipframe;
  119. while (leftsize > 0) {
  120. ret = FreeRTOS_send(net_client_socket, tmp, leftsize, 0);
  121. if (ret > 0) {
  122. leftsize -= ret;
  123. tmp += ret;
  124. errcnt = 0;
  125. } else {
  126. //printf("FreeRTOS_send err %d.\n", ret);
  127. TRACE_INFO("FreeRTOS_send err %d.\n", ret);
  128. if (errcnt++ > 100) {
  129. //printf("FreeRTOS_send fail.\n");
  130. TRACE_INFO("FreeRTOS_send fail.\n");
  131. break;
  132. }
  133. vTaskDelay(pdMS_TO_TICKS(10));
  134. }
  135. }
  136. vPortFree(ipframe);
  137. }
  138. static int install_update_file(char *filename)
  139. {
  140. int i;
  141. for (i = 0; i < UPFILE_TYPE_NUM; i++) {
  142. if (!strcmp(filename, g_upfilename[i])) {
  143. if (!strcmp(filename, "image.bin")) {
  144. printf("mcu image upgrade is not supported.\n");
  145. return -1;
  146. }
  147. return update_from_media(OTA_MOUNT_PATH, i);
  148. }
  149. }
  150. return -1;
  151. }
  152. static u32 create_file_err_count = 0;
  153. static void RevFrameHandler(uint32_t type, uint32_t subtype, uint8_t *data, uint32_t len)
  154. {
  155. printf("rev frame type=0x%x, subtype=0x%x, data=0x%x, len=%d.\n", type, subtype, data, len);
  156. switch (type) {
  157. case 0x70:
  158. if (subtype == 0x01) {
  159. if (1) {
  160. ReqVersionPosiRsp rsp = {0};
  161. //strcpy(rsp.hard_partnumber, "aaa");
  162. //strcpy(rsp.hard_version, "01.00.00");
  163. strcpy(rsp.soft_partnumber, "23847069");
  164. strcpy(rsp.soft_version, "SW:-.-.-");
  165. netSendFrame(0x70, 0x01, 0x01, &rsp, sizeof(rsp));
  166. } else {
  167. ReqVersionNegRsp rsp = {0};
  168. rsp.negative_code = 7011;
  169. netSendFrame(0x70, 0x01, 0x00, &rsp, sizeof(rsp));
  170. }
  171. }
  172. break;
  173. case 0x71:
  174. if (subtype == 0x01) {
  175. FF_FILE *fp = NULL;
  176. ReqFileWriteRsp rsp = {0};
  177. char filename[FILENAME_LEN+4];
  178. FF_FILE *fmd5 = NULL;
  179. char md5name[FILENAME_LEN+16];
  180. char md5[MD5_LEN];
  181. uint32_t err_code =IP_CANNOT_FILE_TFR;
  182. if (len != FILENAME_LEN + 4 + MD5_LEN && len != FILENAME_LEN + 4) {
  183. printf("invalid len %d.\n", len);
  184. netSendFrame(0x71, 0x01, 0x00, &err_code, sizeof(err_code));
  185. break;
  186. }
  187. memcpy(rsp.file_name, data, FILENAME_LEN);
  188. memcpy(&rsp.file_length, data + FILENAME_LEN, 4);
  189. if (len == FILENAME_LEN + 4 + MD5_LEN) {
  190. memcpy(rsp.file_md5, data + FILENAME_LEN + 4, MD5_LEN);
  191. memcpy(cur_file_md5, data + FILENAME_LEN + 4, MD5_LEN);
  192. } else {
  193. memset(cur_file_md5, 0, MD5_LEN);
  194. }
  195. printf("rev update file %s, length is 0x%x.\n", rsp.file_name, rsp.file_length);
  196. strcpy(md5name, OTA_MOUNT_PATH "/");
  197. strcat(md5name, rsp.file_name);
  198. strcat(md5name, ".md5");
  199. strcpy(filename, OTA_MOUNT_PATH "/");
  200. strcat(filename, rsp.file_name);
  201. fp = ff_fopen(filename, "rb");
  202. if (fp) {
  203. fmd5 = ff_fopen(md5name, "rb");
  204. if (fmd5) {
  205. ff_fread(md5, 1, MD5_LEN, fmd5);
  206. if (memcmp(md5, cur_file_md5, MD5_LEN)) {
  207. printf("md5 is not same as previous, rev new file.\n");
  208. ff_fclose(fp);
  209. ff_remove(filename);
  210. ff_fclose(fmd5);
  211. ff_remove(md5name);
  212. fmd5 = NULL;
  213. } else {
  214. printf("md5 is same as previous, continue rev.\n");
  215. rsp.offset = ff_filelength(fp);
  216. ff_fclose(fmd5);
  217. ff_fclose(fp);
  218. }
  219. } else {
  220. ff_fclose(fp);
  221. ff_remove(filename);
  222. }
  223. }
  224. if (!fmd5) {
  225. fmd5 = ff_fopen(md5name, "wb");
  226. if (!fmd5) {
  227. uint32_t err_code = IP_CANNOT_FILE_TFR;
  228. netSendFrame(0x71, 0x01, 0x00, &err_code, sizeof(err_code));
  229. if (++create_file_err_count > 3) {
  230. #if DEVICE_TYPE_SELECT == EMMC_FLASH
  231. FF_SDDiskFormatRemount(sdmmc_disk, OTA_MOUNT_PATH);
  232. #else
  233. FF_SFDiskFormatRemount(sf_disk, OTA_MOUNT_PATH);
  234. #endif
  235. create_file_err_count = 0;
  236. }
  237. break;
  238. }
  239. ff_fwrite(cur_file_md5, 1, MD5_LEN, fmd5);
  240. ff_fclose(fmd5);
  241. rsp.offset = 0;
  242. }
  243. netSendFrame(0x71, 0x01, 0x01, &rsp, sizeof(rsp));
  244. } else if (subtype == 0x02) {
  245. FF_FILE *fp;
  246. ReqFileWriteRsp rsp = {0};
  247. char filename[FILENAME_LEN + 4];
  248. uint32_t data_length;
  249. uint32_t offset;
  250. uint32_t err_code;
  251. memcpy(rsp.file_name, data, FILENAME_LEN);
  252. memcpy(&rsp.file_length, data + FILENAME_LEN, 4);
  253. memcpy(&data_length, data + FILENAME_LEN + 4, 4);
  254. memcpy(&offset, data + FILENAME_LEN + 8, 4);
  255. printf("rev update data %s, offset=0x%x, data_length=0x%x.\n",
  256. rsp.file_name, offset, data_length);
  257. if (len != FILENAME_LEN + 12 + data_length) {
  258. printf("invalid len %d.\n", len);
  259. err_code= IP_ERR_DATA_LEN;
  260. netSendFrame(0x71, 0x02, 0x00, &err_code, sizeof(err_code));
  261. break;
  262. }
  263. if (net_toolong_frame) {
  264. err_code= IP_ERR_DATA_LEN;
  265. netSendFrame(0x71, 0x02, 0x00, &err_code, sizeof(err_code));
  266. break;
  267. }
  268. strcpy(filename, OTA_MOUNT_PATH "/");
  269. strcat(filename, rsp.file_name);
  270. fp = ff_fopen(filename, "a+");
  271. if (fp) {
  272. rsp.offset = ff_filelength(fp);
  273. if (rsp.offset != offset) {
  274. printf("error! rev offset isn't equal to saved file length.\n");
  275. err_code= IP_FW_CANNOT_TFR;
  276. netSendFrame(0x71, 0x02, 0x00, &err_code, sizeof(err_code));
  277. } else {
  278. if (ff_fwrite(data + 140, 1, data_length, fp) == data_length) {
  279. memcpy(rsp.file_md5, cur_file_md5, MD5_LEN);
  280. netSendFrame(0x71, 0x02, 0x01, &rsp, sizeof(rsp));
  281. } else {
  282. err_code= IP_FW_CANNOT_TFR;
  283. netSendFrame(0x71, 0x02, 0x00, &err_code, sizeof(err_code));
  284. }
  285. }
  286. ff_fclose(fp);
  287. } else {
  288. printf("create %s fail.\n", filename);
  289. err_code= IP_FW_CANNOT_TFR;
  290. netSendFrame(0x71, 0x02, 0x00, &err_code, sizeof(err_code));
  291. }
  292. } else if (subtype == 0x03) {
  293. uint8_t reserved[256] = {0};
  294. printf("file transfer finished.\n");
  295. netSendFrame(0x71, 0x03, 0x01, reserved, 256);
  296. } else if (subtype == 0x04) {
  297. printf("start file check...\n");
  298. FF_FILE *fp;
  299. ReqFileCheckRsp rsp = {0};
  300. char filename[FILENAME_LEN+4];
  301. uint32_t err_code = IP_ERR_FILE_CHECK;
  302. if (len != FILENAME_LEN + 4 + MD5_LEN) {
  303. printf("invalid len %d.\n", len);
  304. netSendFrame(0x71, 0x04, 0x00, &err_code, sizeof(err_code));
  305. break;
  306. }
  307. memcpy(rsp.file_name, data, FILENAME_LEN);
  308. memcpy(&rsp.file_length, data + FILENAME_LEN, 4);
  309. memcpy(rsp.file_md5, data + FILENAME_LEN + 4, MD5_LEN);
  310. strcpy(filename, OTA_MOUNT_PATH "/");
  311. strcat(filename, rsp.file_name);
  312. fp = ff_fopen(filename, "rb");
  313. if (fp && ff_filelength(fp) == rsp.file_length) {
  314. md5_context ctx = {0};
  315. int leftsize = rsp.file_length;
  316. void *cbuf = pvPortMalloc(OTA_RW_SIZE);
  317. int rsize;
  318. unsigned char md5out[16];
  319. char md5string[MD5_LEN + 1];
  320. int i;
  321. if (cbuf) {
  322. md5_starts(&ctx);
  323. while (leftsize > 0) {
  324. rsize = leftsize > OTA_RW_SIZE ? OTA_RW_SIZE : leftsize;
  325. ff_fread(cbuf, 1, rsize, fp);
  326. md5_update(&ctx, cbuf, rsize);
  327. leftsize -= rsize;
  328. }
  329. md5_finish(&ctx, md5out);
  330. vPortFree(cbuf);
  331. for (i = 0; i < 16; i++)
  332. sprintf(md5string + 2*i, "%.2x", md5out[i]);
  333. if (!memcmp(md5string, rsp.file_md5, MD5_LEN)) {
  334. printf("file check ok.\n");
  335. ff_fclose(fp);
  336. strcpy(cur_file_name, rsp.file_name);
  337. netSendFrame(0x71, 0x04, 0x01, &rsp, sizeof(rsp));
  338. break;
  339. }
  340. }
  341. }
  342. printf("file check fail.\n");
  343. if (fp) {
  344. ff_fclose(fp);
  345. ff_remove(filename);
  346. }
  347. memset(cur_file_name, 0, MAX_PATH);
  348. netSendFrame(0x71, 0x04, 0x00, &err_code, sizeof(err_code));
  349. }
  350. break;
  351. case 0x72:
  352. if (subtype == 0x01) {
  353. } else if (subtype == 0x02) {
  354. }
  355. break;
  356. case 0x73:
  357. if (subtype == 0x01) {
  358. uint8_t reserved[256] = {0};
  359. printf("installation condition check ok\n");
  360. netSendFrame(0x73, 0x01, 0x01, reserved, 256);
  361. }
  362. break;
  363. case 0x74:
  364. if (subtype == 0x01) {
  365. uint8_t reserved[256] = {0};
  366. uint32_t err_code = IP_UPDATE_ABORT;
  367. FF_FILE *fp;
  368. unzFile zf;
  369. unz_global_info ginfo;
  370. unz_file_info finfo;
  371. char filename[256];
  372. char *buf;
  373. int leftsize, wsize;
  374. int ret;
  375. int i;
  376. char filepath[256 + 16];
  377. if (strlen(cur_file_name) == 0) {
  378. printf("not found update file.\n");
  379. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  380. break;
  381. }
  382. printf("start install update file...\n");
  383. strcpy(filepath, OTA_MOUNT_PATH "/");
  384. strcat(filepath, cur_file_name);
  385. zf = unzOpen(filepath);
  386. if (!zf) {
  387. printf("open zip file fail.\n");
  388. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  389. break;
  390. }
  391. buf = malloc(OTA_RW_SIZE);
  392. if (!buf) {
  393. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  394. break;
  395. }
  396. unzGetGlobalInfo(zf, &ginfo);
  397. for (i = 0; i < ginfo.number_entry; i++) {
  398. ret = unzGetCurrentFileInfo(zf, &finfo, filename, 256, NULL, 0, NULL, 0);
  399. if (ret != UNZ_OK) {
  400. printf("unzGetCurrentFileInfo fail.\n");
  401. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  402. break;
  403. }
  404. printf("unzip file %s.\n", filename);
  405. ret = unzOpenCurrentFile(zf);
  406. if (ret != UNZ_OK) {
  407. printf("unzOpenCurrentFile fail.\n");
  408. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  409. break;
  410. }
  411. leftsize = finfo.uncompressed_size;
  412. strcpy(filepath, OTA_MOUNT_PATH "/");
  413. strcat(filepath, filename);
  414. fp = ff_fopen(filepath, "wb");
  415. if (!fp) {
  416. printf("create %s fail.\n", filepath);
  417. unzCloseCurrentFile(zf);
  418. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  419. if (++create_file_err_count > 3) {
  420. #if DEVICE_TYPE_SELECT == EMMC_FLASH
  421. FF_SDDiskFormatRemount(sdmmc_disk, OTA_MOUNT_PATH);
  422. #else
  423. FF_SFDiskFormatRemount(sf_disk, OTA_MOUNT_PATH);
  424. #endif
  425. create_file_err_count = 0;
  426. }
  427. break;
  428. }
  429. while (leftsize > 0) {
  430. wsize = leftsize > OTA_RW_SIZE ? OTA_RW_SIZE : leftsize;
  431. unzReadCurrentFile(zf, buf, wsize);
  432. if (ff_fwrite(buf, 1, wsize, fp) != wsize) {
  433. printf("ff_fwrite fail.\n");
  434. break;
  435. }
  436. leftsize -= wsize;
  437. }
  438. ff_fclose(fp);
  439. if (leftsize > 0) {
  440. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  441. break;
  442. }
  443. if (install_update_file(filename)) {
  444. printf("install update file %s fail.\n", filename);
  445. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  446. break;
  447. }
  448. unzCloseCurrentFile(zf);
  449. ret = unzGoToNextFile(zf);
  450. if (ret != UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE) {
  451. printf("unzGoToNextFile fail.\n");
  452. netSendFrame(0x74, 0x01, 0x00, &err_code, sizeof(err_code));
  453. break;
  454. }
  455. }
  456. free(buf);
  457. unzClose(zf);
  458. if (i == ginfo.number_entry && ret == UNZ_END_OF_LIST_OF_FILE)
  459. netSendFrame(0x74, 0x01, 0x01, reserved, 256);
  460. }
  461. break;
  462. case 0x75:
  463. if (subtype == 0x01) {
  464. uint8_t reserved[256] = {0};
  465. printf("roll back ok\n");
  466. netSendFrame(0x75, 0x01, 0x01, reserved, 256);
  467. }
  468. break;
  469. }
  470. }
  471. static void RevDataHandler(uint8_t *buf, int32_t len)
  472. {
  473. int i;
  474. for (i = 0; i < len; i++) {
  475. switch (net_rev_state) {
  476. case 0: //head receive
  477. if (net_state_len == 0 && buf[i] == 0xff) {
  478. net_state_len++;
  479. } else if (net_state_len == 1 && buf[i] == 0x5a) {
  480. net_state_len++;
  481. } else if (net_state_len == 2 && buf[i] == 0xff) {
  482. net_state_len++;
  483. } else if (net_state_len == 3 && buf[i] == 0xa5) {
  484. net_rev_state++;
  485. net_state_len = 0;
  486. net_frame_type = 0;
  487. net_frame_subtype = 0;
  488. net_frame_len = 0;
  489. } else if (buf[i] == 0xff) {
  490. net_state_len = 1;
  491. } else {
  492. net_state_len = 0;
  493. }
  494. break;
  495. case 1: //type receive
  496. net_frame_type |= buf[i] << (8 * net_state_len);
  497. if (++net_state_len == 4) {
  498. net_rev_state++;
  499. net_state_len = 0;
  500. }
  501. break;
  502. case 2: //sub_type receive
  503. net_frame_subtype |= buf[i] << (8 * net_state_len);
  504. if (++net_state_len == 4) {
  505. net_rev_state++;
  506. net_state_len = 0;
  507. }
  508. break;
  509. case 3: //data len receive
  510. net_frame_len |= buf[i] << (8 * net_state_len);
  511. if (++net_state_len == 4) {
  512. if (net_frame_len > FRAME_MAX_LEN) {
  513. printf("Invalid NCM frame len 0x%x.\n", net_frame_len);
  514. net_toolong_frame = 1;
  515. } else {
  516. net_toolong_frame = 0;
  517. }
  518. if (net_frame_len == 0)
  519. net_rev_state += 2;
  520. else
  521. net_rev_state++;
  522. net_rev_len = 0;
  523. net_state_len = 0;
  524. }
  525. break;
  526. case 4: //data receive
  527. if (net_rev_len < FRAME_MAX_LEN)
  528. net_frame_buf[net_rev_len] = buf[i];
  529. if (++net_rev_len == net_frame_len)
  530. net_rev_state++;
  531. break;
  532. case 5: //tail receive
  533. if (net_state_len == 0 && buf[i] == 0xff) {
  534. net_state_len++;
  535. } else if (net_state_len == 1 && buf[i] == 0xa5) {
  536. net_state_len++;
  537. } else if (net_state_len == 2 && buf[i] == 0xff) {
  538. net_state_len++;
  539. } else if (net_state_len == 3 && buf[i] == 0x5a) {
  540. RevFrameHandler(net_frame_type, net_frame_subtype, net_frame_buf, net_frame_len);
  541. net_rev_state = 0;
  542. net_state_len = 0;
  543. } else {
  544. net_state_len = 0;
  545. }
  546. break;
  547. default:
  548. break;
  549. }
  550. }
  551. }
  552. static void set_socket_win_net(Socket_t xSockets)
  553. {
  554. WinProperties_t xWinProperties;
  555. memset(&xWinProperties, '\0', sizeof xWinProperties);
  556. xWinProperties.lTxBufSize = ipconfigIPERF_TX_BUFSIZE; /* Units of bytes. */
  557. xWinProperties.lTxWinSize = ipconfigIPERF_TX_WINSIZE; /* Size in units of MSS */
  558. xWinProperties.lRxBufSize = ipconfigIPERF_RX_BUFSIZE; /* Units of bytes. */
  559. xWinProperties.lRxWinSize = ipconfigIPERF_RX_WINSIZE; /* Size in units of MSS */
  560. FreeRTOS_setsockopt( xSockets, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProperties, sizeof( xWinProperties ) );
  561. }
  562. void print_hex(unsigned char *data, int len, const char* tag)
  563. {
  564. unsigned long i, j, l;
  565. unsigned char tmp_str[140];
  566. unsigned char tmp_str1[10];
  567. for (i = 0; i < len; i += 16) {
  568. int n ;
  569. tmp_str[0] = '\0';
  570. n = i ;
  571. for (j = 0; j < 4; j++) {
  572. l = n % 16;
  573. if (l >= 10)
  574. tmp_str[3 - j] = (unsigned char)('A' + l - 10);
  575. else
  576. tmp_str[3 - j] = (unsigned char)(l + '0');
  577. n >>= 4 ;
  578. }
  579. tmp_str[4] = '\0';
  580. strcat((char *) tmp_str, ": ");
  581. /*
  582. Output the hex bytes
  583. */
  584. for (j = i; j < (i + 16); j ++) {
  585. int m ;
  586. if (j < len) {
  587. m = ((unsigned int)((unsigned char) * (data + j))) / 16 ;
  588. if (m >= 10)
  589. tmp_str1[0] = 'A' + (unsigned char) m - 10;
  590. else
  591. tmp_str1[0] = (unsigned char) m + '0';
  592. m = ((unsigned int)((unsigned char) * (data + j))) % 16 ;
  593. if (m >= 10)
  594. tmp_str1[1] = 'A' + (unsigned char) m - 10;
  595. else
  596. tmp_str1[1] = (unsigned char) m + '0';
  597. tmp_str1[2] = '\0';
  598. strcat((char *) tmp_str, (char *) tmp_str1);
  599. strcat((char *) tmp_str, " ");
  600. } else {
  601. strcat((char *) tmp_str, " ");
  602. }
  603. }
  604. strcat((char *) tmp_str, " ");
  605. l = strlen((char *) tmp_str);
  606. /* Output the ASCII bytes */
  607. for (j = i; j < (i + 16); j++) {
  608. if (j < len) {
  609. char c = * (data + j);
  610. if (c < ' ' || c > 'z') {
  611. c = '.';
  612. }
  613. tmp_str[l ++] = c;
  614. } else {
  615. tmp_str[l ++] = ' ';
  616. }
  617. }
  618. tmp_str[l ++] = '\r';
  619. tmp_str[l ++] = '\n';
  620. tmp_str[l ++] = '\0';
  621. printf("%s\r\n", (const char *) tmp_str);
  622. }
  623. }
  624. //static uint8_t *testbuf;
  625. //static uint32_t testbuf_len = 0;
  626. static uint8_t ncm_data_buffer[65536] = {0};
  627. static int vCreateNCMUpdateServerSocket( void )
  628. {
  629. SocketSet_t xFD_Set;
  630. struct freertos_sockaddr xAddress, xRemoteAddr;
  631. Socket_t xSockets = FREERTOS_INVALID_SOCKET, xClientSocket = FREERTOS_INVALID_SOCKET;
  632. socklen_t xClientLength = sizeof( xAddress );
  633. static const TickType_t xNoTimeOut = pdMS_TO_TICKS( 10000 );
  634. BaseType_t ret = -1;
  635. BaseType_t xResult;
  636. xFD_Set = FreeRTOS_CreateSocketSet();
  637. xSockets = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
  638. configASSERT( xSockets != FREERTOS_INVALID_SOCKET );
  639. FreeRTOS_setsockopt( xSockets,
  640. 0,
  641. FREERTOS_SO_RCVTIMEO,
  642. &xNoTimeOut,
  643. sizeof( xNoTimeOut ) );
  644. set_socket_win_net(xSockets);
  645. //xAddress.sin_port = ( uint16_t ) 10003;
  646. xAddress.sin_port = FreeRTOS_htons( 10003 );
  647. FreeRTOS_bind( xSockets, &xAddress, sizeof( xAddress ) );
  648. FreeRTOS_listen( xSockets, 3 );
  649. //testbuf = pvPortMalloc(0x200000);
  650. //memset(testbuf, 0, 0x200000);
  651. while (1) {
  652. FreeRTOS_FD_CLR(xSockets, xFD_Set, eSELECT_READ);
  653. FreeRTOS_FD_SET(xSockets, xFD_Set, eSELECT_READ);
  654. if (xClientSocket && xClientSocket != FREERTOS_INVALID_SOCKET) {
  655. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  656. FreeRTOS_FD_SET( xClientSocket, xFD_Set, eSELECT_READ );
  657. }
  658. xResult = FreeRTOS_select( xFD_Set, portMAX_DELAY );
  659. if (xResult < 0) {
  660. break;
  661. }
  662. if( FreeRTOS_FD_ISSET ( xSockets, xFD_Set ) ) {
  663. xClientSocket = FreeRTOS_accept( xSockets, &xRemoteAddr, &xClientLength);
  664. if( ( xClientSocket != NULL ) && ( xClientSocket != FREERTOS_INVALID_SOCKET ) ) {
  665. char pucBuffer[32] = {0};
  666. //FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  667. //FreeRTOS_FD_SET(xClientSocket, xFD_Set, eSELECT_READ);
  668. set_socket_win_net(xClientSocket);
  669. FreeRTOS_GetRemoteAddress( xClientSocket, ( struct freertos_sockaddr * ) &xRemoteAddr );
  670. FreeRTOS_inet_ntoa(xRemoteAddr.sin_addr, pucBuffer );
  671. printf("NCM: Received a connection from %s:%u\n", pucBuffer, FreeRTOS_ntohs(xRemoteAddr.sin_port));
  672. net_client_socket = xClientSocket;
  673. net_rev_state = 0;
  674. net_state_len = 0;
  675. }
  676. continue;
  677. } else if( FreeRTOS_FD_ISSET ( xClientSocket, xFD_Set ) ) {
  678. ret = FreeRTOS_recv(xClientSocket, ncm_data_buffer, sizeof(ncm_data_buffer), 0);
  679. if (ret > 0) {
  680. printf("@@recv buf size:%d\r\n", ret);
  681. //print_hex(ncm_data_buffer, 160, NULL);
  682. //print_hex(ncm_data_buffer + ret - 16, 16, NULL);
  683. RevDataHandler(ncm_data_buffer, ret);
  684. //memcpy(testbuf + testbuf_len, ncm_data_buffer, ret);
  685. //testbuf_len += ret;
  686. } else {
  687. printf("FreeRTOS_recv err:%d\r\n", ret);
  688. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  689. FreeRTOS_closesocket(xClientSocket);
  690. xClientSocket = FREERTOS_INVALID_SOCKET;
  691. net_rev_state = 0;
  692. net_state_len = 0;
  693. continue;
  694. }
  695. }
  696. }
  697. FreeRTOS_closesocket(xClientSocket);
  698. FreeRTOS_closesocket(xSockets);
  699. return 0;
  700. }
  701. void ncm_update_demo_thread(void *param)
  702. {
  703. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  704. if(!sf_disk) {
  705. sf_disk = FF_SFDiskInit(OTA_MOUNT_PATH);
  706. if (!sf_disk) {
  707. printf("FF_SFDiskInit fail.\n");
  708. return;
  709. }
  710. }
  711. #endif
  712. net_frame_buf = pvPortMalloc(FRAME_MAX_LEN);
  713. if (!net_frame_buf) {
  714. printf("net_frame_buf malloc fail.\n");
  715. return;
  716. }
  717. vCreateNCMUpdateServerSocket();
  718. while(1)
  719. vTaskDelay(portMAX_DELAY);
  720. }
  721. void ncm_update_demo(void)
  722. {
  723. if (xTaskCreate(ncm_update_demo_thread, "ncmupdate", configMINIMAL_STACK_SIZE * 16, NULL,
  724. 1, NULL) != pdPASS) {
  725. printf("create ncm update demo task fail.\n");
  726. }
  727. }
  728. #endif