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

« Back to documentation index

Show/hide line numbers rci_binary_support.h Source File

rci_binary_support.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 
00013 #include <stdarg.h>
00014 
00015 #define BINARY_RCI_ATTRIBUTE_BIT  UINT32_C(0x40)  /* bit 6 */
00016 
00017 #define BINARY_RCI_NO_VALUE        UINT32_C(0xE0)
00018 #define BINARY_RCI_TERMINATOR      UINT32_C(0xE1)
00019 
00020 #define BINARY_RCI_ERROR_INDICATOR_BIT  UINT32_C(0x1000) /* bit 12 */
00021 
00022 #define BINARY_RCI_FIELD_TYPE_INDICATOR_BIT UINT32_C(0x40) /* bit 6 */
00023 #define BINARY_RCI_FIELD_ATTRIBUTE_BIT      UINT32_C(0x400) /* bit 10 */
00024 /* #define BINARY_RCI_FIELD_ASCENDING_INDICATOR_BIT    (0x1 << 6) */
00025 
00026 /*
00027  *    7 6 5 4 3 2 1 0 bit
00028  *    0 X X X X X X X   (0 : 0x7F)
00029  *    1 0 0 X X X X X   + 1 byte followed (0: 0x1FFF)
00030  *    1 0 1 0 0 0 0 0   + 2 bytes followed (0: 0xFFFF)
00031  *    1 0 1 0 0 0 0 1   + 4 bytes followed (0: 0xFFFFFFFF)
00032  *    1 0 1 0 0 0 1 0   + 8 bytes followed (0: 0xFFFFFFFFFFFFFFFF)
00033  *    1 1 0 0 - - - -   Reserved
00034  *    1 1 1 0 0 0 0 0   NONUM (No Value)
00035  *    1 1 1 0 0 0 0 1   TRM (Terminator)
00036  */
00037 #define BINARY_RCI_SIZE_ALTERNATE_FLAG          UINT32_C(0x80) /* bit 7 */
00038 #define BINARY_RCI_SIZE_MODIFIER_MASK           UINT32_C(0x60) /* bits 6:5 */
00039 #define BINARY_RCI_SIZE_MODIFIER(value)         (rci_size_modifier_t)((value & BINARY_RCI_SIZE_MODIFIER_MASK) >> UINT32_C(5))
00040 
00041 typedef enum {
00042     binary_rci_one_follow_byte,
00043     binary_rci_multi_follow_byte,
00044     binary_rci_special_value    = 3
00045 } rci_size_modifier_t;
00046 
00047 
00048 #define BINARY_RCI_MULTI_FOLLOW_BYTE_MASK       UINT32_C(0x03)
00049 #define BINARY_RCI_MULTI_FOLLOW_BYTES(value)    (value & BINARY_RCI_MULTI_FOLLOW_BYTE_MASK)
00050 #define BINARY_RCI_SET_MULTI_FOLLOW_BYTES(value) (BINARY_RCI_SIZE_ALTERNATE_FLAG | (binary_rci_multi_follow_byte << UINT32_C(5)) |value)
00051 
00052 enum {
00053     binary_rci_two_follow_byte,
00054     binary_rci_four_follow_byte,
00055     binary_rci_eight_follow_byte
00056 };
00057 
00058 #define RCI_FLAG_GET_ALL_INSTANCES     UINT32_C(0x01)
00059 
00060 #define RCI_NO_HINT             NULL
00061 #define INVALID_ID              UINT_MAX
00062 #define INVALID_INDEX           UINT_MAX
00063 #define INVALID_COUNT           ((size_t)-1)
00064 
00065 #define ROUND_UP(value, interval)   ((value) + -(value) % (interval))
00066 
00067 #define UNHANDLED_CASES_ARE_INVALID default: ASSERT(connector_false); break;
00068 
00069 static char const nul = '\0';
00070 
00071 enum rci_ber {
00072     field_define(rci_ber, value, uint8_t),
00073     record_end(rci_ber)
00074 };
00075 
00076 enum rci_ber_u8 {
00077     field_define(rci_ber_u8, opcode, uint8_t),
00078     field_define(rci_ber_u8, value, uint8_t),
00079     record_end(rci_ber_u8)
00080 };
00081 
00082 enum rci_ber_u16 {
00083     field_define(rci_ber_u16, opcode, uint8_t),
00084     field_define(rci_ber_u16, value, uint16_t),
00085     record_end(rci_ber_u16)
00086 };
00087 
00088 enum rci_ber_u32 {
00089     field_define(rci_ber_u32, opcode, uint8_t),
00090     field_define(rci_ber_u32, value, uint32_t),
00091     record_end(rci_ber_u32)
00092 };
00093 
00094 
00095 enum
00096 {
00097     rci_field_type_none,
00098     rci_field_type_string,
00099     rci_field_type_multiline_string,
00100     rci_field_type_password,
00101     rci_field_type_int23,
00102     rci_field_type_uint32,
00103     rci_field_type_hex32,
00104     rci_field_type_0x_hex32,
00105     rci_field_type_float,
00106     rci_field_type_enum,
00107     rci_field_type_on_off = 0x0B,
00108     rci_field_type_boolean,
00109     rci_field_type_ip4,
00110     rci_field_type_fqdnv4,
00111     rci_field_type_fqdnv6,
00112     rci_field_type_datetime = 0x16
00113 };
00114 
00115 enum {
00116     rci_command_query_setting = 1,
00117     rci_command_set_setting,
00118     rci_command_query_state,
00119     rci_command_set_state
00120 };
00121 
00122 typedef enum
00123 {
00124     rci_session_start,
00125     rci_session_active,
00126     rci_session_lost
00127 } rci_session_t;
00128 
00129 typedef enum
00130 {
00131     rci_status_internal_error,  /* bad code path */
00132     rci_status_complete,        /* all done */
00133     rci_status_busy,            /* user callback returned busy */
00134     rci_status_more_input,      /* have output buffer space to process more input */
00135     rci_status_flush_output,    /* need more output space, so send out the current buffer */
00136     rci_status_error            /* error occurred, RCI service should inform messaging layer to cancel the session */
00137 } rci_status_t;
00138 
00139 typedef struct
00140 {
00141     uint8_t * data;
00142     size_t bytes;
00143     unsigned int flags;
00144 } rci_service_buffer_t;
00145 
00146 typedef struct
00147 {
00148     connector_data_t * connector_ptr;
00149     rci_service_buffer_t input;
00150     rci_service_buffer_t output;
00151 } rci_service_data_t;
00152 
00153 typedef struct
00154 {
00155     uint8_t * start;
00156     uint8_t * end;
00157     uint8_t * current;
00158 } rci_buffer_t;
00159 
00160 typedef enum
00161 {
00162     rci_parser_state_input,
00163     rci_parser_state_output,
00164     rci_parser_state_traverse,
00165     rci_parser_state_error
00166 } rci_parser_state_t;
00167 
00168 
00169 typedef enum
00170 {
00171     rci_input_state_command_id,
00172     rci_input_state_command_attribute,
00173     rci_input_state_group_id,
00174     rci_input_state_group_attribute,
00175     rci_input_state_field_id,
00176     rci_input_state_field_type,
00177     rci_input_state_field_no_value,
00178     rci_input_state_field_value,
00179     rci_input_state_done
00180 } rci_input_state_t;
00181 
00182 typedef enum
00183 {
00184     rci_output_state_command_id,
00185     rci_output_state_group_id,
00186     rci_output_state_group_attribute,
00187     rci_output_state_field_id,
00188     rci_output_state_field_value,
00189     rci_output_state_field_terminator,
00190     rci_output_state_group_terminator,
00191     rci_output_state_response_done,
00192     rci_output_state_done
00193 } rci_output_state_t;
00194 
00195 typedef enum
00196 {
00197     rci_traverse_state_none,
00198     rci_traverse_state_command_id,
00199     rci_traverse_state_group_id,
00200     rci_traverse_state_element_id,
00201     rci_traverse_state_element_end,
00202     rci_traverse_state_group_end,
00203     rci_traverse_state_all_groups,
00204     rci_traverse_state_all_group_instances,
00205     rci_traverse_state_all_elements
00206 } rci_traverse_state_t;
00207 
00208 typedef enum
00209 {
00210     rci_traverse_process_group,
00211     rci_traverse_process_element,
00212     rci_traverse_process_next_instance
00213 } rci_traverse_process_state_t;
00214 
00215 typedef enum
00216 {
00217     rci_error_state_id,
00218     rci_error_state_description,
00219     rci_error_state_hint,
00220     rci_error_state_callback
00221 } rci_error_state_t;
00222 
00223 typedef struct
00224 {
00225     uint8_t * data;
00226     size_t length;
00227 } rcistr_t;
00228 
00229 typedef struct
00230 {
00231     rcistr_t name;
00232     rcistr_t value;
00233 } rci_attribute_t;
00234 
00235 typedef struct
00236 {
00237     rci_service_data_t * service_data;
00238     rci_status_t status;
00239     struct {
00240         connector_request_id_t request;
00241         connector_callback_status_t status;
00242     } callback;
00243 
00244     struct {
00245         rci_buffer_t input;
00246         rci_buffer_t output;
00247     } buffer;
00248 
00249     struct {
00250         rci_parser_state_t state;
00251     } parser;
00252 
00253     struct {
00254         rci_traverse_state_t state;
00255         rci_traverse_process_state_t process_state;
00256     } traverse;
00257 
00258     struct {
00259         rci_input_state_t state;
00260         unsigned int flag;
00261         uint8_t * destination;
00262         uint8_t storage[CONNECTOR_RCI_MAXIMUM_CONTENT_LENGTH + sizeof nul + sizeof(uint32_t)];
00263     } input;
00264 
00265     struct {
00266         rcistr_t content;
00267         rci_output_state_t state;
00268     } output;
00269 
00270     struct {
00271         rci_error_state_t state;
00272         connector_bool_t command_error;
00273         char const * description;
00274     } error;
00275 
00276     struct {
00277         rcistr_t content;
00278 
00279         struct {
00280             unsigned int id;
00281             unsigned int index;
00282         } group;
00283 
00284         struct {
00285             unsigned int id;
00286         } element;
00287 
00288         connector_element_value_t value;
00289         size_t string_value_length;
00290 
00291         connector_remote_config_t callback_data;
00292     } shared;
00293 } rci_t;
00294 
00295 #define set_rci_input_flag(rci, value)     (rci)->input.flag |= (value)
00296 #define is_rci_input_flag(rci, value)      (((rci)->input.flag & (value)) == (value))
00297 #define clea_rci_input_flag(rci, value)    (rci)->input.flag &= ~(value)
00298 
00299 #define set_rci_input_state(rci, value)     (rci)->input.state = (value)
00300 #define get_rci_input_state(rci)            (rci)->input.state
00301 
00302 #define set_rci_traverse_state(rci, value)     (rci)->traverse.state = (value)
00303 #define get_rci_traverse_state(rci)            (rci)->traverse.state
00304 
00305 #define set_rci_output_state(rci, value)     (rci)->output.state = (value)
00306 #define get_rci_output_state(rci)            (rci)->output.state
00307 
00308 #define set_rci_error_state(rci, value)     (rci)->error.state = (value);
00309 #define get_rci_error_state(rci)            (rci)->error.state;
00310 
00311 #define set_rci_command_error(rci)          (rci)->error.command_error = connector_true;
00312 #define clear_rci_command_error(rci)        (rci)->error.command_error = connector_false;
00313 
00314