/* * Copyright (C) 2013-2015 Kay Sievers * Copyright (C) 2013-2015 Greg Kroah-Hartman * Copyright (C) 2013-2015 Daniel Mack * Copyright (C) 2013-2015 David Herrmann * Copyright (C) 2013-2015 Linux Foundation * * kdbus is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. */ #ifndef __KDBUS_MESSAGE_H #define __KDBUS_MESSAGE_H #include "util.h" #include "metadata.h" /** * enum kdbus_msg_data_type - Type of kdbus_msg_data payloads * @KDBUS_MSG_DATA_VEC: Data vector provided by user-space * @KDBUS_MSG_DATA_MEMFD: Memfd payload */ enum kdbus_msg_data_type { KDBUS_MSG_DATA_VEC, KDBUS_MSG_DATA_MEMFD, }; /** * struct kdbus_msg_data - Data payload as stored by messages * @type: Type of payload (KDBUS_MSG_DATA_*) * @size: Size of the described payload * @off: The offset, relative to the vec slice * @start: Offset inside the memfd * @file: Backing file referenced by the memfd */ struct kdbus_msg_data { unsigned int type; u64 size; union { struct { u64 off; } vec; struct { u64 start; struct file *file; } memfd; }; }; /** * struct kdbus_kmsg_resources - resources of a message * @kref: Reference counter * @dst_name: Short-cut to msg for faster lookup * @fds: Array of file descriptors to pass * @fds_count: Number of file descriptors to pass * @data: Array of data payloads * @vec_count: Number of VEC entries * @memfd_count: Number of MEMFD entries in @data * @data_count: Sum of @vec_count + @memfd_count */ struct kdbus_msg_resources { struct kref kref; const char *dst_name; struct file **fds; unsigned int fds_count; struct kdbus_msg_data *data; size_t vec_count; size_t memfd_count; size_t data_count; }; struct kdbus_msg_resources * kdbus_msg_resources_ref(struct kdbus_msg_resources *r); struct kdbus_msg_resources * kdbus_msg_resources_unref(struct kdbus_msg_resources *r); /** * struct kdbus_kmsg - internal message handling data * @seq: Domain-global message sequence number * @notify_type: Short-cut for faster lookup * @notify_old_id: Short-cut for faster lookup * @notify_new_id: Short-cut for faster lookup * @notify_name: Short-cut for faster lookup * @dst_name_id: Short-cut to msg for faster lookup * @bloom_filter: Bloom filter to match message properties * @bloom_generation: Generation of bloom element set * @notify_entry: List of kernel-generated notifications * @iov: Array of iovec, describing the payload to copy * @iov_count: Number of array members in @iov * @pool_size: Overall size of inlined data referenced by @iov * @proc_meta: Appended SCM-like metadata of the sending process * @conn_meta: Appended SCM-like metadata of the sending connection * @res: Message resources * @msg: Message from or to userspace */ struct kdbus_kmsg { u64 seq; u64 notify_type; u64 notify_old_id; u64 notify_new_id; const char *notify_name; u64 dst_name_id; const struct kdbus_bloom_filter *bloom_filter; u64 bloom_generation; struct list_head notify_entry; struct iovec *iov; size_t iov_count; u64 pool_size; struct kdbus_meta_proc *proc_meta; struct kdbus_meta_conn *conn_meta; struct kdbus_msg_resources *res; /* variable size, must be the last member */ struct kdbus_msg msg; }; struct kdbus_bus; struct kdbus_conn; struct kdbus_kmsg *kdbus_kmsg_new(struct kdbus_bus *bus, size_t extra_size); struct kdbus_kmsg *kdbus_kmsg_new_from_cmd(struct kdbus_conn *conn, struct kdbus_cmd_send *cmd_send); void kdbus_kmsg_free(struct kdbus_kmsg *kmsg); #endif