[sundance] Add reset completion check
[gpxe.git] / src / include / gpxe / filter.h
blob126f634713c2947635abfa085696483362e921f4
1 #ifndef _GPXE_FILTER_H
2 #define _GPXE_FILTER_H
4 /** @file
6 * Data transfer filters
8 */
10 #include <stddef.h>
11 #include <gpxe/xfer.h>
13 /**
14 * Half of a data transfer filter
16 * Embed two of these structures within a structure implementing a
17 * data transfer filter, and intialise with filter_init(). You can
18 * then use the filter_xxx() methods as the data transfer interface
19 * methods as required.
21 struct xfer_filter_half {
22 /** Data transfer interface */
23 struct xfer_interface xfer;
24 /** Other half of the data transfer filter */
25 struct xfer_filter_half *other;
28 /**
29 * Get data transfer interface for the other half of a data transfer filter
31 * @v xfer Data transfer interface
32 * @ret other Other half's data transfer interface
34 static inline __attribute__ (( always_inline )) struct xfer_interface *
35 filter_other_half ( struct xfer_interface *xfer ) {
36 struct xfer_filter_half *half =
37 container_of ( xfer, struct xfer_filter_half, xfer );
38 return &half->other->xfer;
41 extern void filter_close ( struct xfer_interface *xfer, int rc );
42 extern int filter_vredirect ( struct xfer_interface *xfer, int type,
43 va_list args );
44 extern size_t filter_window ( struct xfer_interface *xfer );
45 extern struct io_buffer * filter_alloc_iob ( struct xfer_interface *xfer,
46 size_t len );
47 extern int filter_deliver_iob ( struct xfer_interface *xfer,
48 struct io_buffer *iobuf,
49 struct xfer_metadata *meta );
50 extern int filter_deliver_raw ( struct xfer_interface *xfer, const void *data,
51 size_t len );
53 /**
54 * Initialise a data transfer filter
56 * @v left "Left" half of the filter
57 * @v left_op Data transfer interface operations for "left" half
58 * @v right "Right" half of the filter
59 * @v right_op Data transfer interface operations for "right" half
60 * @v refcnt Containing object reference counter, or NULL
62 static inline void filter_init ( struct xfer_filter_half *left,
63 struct xfer_interface_operations *left_op,
64 struct xfer_filter_half *right,
65 struct xfer_interface_operations *right_op,
66 struct refcnt *refcnt ) {
67 xfer_init ( &left->xfer, left_op, refcnt );
68 xfer_init ( &right->xfer, right_op, refcnt );
69 left->other = right;
70 right->other = left;
73 #endif /* _GPXE_FILTER_H */