/*
 * Copyright 2019, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(DATA61_BSD)
 */

#pragma once

#include <simple/simple.h>
#include <vka/object.h>
#include <vka/vka.h>
#include <rpc.pb.h>

#define SEL4RPC_MSG_MAGIC (0xcafed00d)

struct sel4rpc_env;

typedef int (*sel4rpc_handler_t)(struct sel4rpc_env *env, void *data, RpcMessage *rpcMsg);
typedef struct sel4rpc_env {
    vka_t *vka;

    vka_object_t *reply;

    sel4rpc_handler_t handler;
    void *data;

    simple_t *simple;
} sel4rpc_server_env_t;

int sel4rpc_server_init(sel4rpc_server_env_t *env, vka_t *vka,
                        sel4rpc_handler_t handler_func, void *data, vka_object_t *reply, simple_t *simple);
int sel4rpc_server_recv(sel4rpc_server_env_t *env);
int sel4rpc_server_reply(sel4rpc_server_env_t *env, int caps, int errorCode, int cookie);
int sel4rpc_default_handler(sel4rpc_server_env_t *env, UNUSED void *data, RpcMessage *rpcMsg);

