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