93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 | 
						|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
						|
be copied by any method or incorporated into another program without
 | 
						|
the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
liability for its use in any way and conveys no license or title under
 | 
						|
any patent or copyright and makes no representation or warranty that this
 | 
						|
Information is free from patent or copyright infringement.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
/* os shim includes */
 | 
						|
#include "os_types_api.h"
 | 
						|
#include "os_mem_api.h"
 | 
						|
 | 
						|
/* common includes */
 | 
						|
#include "iot_utils_api.h"
 | 
						|
#include "iot_errno_api.h"
 | 
						|
 | 
						|
/* smart grid internal includes */
 | 
						|
#include "proto_188.h"
 | 
						|
 | 
						|
static const uint8_t proto_188_bcast_addr[PROTO_188_ADDR_LEN] =
 | 
						|
    { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
 | 
						|
 | 
						|
uint8_t proto_188_calc_cs(proto_188_header_t *hdr)
 | 
						|
{
 | 
						|
    uint8_t i, len, ret = 0;
 | 
						|
    uint8_t *data = (uint8_t *)hdr;
 | 
						|
 | 
						|
    len = sizeof(*hdr) + hdr->len;
 | 
						|
    for (i = 0; i < len; i++) {
 | 
						|
        ret += data[i];
 | 
						|
    }
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
proto_188_header_t *proto_188_format_check(uint8_t *data,
 | 
						|
    uint32_t len, uint32_t dir)
 | 
						|
{
 | 
						|
    uint32_t len_t, d_len, i = 0x0;
 | 
						|
    uint8_t *data_s = NULL;
 | 
						|
    proto_188_header_t *head;
 | 
						|
    proto_188_tailer_t *tail;
 | 
						|
    for (i = 0x0, len_t = len; i < len; i++) {
 | 
						|
        if (data[i] == PROTO_188_START_CHAR) {
 | 
						|
            data_s = data + i;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        len_t--;
 | 
						|
    }
 | 
						|
    if (data_s == NULL
 | 
						|
        || len_t < sizeof(proto_188_header_t)) {
 | 
						|
        goto drop;
 | 
						|
    }
 | 
						|
    head = (proto_188_header_t *)data_s;
 | 
						|
    if (head->start_char != PROTO_188_START_CHAR) {
 | 
						|
        goto drop;
 | 
						|
    }
 | 
						|
    d_len = head->len;
 | 
						|
    if (len_t < (sizeof(proto_188_header_t) + d_len +
 | 
						|
        sizeof(proto_188_tailer_t))) {
 | 
						|
        goto drop;
 | 
						|
    }
 | 
						|
    tail = (proto_188_tailer_t*)(data_s + sizeof(*head) + d_len);
 | 
						|
    if (proto_188_calc_cs(head) != tail->cs) {
 | 
						|
        goto drop;
 | 
						|
    }
 | 
						|
    if (tail->end_char != PROTO_188_END_CHAR)
 | 
						|
        goto drop;
 | 
						|
 | 
						|
    if (head->control.dir != dir) {
 | 
						|
        goto drop;
 | 
						|
    }
 | 
						|
    goto out;
 | 
						|
drop:
 | 
						|
    data_s = NULL;
 | 
						|
out:
 | 
						|
    return (proto_188_header_t *)data_s;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t proto_188_is_bcast(uint8_t* dst)
 | 
						|
{
 | 
						|
    return os_mem_cmp(dst, proto_188_bcast_addr, PROTO_188_ADDR_LEN) ==
 | 
						|
        0 ? 1 : 0;
 | 
						|
}
 | 
						|
 |