blob: 4b9a0ac1b3516b3919202d100b896435aace8a85 [file] [log] [blame]
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<refentry id="kdbus.bus">
<refentryinfo>
<title>kdbus.bus</title>
<productname>kdbus.bus</productname>
</refentryinfo>
<refmeta>
<refentrytitle>kdbus.bus</refentrytitle>
<manvolnum>7</manvolnum>
</refmeta>
<refnamediv>
<refname>kdbus.bus</refname>
<refpurpose>kdbus bus</refpurpose>
</refnamediv>
<refsect1>
<title>Description</title>
<para>
A bus is a resource that is shared between connections in order to
transmit messages (see
<citerefentry>
<refentrytitle>kdbus.message</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>).
Each bus is independent, and operations on the bus will not have any
effect on other buses. A bus is a management entity that controls the
addresses of its connections, their policies and message transactions
performed via this bus.
</para>
<para>
Each bus is bound to the mount instance it was created on. It has a
custom name that is unique across all buses of a domain. In
<citerefentry>
<refentrytitle>kdbus.fs</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
a bus is presented as a directory. No operations can be performed on
the bus itself; instead you need to perform the operations on an endpoint
associated with the bus. Endpoints are accessible as files underneath the
bus directory. A default endpoint called <constant>bus</constant> is
provided on each bus.
</para>
<para>
Bus names may be chosen freely except for one restriction: the name must
be prefixed with the numeric effective UID of the creator and a dash. This
is required to avoid namespace clashes between different users. When
creating a bus, the name that is passed in must be properly formatted, or
the kernel will refuse creation of the bus. Example:
<literal>1047-foobar</literal> is an acceptable name for a bus
registered by a user with UID 1047. However,
<literal>1024-foobar</literal> is not, and neither is
<literal>foobar</literal>. The UID must be provided in the
user-namespace of the bus owner.
</para>
<para>
To create a new bus, you need to open the control file of a domain and
employ the <constant>KDBUS_CMD_BUS_MAKE</constant> ioctl. The control
file descriptor that was used to issue
<constant>KDBUS_CMD_BUS_MAKE</constant> must not previously have been
used for any other control-ioctl and must be kept open for the entire
life-time of the created bus. Closing it will immediately cleanup the
entire bus and all its associated resources and endpoints. Every control
file descriptor can only be used to create a single new bus; from that
point on, it is not used for any further communication until the final
<citerefentry>
<refentrytitle>close</refentrytitle>
<manvolnum>2</manvolnum>
</citerefentry>
.
</para>
<para>
Each bus will generate a random, 128-bit UUID upon creation. This UUID
will be returned to creators of connections through
<varname>kdbus_cmd_hello.id128</varname> and can be used to uniquely
identify buses, even across different machines or containers. The UUID
will have its variant bits set to <literal>DCE</literal>, and denote
version 4 (random). For more details on UUIDs, see <ulink
url="https://en.wikipedia.org/wiki/Universally_unique_identifier">
the Wikipedia article on UUIDs</ulink>.
</para>
</refsect1>
<refsect1>
<title>Creating buses</title>
<para>
To create a new bus, the <constant>KDBUS_CMD_BUS_MAKE</constant>
command is used. It takes a <type>struct kdbus_cmd</type> argument.
</para>
<programlisting>
struct kdbus_cmd {
__u64 size;
__u64 flags;
__u64 return_flags;
struct kdbus_item items[0];
};
</programlisting>
<para>The fields in this struct are described below.</para>
<variablelist>
<varlistentry>
<term><varname>size</varname></term>
<listitem><para>
The overall size of the struct, including its items.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>flags</varname></term>
<listitem><para>The flags for creation.</para>
<variablelist>
<varlistentry>
<term><constant>KDBUS_MAKE_ACCESS_GROUP</constant></term>
<listitem>
<para>Make the bus file group-accessible.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_MAKE_ACCESS_WORLD</constant></term>
<listitem>
<para>Make the bus file world-accessible.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_FLAG_NEGOTIATE</constant></term>
<listitem>
<para>
Requests a set of valid flags for this ioctl. When this bit is
set, no action is taken; the ioctl will return
<errorcode>0</errorcode>, and the <varname>flags</varname>
field will have all bits set that are valid for this command.
The <constant>KDBUS_FLAG_NEGOTIATE</constant> bit will be
cleared by the operation.
</para>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>return_flags</varname></term>
<listitem><para>
Flags returned by the kernel. Currently unused and always set to
<constant>0</constant> by the kernel.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>items</varname></term>
<listitem>
<para>
The following items (see
<citerefentry>
<refentrytitle>kdbus.item</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>)
are expected for <constant>KDBUS_CMD_BUS_MAKE</constant>.
</para>
<variablelist>
<varlistentry>
<term><constant>KDBUS_ITEM_MAKE_NAME</constant></term>
<listitem>
<para>
Contains a null-terminated string that identifies the
bus. The name must be unique across the kdbus domain and
must start with the effective UID of the caller, followed by
a '<literal>-</literal>' (dash). This item is mandatory.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_ITEM_BLOOM_PARAMETER</constant></term>
<listitem>
<para>
Bus-wide bloom parameters passed in a
<type>struct kdbus_bloom_parameter</type>. These settings are
copied back to new connections verbatim. This item is
mandatory. See
<citerefentry>
<refentrytitle>kdbus.item</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
for a more detailed description of this item.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_ITEM_ATTACH_FLAGS_RECV</constant></term>
<listitem>
<para>
An optional item that contains a set of required attach flags
that connections must allow. This item is used as a
negotiation measure during connection creation. If connections
do not satisfy the bus requirements, they are not allowed on
the bus. If not set, the bus does not require any metadata to
be attached; in this case connections are free to set their
own attach flags.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_ITEM_ATTACH_FLAGS_SEND</constant></term>
<listitem>
<para>
An optional item that contains a set of attach flags that are
returned to connections when they query the bus creator
metadata. If not set, no metadata is returned.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_ITEM_NEGOTIATE</constant></term>
<listitem><para>
With this item, programs can <emphasis>probe</emphasis> the
kernel for known item types. See
<citerefentry>
<refentrytitle>kdbus.item</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
for more details.
</para></listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
</variablelist>
<para>
Unrecognized items are rejected, and the ioctl will fail with
<varname>errno</varname> set to <constant>EINVAL</constant>.
</para>
</refsect1>
<refsect1>
<title>Return value</title>
<para>
On success, all mentioned ioctl commands return <errorcode>0</errorcode>;
on error, <errorcode>-1</errorcode> is returned, and
<varname>errno</varname> is set to indicate the error.
If the issued ioctl is illegal for the file descriptor used,
<varname>errno</varname> will be set to <constant>ENOTTY</constant>.
</para>
<refsect2>
<title>
<constant>KDBUS_CMD_BUS_MAKE</constant> may fail with the following
errors
</title>
<variablelist>
<varlistentry>
<term><constant>EBADMSG</constant></term>
<listitem><para>
A mandatory item is missing.
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>EINVAL</constant></term>
<listitem><para>
The flags supplied in the <constant>struct kdbus_cmd</constant>
are invalid or the supplied name does not start with the current
UID and a '<literal>-</literal>' (dash).
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>EEXIST</constant></term>
<listitem><para>
A bus of that name already exists.
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>ESHUTDOWN</constant></term>
<listitem><para>
The kdbus mount instance for the bus was already shut down.
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>EMFILE</constant></term>
<listitem><para>
The maximum number of buses for the current user is exhausted.
</para></listitem>
</varlistentry>
</variablelist>
</refsect2>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member>
<citerefentry>
<refentrytitle>kdbus</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.connection</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.endpoint</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.fs</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.item</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.message</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.name</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.pool</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
</simplelist>
</refsect1>
</refentry>