xref: /openbsd/usr.sbin/ldomctl/pri.c (revision d73a4c4f)
1*d73a4c4fSkn /*	$OpenBSD: pri.c,v 1.2 2019/11/28 18:40:42 kn Exp $	*/
2a55bd986Skettenis 
3a55bd986Skettenis /*
4a55bd986Skettenis  * Copyright (c) 2012 Mark Kettenis
5a55bd986Skettenis  *
6a55bd986Skettenis  * Permission to use, copy, modify, and distribute this software for any
7a55bd986Skettenis  * purpose with or without fee is hereby granted, provided that the above
8a55bd986Skettenis  * copyright notice and this permission notice appear in all copies.
9a55bd986Skettenis  *
10a55bd986Skettenis  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11a55bd986Skettenis  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12a55bd986Skettenis  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13a55bd986Skettenis  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14a55bd986Skettenis  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15a55bd986Skettenis  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16a55bd986Skettenis  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17a55bd986Skettenis  */
18a55bd986Skettenis 
19a55bd986Skettenis #include <stdio.h>
20a55bd986Skettenis #include <string.h>
21a55bd986Skettenis 
22a55bd986Skettenis #include "ds.h"
23a55bd986Skettenis #include "mdesc.h"
24*d73a4c4fSkn #include "ldom_util.h"
25a55bd986Skettenis 
26a55bd986Skettenis void	pri_start(struct ldc_conn *, uint64_t);
27a55bd986Skettenis void	pri_rx_data(struct ldc_conn *, uint64_t, void *, size_t);
28a55bd986Skettenis 
29a55bd986Skettenis struct ds_service pri_service = {
30a55bd986Skettenis 	"pri", 1, 0, pri_start, pri_rx_data
31a55bd986Skettenis };
32a55bd986Skettenis 
33a55bd986Skettenis #define PRI_REQUEST	0x00
34a55bd986Skettenis 
35a55bd986Skettenis struct pri_msg {
36a55bd986Skettenis 	uint32_t	msg_type;
37a55bd986Skettenis 	uint32_t	payload_len;
38a55bd986Skettenis 	uint64_t	svc_handle;
39a55bd986Skettenis 	uint64_t	reqnum;
40a55bd986Skettenis 	uint64_t	type;
41a55bd986Skettenis } __packed;
42a55bd986Skettenis 
43a55bd986Skettenis #define PRI_DATA	0x01
44a55bd986Skettenis 
45a55bd986Skettenis struct pri_data {
46a55bd986Skettenis 	uint32_t	msg_type;
47a55bd986Skettenis 	uint32_t	payload_len;
48a55bd986Skettenis 	uint64_t	svc_handle;
49a55bd986Skettenis 	uint64_t	reqnum;
50a55bd986Skettenis 	uint64_t	type;
51a55bd986Skettenis 	char		data[1];
52a55bd986Skettenis } __packed;
53a55bd986Skettenis 
54a55bd986Skettenis #define PRI_UPDATE	0x02
55a55bd986Skettenis 
56a55bd986Skettenis struct pri_update {
57a55bd986Skettenis 	uint32_t	msg_type;
58a55bd986Skettenis 	uint32_t	payload_len;
59a55bd986Skettenis 	uint64_t	svc_handle;
60a55bd986Skettenis 	uint64_t	reqnum;
61a55bd986Skettenis 	uint64_t	type;
62a55bd986Skettenis } __packed;
63a55bd986Skettenis 
64a55bd986Skettenis void
pri_start(struct ldc_conn * lc,uint64_t svc_handle)65a55bd986Skettenis pri_start(struct ldc_conn *lc, uint64_t svc_handle)
66a55bd986Skettenis {
67a55bd986Skettenis 	struct pri_msg pm;
68a55bd986Skettenis 
69a55bd986Skettenis 	bzero(&pm, sizeof(pm));
70a55bd986Skettenis 	pm.msg_type = DS_DATA;
71a55bd986Skettenis 	pm.payload_len = sizeof(pm) - 8;
72a55bd986Skettenis 	pm.svc_handle = svc_handle;
73a55bd986Skettenis 	pm.reqnum = 0;
74a55bd986Skettenis 	pm.type = PRI_REQUEST;
75a55bd986Skettenis 	ds_send_msg(lc, &pm, sizeof(pm));
76a55bd986Skettenis }
77a55bd986Skettenis 
78a55bd986Skettenis void *pri_buf;
79a55bd986Skettenis size_t pri_len;
80a55bd986Skettenis 
81a55bd986Skettenis void
pri_rx_data(struct ldc_conn * lc,uint64_t svc_handle,void * data,size_t len)82a55bd986Skettenis pri_rx_data(struct ldc_conn *lc, uint64_t svc_handle, void *data, size_t len)
83a55bd986Skettenis {
84a55bd986Skettenis 	struct pri_data *pd = data;
85a55bd986Skettenis 
86a55bd986Skettenis 	if (pd->type != PRI_DATA) {
87a55bd986Skettenis 		DPRINTF(("Unexpected PRI message type 0x%02llx\n", pd->type));
88a55bd986Skettenis 		return;
89a55bd986Skettenis 	}
90a55bd986Skettenis 
91a55bd986Skettenis 	pri_len = pd->payload_len - 24;
92a55bd986Skettenis 	pri_buf = xmalloc(pri_len);
93a55bd986Skettenis 
94a55bd986Skettenis 	len -= sizeof(struct pri_msg);
95a55bd986Skettenis 	bcopy(&pd->data, pri_buf, len);
96a55bd986Skettenis 	ds_receive_msg(lc, pri_buf + len, pri_len - len);
97a55bd986Skettenis }
98