blob: 3a86af5a5ec86b515b1c59141e3e52eaed852a16 [file] [log] [blame]
/*
* 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)