/*
 * Copyright (C) 2018-2022 Intel Corporation.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 */

#ifndef _IOC_H_
#define _IOC_H_

#include <stdint.h>
#include <pthread.h>

#include <sys/queue.h>
#include <sys/epoll.h>

/*
 * Carrier Board Communication(CBC) frame definition
 * +---+---------+-----------+---------------+---------+----------+---------+
 *
 *                                          +---------------+-------------+
 *                                          | ServiceHeader | DataPayload |
 *                                          |      8b       | 24b...504b  |
 *                                          ++--------------+-------------+
 *                                                       Service Layer
 *                                                     \               /
 *                             +-------------+----------\-------------/
 *                             | Multiplexer | Priority | UpperLayer  |
 *                             |      5b     |    3b    |             |
 *                             +-------------+------------------------+
 *                                                     Address Layer
 *                                                    \            /
 * +---+---------+-----------+---------------+---------\----------/---------+
 * |SOF|Extension|FrameLength|SequenceCounter|TimeStamp|UpperLayer|CheckSum |
 * |8b |    1b   |   5b      |     2b        |32B(n/a) |          |    8b   |
 * +---+---------+-----------+---------------+---------+----------+---------+
 *                                Link Layer
 *
 */

#define CBC_SOF_VALUE		0x05	/* CBC start of frame value */
#define CBC_EXT_VALUE		0x00	/* CBC extension bit value */
#define CBC_PRIO_MASK		0x07	/* CBC priority bitmask */
#define CBC_MUX_MASK		0x1F	/* CBC muxtiplexer bitmask */
#define CBC_LEN_MASK		0x1F	/* CBC frame length bitmask */
#define CBC_SEQ_MASK		0x03	/* CBC sequence bitmask */
#define CBC_EXT_MASK		0x01	/* CBC extension bits bitmask */
#define CBC_MUX_OFFSET		3	/* CBC muxtiplexer offset */
#define CBC_SEQ_OFFSET		0	/* CBC sequence offset */
#define CBC_LEN_OFFSET		2	/* CBC service frame length offset */
#define CBC_EXT_OFFSET		7	/* CBC extension bits offset */
#define CBC_LEN_UNIT		4	/* CBC frame content in block length */
#define CBC_PRIO_OFFSET	0	/* CBC priority offset */
#define CBC_CHKSUM_SIZE	1	/* CBC checksum size */
#define CBC_GRANULARITY	4	/* CBC frame alignment */
#define CBC_LINK_HDR_SIZE	3	/* CBC link layer header size */
#define CBC_ADDR_HDR_SIZE	1	/* CBC address layser header size */
#define CBC_SRV_HDR_SIZE	1	/* CBC service layer header size */
#define CBC_MAX_FRAME_SIZE	96	/* CBC maximum frame size */
#define CBC_MIN_FRAME_SIZE	8	/* CBC mininum frame size */
#define CBC_MAX_SERVICE_SIZE	64	/* CBC maximum service size */

/*
 * Define the start positions of each layer headers.
 * CBC_SOF_POS: start of frame start byte position
 * CBC_ELS_POS: externsion, frame length and sequence start byte position
 * CBC_ADDR_POS: address protocol start byte postion
 * CBC_SRV_POS: service protocol start byte position
 * CBC_PAYLOAD_POS: CBC payload start byte position
 */
#define CBC_SOF_POS		0
#define CBC_ELS_POS	(CBC_SOF_POS + 1)
#define CBC_ADDR_POS	(CBC_SOF_POS + CBC_LINK_HDR_SIZE - CBC_CHKSUM_SIZE)
#define CBC_SRV_POS	(CBC_ADDR_POS + CBC_ADDR_HDR_SIZE)
#define CBC_PAYLOAD_POS	(CBC_SRV_POS + CBC_SRV_HDR_SIZE)

#define CBC_WK_RSN_BTN	(1 << 5)	/* CBC wakeup reason field button */
#define CBC_WK_RSN_RTC	(1 << 9)	/* CBC wakeup reason field rtc */
#define CBC_WK_RSN_DOR	(1 << 11)	/* CBC wakeup reason field cardoor */
#define CBC_WK_RSN_FS5	(1 << 22)	/* CBC wakeup reason field force S5 */
#define CBC_WK_RSN_SOC	(1 << 23)	/* CBC wakeup reason field soc */
/* CBC wakeup reason field debug channel */
#define CBC_WK_RSN_DGB  (1 << 24)

/* CBC wakeup reason filed suspend or shutdown */
#define CBC_WK_RSN_SHUTDOWN	(0)

/*
 * IOC mediator permits ignition button, cardoor, RTC, SOC and force S5 wakeup
 * reasons which comes from IOC firmware, others will be masked.
 */
#define CBC_WK_RSN_ALL \
	(CBC_WK_RSN_BTN | CBC_WK_RSN_RTC | CBC_WK_RSN_DOR | CBC_WK_RSN_SOC | \
	 CBC_WK_RSN_FS5)

/*
 * CBC ring buffer is used to buffer bytes before build one complete CBC frame.
 */
#define CBC_RING_BUFFER_SIZE	256

/*
 * Default whitelist node is NULL before whitelist initialization.
 */
#define DEFAULT_WLIST_NODE	(0)

/*
 * Default IOC channels file descriptor is -1 before open.
 */
#define IOC_INIT_FD	-1

/*
 * Maximum CBC requests number.
 */
#define IOC_MAX_REQUESTS	200

/*
 * Maximum epoll events.
 */
#define IOC_MAX_EVENTS	32

/* IOC default path */
#define IOC_DP_NONE	""

/*
 * IOC native channel path definition.
 */
#define IOC_NP_PMT	"/dev/cbc-pmt"
#define IOC_NP_LF	"/dev/cbc-lifecycle"
#define IOC_NP_SIG	"/dev/cbc-signals"
#define IOC_NP_ESIG	"/dev/cbc-early-signals"
#define IOC_NP_DIAG	"/dev/cbc-diagnosis"
#define IOC_NP_DLT	"/dev/cbc-dlt"
#define IOC_NP_LIND	"/dev/cbc-linda"
#define IOC_NP_RAW0	"/dev/cbc-raw0"
#define IOC_NP_RAW1	"/dev/cbc-raw1"
#define IOC_NP_RAW2	"/dev/cbc-raw2"
#define IOC_NP_RAW3	"/dev/cbc-raw3"
#define IOC_NP_RAW4	"/dev/cbc-raw4"
#define IOC_NP_RAW5	"/dev/cbc-raw5"
#define IOC_NP_RAW6	"/dev/cbc-raw6"
#define IOC_NP_RAW7	"/dev/cbc-raw7"
#define IOC_NP_RAW8	"/dev/cbc-raw8"
#define IOC_NP_RAW9	"/dev/cbc-raw9"
#define IOC_NP_RAW10	"/dev/cbc-raw10"
#define IOC_NP_RAW11	"/dev/cbc-raw11"
#define IOC_NP_FLF	"/tmp/ioc_fake_lifecycle"
#define IOC_NP_FSIG	"/tmp/ioc_fake_signal"
#define IOC_NP_FRAW	"/tmp/ioc_fake_raw11"

/*
 * CBC signal data command types.
 * Signal Data Message
 * +----------------+--------------+
 * | SignalDataCMD  |   Payload    |
 * |        8b      |    0~56b     |
 * +----------------+--------------+
 */
enum cbc_signal_data_command {
	CBC_SD_SINGLE_SIGNAL	= 1,	/* Single signal update */
	CBC_SD_MULTI_SIGNAL	= 2,	/* Multi signal update */
	CBC_SD_GROUP_SIGNAL	= 3,	/* Group signal update */
	CBC_SD_DEFAULT_VALUES	= 4,	/* Update default values */
	CBC_SD_UPDATE_SNA	= 5,	/* Update SNA values */
	CBC_SD_INVAL_SSIG	= 6,	/* Invalidate signal */
	CBC_SD_INVAL_MSIG	= 7,	/* Invalidate multi signals */
	CBC_SD_INVAL_SGRP	= 8,	/* Invalidate signal group */
	CBC_SD_INVAL_MGRP	= 9,	/* Invalidate muliti groups */
	CBC_SD_OPEN_CHANNEL	= 253,	/* Open signal channel */
	CBC_SD_CLOSE_CHANNEL	= 254,	/* Clsoe signal channel */
	CBC_SD_RESET_CHANNEL	= 255,	/* Reset signal channel */
	CBC_SD_MAX
};

/*
 * CBC system control command types.
 * +------------------+------------+
 * | SystemControlCMD |   Payload  |
 * |        8b        |     24b    |
 * +------------------+------------+
 */
enum cbc_system_control_command {
	CBC_SC_WK_RSN	= 1,	/* Wakeup reasons */
	CBC_SC_HB	= 2,	/* Heartbeat */
	CBC_SC_BOOTSEL	= 3,	/* Boot selector */
	CBC_SC_SPRS_HB	= 4,	/* Suppress heartbeat check */
	CBC_SC_RTC 	= 5,	/* Set RTC wakeup timer */
	CBC_SC_MAX
};

/*
 * CBC system control - heartbeat: command types.
 * Heartbeat Message
 * +------------------+---------+-----------------+------+
 * | SystemControlCMD | Command | SUS_STAT Action | Resv |
 * |        8b        |   8b    |        8b       |  8b  |
 * +------------------+---------+-----------------+------+
 */
enum cbc_heartbeat_command {
	CBC_HB_SD_PREP,	/* Shutdown prepared */
	CBC_HB_ACTIVE,	/* Active */
	CBC_HB_SD_DLY,	/* Shutdown delay */
	CBC_HB_INITIAL,	/* Initial */
	CBC_HB_STANDBY,	/* Standby */
	CBC_HB_DIAG,	/* Diagnosis */
	CBC_HB_SD_REQ,	/* Cm shutdown request */
	CBC_HB_SD_EXE,	/* Shutdown execute */
	CBC_HB_EMG_SD,	/* Mmergency shutdown execute */
	CBC_HB_MAX
};

/*
 * CBC system control - heartbeat: suspend state action types.
 */
enum cbc_sus_stat_action {
	CBC_SS_INVALID,	/* Invalid */
	CBC_SS_HALT_I0,	/* Halt */
	CBC_SS_REBOOT0,	/* Reboot */
	CBC_SS_HALT_I1,	/* Ignore once then halt */
	CBC_SS_REBOOT1,	/* Ignore once then reboot */
	CBC_SS_HALT_I2,	/* Ignore twice then halt */
	CBC_SS_REBOOT2,	/* Ignore twice then reboot */
	CBC_SS_REFRESH,	/* Ram refresh, S3 */
	CBC_SS_MAX
};

/*
 * CBC system control - RTC: command type.
 * RTC Message
 * +------------------+-------------+-------------+-------------+
 * | SystemControlCMD | Timer value | Timer value | Granularity |
 * | SVC-Header: 5    | Bits 0...7  | Bits 8...15 | 0 - seconds |
 * |                  |             |             | 1 - minutes |
 * |                  |             |             | 2 - hours   |
 * |                  |             |             | 3 - days    |
 * |                  |             |             | 4 - week    |
 * |        8b        |     8b      |     8b      |     8b      |
 * +------------------+-------------+-------------+-------------+
 */
enum cbc_rtc_timer_unit {
	CBC_RTC_TIMER_U_SEC,
	CBC_RTC_TIMER_U_MIN,
	CBC_RTC_TIMER_U_HOUR,
	CBC_RTC_TIMER_U_DAY,
	CBC_RTC_TIMER_U_WEEK,
};

/*
 * CBC rx signal identity definition.
 */
enum cbc_rx_signal_id {
	CBC_SIG_ID_STFR		= 20000,	/* SetTunerFrequency */
	CBC_SIG_ID_EGYO		= 20001,	/* EnableGyro */
	CBC_SIG_ID_WACS		= 20002,	/* WriteAmplifierConfigurationSequence*/
	CBC_SIG_ID_RIFC		= 20003,	/* RequestIocFblChecksum */
	CBC_SIG_ID_RIWC		= 20004,	/* RequestIocWfChecksum */
	CBC_SIG_ID_RIAC		= 20005,	/* RequestIocAppChecksum */
	CBC_SIG_ID_RIVS		= 20006,	/* RequestIocVersion */
	CBC_SIG_ID_RRMS		= 20007,	/* RequestRuntimeMeasurement */
	CBC_SIG_ID_MTAM		= 20008,	/* MuteAmplifier */
	CBC_SIG_ID_PBST		= 20009,	/* ParkingBrakeSetting */
	CBC_SIG_ID_PBAT		= 20010,	/* ParkingBrakeAutomaticSetting */
	CBC_SIG_ID_HFSS		= 20011,	/* HvacFanSpeedSetting */
	CBC_SIG_ID_HFDST	= 20012,	/* HvacFanDirectionSetting */
	CBC_SIG_ID_HVAST	= 20013,	/* HvacAcSetting */
	CBC_SIG_ID_HAMS		= 20014,	/* HvacAcMaxSetting */
	CBC_SIG_ID_HATST	= 20015,	/* HvacAutoSetting */
	CBC_SIG_ID_HDEFST 	= 20016,	/* HvacDefrostSetting */
	CBC_SIG_ID_HDMXST	= 20017,	/* HvacDefrostMaxSetting */
	CBC_SIG_ID_HDST		= 20018,	/* HvacDualSetting */
	CBC_SIG_ID_HHSMS	= 20019,	/* HvacHeatingSideMirrorSetting */
	CBC_SIG_ID_HHSWS	= 20020,	/* HvacHeatingSteeringWheelSetting */
	CBC_SIG_ID_HPWST	= 20021,	/* HvacPowerSetting */
	CBC_SIG_ID_HRCST	= 20022,	/* HvacRecirculationSetting */
	CBC_SIG_ID_HTCST	= 20023,	/* HvacTemperatureCabinSetting */
	CBC_SIG_ID_HTSST	= 20024,	/* HvacTemperatureSeatSetting */
	CBC_SIG_ID_HTUST	= 20025,	/* HvacTemperatureUnitsSetting */
	CBC_SIG_ID_HVSST	= 20026,	/* HvacVentilationSeatSetting */
	CBC_SIG_ID_HRAST	= 20027,	/* HvacRecirculationAutomaticSetting */
	CBC_SIG_ID_USBVBUS	= 20028,	/* SupportUsbOtgVbusControl */
	CBC_SIG_ID_VICL		= 651,		/* VideoInCtrl */
};

/*
 * CBC tx signal identity definition.
 */
enum cbc_tx_signal_id {
	CBC_SIG_ID_MBV		= 501,	/* MainBatteryVoltage */
	CBC_SIG_ID_TSA		= 502,	/* TemperatureSensorAmplifier */
	CBC_SIG_ID_TSE		= 503,	/* TemperatureSensorEnvironment */
	CBC_SIG_ID_VSWA		= 701,	/* VehicleSteeringWheelAngle */
	CBC_SIG_ID_VSPD		= 702,	/* VehicleSpeed */
	CBC_SIG_ID_VESP		= 703,	/* VehicleEngineSpeed */
	CBC_SIG_ID_VECT		= 704,	/* VehicleEngineCoolantTemp */
	CBC_SIG_ID_VRGR		= 705,	/* VehicleReverseGear */
	CBC_SIG_ID_VPS		= 706,	/* VehiclePowerStatus */
	CBC_SIG_ID_VPM		= 707,	/* VehiclePowerMode */
	CBC_SIG_ID_VMD		= 708,	/* VehicleMode */
	CBC_SIG_ID_VIS		= 709,	/* VehicleImmobilizerState */
	CBC_SIG_ID_VGP		= 710,	/* VehicleGearshiftPosition */
	CBC_SIG_ID_VAG		= 711,	/* VehicleActualGear */
	CBC_SIG_ID_VFS		= 712,	/* VehicleFuelStatus */
	CBC_SIG_ID_VFL		= 713,	/* VehicleFuelLevel */
	CBC_SIG_ID_VDTE		= 714,	/* VehicleDistanceToEmpty */
	CBC_SIG_ID_SWUB		= 715,	/* SteeringWheelUpBtn */
	CBC_SIG_ID_SWRB		= 716,	/* SteeringWheelRightBtn */
	CBC_SIG_ID_SWPB		= 717,	/* SteeringWheelPrevBtn */
	CBC_SIG_ID_SWNB		= 718,	/* SteeringWheelNextBtn */
	CBC_SIG_ID_SWLB		= 719,	/* SteeringWheelLeftBtn */
	CBC_SIG_ID_SWDB		= 720,	/* SteeringWheelDownBtn */
	CBC_SIG_ID_SWVA		= 721,	/* SteeringWheelVolumeAdjust */
	CBC_SIG_ID_SWSCB	= 722,	/* SteeringWheelSpeechCtrlBtn */
	CBC_SIG_ID_SWPLB	= 723,	/* SteeringWheelPlayBtn */
	CBC_SIG_ID_SWPCB	= 724,	/* SteeringWheelPickupCallBtn */
	CBC_SIG_ID_SWPSB	= 725,	/* SteeringWheelPauseBtn */
	CBC_SIG_ID_SWHB		= 726,	/* SteeringWheelHomeBtn */
	CBC_SIG_ID_SWEB		= 727,	/* SteeringWheelEnterBtn */
	CBC_SIG_ID_SWECB	= 728,	/* SteeringWheelEndCallBtn */
	CBC_SIG_ID_SWCB		= 729,	/* SteeringWheelConfigBtn */
	CBC_SIG_ID_SWCLB	= 730,	/* SteeringWheelCancelBtn */
	CBC_SIG_ID_SWAMB	= 731,	/* SteeringWheelAudioMuteBtn */
	CBC_SIG_ID_RRSUB	= 732,	/* RightRearSeatUpBtn */
	CBC_SIG_ID_RRSRB	= 733,	/* RightRearSeatRightBtn */
	CBC_SIG_ID_RRSPB	= 734,	/* RightRearSeatPrevBtn */
	CBC_SIG_ID_RRSP9B	= 735,	/* RightRearSeatPosition9Btn */
	CBC_SIG_ID_RRSP8B	= 736,	/* RightRearSeatPosition8Btn */
	CBC_SIG_ID_RRSP7B	= 737,	/* RightRearSeatPosition7Btn */
	CBC_SIG_ID_RRSP6B	= 738,	/* RightRearSeatPosition6Btn */
	CBC_SIG_ID_RRSP5B	= 739,	/* RightRearSeatPosition5Btn */
	CBC_SIG_ID_RRSP4B	= 740,	/* RightRearSeatPosition4Btn */
	CBC_SIG_ID_RRSP3B	= 741,	/* RightRearSeatPosition3Btn */
	CBC_SIG_ID_RRSP2B	= 742,	/* RightRearSeatPosition2Btn */
	CBC_SIG_ID_RRSP1B	= 743,	/* RightRearSeatPosition1Btn */
	CBC_SIG_ID_RRSP0B	= 744,	/* RightRearSeatPosition0Btn */
	CBC_SIG_ID_RRSNB	= 745,	/* RightRearSeatNextBtn */
	CBC_SIG_ID_RRSLB	= 746,	/* RightRearSeatLeftBtn */
	CBC_SIG_ID_RRSDB	= 747,	/* RightRearSeatDownBtn */
	CBC_SIG_ID_RRSVA	= 748,	/* RightRearSeatVolumeAdjust */
	CBC_SIG_ID_RSSSB	= 749,	/* RightRearSeatStopBtn */
	CBC_SIG_ID_RRSSCB	= 750,	/* RightRearSeatSpeechCtrlBtn */
	CBC_SIG_ID_RRSSB	= 751,	/* RightRearSeatSearchBtn */
	CBC_SIG_ID_RRSRDB	= 752,	/* RightRearSeatRadioBtn */
	CBC_SIG_ID_RRSPLB	= 753,	/* RightRearSeatPlayBtn */
	CBC_SIG_ID_RRSPSB	= 754,	/* RightRearSeatPauseBtn */
	CBC_SIG_ID_RRSOMB	= 755,	/* RightRearSeatOpticalMediaBtn */
	CBC_SIG_ID_RRSHB	= 756,	/* RightRearSeatHomeBtn */
	CBC_SIG_ID_RRSHDB	= 757,	/* RightRearSeatHarddiskBtn */
	CBC_SIG_ID_RRSENB	= 758,	/* RightRearSeatEnterBtn */
	CBC_SIG_ID_RRSEJB	= 759,	/* RightRearSeatEjectBtn */
	CBC_SIG_ID_RRSCB	= 760,	/* RightRearSeatConfigBtn */
	CBC_SIG_ID_RRSCLB	= 761,	/* RightRearSeatCancelBtn */
	CBC_SIG_ID_RRSAMB	= 762,	/* RightRearSeatAudioMuteBtn */
	CBC_SIG_ID_RVCS		= 763,	/* RearViewCameraStatus */
	CBC_SIG_ID_PSS		= 764,	/* PdcSwitchStatus */
	CBC_SIG_ID_PUB		= 765,	/* PassengerUpBtn */
	CBC_SIG_ID_PRB		= 766,	/* PassengerRightBtn */
	CBC_SIG_ID_PPB		= 767,	/* PassengerPrevBtn */
	CBC_SIG_ID_PP9B		= 768,	/* PassengerPosition9Btn */
	CBC_SIG_ID_PP8B		= 769,	/* PassengerPosition8Btn */
	CBC_SIG_ID_PP7B		= 770,	/* PassengerPosition7Btn */
	CBC_SIG_ID_PP6B		= 771,	/* PassengerPosition6Btn */
	CBC_SIG_ID_PP5B		= 772,	/* PassengerPosition5Btn */
	CBC_SIG_ID_PP4B		= 773,	/* PassengerPosition4Btn */
	CBC_SIG_ID_PP3B		= 774,	/* PassengerPosition3Btn */
	CBC_SIG_ID_PP2B		= 775,	/* PassengerPosition2Btn */
	CBC_SIG_ID_PP1B		= 776,	/* PassengerPosition1Btn */
	CBC_SIG_ID_PP0B		= 777,	/* PassengerPosition0Btn */
	CBC_SIG_ID_PNB		= 778,	/* PassengerNextBtn */
	CBC_SIG_ID_PLB		= 779,	/* PassengerLeftBtn */
	CBC_SIG_ID_PDB		= 780,	/* PassengerDownBtn */
	CBC_SIG_ID_PVA		= 781,	/* PassengerVolumeAdjust */
	CBC_SIG_ID_PSB		= 782,	/* PassengerStopBtn */
	CBC_SIG_ID_PSCB		= 783,	/* PassengerSpeechCtrlBtn */
	CBC_SIG_ID_PSRB		= 784,	/* PassengerSearchBtn */
	CBC_SIG_ID_PRDB		= 785,	/* PassengerRadioBtn */
	CBC_SIG_ID_PPLB		= 786,	/* PassengerPlayBtn */
	CBC_SIG_ID_PPSB		= 787,	/* PassengerPauseBtn */
	CBC_SIG_ID_POMB		= 788,	/* PassengerOpticalMediaBtn */
	CBC_SIG_ID_PHMB		= 789,	/* PassengerHomeBtn */
	CBC_SIG_ID_PHDB		= 790,	/* PassengerHarddiskBtn */
	CBC_SIG_ID_PENB		= 791,	/* PassengerEnterBtn */
	CBC_SIG_ID_PEJB		= 792,	/* PassengerEjectBtn */
	CBC_SIG_ID_PCFB		= 793,	/* PassengerConfigBtn */
	CBC_SIG_ID_PCLB		= 794,	/* PassengerCancelBtn */
	CBC_SIG_ID_PAMB		= 795,	/* PassengerAudioMuteBtn */
	CBC_SIG_ID_LRSUB	= 796,	/* LeftRearSeatUpBtn */
	CBC_SIG_ID_LRSRB	= 797,	/* LeftRearSeatRightBtn */
	CBC_SIG_ID_LRSPB	= 798,	/* LeftRearSeatPrevBtn */
	CBC_SIG_ID_LRSP9B	= 799,	/* LeftRearSeatPosition9Btn */
	CBC_SIG_ID_LRSP8B	= 800,	/* LeftRearSeatPosition8Btn */
	CBC_SIG_ID_LRSP7B	= 801,	/* LeftRearSeatPosition7Btn */
	CBC_SIG_ID_LRSP6B	= 802,	/* LeftRearSeatPosition6Btn */
	CBC_SIG_ID_LRSP5B	= 803,	/* LeftRearSeatPosition5Btn */
	CBC_SIG_ID_LRSP4B	= 804,	/* LeftRearSeatPosition4Btn */
	CBC_SIG_ID_LRSP3B	= 805,	/* LeftRearSeatPosition3Btn */
	CBC_SIG_ID_LRSP2B	= 806,	/* LeftRearSeatPosition2Btn */
	CBC_SIG_ID_LRSP1B	= 807,	/* LeftRearSeatPosition1Btn */
	CBC_SIG_ID_LRSP0B	= 808,	/* LeftRearSeatPosition0Btn */
	CBC_SIG_ID_LRSNB	= 809,	/* LeftRearSeatNextBtn */
	CBC_SIG_ID_LRSLB	= 810,	/* LeftRearSeatLeftBtn */
	CBC_SIG_ID_LRSDB	= 811,	/* LeftRearSeatDownBtn */
	CBC_SIG_ID_LRSVA	= 812,	/* LeftRearSeatVolumeAdjust */
	CBC_SIG_ID_LRSAMB	= 813,	/* LeftRearSeatAudioMuteBtn */
	CBC_SIG_ID_LRSSB	= 814,	/* LeftRearSeatStopBtn */
	CBC_SIG_ID_LRSSCB	= 815,	/* LeftRearSeatSpeechCtrlBtn */
	CBC_SIG_ID_LRSSRB	= 816,	/* LeftRearSeatSearchBtn */
	CBC_SIG_ID_LRSRDB	= 817,	/* LeftRearSeatRadioBtn */
	CBC_SIG_ID_LRSPLB	= 818,	/* LeftRearSeatPlayBtn */
	CBC_SIG_ID_LRSPSB	= 819,	/* LeftRearSeatPauseBtn */
	CBC_SIG_ID_LRSOMB	= 820,	/* LeftRearSeatOpticalMediaBtn */
	CBC_SIG_ID_LRSHMB	= 821,	/* LeftRearSeatHomeBtn */
	CBC_SIG_ID_LRSHDB	= 822,	/* LeftRearSeatHarddiskBtn */
	CBC_SIG_ID_LRSENB	= 823,	/* LeftRearSeatEnterBtn */
	CBC_SIG_ID_LRSEJB	= 824,	/* LeftRearSeatEjectBtn */
	CBC_SIG_ID_LRSCFB	= 825,	/* LeftRearSeatConfigBtn */
	CBC_SIG_ID_LRSCLB	= 826,	/* LeftRearSeatCancelBtn */
	CBC_SIG_ID_DVA		= 827,	/* DriverVolumeAdjust */
	CBC_SIG_ID_DECSP	= 828,	/* DriverErgoCommanderSteps */
	CBC_SIG_ID_DECST	= 829,	/* DriverErgoCommanderStatus */
	CBC_SIG_ID_DAMB		= 830,	/* DriverAudioMuteBtn */
	CBC_SIG_ID_DNB		= 831,	/* DriverNextBtn */
	CBC_SIG_ID_DLB		= 832,	/* DriverLeftBtn */
	CBC_SIG_ID_DDB		= 833,	/* DriverDownBtn */
	CBC_SIG_ID_DUB		= 834,	/* DriverUpBtn */
	CBC_SIG_ID_DRB		= 835,	/* DriverRightBtn */
	CBC_SIG_ID_DPB		= 836,	/* DriverPrevBtn */
	CBC_SIG_ID_DP9B		= 837,	/* DriverPosition9Btn */
	CBC_SIG_ID_DP8B		= 838,	/* DriverPosition8Btn */
	CBC_SIG_ID_DP7B		= 839,	/* DriverPosition7Btn */
	CBC_SIG_ID_DP6B		= 840,	/* DriverPosition6Btn */
	CBC_SIG_ID_DP5B		= 841,	/* DriverPosition5Btn */
	CBC_SIG_ID_DP4B		= 842,	/* DriverPosition4Btn */
	CBC_SIG_ID_DP3B		= 843,	/* DriverPosition3Btn */
	CBC_SIG_ID_DP2B		= 844,	/* DriverPosition2Btn */
	CBC_SIG_ID_DP1B		= 845,	/* DriverPosition1Btn */
	CBC_SIG_ID_DP0B		= 846,	/* DriverPosition0Btn */
	CBC_SIG_ID_DSCB		= 847,	/* DriverSpeechCtrlBtn */
	CBC_SIG_ID_DSRB		= 848,	/* DriverSearchBtn */
	CBC_SIG_ID_DRDB		= 849,	/* DriverRadioBtn */
	CBC_SIG_ID_DSTB		= 850,	/* DriverStopBtn */
	CBC_SIG_ID_DPLB		= 851,	/* DriverPlayBtn */
	CBC_SIG_ID_DPSB		= 852,	/* DriverPauseBtn */
	CBC_SIG_ID_DOMB		= 853,	/* DriverOpticalMediaBtn */
	CBC_SIG_ID_DHMB		= 854,	/* DriverHomeBtn */
	CBC_SIG_ID_DHHB		= 855,	/* DriverHarddiskBtn */
	CBC_SIG_ID_DENB		= 856,	/* DriverEnterBtn */
	CBC_SIG_ID_DEJB		= 857,	/* DriverEjectBtn */
	CBC_SIG_ID_DCFB		= 858,	/* DriverConfigBtn */
	CBC_SIG_ID_DCLB		= 859,	/* DriverCancelBtn */
	CBC_SIG_ID_DSTG		= 860,	/* DoorStatusTailgate */
	CBC_SIG_ID_DSRR		= 861,	/* DoorStatusRightRear */
	CBC_SIG_ID_DSRF		= 862,	/* DoorStatusRightFront */
	CBC_SIG_ID_DSLR		= 863,	/* DoorStatusLeftRear */
	CBC_SIG_ID_DSLF		= 864,	/* DoorStatusLeftFront */
	CBC_SIG_ID_DSEH		= 865,	/* DoorStatusEngineHood */
	CBC_SIG_ID_CSSRRW	= 866,	/* ChildSafetyStatusRightRearWnd */
	CBC_SIG_ID_CSSRR	= 867,	/* ChildSafetyStatusRightRear */
	CBC_SIG_ID_CSSLRW	= 868,	/* ChildSafetyStatusLeftRearWnd */
	CBC_SIG_ID_CSSLR	= 869,	/* ChildSafetyStatusLeftRear */
	CBC_SIG_ID_ATEMP	= 870,	/* AmbientTemperature */
	CBC_SIG_ID_ANSL		= 871,	/* AmbientNoiseLevel */
	CBC_SIG_ID_ALTI		= 872,	/* AmbientLightIntensity */
	CBC_SIG_ID_VSA		= 873,	/* VehicleSteeringAngle */
	CBC_SIG_ID_LLAT		= 875,	/* LocationLatitude */
	CBC_SIG_ID_LLON		= 876,	/* LocationLongitude */
	CBC_SIG_ID_LALT		= 877,	/* LocationAltitude */
	CBC_SIG_ID_LACC		= 878,	/* LocationAccuracy */
	CBC_SIG_ID_LHED		= 879,	/* LocationHeading */
	CBC_SIG_ID_LSPD		= 880,	/* LocationSpeed */
	CBC_SIG_ID_LSRC		= 881,	/* LocationSource */
	CBC_SIG_ID_LSCT		= 882,	/* LocationSourceCount */
	CBC_SIG_ID_PDFB		= 884,	/* PdcDistanceFrontCenter */
	CBC_SIG_ID_PDFL1	= 885,	/* PdcDistanceFrontLeft1 */
	CBC_SIG_ID_PDFL2	= 886,	/* PdcDistanceFrontLeft2 */
	CBC_SIG_ID_PDFL3	= 887,	/* PdcDistanceFrontLeft3 */
	CBC_SIG_ID_PDFR1	= 888,	/* PdcDistanceFrontRight1 */
	CBC_SIG_ID_PDFR2	= 889,	/* PdcDistanceFrontRight2 */
	CBC_SIG_ID_PDFR3	= 890,	/* PdcDistanceFrontRight3 */
	CBC_SIG_ID_PDRC		= 892,	/* PdcDistanceRearCenter */
	CBC_SIG_ID_PDRL1	= 893,	/* PdcDistanceRearLeft1 */
	CBC_SIG_ID_PDRL2	= 894,	/* PdcDistanceRearLeft2 */
	CBC_SIG_ID_PDRL3	= 895,	/* PdcDistanceRearLeft3 */
	CBC_SIG_ID_PDRR1	= 896,	/* PdcDistanceRearRight1 */
	CBC_SIG_ID_PDRR2	= 897,	/* PdcDistanceRearRight2 */
	CBC_SIG_ID_PDRR3	= 898,	/* PdcDistanceRearRight3 */
	CBC_SIG_ID_VXA		= 900,	/* VehicleXAcceleration */
	CBC_SIG_ID_VYA		= 901,	/* VehicleYAcceleration */
	CBC_SIG_ID_VZA		= 902,	/* VehicleZAcceleration */
	CBC_SIG_ID_IACR		= 906,	/* IocAppChecksumResponse */
	CBC_SIG_ID_IWCR		= 907,	/* IocWfChecksumResponse */
	CBC_SIG_ID_IFCR		= 908,	/* IocFblChecksumResponse */
	CBC_SIG_ID_GYROX	= 911,	/* GyroX */
	CBC_SIG_ID_GYROY	= 912,	/* GyroY */
	CBC_SIG_ID_IAVB		= 915,	/* IocAppVersionBuild */
	CBC_SIG_ID_IAVMJ	= 916,	/* IocAppVersionMajor */
	CBC_SIG_ID_RAV		= 919,	/* RuntimeAverageValue */
	CBC_SIG_ID_RMAX		= 920,	/* RuntimeMaxValue */
	CBC_SIG_ID_RMIN		= 921,	/* RuntimeMinValue */
	CBC_SIG_ID_ACCX		= 924,	/* AccX */
	CBC_SIG_ID_ACCY		= 925,	/* AccY */
	CBC_SIG_ID_ACCZ		= 926,	/* AccZ */
	CBC_SIG_ID_MDS		= 927,	/* MrbDipSwitch */
	CBC_SIG_ID_FCP		= 928,	/* FanCurrentRpm */
	CBC_SIG_ID_GYROZ	= 929,	/* GyroZ */
	CBC_SIG_ID_IAVMN	= 930,	/* IocAppVersionMinor */
	CBC_SIG_ID_RTST		= 931,	/* RuntimeSamplesTaken */
	CBC_SIG_ID_PKBK		= 933,	/* ParkingBrake */
	CBC_SIG_ID_PKBKST	= 934,	/* ParkingBrakeSetting */
	CBC_SIG_ID_PKBKAT	= 935,	/* ParkingBrakeAutomatic */
	CBC_SIG_ID_PKBKAS	= 936,	/* ParkingBrakeAutomaticSetting */
	CBC_SIG_ID_HFSPD	= 937,	/* HvacFanSpeed */
	CBC_SIG_ID_HFSST	= 938,	/* HvacFanSpeedSetting */
	CBC_SIG_ID_HFDIR	= 939,	/* HvacFanDirection */
	CBC_SIG_ID_HFDSTT	= 940,	/* HvacFanDirectionSetting */
	CBC_SIG_ID_HVACA	= 941,	/* HvacAc */
	CBC_SIG_ID_HVASTT	= 942,	/* HvacAcSetting */
	CBC_SIG_ID_HAMAX	= 943,	/* HvacAcMax */
	CBC_SIG_ID_HVMST	= 944,	/* HvacAcMaxSetting */
	CBC_SIG_ID_HAUTO	= 945,	/* HvacAuto */
	CBC_SIG_ID_HATSTT	= 946,	/* HvacAutoSetting */
	CBC_SIG_ID_HVDEF	= 947,	/* HvacDefrost */
	CBC_SIG_ID_HDEFSTT	= 948,	/* HvacDefrostSetting */
	CBC_SIG_ID_HDFMAX	= 949,	/* HvacDefrostMax */
	CBC_SIG_ID_HDMXSTT	= 950,	/* HvacDefrostMaxSetting */
	CBC_SIG_ID_HDUAL	= 951,	/* HvacDual */
	CBC_SIG_ID_HDSTT	= 952,	/* HvacDualSetting */
	CBC_SIG_ID_HHSMR	= 953,	/* HvacHeatingSideMirror */
	CBC_SIG_ID_HHSMST	= 954,	/* HvacHeatingSideMirrorSetting */
	CBC_SIG_ID_HHSWL	= 955,	/* HvacHeatingSteeringWheel */
	CBC_SIG_ID_HHSWST	= 956,	/* HvacHeatingSteeringWheelSetting */
	CBC_SIG_ID_HPOWR	= 957,	/* HvacPower */
	CBC_SIG_ID_HPWSTT	= 958,	/* HvacPowerSetting */
	CBC_SIG_ID_HRECC	= 959,	/* HvacRecirculation */
	CBC_SIG_ID_HRECST	= 960,	/* HvacRecirculationSetting */
	CBC_SIG_ID_HTEMCB	= 961,	/* HvacTemperatureCabin */
	CBC_SIG_ID_HTCSTT	= 962,	/* HvacTemperatureCabinSetting */
	CBC_SIG_ID_HTMPST	= 963,	/* HvacTemperatureSeat */
	CBC_SIG_ID_HTSSTT	= 964,	/* HvacTemperatureSeatSetting */
	CBC_SIG_ID_HTMPU	= 965,	/* HvacTemperatureUnits */
	CBC_SIG_ID_HTUSTT	= 966,	/* HvacTemperatureUnitsSetting */
	CBC_SIG_ID_HVTST	= 967,	/* HvacVentilationSeat */
	CBC_SIG_ID_HVSSTT	= 968,	/* HvacVentilationSeatSetting */
	CBC_SIG_ID_HRCAT	= 969,	/* HvacRecirculationAutomatic */
	CBC_SIG_ID_HRASTT	= 970,	/* HvacRecirculationAutomaticSetting */
};

/*
 * CBC rx group identity definition.
 */
enum cbc_rx_group_id {
	CBC_GRP_ID_0	= 0,
};

/*
 * CBC tx group identity definition.
 */
enum cbc_tx_group_id {
	CBC_GRP_ID_LOC	= 874,	/* Location */
	CBC_GRP_ID_PDF	= 883,	/* PdcDistanceFront */
	CBC_GRP_ID_PDR	= 891,	/* PdcDistanceRear */
	CBC_GRP_ID_VAC	= 899,	/* VehicleAcceleration */
	CBC_GRP_ID_GAS	= 909,	/* GyroAbs */
	CBC_GRP_ID_IVR	= 913,	/* IocVersionResponse */
	CBC_GRP_ID_IRM	= 917,	/* IocRuntimeMeasurementResultsResponse */
	CBC_GRP_ID_GAC	= 922,	/* GyroAcc */
};

/*
 * IOC channels definition.
 * Include all native CBC channels and one virtual UART
 */
enum ioc_ch_id {
	IOC_NATIVE_PMT,		/* Native /dev/cbc-pmt */
	IOC_NATIVE_LFCC,	/* Native /dev/cbc-lifecycle */
	IOC_NATIVE_SIGNAL,	/* Native /dev/cbc-signals */
	IOC_NATIVE_ESIG,	/* Native /dev/cbc-early-signals */
	IOC_NATIVE_DIAG,	/* Native /dev/cbc-diagnosis */
	IOC_NATIVE_DLT,		/* Native /dev/cbc_dlt */
	IOC_NATIVE_LINDA,	/* Native /dev/cbc-lindata */
	IOC_NATIVE_RAW0,	/* Native /dev/cbc-raw0 */
	IOC_NATIVE_RAW1,	/* Native /dev/cbc-raw1 */
	IOC_NATIVE_RAW2,	/* Native /dev/cbc-raw2 */
	IOC_NATIVE_RAW3,	/* Native /dev/cbc-raw3 */
	IOC_NATIVE_RAW4,	/* Native /dev/cbc-raw4 */
	IOC_NATIVE_RAW5,	/* Native /dev/cbc-raw5 */
	IOC_NATIVE_RAW6,	/* Native /dev/cbc-raw6 */
	IOC_NATIVE_RAW7,	/* Native /dev/cbc-raw7 */
	IOC_NATIVE_RAW8,	/* Native /dev/cbc-raw8 */
	IOC_NATIVE_RAW9,	/* Native /dev/cbc-raw9 */
	IOC_NATIVE_RAW10,	/* Native /dev/cbc-raw10 */
	IOC_NATIVE_RAW11,	/* Native /dev/cbc-raw11 */
	IOC_VIRTUAL_UART,	/* Virtual UART */
	IOC_LOCAL_EVENT,	/* Local channel for IOC event */
	IOC_NATIVE_DUMMY0,	/* Native fake lifecycle channel */
	IOC_NATIVE_DUMMY1,	/* Native fake signal channel */
	IOC_NATIVE_DUMMY2,	/* Native Fake oem raw channel */
	IOC_CH_MAX
};

/*
 * CBC priority is used to pack CBC address layer header.
 */
enum cbc_prio {
	CBC_PRIO_LOW	= 2,
	CBC_PRIO_MEDIUM	= 3,
	CBC_PRIO_HIGH	= 6
};

/*
 * CBC invalidation types.
 */
enum cbc_inval_type {
	CBC_INVAL_T_SIGNAL,
	CBC_INVAL_T_GROUP
};

/*
 * CBC signal and group state flag.
 */
enum cbc_flag {
	CBC_INACTIVE,
	CBC_ACTIVE
};

/*
 * CBC queue types.
 * Rx queue buffers cbc_requests for virtual UART -> native CBC channels.
 * Tx queue buffers cbc_requests for antive CBC cdevs -> virtual UART.
 * Free queue buffers the cbc_requests that are not in rx/tx queues for new data
 * comming.
 */
enum cbc_queue_type {
	CBC_QUEUE_T_RX,
	CBC_QUEUE_T_TX,
	CBC_QUEUE_T_FREE
};

/*
 * CBC request types.
 */
enum cbc_request_type {
	CBC_REQ_T_PROT,		/* CBC protocol request */
	CBC_REQ_T_SUSPEND,	/* CBC suspend request */
	CBC_REQ_T_SHUTDOWN,	/* CBC shutdown request */
	CBC_REQ_T_HB_INIT,	/* CBC Heartbeat init request */
	CBC_REQ_T_USER_VM_ACTIVE,	/* CBC User VM active request */
	CBC_REQ_T_USER_VM_INACTIVE	/* CBC User VM inactive request */
};

/*
 * Open the channel and add it into IOC epoll event data if the channel state
 * is ON, otherwise ignore it.
 */
enum ioc_ch_stat {
	IOC_CH_OFF,
	IOC_CH_ON
};

struct cbc_signal {
	uint16_t id;		/* CBC signal id number */
	uint16_t len;		/* CBC signal length in bits not bytes */
	enum cbc_flag flag;	/* CBC signal active/inactive flag */
};

struct cbc_group {
	uint16_t id;		/* CBC group id number */
	enum cbc_flag flag;	/* CBC group active/inactive flag */
};

struct wlist_signal {
	uint16_t id;
	struct cbc_signal *sig;
};

struct wlist_group {
	uint16_t id;
	struct cbc_group *grp;
};

/*
 * CBC ring is used to buffer bytes before build one complete CBC frame.
 */
struct cbc_ring {
	uint32_t head;
	uint32_t tail;
	uint8_t buf[CBC_RING_BUFFER_SIZE];
};

/*
 * CBC configuration contains signal/group tables and whiltlist tables.
 */
struct cbc_config {
	int32_t cbc_sig_num;			/* CBC signals number */
	int32_t cbc_grp_num;			/* CBC groups number */
	int32_t wlist_sig_num;			/* Whitelist signals number */
	int32_t wlist_grp_num;			/* Whitelist groups number */
	struct cbc_signal *cbc_sig_tbl;		/* CBC signals table */
	struct cbc_group *cbc_grp_tbl;		/* CBC groups table */
	struct wlist_signal *wlist_sig_tbl;	/* Whitelist signals table */
	struct wlist_group *wlist_grp_tbl;	/* Whitelist groups table */
};

/*
 * IOC channel information.
 */
struct ioc_ch_info {
	int32_t fd;		/* IOC channel fd */
	char name[32];		/* IOC channel name */
	enum ioc_ch_id id;	/* IOC channel identity number */
	enum ioc_ch_stat stat;	/* IOC channel state */
};

/*
 * CBC request is mainly structure of communication between threads.
 */
struct cbc_request {
	int32_t srv_len;		/* Service frame length */
	int32_t link_len;		/* Link frame length */
	enum ioc_ch_id id;		/* Channel id number */
	enum cbc_request_type rtype;	/* Request types */
	uint8_t buf[CBC_MAX_FRAME_SIZE];

	SIMPLEQ_ENTRY(cbc_request) me_queue;
};

/*
 * IOC state types.
 */
enum ioc_state_type {
	IOC_S_INIT,
	IOC_S_ACTIVE,
	IOC_S_SUSPENDING,
	IOC_S_SUSPENDED
};

/*
 * IOC event types.
 */
enum ioc_event_type {
	IOC_E_INVALID,
	IOC_E_HB_ACTIVE,
	IOC_E_RAM_REFRESH,
	IOC_E_HB_INACTIVE,
	IOC_E_SHUTDOWN,
	IOC_E_RESUME,
	IOC_E_KNOCK,
};

/*
 * VM request types.
 */
enum vm_request_type {
	VM_REQ_NONE,
	VM_REQ_STOP,
	VM_REQ_SUSPEND,
	VM_REQ_RESUME
};

/*
 * CBC packet is mainly structure for CBC protocol process.
 */
struct cbc_pkt {
	bool user_vm_active;		/* Mark User VM active status */
	uint32_t reason;		/* Record current wakeup reason */
	struct cbc_request *req;	/* CBC packet data */
	struct cbc_config *cfg;		/* CBC and whitelist configurations */
	enum cbc_queue_type qtype;	/* Routes cbc_request to queue */
	enum ioc_event_type evt;	/* Record last event */
	struct ioc_dev *ioc;		/* IOC device */
};

/*
 * CBC simple queue head definition.
 */
SIMPLEQ_HEAD(cbc_qhead, cbc_request);

/*
 * IOC device structure.
 * IOC device is a virtual device and DM has virtual device data structure
 * for virtual devices management in the further.
 * So export the ioc_dev definition to the IOC header file.
 */
struct ioc_dev {
	char name[16];			/* Core thread name */
	bool cbc_enable;		/* Tx and Rx protocol enable flag */
	int closing;			/* Close IOC mediator device flag */
	int epfd;			/* Epoll fd */
	int32_t evt_fd;			/* Pipe write fd to trigger one event */
	uint32_t boot_reason;		/* Boot or resume wakeup reason */
	enum vm_request_type vm_req;	/* Request from VM Manager (acrnctl) */
	enum ioc_state_type state;	/* IOC state type */
	struct epoll_event *evts;	/* Epoll events table */
	struct cbc_request *pool;	/* CBC requests pool */
	struct cbc_ring ring;		/* Ring buffer */
	pthread_t tid;			/* Core thread id */
	struct cbc_qhead free_qhead;	/* Free queue head */
	pthread_mutex_t free_mtx;	/* Free queue mutex */

	char rx_name[16];		/* Rx thread name */
	struct cbc_qhead rx_qhead;	/* Rx queue head */
	struct cbc_config rx_config;	/* Rx configuration */
	pthread_t rx_tid;
	pthread_cond_t rx_cond;
	pthread_mutex_t rx_mtx;
	void (*ioc_dev_rx)(struct cbc_pkt *pkt);

	char tx_name[16];		/* Tx thread name */
	struct cbc_qhead tx_qhead;	/* Tx queue head */
	struct cbc_config tx_config;	/* Tx configuration */
	pthread_t tx_tid;
	pthread_cond_t tx_cond;
	pthread_mutex_t tx_mtx;
	void (*ioc_dev_tx)(struct cbc_pkt *pkt);
};

/*
 * IOC state information.
 */
struct ioc_state_info {
	enum ioc_state_type cur_stat;
	enum ioc_state_type next_stat;
	enum ioc_event_type evt;
	int32_t (*handler)(struct ioc_dev *ioc);
};

/*
 * obsolete interface
 * Parse IOC parameters
 */
int ioc_parse(const char *opts);

struct vmctx;

/* IOC mediator common ops */
int ioc_init(struct vmctx *ctx);
void ioc_deinit(struct vmctx *ctx);

/* Build a cbc_request and send it to CBC protocol stack */
void ioc_build_request(struct ioc_dev *ioc, int32_t link_len, int32_t srv_len);

/* Send data to native CBC cdevs and virtual PTY(UART DM) device */
int ioc_ch_xmit(enum ioc_ch_id id, const uint8_t *buf, size_t size);

/* Main handlers of CBC protocol stack */
void cbc_rx_handler(struct cbc_pkt *pkt);
void cbc_tx_handler(struct cbc_pkt *pkt);

/* Copy to buf to the ring buffer */
int cbc_copy_to_ring(const uint8_t *buf, size_t size, struct cbc_ring *ring);

/* Build a cbc_request based on CBC link layer protocol */
void cbc_unpack_link(struct ioc_dev *ioc);

/* Whitelist initialization */
void wlist_init_signal(struct cbc_signal *cbc_tbl, size_t cbc_size,
		struct wlist_signal *wlist_tbl, size_t wlist_size);
void wlist_init_group(struct cbc_group *cbc_tbl, size_t cbc_size,
		struct wlist_group *wlist_tbl, size_t wlist_size);

/* Set CBC log file */
void cbc_set_log_file(FILE *f);

/* Update IOC state by the event */
void ioc_update_event(int fd, enum ioc_event_type evt);
#endif
