text: /*	$OpenBSD: pri.c,v 1.1 2012/11/04 19:04:11 kettenis Exp $	*/
  
  /*
   * Copyright (c) 2012 Mark Kettenis
   *
   * Permission to use, copy, modify, and distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
   * copyright notice and this permission notice appear in all copies.
   *
   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   */
  
  #include <stdio.h>
  #include <string.h>
  
  #include "ds.h"
  #include "mdesc.h"
  #include "util.h"
  
  void	pri_start(struct ldc_conn *, uint64_t);
  void	pri_rx_data(struct ldc_conn *, uint64_t, void *, size_t);
  
  struct ds_service pri_service = {
  	"pri", 1, 0, pri_start, pri_rx_data
  };
  
  #define PRI_REQUEST	0x00
  
  struct pri_msg {
  	uint32_t	msg_type;
  	uint32_t	payload_len;
  	uint64_t	svc_handle;
  	uint64_t	reqnum;
  	uint64_t	type;
  } __packed;
  
  #define PRI_DATA	0x01
  
  struct pri_data {
  	uint32_t	msg_type;
  	uint32_t	payload_len;
  	uint64_t	svc_handle;
  	uint64_t	reqnum;
  	uint64_t	type;
  	char		data[1];
  } __packed;
  
  #define PRI_UPDATE	0x02
  
  struct pri_update {
  	uint32_t	msg_type;
  	uint32_t	payload_len;
  	uint64_t	svc_handle;
  	uint64_t	reqnum;
  	uint64_t	type;
  } __packed;
  
  void
  pri_start(struct ldc_conn *lc, uint64_t svc_handle)
  {
  	struct pri_msg pm;
  
  	bzero(&pm, sizeof(pm));
  	pm.msg_type = DS_DATA;
  	pm.payload_len = sizeof(pm) - 8;
  	pm.svc_handle = svc_handle;
  	pm.reqnum = 0;
  	pm.type = PRI_REQUEST;
  	ds_send_msg(lc, &pm, sizeof(pm));
  }
  
  void *pri_buf;
  size_t pri_len;
  
  void
  pri_rx_data(struct ldc_conn *lc, uint64_t svc_handle, void *data, size_t len)
  {
  	struct pri_data *pd = data;
  
  	if (pd->type != PRI_DATA) {
  		DPRINTF(("Unexpected PRI message type 0x%02llx\n", pd->type));
  		return;
  	}
  
  	pri_len = pd->payload_len - 24;
  	pri_buf = xmalloc(pri_len);
  
  	len -= sizeof(struct pri_msg);
  	bcopy(&pd->data, pri_buf, len);
  	ds_receive_msg(lc, pri_buf + len, pri_len - len);
  }
  