From: Kay Sievers Date: Fri, 27 Dec 2013 00:27:43 +0000 (+0100) Subject: bus: update PORTING-DBUS1 X-Git-Tag: v209~620 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=6206f4b49db2de55ee335d6108f474b715b21ae4;hp=3e8ba0b815ebe83e396eb911fa9302e6ddb0ac07 bus: update PORTING-DBUS1 --- diff --git a/src/libsystemd-bus/PORTING-DBUS1 b/src/libsystemd-bus/PORTING-DBUS1 index f2cf27748..d7e0114c7 100644 --- a/src/libsystemd-bus/PORTING-DBUS1 +++ b/src/libsystemd-bus/PORTING-DBUS1 @@ -1,4 +1,4 @@ -A few hints on supporting kdbus as backend in your favourite D-Bus library. +A few hints on supporting kdbus as backend in your favorite D-Bus library. ~~~ @@ -6,19 +6,19 @@ Before you read this, have a look at the DIFFERENCES and GVARIANT_SERIALIZATION texts, you find in the same directory where you found this. -We invite you to port your favourite D-Bus protocol implementation +We invite you to port your favorite D-Bus protocol implementation over to kdbus. However, there are a couple of complexities -involved. On kdbus we only speak GVariant marshalling, kdbus clients -ignore traffic in dbus1 marshalling. Thus, you need to add a second, -GVariant compatible marshaller to your libary first. +involved. On kdbus we only speak GVariant marshaling, kdbus clients +ignore traffic in dbus1 marshaling. Thus, you need to add a second, +GVariant compatible marshaler to your libary first. After you have done that: here's the basic principle how kdbus works: You connect to a bus by opening its bus node in /dev/kdbus/. All -busses have a device node there, that starts with a numeric UID of the +buses have a device node there, that starts with a numeric UID of the owner of the bus, followed by a dash and a string identifying the bus. The system bus is thus called /dev/kdbus/0-system, and for user -busses the device node is /dev/kdbus/1000-user (if 1000 is your user +buses the device node is /dev/kdbus/1000-user (if 1000 is your user id). (Before we proceed, please always keep a copy of libsystemd-bus next @@ -71,8 +71,8 @@ broadcast bloom filter (see below). The kernel will also return the bus ID of the bus in an 128bit field. -The pool size field returned by the kernel indicates the size of the -memory mapped buffer. +The pool size field specifies the size of the memory mapped buffer +where received messages are placed by the kernel. After the calling the hello ioctl, you should memory map the kdbus fd. Use the pool size returned by the hello ioctl as map size. In this @@ -88,7 +88,7 @@ flags field, though the DONT_EXPECT_REPLY field got inverted into EXPECT_REPLY. The dst_id/src_id field contains the unique id of the destination and -the sender. The sender field is overriden by the kernel usually, hence +the sender. The sender field is overridden by the kernel usually, hence you shouldn't fill it in. The destination field can also take the special value KDBUS_DST_ID_BROADCAST for broadcast messages. For messages intended to a well-known name set the field to @@ -108,7 +108,7 @@ When sending a message that expects a reply, you need to set the EXPECT_REPLY flag in the message flag field. In this case you should also fill out the "timeout_ns" value which indicates the timeout in nsec for this call. If the peer does not respond in this time you will -get a notifcation of a timeout. Note that this is also used for +get a notification of a timeout. Note that this is also used for security purposes: a single reply messages is only allowed through the bus as long as the timeout has not ended. With this timeout value you hence "open a time window" in which the peer might respond to your @@ -129,29 +129,29 @@ it: referencing arbitrary user memory. This is how you reference most of your data. It's a lot like the good old iovec structure of glibc. - KDBUS_ITEM_PAYLOAD_MEMFD: for large data blocks it is prefereable - to send prepared "memfds" (see below) over. This is item contains an + KDBUS_ITEM_PAYLOAD_MEMFD: for large data blocks it is preferable + to send prepared "memfds" (see below) over. This item contains an fd for a memfd plus a size. KDBUS_ITEM_PAYLOAD_FDS: for sending over fds attach an item of this type with an array of fds. KDBUS_ITEM_BLOOM: the calculated bloom filter of this message, only - for undericted (broadcast) message. + for undirected (broadcast) message. KDBUS_DST_NAME: for messages that are directed to a well-known name (instead of a unique name), this item contains the well-known name field. -A single message may consists on no, one or more payload items of type +A single message may consists of no, one or more payload items of type PAYLOAD_VEC or PAYLOAD_MEMFD. D-Bus protocol implementations should treat them as a single block that just happens to be split up into multiple items. Some restrictions apply however: The message header in its entirety must be contained in a single - PAYLOAD_VEC item + PAYLOAD_VEC item. - You may only split your messsage up right in front of each GVariant + You may only split your message up right in front of each GVariant contained in the payload as well is immediately before framing of a Gvariant, as well after as any padding bytes if there are any. The padding bytes must be wholly contained in the preceding @@ -166,9 +166,9 @@ multiple items. Some restrictions apply however: element and the array in a single uninterrupted item, however the various strings might end up in different items. -Note again that splitting up messages into seperate items is up to the +Note again that splitting up messages into separate items is up to the implementation. Also note that the kdbus kernel side might merge -seperate items if it deems this to be useful. However, the order in +separate items if it deems this to be useful. However, the order in which items are contained in the message is left untouched. PAYLOAD_MEMFD items allow zero-copy data transfer (see below regarding @@ -221,9 +221,9 @@ FREE ioctl only after that's done. BLOOM FILTERS -The kernel does not understand dbus marshalling, it will not look into +The kernel does not understand dbus marshaling, it will not look into the message payload. To allow clients to subscribe to specific subsets -of the broadcast matches we emply bloom filters. +of the broadcast matches we employ bloom filters. When broadcasting messages a bloom filter needs to be attached to the message in a KDBUS_ITEM_BLOOM item (and only for broadcasting @@ -290,11 +290,11 @@ names!) When a client wants to subscribe to messages matching a certain expression it should calculate the bloom mask following the same -algorithm. The kernel will then simply test the mask againt the +algorithm. The kernel will then simply test the mask against the attached bloom filters. Note that bloom filters are probabilistic, which means that clients -might get messages they did not expect. You bus protocol +might get messages they did not expect. Your bus protocol implementation must be capable of dealing with these unexpected messages (which it needs to anyway, given that transfers are relatively unrestricted on kdbus and people can send you all kinds of @@ -334,7 +334,7 @@ When creating a match you may attach a "cookie" value to them, which is used for deleting a match again. The cookie can be selected freely be the client. When issuing KDBUS_CMD_REMOVE_MATCH simply pass the same cookie as before and all matches matching the same "cookie" value -will be removed. This is particulary handy for the case where multiple +will be removed. This is particularly handy for the case where multiple ioctl()s are added for a single match strings. MEMFDS @@ -356,7 +356,7 @@ it without having to copy it to a safe memory error. memfds can also be reused in multiple messages. A sender may send the same memfd to multiple peers, and since it is sealed in can rely that the received will not be able to modify it. "Sealing" hence provides both sides of -a transactiom with the guarantee that the data stays constant and is +a transaction with the guarantee that the data stays constant and is reusable. memfds are a generic concept that can be used outside of the immediate @@ -366,7 +366,7 @@ payloads, but may also be sent as normal fds. memfds are allocated KDBUS_CMD_MEMFD_NEW ioctl. After allocation simply memory map them and write to them. To set their size use -KDBUS_CMD_MEMFD_SIZE_SET. Note that memfds will ne increased in size +KDBUS_CMD_MEMFD_SIZE_SET. Note that memfds will be increased in size automatically if you touch previously unallocated pages. However, the size will only be increased in multiples of the page size in that case. Thus, in almost all cases, an explicitl KDBUS_CMD_MEMFD_SIZE_SET @@ -399,7 +399,7 @@ like any other that happen to be attached to the message. MESSAGES FROM THE KERNEL -A couple of messages previousl generated by the dbus1 bus driver are +A couple of messages previously generated by the dbus1 bus driver are now generated by the kernel. Since the kernel does not understand the payload marshalling they are shipped in a different format though. This is indicated with a the "payload type" field of the @@ -427,7 +427,7 @@ More specifically: When a method call fails because the peer terminated the connection before responding a KDBUS_ITEM_REPLY_DEAD message is - generated. Simiarl, it should be synthesized into a method error + generated. Simiarly, it should be synthesized into a method error reply message. For synthesized messages we recommend setting the cookie field to @@ -439,7 +439,7 @@ Note that the KDBUS_ITEM_NAME_XYZ messages will actually inform you about all kinds of names, including activatable ones. Classic dbus1 NameOwnerChanged messages OTOH are only generated when a name is really acquired on the bus and not just simply activatable. This means -you must explictly check for the case where an activatable name +you must explicitly check for the case where an activatable name becomes acquired or an acquired name is lost and returns to be activatable. @@ -449,12 +449,12 @@ To acquire names on the bus use the KDBUS_CMD_NAME_ACQUIRE ioctl(). It takes a flags field similar to dbus1's RequestName() bus driver call, however the NO_QUEUE flag got inverted into a QUEUE flag instead. -To release a previousl acquired name use the KDBUS_CMD_NAME_RELEASE +To release a previously acquired name use the KDBUS_CMD_NAME_RELEASE ioctl(). To list acquired names use the KDBUS_CMD_CONN_INFO ioctl. It may be used to list unique names, well known names as well as activatable -names and clients currently queueing for ownership of a well-known +names and clients currently queuing for ownership of a well-known name. The ioctl will return an offset into the memory pool. After reading all the data you need you need to release this via the KDBUS_CMD_FREE ioctl(), similar how you release a received message. @@ -482,7 +482,7 @@ different set of credentials to gather than was originally requested for being attached to incoming messages. Credentials are always specific to the sender namespace that was -current at the time of sending, and of the proceess that opened the +current at the time of sending, and of the process that opened the bus connection at the time of opening it. Note that this latter data is cached! @@ -492,7 +492,7 @@ The kernel enforces only very limited policy on names. It will not do access filtering by userspace payload, and thus not by interface or method name. -This ultimately means that most finegrained policy enforcement needs +This ultimately means that most fine-grained policy enforcement needs to be done by the receiving process. We recommend using PolicyKit for any more complex checks. However, libraries should make simple static policy decisions regarding privileged/unprivileged method calls @@ -543,6 +543,6 @@ This all is just the status quo. We are putting this together, because we are quite confident that further API changes will be smaller, but to make this very clear: this is all subject to change, still! -We invite you to port over your favourite dbus library to this new +We invite you to port over your favorite dbus library to this new scheme, but please be prepared to make minor changes when we still change these interfaces!