3333#include "isrpipe.h"
3434#include "mutex.h"
3535#if IS_USED (MODULE_SLIPDEV_CONFIG )
36+ #include "checksum/crc16_ccitt.h"
3637#include "net/nanocoap.h"
3738#endif
3839#include "stdio_uart.h"
@@ -43,38 +44,9 @@ mutex_t slipdev_mutex = MUTEX_INIT;
4344#endif
4445
4546#if IS_USED (MODULE_SLIPDEV_CONFIG )
46- #define COAP_STACKSIZE (1024)
47-
48- /* Magic values for the fcs */
4947/* The special init is the result of normal fcs init combined with slipmux config start (0xa9) */
5048#define SPECIAL_INIT_FCS (0x374cU)
51- #define INIT_FCS (0xffffU)
52- #define GOOD_FCS (0xf0b8U)
53-
54- static const uint16_t FCS_LOOKUP [256 ] = {
55- 0x0000 , 0x1189 , 0x2312 , 0x329b , 0x4624 , 0x57ad , 0x6536 , 0x74bf , 0x8c48 , 0x9dc1 , 0xaf5a , 0xbed3 ,
56- 0xca6c , 0xdbe5 , 0xe97e , 0xf8f7 , 0x1081 , 0x0108 , 0x3393 , 0x221a , 0x56a5 , 0x472c , 0x75b7 , 0x643e ,
57- 0x9cc9 , 0x8d40 , 0xbfdb , 0xae52 , 0xdaed , 0xcb64 , 0xf9ff , 0xe876 , 0x2102 , 0x308b , 0x0210 , 0x1399 ,
58- 0x6726 , 0x76af , 0x4434 , 0x55bd , 0xad4a , 0xbcc3 , 0x8e58 , 0x9fd1 , 0xeb6e , 0xfae7 , 0xc87c , 0xd9f5 ,
59- 0x3183 , 0x200a , 0x1291 , 0x0318 , 0x77a7 , 0x662e , 0x54b5 , 0x453c , 0xbdcb , 0xac42 , 0x9ed9 , 0x8f50 ,
60- 0xfbef , 0xea66 , 0xd8fd , 0xc974 , 0x4204 , 0x538d , 0x6116 , 0x709f , 0x0420 , 0x15a9 , 0x2732 , 0x36bb ,
61- 0xce4c , 0xdfc5 , 0xed5e , 0xfcd7 , 0x8868 , 0x99e1 , 0xab7a , 0xbaf3 , 0x5285 , 0x430c , 0x7197 , 0x601e ,
62- 0x14a1 , 0x0528 , 0x37b3 , 0x263a , 0xdecd , 0xcf44 , 0xfddf , 0xec56 , 0x98e9 , 0x8960 , 0xbbfb , 0xaa72 ,
63- 0x6306 , 0x728f , 0x4014 , 0x519d , 0x2522 , 0x34ab , 0x0630 , 0x17b9 , 0xef4e , 0xfec7 , 0xcc5c , 0xddd5 ,
64- 0xa96a , 0xb8e3 , 0x8a78 , 0x9bf1 , 0x7387 , 0x620e , 0x5095 , 0x411c , 0x35a3 , 0x242a , 0x16b1 , 0x0738 ,
65- 0xffcf , 0xee46 , 0xdcdd , 0xcd54 , 0xb9eb , 0xa862 , 0x9af9 , 0x8b70 , 0x8408 , 0x9581 , 0xa71a , 0xb693 ,
66- 0xc22c , 0xd3a5 , 0xe13e , 0xf0b7 , 0x0840 , 0x19c9 , 0x2b52 , 0x3adb , 0x4e64 , 0x5fed , 0x6d76 , 0x7cff ,
67- 0x9489 , 0x8500 , 0xb79b , 0xa612 , 0xd2ad , 0xc324 , 0xf1bf , 0xe036 , 0x18c1 , 0x0948 , 0x3bd3 , 0x2a5a ,
68- 0x5ee5 , 0x4f6c , 0x7df7 , 0x6c7e , 0xa50a , 0xb483 , 0x8618 , 0x9791 , 0xe32e , 0xf2a7 , 0xc03c , 0xd1b5 ,
69- 0x2942 , 0x38cb , 0x0a50 , 0x1bd9 , 0x6f66 , 0x7eef , 0x4c74 , 0x5dfd , 0xb58b , 0xa402 , 0x9699 , 0x8710 ,
70- 0xf3af , 0xe226 , 0xd0bd , 0xc134 , 0x39c3 , 0x284a , 0x1ad1 , 0x0b58 , 0x7fe7 , 0x6e6e , 0x5cf5 , 0x4d7c ,
71- 0xc60c , 0xd785 , 0xe51e , 0xf497 , 0x8028 , 0x91a1 , 0xa33a , 0xb2b3 , 0x4a44 , 0x5bcd , 0x6956 , 0x78df ,
72- 0x0c60 , 0x1de9 , 0x2f72 , 0x3efb , 0xd68d , 0xc704 , 0xf59f , 0xe416 , 0x90a9 , 0x8120 , 0xb3bb , 0xa232 ,
73- 0x5ac5 , 0x4b4c , 0x79d7 , 0x685e , 0x1ce1 , 0x0d68 , 0x3ff3 , 0x2e7a , 0xe70e , 0xf687 , 0xc41c , 0xd595 ,
74- 0xa12a , 0xb0a3 , 0x8238 , 0x93b1 , 0x6b46 , 0x7acf , 0x4854 , 0x59dd , 0x2d62 , 0x3ceb , 0x0e70 , 0x1ff9 ,
75- 0xf78f , 0xe606 , 0xd49d , 0xc514 , 0xb1ab , 0xa022 , 0x92b9 , 0x8330 , 0x7bc7 , 0x6a4e , 0x58d5 , 0x495c ,
76- 0x3de3 , 0x2c6a , 0x1ef1 , 0x0f78
77- };
49+ #define COAP_STACKSIZE (1024)
7850
7951static char coap_stack [COAP_STACKSIZE ];
8052#endif /* IS_USED(MODULE_SLIPDEV_CONFIG) */
@@ -460,26 +432,6 @@ static const netdev_driver_t slip_driver = {
460432};
461433
462434#if IS_USED (MODULE_SLIPDEV_CONFIG )
463- static uint16_t _fcs_part (const uint8_t * data , size_t len ) {
464- uint16_t fcs = SPECIAL_INIT_FCS ;
465- for (size_t i = 0 ; i < len ; ++ i )
466- {
467- fcs = (fcs >> 8 ) ^ FCS_LOOKUP [(fcs ^ data [i ]) & 0xff ];
468- }
469- return fcs ;
470- }
471-
472- static int check_fcs (const uint8_t * data , size_t len ) {
473- uint16_t trialfcs = _fcs_part (data , len );
474- return trialfcs == GOOD_FCS ;
475- }
476-
477- static uint16_t fcs (const uint8_t * data , size_t len ) {
478- uint16_t trialfcs = _fcs_part (data , len );
479- uint16_t result = trialfcs ^ INIT_FCS ;
480- return result ;
481- }
482-
483435static void * _coap_server_thread (void * arg )
484436{
485437 static uint8_t buf [512 ];
@@ -490,11 +442,12 @@ static void *_coap_server_thread(void *arg)
490442 while (crb_get_chunk_size (& dev -> rb_config , & len )) {
491443 crb_consume_chunk (& dev -> rb_config , buf , len );
492444
493- if (!check_fcs (buf , len )) {
445+ /* Is crc correct via Residue test */
446+ if (crc16_ccitt_fcs_update (SPECIAL_INIT_FCS , buf , len ) != 0xF0B8 ) {
494447 break ;
495448 }
496449
497- // cut off the FCS checksum at the end
450+ /* cut off the FCS checksum at the end */
498451 size_t pktlen = len - 2 ;
499452
500453 coap_pkt_t pkt ;
@@ -510,7 +463,7 @@ static void *_coap_server_thread(void *arg)
510463 break ;
511464 }
512465
513- uint16_t fcs_sum = fcs ( buf , res );
466+ uint16_t fcs_sum = crc16_ccitt_fcs_finish ( SPECIAL_INIT_FCS , buf , res );
514467
515468 slipdev_lock ();
516469 slipdev_write_byte (dev -> config .uart , SLIPDEV_CONFIG_START );
0 commit comments