| /* |
| * include/vservices/protocol/core.h |
| * |
| * Copyright (c) 2012-2018 General Dynamics |
| * Copyright (c) 2014 Open Kernel Labs, Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * These are the common generated definitions for the core protocol drivers; |
| * specifically the message IDs and the protocol state representation. |
| * |
| * This is currently hand-generated, but will eventually be autogenerated, |
| * from the protocol specifications in core.vs. Please keep it consistent |
| * with that file. |
| */ |
| |
| #define VSERVICE_CORE_PROTOCOL_NAME "com.ok-labs.core" |
| #define VSERVICE_CORE_PARAM_SIZE_SERVICE_INFO__PROTOCOL_NAME 32 |
| #define VSERVICE_CORE_PARAM_SIZE_SERVICE_INFO__SERVICE_NAME 16 |
| |
| /* |
| * Identifiers for in-band messages. |
| * |
| * This definition applies in both directions, because there is no practical |
| * limit on message IDs (services are unlikely to define 2^16 distinct message |
| * names). |
| */ |
| typedef enum { |
| /** simple_protocol core **/ |
| /* message out startup */ |
| VSERVICE_CORE_MSG_STARTUP, |
| |
| /* message out shutdown */ |
| VSERVICE_CORE_MSG_SHUTDOWN, |
| |
| /* command in sync connect */ |
| VSERVICE_CORE_REQ_CONNECT, |
| VSERVICE_CORE_ACK_CONNECT, |
| VSERVICE_CORE_NACK_CONNECT, |
| |
| /* command in sync disconnect */ |
| VSERVICE_CORE_REQ_DISCONNECT, |
| VSERVICE_CORE_ACK_DISCONNECT, |
| VSERVICE_CORE_NACK_DISCONNECT, |
| |
| /* command in service_count */ |
| VSERVICE_CORE_REQ_SERVICE_COUNT, |
| VSERVICE_CORE_ACK_SERVICE_COUNT, |
| VSERVICE_CORE_NACK_SERVICE_COUNT, |
| |
| /* command in queued service_info */ |
| VSERVICE_CORE_REQ_SERVICE_INFO, |
| VSERVICE_CORE_ACK_SERVICE_INFO, |
| VSERVICE_CORE_NACK_SERVICE_INFO, |
| |
| /* message inout service_reset */ |
| VSERVICE_CORE_MSG_SERVICE_RESET, |
| |
| /* message inout service_ready */ |
| VSERVICE_CORE_MSG_SERVICE_READY, |
| |
| /* message out notification bits */ |
| VSERVICE_CORE_MSG_NOTIFICATION_BITS_INFO, |
| |
| } vservice_core_message_id_t; |
| |
| /* |
| * Notification bits are defined separately for each direction because there |
| * is relatively limited space to allocate them from (specifically, the bits in |
| * a machine word). It is unlikely but possible for a protocol to reach this |
| * limit. |
| */ |
| |
| /* Bits in the in (client -> server) notification bitmask. */ |
| typedef enum { |
| /** simple_protocol core **/ |
| /* No in notifications */ |
| |
| VSERVICE_CORE_NBIT_IN__COUNT = 0, |
| } vservice_core_nbit_in_t; |
| |
| /* Masks for the in notification bits */ |
| /* No in notifications */ |
| |
| /* Bits in the out (server -> client) notification bitmask. */ |
| typedef enum { |
| /** simple_protocol core **/ |
| /* notification out reenumerate */ |
| VSERVICE_CORE_NBIT_OUT_REENUMERATE = 0, |
| |
| VSERVICE_CORE_NBIT_OUT__COUNT, |
| } vservice_core_nbit_out_t; |
| |
| /* Masks for the out notification bits */ |
| #define VSERVICE_CORE_NMASK_OUT_REENUMERATE \ |
| (1 << VSERVICE_CORE_NBIT_OUT_REENUMERATE) |
| |
| /* Valid states of the interface's generated state machine. */ |
| typedef enum { |
| /* state offline */ |
| VSERVICE_CORE_STATE_OFFLINE = 0, |
| |
| /* state disconnected */ |
| VSERVICE_CORE_STATE_DISCONNECTED, |
| VSERVICE_CORE_STATE_DISCONNECTED__CONNECT, |
| |
| /* state connected */ |
| VSERVICE_CORE_STATE_CONNECTED, |
| VSERVICE_CORE_STATE_CONNECTED__DISCONNECT, |
| |
| /* reset offline */ |
| VSERVICE_CORE_STATE__RESET = VSERVICE_CORE_STATE_OFFLINE, |
| } vservice_core_statenum_t; |
| |
| typedef struct { |
| vservice_core_statenum_t statenum; |
| bool pending_service_count; |
| unsigned pending_service_info; |
| } vservice_core_state_t; |
| |
| #define VSERVICE_CORE_RESET_STATE (vservice_core_state_t) { \ |
| .statenum = VSERVICE_CORE_STATE__RESET, \ |
| .pending_service_count = false, \ |
| .pending_service_info = 0 } |
| |
| #define VSERVICE_CORE_STATE_IS_OFFLINE(state) ( \ |
| ((state).statenum == VSERVICE_CORE_STATE_OFFLINE)) |
| #define VSERVICE_CORE_STATE_IS_DISCONNECTED(state) ( \ |
| ((state).statenum == VSERVICE_CORE_STATE_DISCONNECTED) || \ |
| ((state).statenum == VSERVICE_CORE_STATE_DISCONNECTED__CONNECT)) |
| #define VSERVICE_CORE_STATE_IS_CONNECTED(state) ( \ |
| ((state).statenum == VSERVICE_CORE_STATE_CONNECTED) || \ |
| ((state).statenum == VSERVICE_CORE_STATE_CONNECTED__DISCONNECT)) |
| |
| #define VSERVICE_CORE_STATE_VALID(state) \ |
| VSERVICE_CORE_STATE_IS_OFFLINE(state) ? ( \ |
| ((state).pending_service_count == false) && \ |
| ((state).pending_service_info == 0)) : \ |
| VSERVICE_CORE_STATE_IS_DISCONNECTED(state) ? ( \ |
| ((state).pending_service_count == false) && \ |
| ((state).pending_service_info == 0)) : \ |
| VSERVICE_CORE_STATE_IS_CONNECTED(state) ? true : \ |
| false) |