1*5a44f896Skettenis /* $OpenBSD: ds.h,v 1.4 2018/07/13 08:46:07 kettenis Exp $ */ 2be8be80fSkettenis 3be8be80fSkettenis /* 4be8be80fSkettenis * Copyright (c) 2012 Mark Kettenis 5be8be80fSkettenis * 6be8be80fSkettenis * Permission to use, copy, modify, and distribute this software for any 7be8be80fSkettenis * purpose with or without fee is hereby granted, provided that the above 8be8be80fSkettenis * copyright notice and this permission notice appear in all copies. 9be8be80fSkettenis * 10be8be80fSkettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11be8be80fSkettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12be8be80fSkettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13be8be80fSkettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14be8be80fSkettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15be8be80fSkettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16be8be80fSkettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17be8be80fSkettenis */ 18be8be80fSkettenis 19be8be80fSkettenis #include <sys/types.h> 20be8be80fSkettenis #include <sys/queue.h> 21be8be80fSkettenis 22be8be80fSkettenis /* 23be8be80fSkettenis * LDC virtual link layer protocol. 24be8be80fSkettenis */ 25be8be80fSkettenis 26be8be80fSkettenis #define LDC_VERSION_MAJOR 1 27be8be80fSkettenis #define LDC_VERSION_MINOR 0 28be8be80fSkettenis 29be8be80fSkettenis #define LDC_PKT_PAYLOAD 48 30be8be80fSkettenis 31be8be80fSkettenis struct ldc_pkt { 32be8be80fSkettenis uint8_t type; 33be8be80fSkettenis uint8_t stype; 34be8be80fSkettenis uint8_t ctrl; 35be8be80fSkettenis uint8_t env; 36be8be80fSkettenis uint32_t seqid; 37be8be80fSkettenis 38be8be80fSkettenis uint16_t major; 39be8be80fSkettenis uint16_t minor; 40be8be80fSkettenis uint32_t ackid; 41be8be80fSkettenis 42be8be80fSkettenis uint64_t data[6]; 43be8be80fSkettenis }; 44be8be80fSkettenis 45be8be80fSkettenis /* Packet types. */ 46be8be80fSkettenis #define LDC_CTRL 0x01 47be8be80fSkettenis #define LDC_DATA 0x02 48be8be80fSkettenis #define LDC_ERR 0x10 49be8be80fSkettenis 50be8be80fSkettenis /* Packet subtypes. */ 51be8be80fSkettenis #define LDC_INFO 0x01 52be8be80fSkettenis #define LDC_ACK 0x02 53be8be80fSkettenis #define LDC_NACK 0x04 54be8be80fSkettenis 55be8be80fSkettenis /* Control info values. */ 56be8be80fSkettenis #define LDC_VERS 0x01 57be8be80fSkettenis #define LDC_RTS 0x02 58be8be80fSkettenis #define LDC_RTR 0x03 59be8be80fSkettenis #define LDC_RDX 0x04 60be8be80fSkettenis 61be8be80fSkettenis /* Packet envelope. */ 62be8be80fSkettenis #define LDC_MODE_RAW 0x00 63be8be80fSkettenis #define LDC_MODE_UNRELIABLE 0x01 64be8be80fSkettenis #define LDC_MODE_RELIABLE 0x03 65be8be80fSkettenis 66be8be80fSkettenis #define LDC_LEN_MASK 0x3f 67be8be80fSkettenis #define LDC_FRAG_MASK 0xc0 68be8be80fSkettenis #define LDC_FRAG_START 0x40 69be8be80fSkettenis #define LDC_FRAG_STOP 0x80 70be8be80fSkettenis 71be8be80fSkettenis #define LDC_MSG_MAX 4096 72be8be80fSkettenis 73be8be80fSkettenis struct ldc_conn { 74be8be80fSkettenis int lc_fd; 75be8be80fSkettenis 76be8be80fSkettenis uint32_t lc_tx_seqid; 77be8be80fSkettenis uint8_t lc_state; 78be8be80fSkettenis #define LDC_SND_VERS 1 79be8be80fSkettenis #define LDC_RCV_VERS 2 80be8be80fSkettenis #define LDC_SND_RTS 3 81be8be80fSkettenis #define LDC_SND_RTR 4 82be8be80fSkettenis #define LDC_SND_RDX 5 83be8be80fSkettenis 84be8be80fSkettenis uint64_t lc_msg[LDC_MSG_MAX / 8]; 85be8be80fSkettenis size_t lc_len; 86be8be80fSkettenis 87be8be80fSkettenis void *lc_cookie; 88be8be80fSkettenis void (*lc_reset)(struct ldc_conn *); 89be8be80fSkettenis void (*lc_start)(struct ldc_conn *); 90be8be80fSkettenis void (*lc_rx_data)(struct ldc_conn *, void *, size_t); 91be8be80fSkettenis }; 92be8be80fSkettenis 93be8be80fSkettenis void ldc_rx_ctrl(struct ldc_conn *, struct ldc_pkt *); 94be8be80fSkettenis void ldc_rx_data(struct ldc_conn *, struct ldc_pkt *); 95be8be80fSkettenis 96be8be80fSkettenis void ldc_send_vers(struct ldc_conn *); 97be8be80fSkettenis 98be8be80fSkettenis void ldc_reset(struct ldc_conn *); 99be8be80fSkettenis 100be8be80fSkettenis struct ds_msg { 101be8be80fSkettenis uint32_t msg_type; 102be8be80fSkettenis uint32_t payload_len; 103be8be80fSkettenis uint64_t data[5]; 104be8be80fSkettenis }; 105be8be80fSkettenis 106be8be80fSkettenis struct ds_init_req { 107be8be80fSkettenis uint32_t msg_type; 108be8be80fSkettenis uint32_t payload_len; 109be8be80fSkettenis uint16_t major_vers; 110be8be80fSkettenis uint16_t minor_vers; 111be8be80fSkettenis } __packed; 112be8be80fSkettenis 113be8be80fSkettenis struct ds_init_ack { 114be8be80fSkettenis uint32_t msg_type; 115be8be80fSkettenis uint32_t payload_len; 116be8be80fSkettenis uint16_t minor_vers; 117be8be80fSkettenis } __packed; 118be8be80fSkettenis 119be8be80fSkettenis #define DS_INIT_REQ 0x00 120be8be80fSkettenis #define DS_INIT_ACK 0x01 121be8be80fSkettenis #define DS_INIT_NACK 0x02 122be8be80fSkettenis 123be8be80fSkettenis struct ds_reg_req { 124be8be80fSkettenis uint32_t msg_type; 125be8be80fSkettenis uint32_t payload_len; 126be8be80fSkettenis uint64_t svc_handle; 127be8be80fSkettenis uint16_t major_vers; 128be8be80fSkettenis uint16_t minor_vers; 129be8be80fSkettenis char svc_id[1]; 130be8be80fSkettenis } __packed; 131be8be80fSkettenis 132be8be80fSkettenis #define DS_REG_REQ 0x03 133be8be80fSkettenis 134be8be80fSkettenis struct ds_reg_ack { 135be8be80fSkettenis uint32_t msg_type; 136be8be80fSkettenis uint32_t payload_len; 137be8be80fSkettenis uint64_t svc_handle; 138be8be80fSkettenis uint16_t minor_vers; 139be8be80fSkettenis uint8_t _reserved[6]; 140be8be80fSkettenis } __packed; 141be8be80fSkettenis 142be8be80fSkettenis #define DS_REG_ACK 0x04 143be8be80fSkettenis 144be8be80fSkettenis struct ds_reg_nack { 145be8be80fSkettenis uint32_t msg_type; 146be8be80fSkettenis uint32_t payload_len; 147be8be80fSkettenis uint64_t svc_handle; 148be8be80fSkettenis uint64_t result; 149be8be80fSkettenis uint16_t major_vers; 150be8be80fSkettenis uint8_t _reserved[6]; 151be8be80fSkettenis } __packed; 152be8be80fSkettenis 153be8be80fSkettenis #define DS_REG_NACK 0x05 154be8be80fSkettenis 155be8be80fSkettenis struct ds_unreg { 156be8be80fSkettenis uint32_t msg_type; 157be8be80fSkettenis uint32_t payload_len; 158be8be80fSkettenis uint64_t svc_handle; 159be8be80fSkettenis } __packed; 160be8be80fSkettenis 161be8be80fSkettenis #define DS_UNREG 0x06 162be8be80fSkettenis #define DS_UNREG_ACK 0x07 163be8be80fSkettenis #define DS_UNREG_NACK 0x08 164be8be80fSkettenis 165be8be80fSkettenis struct ds_data { 166be8be80fSkettenis uint32_t msg_type; 167be8be80fSkettenis uint32_t payload_len; 168be8be80fSkettenis uint64_t svc_handle; 169be8be80fSkettenis uint64_t data[4]; 170be8be80fSkettenis }; 171be8be80fSkettenis 172be8be80fSkettenis #define DS_DATA 0x09 173be8be80fSkettenis 174be8be80fSkettenis struct ds_nack { 175be8be80fSkettenis uint32_t msg_type; 176be8be80fSkettenis uint32_t payload_len; 177be8be80fSkettenis uint64_t svc_handle; 178be8be80fSkettenis uint64_t result; 179be8be80fSkettenis } __packed; 180be8be80fSkettenis 181be8be80fSkettenis #define DS_NACK 0x0a 182be8be80fSkettenis 183be8be80fSkettenis #define DS_REG_VER_NACK 0x01 184be8be80fSkettenis #define DS_REG_DUP 0x02 185be8be80fSkettenis #define DS_INV_HDL 0x03 186be8be80fSkettenis #define DS_TYPE_UNKNOWN 0x04 187be8be80fSkettenis 188be8be80fSkettenis struct ds_service { 189be8be80fSkettenis const char *ds_svc_id; 190be8be80fSkettenis uint16_t ds_major_vers; 191be8be80fSkettenis uint16_t ds_minor_vers; 192be8be80fSkettenis 193be8be80fSkettenis void (*ds_start)(struct ldc_conn *, uint64_t); 194be8be80fSkettenis void (*ds_rx_data)(struct ldc_conn *, uint64_t, void *, 195be8be80fSkettenis size_t); 196be8be80fSkettenis }; 197be8be80fSkettenis 198be8be80fSkettenis void ldc_ack(struct ldc_conn *, uint32_t); 199be8be80fSkettenis void ds_rx_msg(struct ldc_conn *, void *, size_t); 200be8be80fSkettenis 201be8be80fSkettenis void ds_init_ack(struct ldc_conn *); 20225f16b1bSkettenis void ds_reg_ack(struct ldc_conn *, uint64_t, uint16_t); 203*5a44f896Skettenis void ds_reg_nack(struct ldc_conn *, uint64_t, uint16_t); 204be8be80fSkettenis void ds_unreg_ack(struct ldc_conn *, uint64_t); 205be8be80fSkettenis void ds_unreg_nack(struct ldc_conn *, uint64_t); 206be8be80fSkettenis 207be8be80fSkettenis void ds_receive_msg(struct ldc_conn *lc, void *, size_t); 208be8be80fSkettenis void ds_send_msg(struct ldc_conn *lc, void *, size_t); 209be8be80fSkettenis 210be8be80fSkettenis struct ds_conn_svc { 211be8be80fSkettenis struct ds_service *service; 212be8be80fSkettenis uint64_t svc_handle; 213be8be80fSkettenis uint32_t ackid; 214be8be80fSkettenis 215be8be80fSkettenis TAILQ_ENTRY(ds_conn_svc) link; 216be8be80fSkettenis }; 217be8be80fSkettenis 218be8be80fSkettenis struct ds_conn { 219be8be80fSkettenis char *path; 220be8be80fSkettenis void *cookie; 221be8be80fSkettenis int id; 222be8be80fSkettenis struct ldc_conn lc; 223be8be80fSkettenis int fd; 224be8be80fSkettenis 225be8be80fSkettenis TAILQ_HEAD(ds_conn_svc_head, ds_conn_svc) services; 226be8be80fSkettenis TAILQ_ENTRY(ds_conn) link; 227be8be80fSkettenis }; 228be8be80fSkettenis 229be8be80fSkettenis struct ds_conn *ds_conn_open(const char *, void *); 230be8be80fSkettenis void ds_conn_register_service(struct ds_conn *, struct ds_service *); 231be8be80fSkettenis void ds_conn_serve(void); 232274866cdSkettenis void ds_conn_handle(struct ds_conn *); 233