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

« Back to documentation index

Show/hide line numbers connector_sm_def.h Source File

connector_sm_def.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 CONNECTOR_SM_DEF_H
00013 #define CONNECTOR_SM_DEF_H
00014 
00015 #if (defined CONNECTOR_COMPRESSION)
00016 #include "zlib.h"
00017 #endif
00018 
00019 #include "ei_packet.h"
00020 
00021 #define SM_UDP_VERSION 0x01
00022 
00023 #if defined SM_PACKET_SIZE_UDP
00024 #if  defined CONNECTOR_SM_MULTIPART
00025 #error "SM_PACKET_SIZE_UDP cannot be override if multi-packet messaging is ON (defined CONNECTOR_SM_MULTIPART)"
00026 #endif
00027 #else
00028 #define SM_PACKET_SIZE_UDP 1472
00029 #endif
00030 
00031 #define SM_PACKET_SIZE_SMS 128
00032 #define SM_PACKET_SIZE_SMS_ENCODED ((SM_PACKET_SIZE_SMS/4) * 5)
00033 #define SM_REQUEST_ID_MASK 0x3FF  /* 10 bits */
00034 #define SM_DEFAULT_REQUEST_ID 0x01
00035 #define SM_WAIT_FOREVER     0
00036 
00037 /* NOTE: Some of these bits are tied to protocol, so please don't change them
00038          without referring to SM protocol */
00039 #define SM_ERROR               0x0001
00040 #define SM_LAST_DATA           0x0002
00041 #define SM_MULTI_PART          0x0004
00042 #define SM_RESPONSE_NEEDED     0x0008
00043 #define SM_RESPONSE_DATA       0x0010
00044 #define SM_CLIENT_OWNED        0x0020
00045 #define SM_ENCODED             0x0040
00046 #define SM_COMPRESSED          0x0080
00047 #define SM_REBOOT              0x0100
00048 #define SM_TARGET_IN_PAYLOAD   0x0200
00049 #define SM_DATA_POINT          0x8000
00050                                 
00051 #define SmIsBitSet(flag, bit) (connector_bool(((flag) & (bit)) == (bit)))
00052 #define SmIsBitClear(flag, bit) (connector_bool(((flag) & (bit)) == 0))
00053 #define SmBitSet(flag, bit) ((flag) |= (bit))
00054 #define SmBitClear(flag, bit) ((flag) &= ~(bit))
00055 
00056 #define SmIsError(flag) SmIsBitSet((flag), SM_ERROR)
00057 #define SmIsResponse(flag) SmIsBitSet((flag), SM_RESPONSE_DATA)
00058 #define SmIsResponseNeeded(flag) SmIsBitSet((flag), SM_RESPONSE_NEEDED)
00059 #define SmIsLastData(flag) SmIsBitSet((flag), SM_LAST_DATA)
00060 #define SmIsMultiPart(flag) SmIsBitSet((flag), SM_MULTI_PART)
00061 #define SmIsCompressed(flag) SmIsBitSet((flag), SM_COMPRESSED)
00062 #define SmIsClientOwned(flag) SmIsBitSet((flag), SM_CLIENT_OWNED)
00063 #define SmIsEncoded(flag) SmIsBitSet((flag), SM_ENCODED)
00064 #define SmIsReboot(flag) SmIsBitSet((flag), SM_REBOOT)
00065 #define SmIsDatapoint(flag) SmIsBitSet((flag), SM_DATA_POINT)
00066 #define SmIsTargetInPayload(flag) SmIsBitSet((flag), SM_TARGET_IN_PAYLOAD)
00067 
00068 #define SmIsRequest(flag) SmIsBitClear((flag), SM_RESPONSE_DATA)
00069 #define SmIsNotLastData(flag) SmIsBitClear((flag), SM_LAST_DATA)
00070 #define SmIsNotMultiPart(flag) SmIsBitClear((flag), SM_MULTI_PART)
00071 #define SmIsCloudOwned(flag) SmIsBitClear((flag), SM_CLIENT_OWNED)
00072 #define SmNotCompressed(flag) SmIsBitClear((flag), SM_COMPRESSED)
00073 #define SmIsNoResponseNeeded(flag) SmIsBitClear((flag), SM_RESPONSE_NEEDED)
00074 
00075 #define SmSetError(flag) SmBitSet((flag), SM_ERROR)
00076 #define SmSetResponse(flag) SmBitSet((flag), SM_RESPONSE_DATA)
00077 #define SmSetResponseNeeded(flag) SmBitSet((flag), SM_RESPONSE_NEEDED)
00078 #define SmSetLastData(flag) SmBitSet((flag), SM_LAST_DATA)
00079 #define SmSetMultiPart(flag) SmBitSet((flag), SM_MULTI_PART)
00080 #define SmSetCompressed(flag) SmBitSet((flag), SM_COMPRESSED)
00081 #define SmSetClientOwned(flag) SmBitSet((flag), SM_CLIENT_OWNED)
00082 #define SmSetEncoded(flag) SmBitSet((flag), SM_ENCODED)
00083 #define SmSetReboot(flag) SmBitSet((flag), SM_REBOOT)
00084 #define SmSetDatapoint(flag) SmBitSet((flag), SM_DATA_POINT)
00085 #define SmSetTargetInPayload(flag) SmBitSet((flag), SM_TARGET_IN_PAYLOAD)
00086 
00087 #define SmClearError(flag) SmBitClear((flag), SM_ERROR)
00088 #define SmClearResponse(flag) SmBitClear((flag), SM_RESPONSE_DATA)
00089 #define SmClearResponseNeeded(flag) SmBitClear((flag), SM_RESPONSE_NEEDED)
00090 #define SmClearLastData(flag) SmBitClear((flag), SM_LAST_DATA)
00091 #define SmClearMultiPart(flag) SmBitClear((flag), SM_MULTI_PART)
00092 #define SmClearCompressed(flag) SmBitClear((flag), SM_COMPRESSED)
00093 #define SmClearTargetInPayload(flag) SmBitClear((flag), SM_TARGET_IN_PAYLOAD)
00094 
00095 #define SMS_SERVICEID_WRAPPER_TX_SIZE     1  /* 'service-id '   */
00096 #define SMS_SERVICEID_WRAPPER_RX_SIZE     3  /* '(service-id):' */
00097 
00098 typedef enum
00099 {
00100     connector_sm_cmd_ping,
00101     connector_sm_cmd_connect,
00102     connector_sm_cmd_reboot,
00103     connector_sm_cmd_cli,
00104     connector_sm_cmd_pack,
00105     connector_sm_cmd_pad,
00106     connector_sm_cmd_config,
00107     connector_sm_cmd_data,
00108     connector_sm_cmd_no_path_data,
00109     /* Add new commands here */
00110     connector_sm_cmd_opaque_response
00111 } connector_sm_cmd_t;
00112 
00113 typedef enum
00114 {
00115     connector_sm_id_type_device_id,
00116     connector_sm_id_type_imei,
00117     connector_sm_id_type_none,
00118     connector_sm_id_type_service_id
00119 } connector_sm_id_type_t;
00120 
00121 typedef enum
00122 {
00123     connector_sm_state_get_total_length,
00124     connector_sm_state_prepare_payload,
00125     connector_sm_state_more_data,
00126     connector_sm_state_compress,
00127     connector_sm_state_prepare_segment,
00128     connector_sm_state_encoding,
00129     connector_sm_state_send_data,
00130     connector_sm_state_receive_data,
00131     connector_sm_state_decompress,
00132     connector_sm_state_process_payload,
00133     connector_sm_state_complete,
00134     connector_sm_state_error
00135 } connector_sm_state_t;
00136 
00137 typedef enum
00138 {
00139     connector_sm_error_none,
00140     connector_sm_error_in_request,
00141     connector_sm_error_unavailable,
00142     connector_sm_error_unknown,
00143     connector_sm_error_complete,
00144     connector_sm_error_cancel,
00145     connector_sm_error_timeout,
00146     connector_sm_error_no_resource
00147 } connector_sm_error_id_t;
00148 
00149 typedef struct
00150 {
00151     uint8_t * data;
00152     size_t bytes;
00153 } sm_data_block_t;
00154 
00155 typedef struct connector_sm_session_t
00156 {
00157     struct
00158     {
00159         void * context;
00160         void const * header;
00161     } user;
00162 
00163     connector_transport_t transport;
00164     connector_sm_state_t sm_state;
00165     connector_sm_cmd_t command;
00166     connector_sm_error_id_t error;
00167     unsigned long start_time;
00168     uint32_t request_id;
00169     uint32_t flags;
00170 
00171     sm_data_block_t in;
00172     size_t bytes_processed;
00173 
00174 #if (defined CONNECTOR_COMPRESSION)
00175     struct
00176     {
00177         z_stream zlib;
00178         sm_data_block_t out;
00179     } compress;
00180 #endif
00181 
00182     struct connector_sm_session_t * next;
00183     struct connector_sm_session_t * prev;
00184 
00185     struct
00186     {
00187         uint16_t * size_array;
00188         uint8_t count;
00189         uint8_t processed;
00190     } segments;
00191 } connector_sm_session_t;
00192 
00193 typedef struct connector_sm_packet_t
00194 {
00195     uint8_t * data;
00196     size_t total_bytes;
00197     size_t processed_bytes;
00198     connector_sm_session_t * pending_session;
00199 } connector_sm_packet_t;
00200 
00201 typedef struct connector_sm_data_t
00202 {
00203     connector_status_t error_code;
00204     unsigned long timeout_in_seconds;  /* 0 means wait forever */
00205 
00206     struct
00207     {
00208         size_t mtu;
00209         size_t sm_mtu_tx;
00210         size_t sm_mtu_rx;
00211         uint8_t * id;
00212         size_t id_length;
00213         connector_sm_id_type_t id_type;
00214         connector_transport_state_t state;
00215         connector_connect_auto_type_t connect_type;
00216         unsigned long int connect_at;
00217     } transport;
00218 
00219     struct
00220     {
00221         connector_close_status_t status;
00222         connector_stop_condition_t stop_condition;
00223         void * user_context;
00224         connector_bool_t callback_needed;
00225     } close;
00226 
00227     struct
00228     {
00229         connector_sm_packet_t send_packet;
00230         connector_sm_packet_t recv_packet;
00231         connector_network_handle_t * handle;
00232         connector_class_id_t class_id;
00233         connector_transport_t transport;
00234     } network;
00235 
00236     struct
00237     {
00238         void const * data;
00239         connector_initiate_request_t request;
00240         uint32_t request_id;
00241         connector_bool_t pending_internal;
00242     } pending;
00243 
00244     struct
00245     {
00246         connector_sm_session_t * head;
00247         connector_sm_session_t * tail;
00248         connector_sm_session_t * current;
00249         size_t max_sessions;
00250         size_t active_client_sessions;
00251         size_t active_cloud_sessions;
00252         size_t max_segments;
00253     } session;
00254 
00255 } connector_sm_data_t;
00256 
00257 enum sm_segment_t
00258 {
00259     field_define(segment, info, uint8_t),
00260     field_define(segment, request, uint8_t),
00261     field_define(segment, cmd_status, uint8_t),
00262     field_define(segment, crc, uint16_t),
00263     record_end(segment)
00264 };
00265 
00266 enum sm_segment0_t
00267 {
00268     field_define(segment0, info, uint8_t),
00269     field_define(segment0, request, uint8_t),
00270     field_define(segment0, segment, uint8_t),
00271     field_define(segment0, count, uint8_t),
00272     field_define(segment0, cmd_status, uint8_t),
00273     field_define(segment0, crc, uint16_t),
00274     record_end(segment0)
00275 };
00276 
00277 enum sm_segmentn_t
00278 {
00279     field_define(segmentn, info, uint8_t),
00280     field_define(segmentn, request, uint8_t),
00281     field_define(segmentn, segment, uint8_t),
00282     field_define(segmentn, crc, uint16_t),
00283     record_end(segmentn)
00284 };
00285 
00286 #endif
00287