• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GPXE_FILTER_H
2 #define _GPXE_FILTER_H
3 
4 /** @file
5  *
6  * Data transfer filters
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER );
11 
12 #include <stddef.h>
13 #include <gpxe/xfer.h>
14 
15 /**
16  * Half of a data transfer filter
17  *
18  * Embed two of these structures within a structure implementing a
19  * data transfer filter, and intialise with filter_init().  You can
20  * then use the filter_xxx() methods as the data transfer interface
21  * methods as required.
22  */
23 struct xfer_filter_half {
24 	/** Data transfer interface */
25 	struct xfer_interface xfer;
26 	/** Other half of the data transfer filter */
27 	struct xfer_filter_half *other;
28 };
29 
30 /**
31  * Get data transfer interface for the other half of a data transfer filter
32  *
33  * @v xfer		Data transfer interface
34  * @ret other		Other half's data transfer interface
35  */
36 static inline __attribute__ (( always_inline )) struct xfer_interface *
filter_other_half(struct xfer_interface * xfer)37 filter_other_half ( struct xfer_interface *xfer ) {
38 	struct xfer_filter_half *half =
39 		container_of ( xfer, struct xfer_filter_half, xfer );
40 	return &half->other->xfer;
41 }
42 
43 extern void filter_close ( struct xfer_interface *xfer, int rc );
44 extern int filter_vredirect ( struct xfer_interface *xfer, int type,
45 			      va_list args );
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  */
filter_init(struct xfer_filter_half * left,struct xfer_interface_operations * left_op,struct xfer_filter_half * right,struct xfer_interface_operations * right_op,struct refcnt * refcnt)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 */
76