Added a simple pass-through filter layer for data transfer interfaces.
[people/xl0/gpxe.git] / src / include / gpxe / filter.h
1 #ifndef _GPXE_FILTER_H
2 #define _GPXE_FILTER_H
3
4 /** @file
5  *
6  * Data transfer filters
7  *
8  */
9
10 #include <stddef.h>
11 #include <gpxe/xfer.h>
12
13 /**
14  * Half of a data transfer filter
15  *
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.
20  */
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;
26 };
27
28 /**
29  * Get data transfer interface for the other half of a data transfer filter
30  *
31  * @v xfer              Data transfer interface
32  * @ret other           Other half's data transfer interface
33  */
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;
39 }
40
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 int filter_seek ( struct xfer_interface *xfer, off_t offset,
45                          int whence );
46 extern size_t filter_window ( struct xfer_interface *xfer );
47 extern struct io_buffer * filter_alloc_iob ( struct xfer_interface *xfer,
48                                              size_t len );
49 extern int filter_deliver_iob ( struct xfer_interface *xfer,
50                                 struct io_buffer *iobuf,
51                                 struct xfer_metadata *meta );
52 extern int filter_deliver_raw ( struct xfer_interface *xfer, const void *data,
53                                 size_t len );
54
55 /**
56  * Initialise a data transfer filter
57  *
58  * @v left              "Left" half of the filter
59  * @v left_op           Data transfer interface operations for "left" half
60  * @v right             "Right" half of the filter
61  * @v right_op          Data transfer interface operations for "right" half
62  * @v refcnt            Containing object reference counter, or NULL
63  */
64 static inline void filter_init ( struct xfer_filter_half *left,
65                                  struct xfer_interface_operations *left_op,
66                                  struct xfer_filter_half *right,
67                                  struct xfer_interface_operations *right_op,
68                                  struct refcnt *refcnt ) {
69         xfer_init ( &left->xfer, left_op, refcnt );
70         xfer_init ( &right->xfer, right_op, refcnt );
71         left->other = right;
72         right->other = left;
73 }
74
75 #endif /* _GPXE_FILTER_H */