Home | History | Annotate | Download | only in gpxe
      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 *
     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  */
     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