⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r64_endec.h

📁 wimax bs simulator对应的GUI程序
💻 H
字号:
/**********************************************************************************    Copyright (c) 2007, UTStarcom, Inc.**            All Rights Reserved.****    Subsystem : Wimax BS**    File      : r64_endec.h**    Created By: scott.wang**    Created On: 1/5/2007****    Purpose:**        This file define R64 message structure.**    History:**    Programmer  Date       Rev     Description**    Scott.wang   1/18/2007   0.0     Creating file******************************************************************************/#ifndef _R64_ENDEC_H_#define _R64_ENDEC_H_/* #define R64_ENDEC_DEBUG */#define R64_R4_HEADER_LEN sizeof(R64_R4_HEADER_S)#define R64_R6_HEADER_LEN sizeof(R64_R6_HEADER_S)#define R64_TLV_TL_LEN    4#define R64_T_SRC_ID      0xF001#define R64_T_DST_ID      0xF002#define R6_UDP_PORT       6021#define R4_UDP_PORT       2231#define R64_TLV_HEADER_LEN sizeof(R64_TLV_HEADER_S)#define R64_PRINT_MAX_STR_LEN 512typedef struct _R64_TLV_HEADER{	WORD w_type;	/* The length of the value portion of the TLV, the type and length field are not included.*/	WORD w_len;}R64_TLV_HEADER_S;typedef struct _R64_R6_HEADER_{	BYTE b_ver;	BYTE b_flags;	BYTE b_function_type;	BYTE b_msg_type;	/* The length of the message (including the header) in bytes. This field is 2 bytes long.*/	WORD w_len;	BYTE ab_msid[R64_MSID_LENGTH];	BYTE ab_rsvd[4];	WORD w_transaction_id;	BYTE b_rsvd;	BYTE b_fragment_id;}R64_R6_HEADER_S;typedef struct _R64_R4_HEADER_{	BYTE b_ver;	BYTE b_flags;	BYTE b_function_type;	BYTE b_msg_type;	/* The length of the message (including the header) in bytes. This field is 2 bytes long.*/	WORD w_len;	BYTE ab_msid[R64_MSID_LENGTH];	BYTE ab_rsvd[4];	WORD w_transaction_id;	BYTE b_rsvd;	BYTE b_fragment_id;	WORD w_src_id_type;	WORD w_src_id_len;	DWORD dw_src_entity_id;	WORD w_dst_id_type;	WORD w_dst_id_len;	DWORD dw_dst_entity_id;}R64_R4_HEADER_S;#define R64_MAX_FUNCTION_TYPE 10#define R64_MAX_MSG_TYPE      17#define REAL_STR_DEF(S) #S#define STR_DEF(S) REAL_STR_DEF(S)#define PRINT_SIZE(a) printf("%40s size: %d\n", STR_DEF(a), (int)sizeof(a));#ifdef R64_ENDEC_DEBUG#define R64_MAX_ERROR_LINE 10000typedef struct _R64_ENDEC_ERROR_LINE_{	DWORD dw_index;	DWORD adw_line[R64_MAX_ERROR_LINE];}R64_ENDEC_ERROR_LINE_S;extern R64_ENDEC_ERROR_LINE_S gst_encode_error_line;extern R64_ENDEC_ERROR_LINE_S gst_decode_error_line;#define R64_SAVE_ENCODE_ERROR_LINE \{ \	if (gst_encode_error_line.dw_index >= R64_MAX_ERROR_LINE) \	{ \		gst_encode_error_line.dw_index = 0;\	} \	gst_encode_error_line.adw_line[gst_encode_error_line.dw_index] = __LINE__;\	gst_encode_error_line.dw_index++;\}#define R64_SAVE_DECODE_ERROR_LINE \{ \	if (gst_decode_error_line.dw_index >= R64_MAX_ERROR_LINE) \	{ \		gst_decode_error_line.dw_index = 0;\	} \	gst_decode_error_line.adw_line[gst_decode_error_line.dw_index] = __LINE__;\	gst_decode_error_line.dw_index++;\}#else#define R64_SAVE_ENCODE_ERROR_LINE ((void)0)#define R64_SAVE_DECODE_ERROR_LINE ((void)0)#endif#define	R64_DEC_CHK_IE_LEN_EQ(a, b)	\{\	if ((a) != (b))\	{\		printf("decode error EQ, TLV-IE len is wrong[%d-%d]. file %s, line = [%d]!\n", (int)(a), (int)(b), __FILE__, __LINE__);\		R64_SAVE_DECODE_ERROR_LINE; \		return ERROR;\	}\}#define R64_DEC_CHK_IE_LEN_LE(a, b) \{\	if ((a) > (b))\	{\		printf("decode error LE, TLV-IE len is wrong[%d-%d]. file %s, line = [%d]!\n", (int)(a), (int)(b), __FILE__, __LINE__);\		R64_SAVE_DECODE_ERROR_LINE; \		return ERROR;\	}\}/*    a: function_name;   b: p_tlv_structure   c: present   d: msg_name   e: tlv_name*/#define	R64_ENCODE_TLV(a, b, c, d, e) \{\	if (a) \	{\		i_ret = (b)((c), p_offset, &w_one_tlv_value_len);\		if (i_ret == ERROR)\		{ \			printf("encode msg %s, tlv %s error, line %d.\n", (d), (e), __LINE__);\			R64_SAVE_ENCODE_ERROR_LINE; \			return ERROR;\		}\		w_tlvs_len += w_one_tlv_value_len + R64_TLV_TL_LEN;\		p_offset += w_one_tlv_value_len + R64_TLV_TL_LEN;\	}\}#define R64_ENCODE_TLV_HEADER(type, length, addr) \{ \	WORD w_temp_value; \	BYTE * p_addr; \\	p_addr = addr; \	w_temp_value = type; \	w_temp_value = htons(w_temp_value); \	WORD_2_BYTEP(w_temp_value, p_addr); \\	p_addr += sizeof(WORD); \	w_temp_value = length; \	w_temp_value = htons(w_temp_value); \	WORD_2_BYTEP(w_temp_value, p_addr); \}/*	t: type;	a: tlv name*/#define R64_ENCODE_TLVS_HEAD(t, a) \{ \	if (w_tlvs_len == 0) \	{ \		printf("encode tlv %s error, no ie exist, line %d.\n", a, __LINE__); \		R64_SAVE_ENCODE_ERROR_LINE; \		return ERROR; \	} \	R64_ENCODE_TLV_HEADER(t, w_tlvs_len, p_tlvs_value); \}#define R64_ENCODE_SET_OFFSET_LEN \{\	e_if_type = p_r64_msg->msgHead.ifType; \	if (e_if_type == IF_TYPE_R4) \	{ \		p_offset = p_udp_msg->data + R64_R4_HEADER_LEN; \		w_msg_head_len = R64_R4_HEADER_LEN; \	} \	else \	{ \		p_offset = p_udp_msg->data + R64_R6_HEADER_LEN; \		w_msg_head_len = R64_R6_HEADER_LEN; \	}\}/*	t: type	l: length	v: value*/#define R64_ENCODE_BASIC_BYTE(t, l, v) \{ \	BYTE * p_value; \	R64_ENCODE_TLV_HEADER(t, l, p_offset); \    *pw_len = l; \	p_value = p_offset + R64_TLV_TL_LEN; \	*p_value = v; \	return OK; \}#define R64_ENCODE_BASIC_WORD(t, l, v) \{ \	BYTE * p_value; \	WORD   w_temp; \	R64_ENCODE_TLV_HEADER(t, l, p_offset); \	*pw_len = l; \	p_value = p_offset + R64_TLV_TL_LEN; \	w_temp = htons(v); \	WORD_2_BYTEP(w_temp, p_value); \	return OK; \}#define R64_ENCODE_BASIC_DWORD(t, l, v) \{ \	BYTE * p_value; \	DWORD dw_temp; \	R64_ENCODE_TLV_HEADER(t, l, p_offset); \	*pw_len = l; \	p_value = p_offset + R64_TLV_TL_LEN; \	dw_temp = (v); \	dw_temp = htonl(dw_temp); \	DWORD_2_BYTEP(dw_temp, p_value); \	return OK; \}#define R64_ENCODE_BASIC_BYTE_ARRAY(t, l, v) \{ \	BYTE * p_value; \	R64_ENCODE_TLV_HEADER(t, l, p_offset); \	*pw_len = l; \	p_value = p_offset + R64_TLV_TL_LEN; \	memcpy(p_value, v, l); \	return OK; \}#define	R64_ENCODE_BASIC_WORD_ARRAY(t, l, v) \{ \	WORD i; \	WORD w_len_tlv; \	BYTE * p_value; \	WORD w_temp; \	w_len_tlv = l * sizeof(WORD); \	R64_ENCODE_TLV_HEADER(t, w_len_tlv, p_offset); \	*pw_len = w_len_tlv; \	p_value = p_offset + R64_TLV_TL_LEN; \	for (i=0; i<l; i++)\	{\		w_temp = htons((v)[i]); \		WORD_2_BYTEP(w_temp, p_value); \		p_value += sizeof(WORD); \	} \	return OK; \}#define	R64_ENCODE_BASIC_DWORD_ARRAY(t, l, v) \{ \	WORD i; \	WORD w_len_tlv; \	BYTE * p_value; \	DWORD dw_temp; \	w_len_tlv = l * sizeof(DWORD); \	R64_ENCODE_TLV_HEADER(t, w_len_tlv, p_offset); \	*pw_len = w_len_tlv; \	p_value = p_offset + R64_TLV_TL_LEN; \	for (i=0; i<l; i++)\	{\		dw_temp = htonl((v)[i]); \		DWORD_2_BYTEP(dw_temp, p_value); \		p_value += sizeof(DWORD); \	} \	return OK; \}/* decode macro *//*	p: pointer to the data buffer	l: length	v: value	present*/#define R64_DECODE_MSG_PREPARE(a) \{\	e_if_type = p_r64_msg->msgHead.ifType; \	p_msg = &a; \	memset((char *)&p_msg->present, 0, sizeof(p_msg->present)); \	if (e_if_type == IF_TYPE_R4) \	{ \		w_tlvs_len = p_udp_msg->dataLen - R64_R4_HEADER_LEN; \		p_offset = p_udp_msg->data + R64_R4_HEADER_LEN; \	} \	else \	{ \		w_tlvs_len = p_udp_msg->dataLen - R64_R6_HEADER_LEN; \		p_offset = p_udp_msg->data + R64_R6_HEADER_LEN; \	}\	if (0 == w_tlvs_len) \	{ \		return OK; \	} \}#define R64_DECODE_MSG_SET_OFFSET_LEN \{ \	BYTEP_2_WORD(p_offset, w_type); \	BYTEP_2_WORD(p_offset+sizeof(WORD), w_one_tlv_len); \	p_value = p_offset + R64_TLV_HEADER_LEN; \	w_one_tlv_len = htons(w_one_tlv_len); \	w_type = htons(w_type); \	w_tlvs_len = w_tlvs_len - (w_one_tlv_len + R64_TLV_HEADER_LEN); \	p_offset += (w_one_tlv_len + R64_TLV_HEADER_LEN); \}#define R64_DECODE_CHK_MSG_ERROR(a) \{ \	if (i_ret == ERROR) \	{ \		R64_SAVE_DECODE_ERROR_LINE; \		printf("Decode msg %s, line %d\n", a, __LINE__); \		return ERROR; \	} \}#define R64_DECODE_BASIC_BYTE(v, l) \{ \    R64_DEC_CHK_IE_LEN_EQ(w_len, l); \    (v) = *p_offset; \    return OK; \}#define R64_DECODE_BASIC_WORD(v, l) \{ \    R64_DEC_CHK_IE_LEN_EQ(w_len, l); \	BYTEP_2_WORD(p_offset, (v)); \    (v) = ntohs(v); \    return OK; \}#define R64_DECODE_BASIC_DWORD(v, l) \{ \    R64_DEC_CHK_IE_LEN_EQ(w_len, l); \	BYTEP_2_DWORD(p_offset, (v)); \    (v) = ntohl(v); \    return OK; \}#define R64_DECODE_BASIC_BYTE_ARRAY(v, l) \{ \    R64_DEC_CHK_IE_LEN_EQ(w_len, l); \	memcpy(v, p_offset, l); \    return OK; \}#define R64_DECODE_BASIC_BYTE_ARRAY_V(v, num, max_num) \{ \    R64_DEC_CHK_IE_LEN_LE(w_len, max_num); \	memcpy(v, p_offset, w_len); \	num = w_len; \    return OK; \}#define	R64_DECODE_BASIC_WORD_ARRAY_V(v, num, max_num) \{ \	WORD i; \	BYTE * p_value; \	WORD w_num; \	if (w_len % sizeof(WORD)) \	{ \		printf("R64_DECODE_BASIC_DWORD_ARRAY, %d is illegal.\n", w_len); \		R64_SAVE_DECODE_ERROR_LINE; \		return ERROR; \	} \    R64_DEC_CHK_IE_LEN_LE(w_len, max_num * sizeof(WORD)); \	w_num = w_len/sizeof(WORD); \	num = w_num; \	p_value = p_offset;\	for (i=0; i<w_num; i++)\	{\		BYTEP_2_WORD(p_value, (v)[i]); \		(v)[i] = ntohs((v)[i]); \		p_value += sizeof(WORD); \	} \    return OK; \}#define	R64_DECODE_BASIC_DWORD_ARRAY_V(v, num, max_num) \{ \	WORD i; \	BYTE * p_value; \	WORD w_num; \	if (w_len % sizeof(DWORD)) \	{ \		printf("R64_DECODE_BASIC_DWORD_ARRAY, %d is illegal.\n", w_len); \		R64_SAVE_DECODE_ERROR_LINE; \		return ERROR; \	} \    R64_DEC_CHK_IE_LEN_LE(w_len, max_num * sizeof(DWORD)); \	w_num = w_len / sizeof(DWORD); \	num = w_num; \	p_value = p_offset;\	for (i=0; i<w_num; i++) \	{\		BYTEP_2_DWORD(p_value, (v)[i]); \		(v)[i] = ntohl((v)[i]); \		p_value += sizeof(DWORD); \	} \    return OK; \}#define R64_DECODE_TLV_PREPARE(a) \{\	w_tlvs_len = w_len; \	p_tlv = a; \	memset((char *)&p_tlv->present, 0, sizeof(p_tlv->present)); \	if (0 == w_tlvs_len) \	{ \		return OK; \	} \	if (r64_check_tlvs_len(p_offset, w_len)) \	{ \		printf("decode tlv %s r64_check_tlvs_len error, line %d\n", p_name, __LINE__); \		R64_SAVE_DECODE_ERROR_LINE; \		return ERROR; \	} \}#define R64_DECODE_TLV_SET_OFFSET_LEN R64_DECODE_MSG_SET_OFFSET_LEN#define R64_DECODE_CHK_TLV_ERROR(a) \{ \	if (i_ret == ERROR) \	{ \		printf("Decode TLV %s, line %d\n", a, __LINE__); \		R64_SAVE_DECODE_ERROR_LINE; \		return ERROR; \	} \}/* print macro */#define	R64_PRINT_TLV(a, b, c, d, e) \{\	if (a) \	{\		b(c, d, e);\	}\}#define R64_PRINT_TLVS_HEAD(t, a) \{ \}#define R64_PRINT_BASIC_BYTE(p_pre3, value) \{ \	printf("%s.%s.%s = %d\n", p_prefix1, p_prefix2, p_pre3, value);\	return;\}#define R64_PRINT_BASIC_WORD(p_pre3, value) \{ \	printf("%s.%s.%s = %d\n", p_prefix1, p_prefix2, p_pre3, value);\	return;\}#define R64_PRINT_BASIC_DWORD(p_pre3, value) \{ \	printf("%s.%s.%s = %ld\n", p_prefix1, p_prefix2, p_pre3, value);\	return;\}#define R64_PRINT_BASIC_BYTE_ARRAY(p_pre3, value, length) \{\	printf("%s.%s.%s, length %d, data: \n", p_prefix1, p_prefix2, p_pre3, length);\	r64_dump(value, length); \	return;\}#define	R64_PRINT_BASIC_WORD_ARRAY(p_pre3, value, length) \{\	int i; \	printf("%s.%s.%s: \n", p_prefix1, p_prefix2, p_pre3);\	for (i=0; i<length; i++) \	{ \	    printf("[%d] = %d\n", i, value[i]); \	} \	return;\}#define	R64_PRINT_BASIC_DWORD_ARRAY(p_pre3, value, length) \{ \	int i; \	printf("%s.%s.%s: \n", p_prefix1, p_prefix2, p_pre3);\	for (i=0; i<length; i++) \	{ \	    printf("[%d] = %ld\n", i, value[i]); \	} \	return;\}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -