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