You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.4 KiB
145 lines
4.4 KiB
/*
|
|
* 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)
|
|
|