/* * 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 * Copyright (C) 2014-2015 Djalal Harouni * * 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_BUS_H #define __KDBUS_BUS_H #include #include #include #include #include #include #include "metadata.h" #include "names.h" #include "node.h" #include "policy.h" struct kdbus_conn; struct kdbus_domain; struct kdbus_staging; struct kdbus_user; /** * struct kdbus_bus - bus in a domain * @node: kdbus_node * @id: ID of this bus in the domain * @bus_flags: Simple pass-through flags from userspace to userspace * @attach_flags_owner: KDBUS_ATTACH_* flags of bus creator that other * connections can see or query * @id128: Unique random 128 bit ID of this bus * @bloom: Bloom parameters * @domain: Domain of this bus * @creator: Creator of the bus * @creator_meta: Meta information about the bus creator * @policy_db: Policy database for this bus * @name_registry: Name registry of this bus * @conn_rwlock: Read/Write lock for all lists of child connections * @conn_hash: Map of connection IDs * @monitors_list: Connections that monitor this bus * @notify_list: List of pending kernel-generated messages * @notify_lock: Notification list lock * @notify_flush_lock: Notification flushing lock */ struct kdbus_bus { struct kdbus_node node; /* static */ u64 id; u64 bus_flags; u64 attach_flags_owner; u8 id128[16]; struct kdbus_bloom_parameter bloom; struct kdbus_domain *domain; struct kdbus_user *creator; struct kdbus_meta_proc *creator_meta; /* protected by own locks */ struct kdbus_policy_db policy_db; struct kdbus_name_registry *name_registry; /* protected by conn_rwlock */ struct rw_semaphore conn_rwlock; DECLARE_HASHTABLE(conn_hash, 8); struct list_head monitors_list; /* protected by notify_lock */ struct list_head notify_list; spinlock_t notify_lock; struct mutex notify_flush_lock; }; struct kdbus_bus *kdbus_bus_ref(struct kdbus_bus *bus); struct kdbus_bus *kdbus_bus_unref(struct kdbus_bus *bus); struct kdbus_conn *kdbus_bus_find_conn_by_id(struct kdbus_bus *bus, u64 id); void kdbus_bus_broadcast(struct kdbus_bus *bus, struct kdbus_conn *conn_src, struct kdbus_staging *staging); void kdbus_bus_eavesdrop(struct kdbus_bus *bus, struct kdbus_conn *conn_src, struct kdbus_staging *staging); struct kdbus_bus *kdbus_cmd_bus_make(struct kdbus_domain *domain, void __user *argp); int kdbus_cmd_bus_creator_info(struct kdbus_conn *conn, void __user *argp); #endif