When a protocol has a @transport("Driver") attribute, the protocol operates over the driver transport rather than the zircon channel transport:
library fuchsia.example; @transport("Driver") protocol Protocol { TwoWay(struct { request uint32; }) -> (struct { response uint32; }); };
The driver transport builds on the Fuchsia driver runtime , which has different memory management constraints and a different threading model than with Zircon channels. As such, the FIDL client and server types are different from those found in protocols over Zircon channels, to provide a tailored API.
Most client/server types under the fidl:: namespace will have a counterpart in the fdf:: namespace, that provides the same features but is specialized to the driver runtime. For example, whereas one would write fidl::Client to declare an asynchronous client over the Zircon channel transport, to use the example protocol above one would write fdf::Client<fuchsia_example::Protocol>. The generated FIDL header is of the form #include <fidl/fuchsia.example/cpp/driver/fidl.h>.
Similarly, when using the client and server APIs restricted to wire types, whereas one would write fidl::WireClient to declare an asynchronous client over the Zircon channel transport, to use the example protocol above one would write fdf::WireClient<fuchsia_example::Protocol>. One may include the wire subset header at #include <fidl/fuchsia.example/cpp/driver/wire.h>.
C++ bindings over the driver transport is under iteration. For now the tests may serve as examples of using the bindings.