| /* |
| * Copyright (C) 2013-2015 Kay Sievers |
| * Copyright (C) 2013-2015 Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| * Copyright (C) 2013-2015 Daniel Mack <daniel@zonque.org> |
| * Copyright (C) 2013-2015 David Herrmann <dh.herrmann@gmail.com> |
| * 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); |
| int kdbus_kmsg_collect_metadata(struct kdbus_kmsg *kmsg, struct kdbus_conn *src, |
| struct kdbus_conn *dst); |
| |
| #endif |