xref: /openbsd-src/usr.sbin/ldomd/ds.h (revision 5a44f89625c1a201058ece428162d035b68a928b)
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