1/* $OpenBSD: pri.c,v 1.2 2019/11/28 18:40:42 kn 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 <stdio.h> 20#include <string.h> 21 22#include "ds.h" 23#include "mdesc.h" 24#include "ldom_util.h" 25 26void pri_start(struct ldc_conn *, uint64_t); 27void pri_rx_data(struct ldc_conn *, uint64_t, void *, size_t); 28 29struct ds_service pri_service = { 30 "pri", 1, 0, pri_start, pri_rx_data 31}; 32 33#define PRI_REQUEST 0x00 34 35struct pri_msg { 36 uint32_t msg_type; 37 uint32_t payload_len; 38 uint64_t svc_handle; 39 uint64_t reqnum; 40 uint64_t type; 41} __packed; 42 43#define PRI_DATA 0x01 44 45struct pri_data { 46 uint32_t msg_type; 47 uint32_t payload_len; 48 uint64_t svc_handle; 49 uint64_t reqnum; 50 uint64_t type; 51 char data[1]; 52} __packed; 53 54#define PRI_UPDATE 0x02 55 56struct pri_update { 57 uint32_t msg_type; 58 uint32_t payload_len; 59 uint64_t svc_handle; 60 uint64_t reqnum; 61 uint64_t type; 62} __packed; 63 64void 65pri_start(struct ldc_conn *lc, uint64_t svc_handle) 66{ 67 struct pri_msg pm; 68 69 bzero(&pm, sizeof(pm)); 70 pm.msg_type = DS_DATA; 71 pm.payload_len = sizeof(pm) - 8; 72 pm.svc_handle = svc_handle; 73 pm.reqnum = 0; 74 pm.type = PRI_REQUEST; 75 ds_send_msg(lc, &pm, sizeof(pm)); 76} 77 78void *pri_buf; 79size_t pri_len; 80 81void 82pri_rx_data(struct ldc_conn *lc, uint64_t svc_handle, void *data, size_t len) 83{ 84 struct pri_data *pd = data; 85 86 if (pd->type != PRI_DATA) { 87 DPRINTF(("Unexpected PRI message type 0x%02llx\n", pd->type)); 88 return; 89 } 90 91 pri_len = pd->payload_len - 24; 92 pri_buf = xmalloc(pri_len); 93 94 len -= sizeof(struct pri_msg); 95 bcopy(&pd->data, pri_buf, len); 96 ds_receive_msg(lc, pri_buf + len, pri_len - len); 97} 98