Sebastián Pastor / EtheriosCloudConnector
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ei_packet.h Source File

ei_packet.h

00001 /*
00002  * Copyright (c) 2013 Digi International Inc.,
00003  * All rights not expressly granted are reserved.
00004  *
00005  * This Source Code Form is subject to the terms of the Mozilla Public
00006  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
00007  * You can obtain one at http://mozilla.org/MPL/2.0/.
00008  *
00009  * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
00010  * =======================================================================
00011  */
00012 #ifndef _EI_PACKET_H
00013 #define _EI_PACKET_H
00014 
00015 #define field_glue(left, right)                 left ## _ ## right
00016 #define field_name(record, field)               field_glue(record,field)
00017 #define field_data(name, data)                  field_glue(name, data)
00018 
00019 #define field_named_data(record, field, data)   field_data(field_name(record, field), data)
00020 
00021 #define field_allocate(name, type)              field_data(name, offset), \
00022                                                 field_data(name, size) = (sizeof(type)), \
00023                                                 field_data(name, next) = (field_data(name, offset) + field_data(name, size) - 1)
00024 
00025 #define field_define(record, field, type)       field_allocate(field_name(record, field), type)
00026 
00027 #define field_allocate_array(name, bytes)       field_data(name, offset), \
00028                                                 field_data(name, size) = (bytes), \
00029                                                 field_data(name, next) = (field_data(name, offset) + field_data(name, size) - 1)
00030 
00031 #define field_define_array(record, field, count) field_allocate_array(field_name(record, field), count)
00032 
00033 #define record_end(name)                        field_data(name, bytes)
00034 
00035 #define record_bytes(name)                      field_data(name, bytes)
00036 
00037 #if (defined CONNECTOR_HAS_64_BIT_INTEGERS)
00038 #define message_store_be64(record, field, value) \
00039 do { \
00040     ASSERT(field_named_data(record, field, size) == sizeof (uint64_t)); \
00041     StoreBE64(record + field_named_data(record, field, offset), (value)); \
00042 } while (0)
00043 #endif
00044 
00045 #define message_store_be32(record, field, value) \
00046     do { \
00047         ASSERT(field_named_data(record, field, size) == sizeof (uint32_t)); \
00048         StoreBE32(record + field_named_data(record, field, offset), (value)); \
00049     } while (0)
00050 
00051 #define message_store_be16(record, field, value) \
00052     do { \
00053         ASSERT(field_named_data(record, field, size) == sizeof (uint16_t)); \
00054         StoreBE16(record + field_named_data(record, field, offset), (value)); \
00055     } while (0)
00056 
00057 #define message_store_u8(record, field, value) \
00058     do { \
00059         ASSERT(field_named_data(record, field, size) == sizeof (uint8_t)); \
00060         *(record + field_named_data(record, field, offset)) = (value); \
00061     } while (0)
00062 
00063 #define message_store_array(record, field, value, array) \
00064     do { \
00065         ASSERT(field_named_data(record, field, size) == array); \
00066         memcpy((record + field_named_data(record, field, offset)), (value), array); \
00067     } while (0)
00068 
00069 #if (defined CONNECTOR_DEBUG)
00070 #define message_load_be32(record, field) (ASSERT(field_named_data(record, field, size) == sizeof (uint32_t)), LoadBE32(record + field_named_data(record, field, offset)))
00071 #define message_load_be16(record, field) (ASSERT(field_named_data(record, field, size) == sizeof (uint16_t)), LoadBE16(record + field_named_data(record, field, offset)))
00072 #define message_load_u8(record, field) (ASSERT(field_named_data(record, field, size) == sizeof (uint8_t)), *(record + field_named_data(record, field, offset)))
00073 #else
00074 #define message_load_be32(record, field) LoadBE32(record + field_named_data(record, field, offset))
00075 #define message_load_be16(record, field) LoadBE16(record + field_named_data(record, field, offset))
00076 #define message_load_u8(record, field) *(record + field_named_data(record, field, offset))
00077 #endif
00078 
00079 #define PACKET_EDP_PROTOCOL_SIZE        ((size_t)record_bytes(edp_protocol))
00080 #define PACKET_EDP_HEADER_SIZE          ((size_t)record_bytes(edp_header))
00081 #define PACKET_EDP_FACILITY_SIZE        (PACKET_EDP_PROTOCOL_SIZE + PACKET_EDP_HEADER_SIZE)
00082 
00083 /* private definitions */
00084 enum edp_header {
00085     field_define(edp_header, type, uint16_t),
00086     field_define(edp_header, length, uint16_t),
00087     record_end(edp_header)
00088 };
00089 
00090 enum edp_protocol {
00091     field_define(edp_protocol, sec_coding, uint8_t),
00092     field_define(edp_protocol, payload, uint8_t),
00093     field_define(edp_protocol, facility, uint16_t),
00094     record_end(edp_protocol)
00095 };
00096 
00097 
00098 #endif
00099