diff options
Diffstat (limited to 'Documentation/kdbus/kdbus.match.xml')
-rw-r--r-- | Documentation/kdbus/kdbus.match.xml | 555 |
1 files changed, 0 insertions, 555 deletions
diff --git a/Documentation/kdbus/kdbus.match.xml b/Documentation/kdbus/kdbus.match.xml deleted file mode 100644 index ae38e04ab..000000000 --- a/Documentation/kdbus/kdbus.match.xml +++ /dev/null @@ -1,555 +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.match"> - - <refentryinfo> - <title>kdbus.match</title> - <productname>kdbus.match</productname> - </refentryinfo> - - <refmeta> - <refentrytitle>kdbus.match</refentrytitle> - <manvolnum>7</manvolnum> - </refmeta> - - <refnamediv> - <refname>kdbus.match</refname> - <refpurpose>kdbus match</refpurpose> - </refnamediv> - - <refsect1> - <title>Description</title> - - <para> - kdbus connections can install matches in order to subscribe to signal - messages sent on the bus. Such signal messages can be either directed - to a single connection (by setting a specific connection ID in - <varname>struct kdbus_msg.dst_id</varname> or by sending it to a - well-known name), or to potentially <emphasis>all</emphasis> currently - active connections on the bus (by setting - <varname>struct kdbus_msg.dst_id</varname> to - <constant>KDBUS_DST_ID_BROADCAST</constant>). - A signal message always has the <constant>KDBUS_MSG_SIGNAL</constant> - bit set in the <varname>flags</varname> bitfield. - Also, signal messages can originate from either the kernel (called - <emphasis>notifications</emphasis>), or from other bus connections. - In either case, a bus connection needs to have a suitable - <emphasis>match</emphasis> installed in order to receive any signal - message. Without any rules installed in the connection, no signal message - will be received. - </para> - </refsect1> - - <refsect1> - <title>Matches for signal messages from other connections</title> - <para> - Matches for messages from other connections (not kernel notifications) - are implemented as bloom filters (see below). The sender adds certain - properties of the message as elements to a bloom filter bit field, and - sends that along with the signal message. - - The receiving connection adds the message properties it is interested in - as elements to a bloom mask bit field, and uploads the mask as match rule, - possibly along with some other rules to further limit the match. - - The kernel will match the signal message's bloom filter against the - connection's bloom mask (simply by &-ing it), and will decide whether - the message should be delivered to a connection. - </para> - <para> - The kernel has no notion of any specific properties of the signal message, - all it sees are the bit fields of the bloom filter and the mask to match - against. The use of bloom filters allows simple and efficient matching, - without exposing any message properties or internals to the kernel side. - Clients need to deal with the fact that they might receive signal messages - which they did not subscribe to, as the bloom filter might allow - false-positives to pass the filter. - - To allow the future extension of the set of elements in the bloom filter, - the filter specifies a <emphasis>generation</emphasis> number. A later - generation must always contain all elements of the set of the previous - generation, but can add new elements to the set. The match rules mask can - carry an array with all previous generations of masks individually stored. - When the filter and mask are matched by the kernel, the mask with the - closest matching generation is selected as the index into the mask array. - </para> - </refsect1> - - <refsect1> - <title>Bloom filters</title> - <para> - Bloom filters allow checking whether a given word is present in a - dictionary. This allows connections to set up a mask for information it - is interested in, and will be delivered signal messages that have a - matching filter. - - For general information, see - <ulink url="https://en.wikipedia.org/wiki/Bloom_filter">the Wikipedia - article on bloom filters</ulink>. - </para> - <para> - The size of the bloom filter is defined per bus when it is created, in - <varname>kdbus_bloom_parameter.size</varname>. All bloom filters attached - to signal messages on the bus must match this size, and all bloom filter - matches uploaded by connections must also match the size, or a multiple - thereof (see below). - - The calculation of the mask has to be done in userspace applications. The - kernel just checks the bitmasks to decide whether or not to let the - message pass. All bits in the mask must match the filter in and bit-wise - <emphasis>AND</emphasis> logic, but the mask may have more bits set than - the filter. Consequently, false positive matches are expected to happen, - and programs must deal with that fact by checking the contents of the - payload again at receive time. - </para> - <para> - Masks are entities that are always passed to the kernel as part of a - match (with an item of type <constant>KDBUS_ITEM_BLOOM_MASK</constant>), - and filters can be attached to signals, with an item of type - <constant>KDBUS_ITEM_BLOOM_FILTER</constant>. For a filter to match, all - its bits have to be set in the match mask as well. - </para> - <para> - For example, consider a bus that has a bloom size of 8 bytes, and the - following mask/filter combinations: - </para> - <programlisting><![CDATA[ - filter 0x0101010101010101 - mask 0x0101010101010101 - -> matches - - filter 0x0303030303030303 - mask 0x0101010101010101 - -> doesn't match - - filter 0x0101010101010101 - mask 0x0303030303030303 - -> matches - ]]></programlisting> - - <para> - Hence, in order to catch all messages, a mask filled with - <constant>0xff</constant> bytes can be installed as a wildcard match rule. - </para> - - <refsect2> - <title>Generations</title> - - <para> - Uploaded matches may contain multiple masks, which have to be as large - as the bloom filter size defined by the bus. Each block of a mask is - called a <emphasis>generation</emphasis>, starting at index 0. - - At match time, when a signal is about to be delivered, a bloom mask - generation is passed, which denotes which of the bloom masks the filter - should be matched against. This allows programs to provide backward - compatible masks at upload time, while older clients can still match - against older versions of filters. - </para> - </refsect2> - </refsect1> - - <refsect1> - <title>Matches for kernel notifications</title> - <para> - To receive kernel generated notifications (see - <citerefentry> - <refentrytitle>kdbus.message</refentrytitle> - <manvolnum>7</manvolnum> - </citerefentry>), - a connection must install match rules that are different from - the bloom filter matches described in the section above. They can be - filtered by the connection ID that caused the notification to be sent, by - one of the names it currently owns, or by the type of the notification - (ID/name add/remove/change). - </para> - </refsect1> - - <refsect1> - <title>Adding a match</title> - <para> - To add a match, the <constant>KDBUS_CMD_MATCH_ADD</constant> ioctl is - used, which takes a <type>struct kdbus_cmd_match</type> as an argument - described below. - - Note that each of the items attached to this command will internally - create one match <emphasis>rule</emphasis>, and the collection of them, - which is submitted as one block via the ioctl, is called a - <emphasis>match</emphasis>. To allow a message to pass, all rules of a - match have to be satisfied. Hence, adding more items to the command will - only narrow the possibility of a match to effectively let the message - pass, and will decrease the chance that the connection's process will be - woken up needlessly. - - Multiple matches can be installed per connection. As long as one of it has - a set of rules which allows the message to pass, this one will be - decisive. - </para> - - <programlisting> -struct kdbus_cmd_match { - __u64 size; - __u64 flags; - __u64 return_flags; - __u64 cookie; - 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 behavior of the ioctl.</para> - <variablelist> - <varlistentry> - <term><constant>KDBUS_MATCH_REPLACE</constant></term> - <listitem> - <para>Make the endpoint file group-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>cookie</varname></term> - <listitem><para> - A cookie which identifies the match, so it can be referred to when - removing it. - </para></listitem> - </varlistentry> - - <varlistentry> - <term><varname>items</varname></term> - <listitem> - <para> - Items to define the actual rules of the matches. The following item - types are expected. Each item will create one new match rule. - </para> - <variablelist> - <varlistentry> - <term><constant>KDBUS_ITEM_BLOOM_MASK</constant></term> - <listitem> - <para> - An item that carries the bloom filter mask to match against - in its data field. The payload size must match the bloom - filter size that was specified when the bus was created. - See the "Bloom filters" section above for more information on - bloom filters. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>KDBUS_ITEM_NAME</constant></term> - <listitem> - <para> - When used as part of kernel notifications, this item specifies - a name that is acquired, lost or that changed its owner (see - below). When used as part of a match for user-generated signal - messages, it specifies a name that the sending connection must - own at the time of sending the signal. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>KDBUS_ITEM_ID</constant></term> - <listitem> - <para> - Specify a sender connection's ID that will match this rule. - For kernel notifications, this specifies the ID of a - connection that was added to or removed from the bus. - For used-generated signals, it specifies the ID of the - connection that sent the signal message. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>KDBUS_ITEM_NAME_ADD</constant></term> - <term><constant>KDBUS_ITEM_NAME_REMOVE</constant></term> - <term><constant>KDBUS_ITEM_NAME_CHANGE</constant></term> - <listitem> - <para> - These items request delivery of kernel notifications that - describe a name acquisition, loss, or change. The details - are stored in the item's - <varname>kdbus_notify_name_change</varname> member. - All information specified must be matched in order to make - the message pass. Use - <constant>KDBUS_MATCH_ID_ANY</constant> to - match against any unique connection ID. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>KDBUS_ITEM_ID_ADD</constant></term> - <term><constant>KDBUS_ITEM_ID_REMOVE</constant></term> - <listitem> - <para> - These items request delivery of kernel notifications that are - generated when a connection is created or terminated. - <type>struct kdbus_notify_id_change</type> is used to - store the actual match information. This item can be used to - monitor one particular connection ID, or, when the ID field - is set to <constant>KDBUS_MATCH_ID_ANY</constant>, - all of them. - </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> - - <para> - Unrecognized items are rejected, and the ioctl will fail with - <varname>errno</varname> set to <constant>EINVAL</constant>. - </para> - </listitem> - </varlistentry> - </variablelist> - - <para> - Refer to - <citerefentry> - <refentrytitle>kdbus.message</refentrytitle> - <manvolnum>7</manvolnum> - </citerefentry> - for more information on message types. - </para> - </refsect1> - - <refsect1> - <title>Removing a match</title> - <para> - Matches can be removed with the - <constant>KDBUS_CMD_MATCH_REMOVE</constant> ioctl, which takes - <type>struct kdbus_cmd_match</type> as argument, but its fields - usage slightly differs compared to that of - <constant>KDBUS_CMD_MATCH_ADD</constant>. - </para> - - <programlisting> -struct kdbus_cmd_match { - __u64 size; - __u64 cookie; - __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>cookie</varname></term> - <listitem><para> - The cookie of the match, as it was passed when the match was added. - All matches that have this cookie will be removed. - </para></listitem> - </varlistentry> - - <varlistentry> - <term><varname>flags</varname></term> - <listitem><para> - No flags are supported for this use case. - <constant>KDBUS_FLAG_NEGOTIATE</constant> is accepted to probe for - valid flags. If set, the ioctl will fail with - <errorcode>-1</errorcode>, <varname>errno</varname> is set to - <constant>EPROTO</constant>, and the <varname>flags</varname> field - is set to <constant>0</constant>. - </para></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> - No items are supported for this use case, but - <constant>KDBUS_ITEM_NEGOTIATE</constant> is allowed nevertheless. - </para> - </listitem> - </varlistentry> - </variablelist> - </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_MATCH_ADD</constant> may fail with the following - errors - </title> - - <variablelist> - <varlistentry> - <term><constant>EINVAL</constant></term> - <listitem><para> - Illegal flags or items. - </para></listitem> - </varlistentry> - - <varlistentry> - <term><constant>EDOM</constant></term> - <listitem><para> - Illegal bloom filter size. - </para></listitem> - </varlistentry> - - <varlistentry> - <term><constant>EMFILE</constant></term> - <listitem><para> - Too many matches for this connection. - </para></listitem> - </varlistentry> - </variablelist> - </refsect2> - - <refsect2> - <title> - <constant>KDBUS_CMD_MATCH_REMOVE</constant> may fail with the following - errors - </title> - - <variablelist> - <varlistentry> - <term><constant>EINVAL</constant></term> - <listitem><para> - Illegal flags. - </para></listitem> - </varlistentry> - - <varlistentry> - <term><constant>EBADSLT</constant></term> - <listitem><para> - A match entry with the given cookie could not be found. - </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.match</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> |