6 * Data transfer interfaces
12 #include <gpxe/interface.h>
13 #include <gpxe/iobuf.h>
15 struct xfer_interface;
17 /** Data transfer interface operations */
18 struct xfer_interface_operations {
22 * notification of non-close status - e.g. connected/opened, ...
26 * prompt for data delivery
28 * I/O buffer preparation
35 * @v xfer Data transfer interface
36 * @v rc Reason for close
38 void ( * close ) ( struct xfer_interface *xfer, int rc );
39 /** Redirect to new location
41 * @v xfer Data transfer interface
42 * @v type New location type
43 * @v args Remaining arguments depend upon location type
44 * @ret rc Return status code
46 int ( * vredirect ) ( struct xfer_interface *xfer, int type,
50 * @v xfer Data transfer interface
52 * @ret rc Return status code
54 int ( * seek ) ( struct xfer_interface *xfer, size_t pos );
57 * @v xfer Data transfer interface
58 * @v iobuf Datagram I/O buffer
59 * @ret rc Return status code
61 * A data transfer interface that wishes to support only raw
62 * data delivery should set this method to
65 int ( * deliver ) ( struct xfer_interface *xfer,
66 struct io_buffer *iobuf );
67 /** Deliver datagram as raw data
69 * @v xfer Data transfer interface
71 * @v len Length of data buffer
72 * @ret rc Return status code
74 * A data transfer interface that wishes to support only I/O
75 * buffer delivery should set this method to
78 int ( * deliver_raw ) ( struct xfer_interface *xfer,
79 const void *data, size_t len );
82 /** A data transfer interface */
83 struct xfer_interface {
84 /** Generic object communication interface */
85 struct interface intf;
86 /** Operations for received messages */
87 struct xfer_interface_operations *op;
90 extern struct xfer_interface null_xfer;
91 extern struct xfer_interface_operations null_xfer_ops;
93 extern void close ( struct xfer_interface *xfer, int rc );
94 extern int seek ( struct xfer_interface *xfer, size_t pos );
95 extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
96 extern int redirect ( struct xfer_interface *xfer, int type, ... );
97 extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
98 extern int deliver_raw ( struct xfer_interface *xfer,
99 const void *data, size_t len );
101 extern void ignore_close ( struct xfer_interface *xfer, int rc );
102 extern int ignore_vredirect ( struct xfer_interface *xfer,
103 int type, va_list args );
104 extern int ignore_seek ( struct xfer_interface *xfer, size_t pos );
105 extern int deliver_as_raw ( struct xfer_interface *xfer,
106 struct io_buffer *iobuf );
107 extern int deliver_as_iobuf ( struct xfer_interface *xfer,
108 const void *data, size_t len );
109 extern int ignore_deliver_raw ( struct xfer_interface *xfer,
110 const void *data __unused, size_t len );
113 * Initialise a data transfer interface
115 * @v xfer Data transfer interface
116 * @v op Data transfer interface operations
117 * @v refcnt Containing object reference counter, or NULL
119 static inline void xfer_init ( struct xfer_interface *xfer,
120 struct xfer_interface_operations *op,
121 struct refcnt *refcnt ) {
122 xfer->intf.dest = &null_xfer.intf;
123 xfer->intf.refcnt = refcnt;
128 * Get data transfer interface from generic object communication interface
130 * @v intf Generic object communication interface
131 * @ret xfer Data transfer interface
133 static inline struct xfer_interface *
134 intf_to_xfer ( struct interface *intf ) {
135 return container_of ( intf, struct xfer_interface, intf );
139 * Get destination data transfer interface
141 * @v xfer Data transfer interface
142 * @ret dest Destination interface
144 static inline struct xfer_interface *
145 xfer_dest ( struct xfer_interface *xfer ) {
146 return intf_to_xfer ( xfer->intf.dest );
150 * Plug a data transfer interface into a new destination interface
152 * @v xfer Data transfer interface
153 * @v dest New destination interface
155 static inline void xfer_plug ( struct xfer_interface *xfer,
156 struct xfer_interface *dest ) {
157 plug ( &xfer->intf, &dest->intf );
161 * Unplug a data transfer interface
163 * @v xfer Data transfer interface
165 static inline void xfer_unplug ( struct xfer_interface *xfer ) {
166 plug ( &xfer->intf, &null_xfer.intf );
170 * Stop using a data transfer interface
172 * @v xfer Data transfer interface
174 * After calling this method, no further messages will be received via
177 static inline void xfer_nullify ( struct xfer_interface *xfer ) {
178 xfer->op = &null_xfer_ops;
181 #endif /* _GPXE_XFER_H */