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