Systemd/src/libsystemd/GVARIANT-SERIALIZATION

64 lines
2.2 KiB
Plaintext

How we use GVariant for serializing D-Bus messages
--------------------------------------------------
We stay as close to the original dbus1 framing as possible. dbus1 has
the following framing:
1. A fixed header of "yyyyuu"
2. Additional header fields of "a(yv)"
3. Padding with NUL bytes to pad up to next 8byte boundary
4. The body
Note that the body is not padded at the end, the complete message
hence might have a non-aligned size. Reading multiple messages at once
will hence result in possibly unaligned messages in memory.
The header consists of the following:
y Endianness, 'l' or 'B'
y Message Type
y Flags
y Protocol version, '1'
u Length of the body, i.e. the length of part 4 above
u Serial number
= 12 bytes
When using GVariant we keep the basic structure in place, only
slightly extend the header, and define protocol version '2'. The new
header:
y Endianness, 'l' or 'B'
y Message Type
y Flags
y Protocol version, '2'
u Length of the body, i.e. the length of part 4 above
u Serial number
u Length of the additional header fields array
= 16 bytes
This has the nice benefit that the beginning of the additional header
fields array is aligned to an 8 byte boundary. Also, in dbus1
marshalling arrays start with a length value of 32bit, which means in
both dbus1 and gvariant marshallings the size of the header fields
array will be at the same location between bytes 12 and 16. To
visualize that:
0 4 8 12 16
Common: | E | T | F | V | Body Length | Serial | Fields Length |
dbus1: | ... (as above) ... | Fields array ...
gvariant: | ... (as above) ... | Fields Length | Fields array ...
And that's already it.
Note: on kdbus only native endian messages marshalled in gvariant may
be sent. If a client receives a message in non-native endianness
or in dbus1 marshalling it shall ignore the message.
Note: The GVariant "MAYBE" type is not supported, so that messages can
be fully converted forth and back between dbus1 and gvariant
representations.