diff options
author | Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> | 2023-10-10 11:40:56 +0000 |
---|---|---|
committer | Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> | 2023-10-10 11:40:56 +0000 |
commit | e02cda008591317b1625707ff8e115a4841aa889 (patch) | |
tree | aee302e3cf8b59ec2d32ec481be3d1afddfc8968 /include/hw/stream.h | |
parent | cc668e6b7e0ffd8c9d130513d12053cf5eda1d3b (diff) |
Introduce Virtio-loopback epsilon release:
Epsilon release introduces a new compatibility layer which make virtio-loopback
design to work with QEMU and rust-vmm vhost-user backend without require any
changes.
Signed-off-by: Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>
Change-Id: I52e57563e08a7d0bdc002f8e928ee61ba0c53dd9
Diffstat (limited to 'include/hw/stream.h')
-rw-r--r-- | include/hw/stream.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/include/hw/stream.h b/include/hw/stream.h new file mode 100644 index 000000000..f166facb0 --- /dev/null +++ b/include/hw/stream.h @@ -0,0 +1,53 @@ +#ifndef STREAM_H +#define STREAM_H + +#include "qom/object.h" + +#define TYPE_STREAM_SINK "stream-sink" + +typedef struct StreamSinkClass StreamSinkClass; +DECLARE_CLASS_CHECKERS(StreamSinkClass, STREAM_SINK, + TYPE_STREAM_SINK) +#define STREAM_SINK(obj) \ + INTERFACE_CHECK(StreamSink, (obj), TYPE_STREAM_SINK) + +typedef struct StreamSink StreamSink; + +typedef void (*StreamCanPushNotifyFn)(void *opaque); + +struct StreamSinkClass { + InterfaceClass parent; + /** + * can push - determine if a stream sink is capable of accepting at least + * one byte of data. Returns false if cannot accept. If not implemented, the + * sink is assumed to always be capable of receiving. + * @notify: Optional callback that the sink will call when the sink is + * capable of receiving again. Only called if false is returned. + * @notify_opaque: opaque data to pass to notify call. + */ + bool (*can_push)(StreamSink *obj, StreamCanPushNotifyFn notify, + void *notify_opaque); + /** + * push - push data to a Stream sink. The number of bytes pushed is + * returned. If the sink short returns, the master must wait before trying + * again, the sink may continue to just return 0 waiting for the vm time to + * advance. The can_push() function can be used to trap the point in time + * where the sink is ready to receive again, otherwise polling on a QEMU + * timer will work. + * @obj: Stream sink to push to + * @buf: Data to write + * @len: Maximum number of bytes to write + * @eop: End of packet flag + */ + size_t (*push)(StreamSink *obj, unsigned char *buf, size_t len, bool eop); +}; + +size_t +stream_push(StreamSink *sink, uint8_t *buf, size_t len, bool eop); + +bool +stream_can_push(StreamSink *sink, StreamCanPushNotifyFn notify, + void *notify_opaque); + + +#endif /* STREAM_H */ |