summaryrefslogtreecommitdiff
path: root/Documentation/kdbus/kdbus.message.xml
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/kdbus/kdbus.message.xml')
-rw-r--r--Documentation/kdbus/kdbus.message.xml1276
1 files changed, 0 insertions, 1276 deletions
diff --git a/Documentation/kdbus/kdbus.message.xml b/Documentation/kdbus/kdbus.message.xml
deleted file mode 100644
index 0115d9d50..000000000
--- a/Documentation/kdbus/kdbus.message.xml
+++ /dev/null
@@ -1,1276 +0,0 @@
-<?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.message">
-
- <refentryinfo>
- <title>kdbus.message</title>
- <productname>kdbus.message</productname>
- </refentryinfo>
-
- <refmeta>
- <refentrytitle>kdbus.message</refentrytitle>
- <manvolnum>7</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>kdbus.message</refname>
- <refpurpose>kdbus message</refpurpose>
- </refnamediv>
-
- <refsect1>
- <title>Description</title>
-
- <para>
- A kdbus message is used to exchange information between two connections
- on a bus, or to transport notifications from the kernel to one or many
- connections. This document describes the layout of messages, how payload
- is added to them and how they are sent and received.
- </para>
- </refsect1>
-
- <refsect1>
- <title>Message layout</title>
-
- <para>The layout of a message is shown below.</para>
-
- <programlisting>
- +-------------------------------------------------------------------------+
- | Message |
- | +---------------------------------------------------------------------+ |
- | | Header | |
- | | size: overall message size, including the data records | |
- | | destination: connection ID of the receiver | |
- | | source: connection ID of the sender (set by kernel) | |
- | | payload_type: "DBusDBus" textual identifier stored as uint64_t | |
- | +---------------------------------------------------------------------+ |
- | +---------------------------------------------------------------------+ |
- | | Data Record | |
- | | size: overall record size (without padding) | |
- | | type: type of data | |
- | | data: reference to data (address or file descriptor) | |
- | +---------------------------------------------------------------------+ |
- | +---------------------------------------------------------------------+ |
- | | padding bytes to the next 8 byte alignment | |
- | +---------------------------------------------------------------------+ |
- | +---------------------------------------------------------------------+ |
- | | Data Record | |
- | | size: overall record size (without padding) | |
- | | ... | |
- | +---------------------------------------------------------------------+ |
- | +---------------------------------------------------------------------+ |
- | | padding bytes to the next 8 byte alignment | |
- | +---------------------------------------------------------------------+ |
- | +---------------------------------------------------------------------+ |
- | | Data Record | |
- | | size: overall record size | |
- | | ... | |
- | +---------------------------------------------------------------------+ |
- | ... further data records ... |
- +-------------------------------------------------------------------------+
- </programlisting>
- </refsect1>
-
- <refsect1>
- <title>Message payload</title>
-
- <para>
- When connecting to the bus, receivers request a memory pool of a given
- size, large enough to carry all backlog of data enqueued for the
- connection. The pool is internally backed by a shared memory file which
- can be <function>mmap()</function>ed by the receiver. See
- <citerefentry>
- <refentrytitle>kdbus.pool</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- for more information.
- </para>
-
- <para>
- Message payload must be described in items attached to a message when
- it is sent. A receiver can access the payload by looking at the items
- that are attached to a message in its pool. The following items are used.
- </para>
-
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_ITEM_PAYLOAD_VEC</constant></term>
- <listitem>
- <para>
- This item references a piece of memory on the sender side which is
- directly copied into the receiver's pool. This way, two peers can
- exchange data by effectively doing a single-copy from one process
- to another; the kernel will not buffer the data anywhere else.
- This item is never found in a message received by a connection.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_ITEM_PAYLOAD_OFF</constant></term>
- <listitem>
- <para>
- This item is attached to messages on the receiving side and points
- to a memory area inside the receiver's pool. The
- <varname>offset</varname> variable in the item denotes the memory
- location relative to the message itself.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_ITEM_PAYLOAD_MEMFD</constant></term>
- <listitem>
- <para>
- Messages can reference <emphasis>memfd</emphasis> files which
- contain the data. memfd files are tmpfs-backed files that allow
- sealing of the content of the file, which prevents all writable
- access to the file content.
- </para>
- <para>
- Only memfds that have
- <constant>(F_SEAL_SHRINK|F_SEAL_GROW|F_SEAL_WRITE|F_SEAL_SEAL)
- </constant>
- set are accepted as payload data, which enforces reliable passing of
- data. The receiver can assume that neither the sender nor anyone
- else can alter the content after the message is sent. If those
- seals are not set on the memfd, the ioctl will fail with
- <errorcode>-1</errorcode>, and <varname>errno</varname> will be
- set to <constant>ETXTBUSY</constant>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_ITEM_FDS</constant></term>
- <listitem>
- <para>
- Messages can transport regular file descriptors via
- <constant>KDBUS_ITEM_FDS</constant>. This item carries an array
- of <type>int</type> values in <varname>item.fd</varname>. The
- maximum number of file descriptors in the item is
- <constant>253</constant>, and only one item of this type is
- accepted per message. All passed values must be valid file
- descriptors; the open count of each file descriptors is increased
- by installing it to the receiver's task. This item can only be
- used for directed messages, not for broadcasts, and only to
- remote peers that have opted-in for receiving file descriptors
- at connection time (<constant>KDBUS_HELLO_ACCEPT_FD</constant>).
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>
- The sender must not make any assumptions on the type in which data is
- received by the remote peer. The kernel is free to re-pack multiple
- <constant>KDBUS_ITEM_PAYLOAD_VEC</constant> and
- <constant>KDBUS_ITEM_PAYLOAD_MEMFD</constant> payloads. For instance, the
- kernel may decide to merge multiple <constant>VECs</constant> into a
- single <constant>VEC</constant>, inline <constant>MEMFD</constant>
- payloads into memory, or merge all passed <constant>VECs</constant> into a
- single <constant>MEMFD</constant>. However, the kernel preserves the order
- of passed data. This means that the order of all <constant>VEC</constant>
- and <constant>MEMFD</constant> items is not changed in respect to each
- other. In other words: All passed <constant>VEC</constant> and
- <constant>MEMFD</constant> data payloads are treated as a single stream
- of data that may be received by the remote peer in a different set of
- chunks than it was sent as.
- </para>
- </refsect1>
-
- <refsect1>
- <title>Sending messages</title>
-
- <para>
- Messages are passed to the kernel with the
- <constant>KDBUS_CMD_SEND</constant> ioctl. Depending on the destination
- address of the message, the kernel delivers the message to the specific
- destination connection, or to some subset of all connections on the same
- bus. Sending messages across buses is not possible. Messages are always
- queued in the memory pool of the destination connection (see above).
- </para>
-
- <para>
- The <constant>KDBUS_CMD_SEND</constant> ioctl uses a
- <type>struct kdbus_cmd_send</type> to describe the message
- transfer.
- </para>
- <programlisting>
-struct kdbus_cmd_send {
- __u64 size;
- __u64 flags;
- __u64 return_flags;
- __u64 msg_address;
- struct kdbus_msg_info reply;
- 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>Flags for message delivery</para>
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_SEND_SYNC_REPLY</constant></term>
- <listitem>
- <para>
- By default, all calls to kdbus are considered asynchronous,
- non-blocking. However, as there are many use cases that need
- to wait for a remote peer to answer a method call, there's a
- way to send a message and wait for a reply in a synchronous
- fashion. This is what the
- <constant>KDBUS_SEND_SYNC_REPLY</constant> controls. The
- <constant>KDBUS_CMD_SEND</constant> ioctl will block until the
- reply has arrived, the timeout limit is reached, in case the
- remote connection was shut down, or if interrupted by a signal
- before any reply; see
- <citerefentry>
- <refentrytitle>signal</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>.
-
- The offset of the reply message in the sender's pool is stored
- in <varname>reply</varname> when the ioctl has returned without
- error. Hence, there is no need for another
- <constant>KDBUS_CMD_RECV</constant> ioctl or anything else to
- receive the reply.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_FLAG_NEGOTIATE</constant></term>
- <listitem>
- <para>
- Request a set of valid flags for this ioctl. When this bit is
- set, no action is taken; the ioctl will fail with
- <errorcode>-1</errorcode>, <varname>errno</varname>
- is set to <constant>EPROTO</constant>.
- Once the ioctl returned, the <varname>flags</varname>
- field will have all bits set that the kernel recognizes as
- 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>msg_address</varname></term>
- <listitem><para>
- In this field, users have to provide a pointer to a message
- (<type>struct kdbus_msg</type>) to send. See below for a
- detailed description.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>reply</varname></term>
- <listitem><para>
- Only used for synchronous replies. See description of
- <type>struct kdbus_cmd_recv</type> for more details.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>items</varname></term>
- <listitem>
- <para>
- The following items are currently recognized.
- </para>
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_ITEM_CANCEL_FD</constant></term>
- <listitem>
- <para>
- When this optional item is passed in, and the call is
- executed as SYNC call, the passed in file descriptor can be
- used as alternative cancellation point. The kernel will call
- <citerefentry>
- <refentrytitle>poll</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- on this file descriptor, and once it reports any incoming
- bytes, the blocking send operation will be canceled; the
- blocking, synchronous ioctl call will return
- <errorcode>-1</errorcode>, and <varname>errno</varname> will
- be set to <errorname>ECANCELED</errorname>.
- Any type of file descriptor on which
- <citerefentry>
- <refentrytitle>poll</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- can be called on can be used as payload to this item; for
- example, an eventfd can be used for this purpose, see
- <citerefentry>
- <refentrytitle>eventfd</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>.
- For asynchronous message sending, this item is allowed but
- ignored.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>
- Unrecognized items are rejected, and the ioctl will fail with
- <varname>errno</varname> set to <constant>EINVAL</constant>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>
- The message referenced by the <varname>msg_address</varname> above has
- the following layout.
- </para>
-
- <programlisting>
-struct kdbus_msg {
- __u64 size;
- __u64 flags;
- __s64 priority;
- __u64 dst_id;
- __u64 src_id;
- __u64 payload_type;
- __u64 cookie;
- __u64 timeout_ns;
- __u64 cookie_reply;
- 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>Flags to describe message details.</para>
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_MSG_EXPECT_REPLY</constant></term>
- <listitem>
- <para>
- Expect a reply to this message from the remote peer. With
- this bit set, the timeout_ns field must be set to a non-zero
- number of nanoseconds in which the receiving peer is expected
- to reply. If such a reply is not received in time, the sender
- will be notified with a timeout message (see below). The
- value must be an absolute value, in nanoseconds and based on
- <constant>CLOCK_MONOTONIC</constant>.
- </para><para>
- For a message to be accepted as reply, it must be a direct
- message to the original sender (not a broadcast and not a
- signal message), and its
- <varname>kdbus_msg.cookie_reply</varname> must match the
- previous message's <varname>kdbus_msg.cookie</varname>.
- </para><para>
- Expected replies also temporarily open the policy of the
- sending connection, so the other peer is allowed to respond
- within the given time window.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_MSG_NO_AUTO_START</constant></term>
- <listitem>
- <para>
- By default, when a message is sent to an activator
- connection, the activator is notified and will start an
- implementer. This flag inhibits that behavior. With this bit
- set, and the remote being an activator, the ioctl will fail
- with <varname>errno</varname> set to
- <constant>EADDRNOTAVAIL</constant>.
- </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>priority</varname></term>
- <listitem><para>
- The priority of this message. Receiving messages (see below) may
- optionally be constrained to messages of a minimal priority. This
- allows for use cases where timing critical data is interleaved with
- control data on the same connection. If unused, the priority field
- should be set to <constant>0</constant>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>dst_id</varname></term>
- <listitem><para>
- The numeric ID of the destination connection, or
- <constant>KDBUS_DST_ID_BROADCAST</constant>
- (~0ULL) to address every peer on the bus, or
- <constant>KDBUS_DST_ID_NAME</constant> (0) to look
- it up dynamically from the bus' name registry.
- In the latter case, an item of type
- <constant>KDBUS_ITEM_DST_NAME</constant> is mandatory.
- Also see
- <citerefentry>
- <refentrytitle>kdbus.name</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- .
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>src_id</varname></term>
- <listitem><para>
- Upon return of the ioctl, this member will contain the sending
- connection's numerical ID. Should be 0 at send time.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>payload_type</varname></term>
- <listitem><para>
- Type of the payload in the actual data records. Currently, only
- <constant>KDBUS_PAYLOAD_DBUS</constant> is accepted as input value
- of this field. When receiving messages that are generated by the
- kernel (notifications), this field will contain
- <constant>KDBUS_PAYLOAD_KERNEL</constant>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>cookie</varname></term>
- <listitem><para>
- Cookie of this message, for later recognition. Also, when replying
- to a message (see above), the <varname>cookie_reply</varname>
- field must match this value.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>timeout_ns</varname></term>
- <listitem><para>
- If the message sent requires a reply from the remote peer (see above),
- this field contains the timeout in absolute nanoseconds based on
- <constant>CLOCK_MONOTONIC</constant>. Also see
- <citerefentry>
- <refentrytitle>clock_gettime</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>cookie_reply</varname></term>
- <listitem><para>
- If the message sent is a reply to another message, this field must
- match the cookie of the formerly received message.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>items</varname></term>
- <listitem>
- <para>
- A dynamically sized list of items to contain additional information.
- The following items are expected/valid:
- </para>
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_ITEM_PAYLOAD_VEC</constant></term>
- <term><constant>KDBUS_ITEM_PAYLOAD_MEMFD</constant></term>
- <term><constant>KDBUS_ITEM_FDS</constant></term>
- <listitem>
- <para>
- Actual data records containing the payload. See section
- "Message payload".
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_ITEM_BLOOM_FILTER</constant></term>
- <listitem>
- <para>
- Bloom filter for matches (see below).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_ITEM_DST_NAME</constant></term>
- <listitem>
- <para>
- Well-known name to send this message to. Required if
- <varname>dst_id</varname> is set to
- <constant>KDBUS_DST_ID_NAME</constant>.
- If a connection holding the given name can't be found,
- the ioctl will fail with <varname>errno</varname> set to
- <constant>ESRCH</constant> is returned.
- </para>
- <para>
- For messages to a unique name (ID), this item is optional. If
- present, the kernel will make sure the name owner matches the
- given unique name. This allows programs to tie the message
- sending to the condition that a name is currently owned by a
- certain unique name.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>
- The message will be augmented by the requested metadata items when
- queued into the receiver's pool. See
- <citerefentry>
- <refentrytitle>kdbus.connection</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- and
- <citerefentry>
- <refentrytitle>kdbus.item</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- for more information on metadata.
- </para>
- </refsect1>
-
- <refsect1>
- <title>Receiving messages</title>
-
- <para>
- Messages are received by the client with the
- <constant>KDBUS_CMD_RECV</constant> ioctl. The endpoint file of the bus
- supports <function>poll()/epoll()/select()</function>; when new messages
- are available on the connection's file descriptor,
- <constant>POLLIN</constant> is reported. For compatibility reasons,
- <constant>POLLOUT</constant> is always reported as well. Note, however,
- that the latter does not guarantee that a message can in fact be sent, as
- this depends on how many pending messages the receiver has in its pool.
- </para>
-
- <para>
- With the <constant>KDBUS_CMD_RECV</constant> ioctl, a
- <type>struct kdbus_cmd_recv</type> is used.
- </para>
-
- <programlisting>
-struct kdbus_cmd_recv {
- __u64 size;
- __u64 flags;
- __u64 return_flags;
- __s64 priority;
- __u64 dropped_msgs;
- struct kdbus_msg_info msg;
- 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>Flags to control the receive command.</para>
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_RECV_PEEK</constant></term>
- <listitem>
- <para>
- Just return the location of the next message. Do not install
- file descriptors or anything else. This is usually used to
- determine the sender of the next queued message.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_RECV_DROP</constant></term>
- <listitem>
- <para>
- Drop the next message without doing anything else with it,
- and free the pool slice. This a short-cut for
- <constant>KDBUS_RECV_PEEK</constant> and
- <constant>KDBUS_CMD_FREE</constant>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_RECV_USE_PRIORITY</constant></term>
- <listitem>
- <para>
- Dequeue the messages ordered by their priority, and filtering
- them with the priority field (see below).
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>KDBUS_FLAG_NEGOTIATE</constant></term>
- <listitem>
- <para>
- Request a set of valid flags for this ioctl. When this bit is
- set, no action is taken; the ioctl will fail with
- <errorcode>-1</errorcode>, <varname>errno</varname>
- is set to <constant>EPROTO</constant>.
- Once the ioctl returned, the <varname>flags</varname>
- field will have all bits set that the kernel recognizes as
- valid for this command.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>return_flags</varname></term>
- <listitem><para>
- Flags returned by the kernel. If the <varname>dropped_msgs</varname>
- field is non-zero, <constant>KDBUS_RECV_RETURN_DROPPED_MSGS</constant>
- is set. If a file descriptor could not be installed, the
- <constant>KDBUS_RECV_RETURN_INCOMPLETE_FDS</constant> flag is set.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>priority</varname></term>
- <listitem><para>
- With <constant>KDBUS_RECV_USE_PRIORITY</constant> set in
- <varname>flags</varname>, messages will be dequeued ordered by their
- priority, starting with the highest value. Also, messages will be
- filtered by the value given in this field, so the returned message
- will at least have the requested priority. If no such message is
- waiting in the queue, the ioctl will fail, and
- <varname>errno</varname> will be set to <constant>EAGAIN</constant>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>dropped_msgs</varname></term>
- <listitem><para>
- Whenever a message with <constant>KDBUS_MSG_SIGNAL</constant> is sent
- but cannot be queued on a peer (e.g., as it contains FDs but the peer
- does not support FDs, or there is no space left in the peer's pool)
- the 'dropped_msgs' counter of the peer is incremented. On the next
- RECV ioctl, the 'dropped_msgs' field is copied into the ioctl struct
- and cleared on the peer. If it was non-zero, the
- <constant>KDBUS_RECV_RETURN_DROPPED_MSGS</constant> flag will be set
- in <varname>return_flags</varname>. Note that this will only happen
- if the ioctl succeeded or failed with <constant>EAGAIN</constant>. In
- other error cases, the 'dropped_msgs' field of the peer is left
- untouched.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>msg</varname></term>
- <listitem><para>
- Embedded struct containing information on the received message when
- this command succeeded (see below).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>items</varname></term>
- <listitem><para>
- Items to specify further details for the receive command.
- Currently unused, and all items will be rejected with
- <varname>errno</varname> set to <constant>EINVAL</constant>.
- </para></listitem>
- </varlistentry>
- </variablelist>
-
- <para>
- Both <type>struct kdbus_cmd_recv</type> and
- <type>struct kdbus_cmd_send</type> embed
- <type>struct kdbus_msg_info</type>.
- For the <constant>KDBUS_CMD_SEND</constant> ioctl, it is used to catch
- synchronous replies, if one was requested, and is unused otherwise.
- </para>
-
- <programlisting>
-struct kdbus_msg_info {
- __u64 offset;
- __u64 msg_size;
- __u64 return_flags;
-};
- </programlisting>
-
- <para>The fields in this struct are described below.</para>
-
- <variablelist>
- <varlistentry>
- <term><varname>offset</varname></term>
- <listitem><para>
- Upon return of the ioctl, this field contains the offset in the
- receiver's memory pool. The memory must be freed with
- <constant>KDBUS_CMD_FREE</constant>. See
- <citerefentry>
- <refentrytitle>kdbus.pool</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- for further details.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>msg_size</varname></term>
- <listitem><para>
- Upon successful return of the ioctl, this field contains the size of
- the allocated slice at offset <varname>offset</varname>.
- It is the combination of the size of the stored
- <type>struct kdbus_msg</type> object plus all appended VECs.
- You can use it in combination with <varname>offset</varname> to map
- a single message, instead of mapping the entire pool. See
- <citerefentry>
- <refentrytitle>kdbus.pool</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- for further details.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>return_flags</varname></term>
- <listitem>
- <para>
- Kernel-provided return flags. Currently, the following flags are
- defined.
- </para>
- <variablelist>
- <varlistentry>
- <term><constant>KDBUS_RECV_RETURN_INCOMPLETE_FDS</constant></term>
- <listitem>
- <para>
- The message contained memfds or file descriptors, and the
- kernel failed to install one or more of them at receive time.
- Most probably that happened because the maximum number of
- file descriptors for the receiver's task were exceeded.
- In such cases, the message is still delivered, so this is not
- a fatal condition. File descriptors numbers inside the
- <constant>KDBUS_ITEM_FDS</constant> item or memfd files
- referenced by <constant>KDBUS_ITEM_PAYLOAD_MEMFD</constant>
- items which could not be installed will be set to
- <constant>-1</constant>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>
- Unless <constant>KDBUS_RECV_DROP</constant> was passed, the
- <varname>offset</varname> field contains the location of the new message
- inside the receiver's pool after the <constant>KDBUS_CMD_RECV</constant>
- ioctl was employed. The message is stored as <type>struct kdbus_msg</type>
- at this offset, and can be interpreted with the semantics described above.
- </para>
- <para>
- Also, if the connection allowed for file descriptor to be passed
- (<constant>KDBUS_HELLO_ACCEPT_FD</constant>), and if the message contained
- any, they will be installed into the receiving process when the
- <constant>KDBUS_CMD_RECV</constant> ioctl is called.
- <emphasis>memfds</emphasis> may always be part of the message payload.
- The receiving task is obliged to close all file descriptors appropriately
- once no longer needed. If <constant>KDBUS_RECV_PEEK</constant> is set, no
- file descriptors are installed. This allows for peeking at a message,
- looking at its metadata only and dropping it via
- <constant>KDBUS_RECV_DROP</constant>, without installing any of the file
- descriptors into the receiving process.
- </para>
- <para>
- The caller is obliged to call the <constant>KDBUS_CMD_FREE</constant>
- ioctl with the returned offset when the memory is no longer needed.
- </para>
- </refsect1>
-
- <refsect1>
- <title>Notifications</title>
- <para>
- A kernel notification is a regular kdbus message with the following
- details.
- </para>
-
- <itemizedlist>
- <listitem><para>
- kdbus_msg.src_id == <constant>KDBUS_SRC_ID_KERNEL</constant>
- </para></listitem>
- <listitem><para>
- kdbus_msg.dst_id == <constant>KDBUS_DST_ID_BROADCAST</constant>
- </para></listitem>
- <listitem><para>
- kdbus_msg.payload_type == <constant>KDBUS_PAYLOAD_KERNEL</constant>
- </para></listitem>
- <listitem><para>
- Has exactly one of the items attached that are described below.
- </para></listitem>
- <listitem><para>
- Always has a timestamp item (<constant>KDBUS_ITEM_TIMESTAMP</constant>)
- attached.
- </para></listitem>
- </itemizedlist>
-
- <para>
- The kernel will notify its users of the following events.
- </para>
-
- <itemizedlist>
- <listitem><para>
- When connection <emphasis>A</emphasis> is terminated while connection
- <emphasis>B</emphasis> is waiting for a reply from it, connection
- <emphasis>B</emphasis> is notified with a message with an item of
- type <constant>KDBUS_ITEM_REPLY_DEAD</constant>.
- </para></listitem>
-
- <listitem><para>
- When connection <emphasis>A</emphasis> does not receive a reply from
- connection <emphasis>B</emphasis> within the specified timeout window,
- connection <emphasis>A</emphasis> will receive a message with an
- item of type <constant>KDBUS_ITEM_REPLY_TIMEOUT</constant>.
- </para></listitem>
-
- <listitem><para>
- When an ordinary connection (not a monitor) is created on or removed
- from a bus, messages with an item of type
- <constant>KDBUS_ITEM_ID_ADD</constant> or
- <constant>KDBUS_ITEM_ID_REMOVE</constant>, respectively, are delivered
- to all bus members that match these messages through their match
- database. Eavesdroppers (monitor connections) do not cause such
- notifications to be sent. They are invisible on the bus.
- </para></listitem>
-
- <listitem><para>
- When a connection gains or loses ownership of a name, messages with an
- item of type <constant>KDBUS_ITEM_NAME_ADD</constant>,
- <constant>KDBUS_ITEM_NAME_REMOVE</constant> or
- <constant>KDBUS_ITEM_NAME_CHANGE</constant> are delivered to all bus
- members that match these messages through their match database.
- </para></listitem>
- </itemizedlist>
- </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_SEND</constant> may fail with the following
- errors
- </title>
-
- <variablelist>
- <varlistentry>
- <term><constant>EOPNOTSUPP</constant></term>
- <listitem><para>
- The connection is not an ordinary connection, or the passed
- file descriptors in <constant>KDBUS_ITEM_FDS</constant> item are
- either kdbus handles or unix domain sockets. Both are currently
- unsupported.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EINVAL</constant></term>
- <listitem><para>
- The submitted payload type is
- <constant>KDBUS_PAYLOAD_KERNEL</constant>,
- <constant>KDBUS_MSG_EXPECT_REPLY</constant> was set without timeout
- or cookie values, <constant>KDBUS_SEND_SYNC_REPLY</constant> was
- set without <constant>KDBUS_MSG_EXPECT_REPLY</constant>, an invalid
- item was supplied, <constant>src_id</constant> was non-zero and was
- different from the current connection's ID, a supplied memfd had a
- size of 0, or a string was not properly null-terminated.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ENOTUNIQ</constant></term>
- <listitem><para>
- The supplied destination is
- <constant>KDBUS_DST_ID_BROADCAST</constant> and either
- file descriptors were passed, or
- <constant>KDBUS_MSG_EXPECT_REPLY</constant> was set,
- or a timeout was given.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>E2BIG</constant></term>
- <listitem><para>
- Too many items.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EMSGSIZE</constant></term>
- <listitem><para>
- The size of the message header and items or the payload vector
- is excessive.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EEXIST</constant></term>
- <listitem><para>
- Multiple <constant>KDBUS_ITEM_FDS</constant>,
- <constant>KDBUS_ITEM_BLOOM_FILTER</constant> or
- <constant>KDBUS_ITEM_DST_NAME</constant> items were supplied.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EBADF</constant></term>
- <listitem><para>
- The supplied <constant>KDBUS_ITEM_FDS</constant> or
- <constant>KDBUS_ITEM_PAYLOAD_MEMFD</constant> items
- contained an illegal file descriptor.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EMEDIUMTYPE</constant></term>
- <listitem><para>
- The supplied memfd is not a sealed kdbus memfd.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EMFILE</constant></term>
- <listitem><para>
- Too many file descriptors inside a
- <constant>KDBUS_ITEM_FDS</constant>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EBADMSG</constant></term>
- <listitem><para>
- An item had illegal size, both a <constant>dst_id</constant> and a
- <constant>KDBUS_ITEM_DST_NAME</constant> was given, or both a name
- and a bloom filter was given.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ETXTBSY</constant></term>
- <listitem><para>
- The supplied kdbus memfd file cannot be sealed or the seal
- was removed, because it is shared with other processes or
- still mapped with
- <citerefentry>
- <refentrytitle>mmap</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ECOMM</constant></term>
- <listitem><para>
- A peer does not accept the file descriptors addressed to it.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EFAULT</constant></term>
- <listitem><para>
- The supplied bloom filter size was not 64-bit aligned, or supplied
- memory could not be accessed by the kernel.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EDOM</constant></term>
- <listitem><para>
- The supplied bloom filter size did not match the bloom filter
- size of the bus.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EDESTADDRREQ</constant></term>
- <listitem><para>
- <constant>dst_id</constant> was set to
- <constant>KDBUS_DST_ID_NAME</constant>, but no
- <constant>KDBUS_ITEM_DST_NAME</constant> was attached.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ESRCH</constant></term>
- <listitem><para>
- The name to look up was not found in the name registry.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EADDRNOTAVAIL</constant></term>
- <listitem><para>
- <constant>KDBUS_MSG_NO_AUTO_START</constant> was given but the
- destination connection is an activator.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ENXIO</constant></term>
- <listitem><para>
- The passed numeric destination connection ID couldn't be found,
- or is not connected.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ECONNRESET</constant></term>
- <listitem><para>
- The destination connection is no longer active.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ETIMEDOUT</constant></term>
- <listitem><para>
- Timeout while synchronously waiting for a reply.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EINTR</constant></term>
- <listitem><para>
- Interrupted system call while synchronously waiting for a reply.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EPIPE</constant></term>
- <listitem><para>
- When sending a message, a synchronous reply from the receiving
- connection was expected but the connection died before answering.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>ENOBUFS</constant></term>
- <listitem><para>
- Too many pending messages on the receiver side.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EREMCHG</constant></term>
- <listitem><para>
- Both a well-known name and a unique name (ID) was given, but
- the name is not currently owned by that connection.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EXFULL</constant></term>
- <listitem><para>
- The memory pool of the receiver is full.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EREMOTEIO</constant></term>
- <listitem><para>
- While synchronously waiting for a reply, the remote peer
- failed with an I/O error.
- </para></listitem>
- </varlistentry>
- </variablelist>
- </refsect2>
-
- <refsect2>
- <title>
- <constant>KDBUS_CMD_RECV</constant> may fail with the following
- errors
- </title>
-
- <variablelist>
- <varlistentry>
- <term><constant>EOPNOTSUPP</constant></term>
- <listitem><para>
- The connection is not an ordinary connection, or the passed
- file descriptors are either kdbus handles or unix domain
- sockets. Both are currently unsupported.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EINVAL</constant></term>
- <listitem><para>
- Invalid flags or offset.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>EAGAIN</constant></term>
- <listitem><para>
- No message found in the queue.
- </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.bus</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.name</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>kdbus.pool</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>clock_gettime</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>ioctl</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>poll</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>select</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>epoll</refentrytitle>
- <manvolnum>7</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>eventfd</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- </member>
- <member>
- <citerefentry>
- <refentrytitle>memfd_create</refentrytitle>
- <manvolnum>2</manvolnum>
- </citerefentry>
- </member>
- </simplelist>
- </refsect1>
-</refentry>