From d421b7660c948c2e22798a79aa480343027243c0 Mon Sep 17 00:00:00 2001 From: Guo Wenxue <guowenxue@gmail.com> Date: Thu, 28 Mar 2019 00:09:04 +0800 Subject: [PATCH] Add tlv makefile and comment for source code --- ch8_tlv/tlv_sample.c | 21 ++++++++++++++------- ch8_tlv/makefile | 11 +++++++++++ ch8_tlv/crc-itu-t.h | 28 ++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/ch8_tlv/crc-itu-t.h b/ch8_tlv/crc-itu-t.h index 748bf6c..e054724 100644 --- a/ch8_tlv/crc-itu-t.h +++ b/ch8_tlv/crc-itu-t.h @@ -13,14 +13,38 @@ #ifndef CRC_ITU_T_H #define CRC_ITU_T_H -#define IoT_MAGIC_CRC 0x1E50 +#define MAGIC_CRC 0x1E50 extern const unsigned short crc_itu_t_table[256]; + +/** + * crc_itu_t - Compute the CRC-ITU-T for the data buffer + * + * @crc: previous CRC value, we use $IoT_MAGIC_CRC + * @buffer: data pointer + * @len: number of bytes in the buffer + * + * Returns the updated CRC value + */ +extern unsigned short crc_itu_t(unsigned short magic_crc, const unsigned char *buffer, unsigned int len); + + +/* + * ushort_to_bytes - Convert unsigned short CRC16 value to two bytes + * @bytes: two bytes CRC16 value saving buffer, buffer size must more than 2 bytes + * @crc: crc_itu_t() compute returnd value( unsigned short CRC16 checksum) + */ extern int ushort_to_bytes(unsigned char *bytes, unsigned short val); + + +/* + * bytes_to_ushort - Convert two bytes mode CRC value into unsigned short CRC16 value + * @bytes: bytes mode CRC value first byte position + * @len: bytes mode CRC value length + */ extern unsigned short bytes_to_ushort(unsigned char *bytes, int len); -extern unsigned short crc_itu_t(unsigned short crc, const unsigned char *buffer, unsigned int len); static inline unsigned short crc_itu_t_byte(unsigned short crc, const unsigned char data) { diff --git a/ch8_tlv/makefile b/ch8_tlv/makefile new file mode 100644 index 0000000..53d7f60 --- /dev/null +++ b/ch8_tlv/makefile @@ -0,0 +1,11 @@ + +BINAME=tlv_sample + +all: + gcc *.c -o ${BINAME} + +clean: + rm -f ${BINAME} + +run: all + ./${BINAME} diff --git a/ch8_tlv/tlv_sample.c b/ch8_tlv/tlv_sample.c index 97bf93a..b86184f 100644 --- a/ch8_tlv/tlv_sample.c +++ b/ch8_tlv/tlv_sample.c @@ -29,6 +29,7 @@ #define PACK_HEADER 0xFD +/* Tag definition */ enum { TAG_LOGON=1, @@ -53,6 +54,8 @@ bytes = packtlv_led(buf, sizeof(buf), ON); + /* print every byte in the buffer as HEX and corresponding charactor, + which is not printable charactor will be instead as '?' */ dump_buf(buf, bytes); bytes = packtlv_logon(buf, sizeof(buf), "iot@yun"); @@ -68,7 +71,7 @@ unsigned short crc16 = 0; int pack_len = 0; int data_len = 0; - int ofset = 0; + int ofset = 0; /* index position for the buf */ if(!buf || !pwd || size<TLV_MIN_SIZE ) { @@ -84,7 +87,8 @@ buf[ofset] = TAG_LOGON; ofset += 1; - /* $pwd too long maybe result buffer overflow, if it's too long then truncate it */ + /* $pwd too long maybe result buffer overflow, so we need check the buffer + * is large enuf or not. If buf size is not enuf we will truncate $pwd string */ if( strlen(pwd) <= size-TLV_FIXED_SIZE ) data_len = strlen(pwd); else @@ -99,8 +103,10 @@ memcpy(&buf[ofset], pwd, data_len); ofset += data_len; - /* Calc CRC16 value from Packet Head(buf[0])~ Packet Value(buf[ofset]) */ - crc16 = crc_itu_t(IoT_MAGIC_CRC, buf, ofset); + /* Calc CRC16 checksum value from Packet Head(buf[0])~ Value(buf[ofset]) */ + crc16 = crc_itu_t(MAGIC_CRC, buf, ofset); + + /* Append the 2 Bytes CRC16 checksum value into the last two bytes in packet buffer */ ushort_to_bytes(&buf[ofset], crc16); ofset += 2; @@ -132,10 +138,10 @@ /* Value */ buf[3] = (OFF==cmd) ? 0x00 : 0x01; - /* Calc CRC16 value from Packet Head(buf[0])~ Packet Value(buf[3]) */ - crc16 = crc_itu_t(IoT_MAGIC_CRC, buf, 4); + /* Calc CRC16 checksum value from Packet Head(buf[0])~ Packet Value(buf[3]) */ + crc16 = crc_itu_t(MAGIC_CRC, buf, 4); - /* Append the 2 Bytes CRC16 value into the packet buffer */ + /* Append the 2 Bytes CRC16 checksum value into the last two bytes in packet buffer */ ushort_to_bytes(&buf[4], crc16); return pack_len; @@ -167,6 +173,7 @@ "????????????????" "????????????????"; +/* print every byte in the buffer as HEX and corresponding charactor, which is not printable charactor will be instead as '?' */ void dump_buf(char *data, int len) { int rc; -- Gitblit v1.9.1