1/*-
2 * Copyright (c) 2018 VMware, Inc.
3 *
4 * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
5 *
6 * $FreeBSD$
7 */
8
9/* VMCI Resource Access Control API. */
10
11#ifndef _VMCI_RESOURCE_H_
12#define _VMCI_RESOURCE_H_
13
14#include "vmci_defs.h"
15#include "vmci_hashtable.h"
16#include "vmci_kernel_if.h"
17
18#define RESOURCE_CONTAINER(ptr, type, member)				\
19	((type *)((char *)(ptr) - offsetof(type, member)))
20
21typedef void(*vmci_resource_free_cb)(void *resource);
22
23typedef enum {
24	VMCI_RESOURCE_TYPE_ANY,
25	VMCI_RESOURCE_TYPE_API,
26	VMCI_RESOURCE_TYPE_GROUP,
27	VMCI_RESOURCE_TYPE_DATAGRAM,
28	VMCI_RESOURCE_TYPE_DOORBELL,
29} vmci_resource_type;
30
31struct vmci_resource {
32	struct vmci_hash_entry	hash_entry;
33	vmci_resource_type	type;
34	/* Callback to free container object when refCount is 0. */
35	vmci_resource_free_cb	container_free_cb;
36	/* Container object reference. */
37	void			*container_object;
38};
39
40int	vmci_resource_init(void);
41void	vmci_resource_exit(void);
42void	vmci_resource_sync(void);
43
44vmci_id	vmci_resource_get_id(vmci_id context_id);
45
46int	vmci_resource_add(struct vmci_resource *resource,
47	    vmci_resource_type resource_type,
48	    struct vmci_handle resource_handle,
49	    vmci_resource_free_cb container_free_cb, void *container_object);
50void	vmci_resource_remove(struct vmci_handle resource_handle,
51	    vmci_resource_type resource_type);
52struct	vmci_resource *vmci_resource_get(struct vmci_handle resource_handle,
53	    vmci_resource_type resource_type);
54void	vmci_resource_hold(struct vmci_resource *resource);
55int	vmci_resource_release(struct vmci_resource *resource);
56struct	vmci_handle vmci_resource_handle(struct vmci_resource *resource);
57
58#endif /* !_VMCI_RESOURCE_H_ */
59