| // Copyright 2018 The Fuchsia Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 | library fuchsia.hardware.vsock; | 
 |  | 
 | using zx; | 
 |  | 
 | // Vsock address where 'local' always means the driver and 'remote' always means | 
 | // the device. As such there is no 'local_cid' as it can only ever be the driver cid | 
 | // and so specifying is redundant and a source of errors. | 
 | @for_deprecated_c_bindings | 
 | type Addr = struct { | 
 |     local_port uint32; | 
 |     remote_cid uint32; | 
 |     remote_port uint32; | 
 | }; | 
 |  | 
 | // Callbacks sent from the device to whomever registered them (typically a service) | 
 | // in response to events from host. | 
 | @for_deprecated_c_bindings | 
 | protocol Callbacks { | 
 |     // Indicates a 'request' op was received from the host. One of Device.SendResponse | 
 |     // or Device.SendRst should be done in response to this. | 
 |     Request(struct { | 
 |         addr Addr; | 
 |     }); | 
 |     // Indicates a response was received for a connection that was trying to be | 
 |     // established from Device.SendRequest. | 
 |     Response(struct { | 
 |         addr Addr; | 
 |     }); | 
 |     // Indicates a 'rst' op was received from the host, and that the driver has | 
 |     // has freed the resources for any potential connection relating to `addr`. | 
 |     Rst(struct { | 
 |         addr Addr; | 
 |     }); | 
 |     // Indicates a 'shutdown' op was received from the host. | 
 |     Shutdown(struct { | 
 |         addr Addr; | 
 |     }); | 
 |     // Indicates a 'transport reset' op was received from the host. Responding to | 
 |     // this method indicates that you have processed all preceding Callbacks and | 
 |     // dropped any active connections. | 
 |     TransportReset(struct { | 
 |         new_cid uint32; | 
 |     }) -> (); | 
 |     // Indicates that a previous Device.SendVmo request has completed. | 
 |     SendVmoComplete(struct { | 
 |         addr Addr; | 
 |     }); | 
 | }; | 
 |  | 
 | // Low level vsock device operations. Users of this interface are responsible for | 
 | // adhering to the vsock protocol and must use ensure they do not reuse addresses | 
 | // for active connections, perform SendRst and SendResponse only when it is correct | 
 | // to do so, etc. | 
 | @for_deprecated_c_bindings | 
 | protocol Device { | 
 |     // Causes the device to start and gives it Callbacks to use for forwarding messages | 
 |     // from the host. The rest of the methods on this interface are only valid to use | 
 |     // after calling Start and whilst the passed Callbacks remain valid. The device | 
 |     // will stop if it detects the other end of the Callbacks channel has closed. | 
 |     Start(resource struct { | 
 |         cb client_end:Callbacks; | 
 |     }) -> (struct { | 
 |         status zx.status; | 
 |     }); | 
 |     // Will send a request to open a connection with the remote specified in the | 
 |     // `addr`. The `data` socket is stored and will be used for data transmission | 
 |     // should the connection get established successfully, otherwise it will close | 
 |     // the handle. The `status` returned indicates whether the request was sent | 
 |     // successfully. Callbacks.Response or Callbacks.Rst will be called to indicate | 
 |     // if the connection was successfully established or not. | 
 |     SendRequest(resource struct { | 
 |         addr Addr; | 
 |         data zx.handle:SOCKET; | 
 |     }) -> (struct { | 
 |         status zx.status; | 
 |     }); | 
 |     // Request a shutdown to begin for the connection indicated by the given `addr`. | 
 |     // This immediately stops any data from being sent on the connection, although | 
 |     // data may still be received up until Callbacks.Rst is called to indicate the | 
 |     // shutdown has complete. This is only valid on a connection established with | 
 |     // SendRequest or SendResponse. | 
 |     SendShutdown(struct { | 
 |         addr Addr; | 
 |     }) -> (struct { | 
 |         status zx.status; | 
 |     }); | 
 |     // Request a rst be sent to the host. The device will also release the resources | 
 |     // for any connection that may exist for `addr`. | 
 |     SendRst(struct { | 
 |         addr Addr; | 
 |     }) -> (struct { | 
 |         status zx.status; | 
 |     }); | 
 |     // Causes a 'response' to get sent to the host, gives the driver a `data` socket | 
 |     // to use for sending and receiving data on the established connection. It is | 
 |     // only correct to use this in response to a Callbacks.Request. | 
 |     SendResponse(resource struct { | 
 |         addr Addr; | 
 |         data zx.handle:SOCKET; | 
 |     }) -> (struct { | 
 |         status zx.status; | 
 |     }); | 
 |     // Query the current context id of the driver. The local CID is never needed | 
 |     // in interactions with the same device, and retrieving it is only useful for | 
 |     // debugging or if you have some other communication channel to a different host | 
 |     // and you would like to send them your CID to then establish a vsock connection on. | 
 |     GetCid() -> (struct { | 
 |         local_cid uint32; | 
 |     }); | 
 |     // Send the contents of a vmo over an already established connection. A | 
 |     // connection may only have a single outstanding vmo at a time, and trying | 
 |     // to send whilst one is already in progress will generate an error. If there | 
 |     // is pending data to transmit in the `data` socket of a connection and there | 
 |     // is a vmo pending then it is undefined which one will be sent. Once the vmo | 
 |     // contents have finished sending Callbacks.SendVmoComplete will be called. | 
 |     SendVmo(resource struct { | 
 |         addr Addr; | 
 |         vmo zx.handle:VMO; | 
 |         off uint64; | 
 |         len uint64; | 
 |     }) -> (struct { | 
 |         status zx.status; | 
 |     }); | 
 | }; |