6 * Data transfer interfaces
12 #include <gpxe/interface.h>
13 #include <gpxe/iobuf.h>
15 struct xfer_interface;
18 /** Data transfer interface operations */
19 struct xfer_interface_operations {
22 * @v xfer Data transfer interface
23 * @v rc Reason for close
25 void ( * close ) ( struct xfer_interface *xfer, int rc );
26 /** Redirect to new location
28 * @v xfer Data transfer interface
29 * @v type New location type
30 * @v args Remaining arguments depend upon location type
31 * @ret rc Return status code
33 int ( * vredirect ) ( struct xfer_interface *xfer, int type,
35 /** Check flow control window
37 * @v xfer Data transfer interface
38 * @ret len Length of window
40 * Flow control is regarded as advisory but not mandatory.
41 * Users who have control over their own rate of data
42 * generation should perform a flow control check before
43 * generating new data. Users who have no control (such as
44 * NIC drivers or filter layers) are not obliged to check.
46 * Data transfer interfaces must be prepared to accept
47 * datagrams even if they are advertising a window of zero
50 size_t ( * window ) ( struct xfer_interface *xfer );
51 /** Allocate I/O buffer
53 * @v xfer Data transfer interface
54 * @v len I/O buffer payload length
55 * @ret iobuf I/O buffer
57 struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,
59 /** Deliver datagram as I/O buffer with metadata
61 * @v xfer Data transfer interface
62 * @v iobuf Datagram I/O buffer
63 * @v meta Data transfer metadata
64 * @ret rc Return status code
66 * A data transfer interface that wishes to support only raw
67 * data delivery should set this method to
68 * xfer_deliver_as_raw().
70 int ( * deliver_iob ) ( struct xfer_interface *xfer,
71 struct io_buffer *iobuf,
72 struct xfer_metadata *meta );
73 /** Deliver datagram as raw data
75 * @v xfer Data transfer interface
77 * @v len Length of data buffer
78 * @ret rc Return status code
80 * A data transfer interface that wishes to support only I/O
81 * buffer delivery should set this method to
82 * xfer_deliver_as_iob().
84 int ( * deliver_raw ) ( struct xfer_interface *xfer,
85 const void *data, size_t len );
88 /** A data transfer interface */
89 struct xfer_interface {
90 /** Generic object communication interface */
91 struct interface intf;
92 /** Operations for received messages */
93 struct xfer_interface_operations *op;
96 /** Basis positions for seek() events */
102 /** Data transfer metadata */
103 struct xfer_metadata {
104 /** Position of data within stream */
106 /** Basis for data position
108 * Must be one of @c SEEK_CUR or @c SEEK_SET.
111 /** Source socket address, or NULL */
112 struct sockaddr *src;
113 /** Destination socket address, or NULL */
114 struct sockaddr *dest;
115 /** Network device, or NULL */
116 struct net_device *netdev;
120 * Describe seek basis
122 * @v whence Basis for new position
124 static inline __attribute__ (( always_inline )) const char *
125 whence_text ( int whence ) {
127 case SEEK_CUR: return "CUR";
128 case SEEK_SET: return "SET";
129 default: return "INVALID";
133 extern struct xfer_interface null_xfer;
134 extern struct xfer_interface_operations null_xfer_ops;
136 extern void xfer_close ( struct xfer_interface *xfer, int rc );
137 extern int xfer_vredirect ( struct xfer_interface *xfer, int type,
139 extern int xfer_redirect ( struct xfer_interface *xfer, int type, ... );
140 extern size_t xfer_window ( struct xfer_interface *xfer );
141 extern struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer,
143 extern int xfer_deliver_iob ( struct xfer_interface *xfer,
144 struct io_buffer *iobuf );
145 extern int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
146 struct io_buffer *iobuf,
147 struct xfer_metadata *meta );
148 extern int xfer_deliver_raw ( struct xfer_interface *xfer,
149 const void *data, size_t len );
150 extern int xfer_vprintf ( struct xfer_interface *xfer,
151 const char *format, va_list args );
152 extern int xfer_printf ( struct xfer_interface *xfer,
153 const char *format, ... );
154 extern int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence );
156 extern void ignore_xfer_close ( struct xfer_interface *xfer, int rc );
157 extern int ignore_xfer_vredirect ( struct xfer_interface *xfer,
158 int type, va_list args );
159 extern size_t unlimited_xfer_window ( struct xfer_interface *xfer );
160 extern size_t no_xfer_window ( struct xfer_interface *xfer );
161 extern struct io_buffer * default_xfer_alloc_iob ( struct xfer_interface *xfer,
163 extern int xfer_deliver_as_raw ( struct xfer_interface *xfer,
164 struct io_buffer *iobuf,
165 struct xfer_metadata *meta );
166 extern int xfer_deliver_as_iob ( struct xfer_interface *xfer,
167 const void *data, size_t len );
168 extern int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,
169 const void *data __unused, size_t len );
172 * Initialise a data transfer interface
174 * @v xfer Data transfer interface
175 * @v op Data transfer interface operations
176 * @v refcnt Containing object reference counter, or NULL
178 static inline void xfer_init ( struct xfer_interface *xfer,
179 struct xfer_interface_operations *op,
180 struct refcnt *refcnt ) {
181 xfer->intf.dest = &null_xfer.intf;
182 xfer->intf.refcnt = refcnt;
187 * Get data transfer interface from generic object communication interface
189 * @v intf Generic object communication interface
190 * @ret xfer Data transfer interface
192 static inline __attribute__ (( always_inline )) struct xfer_interface *
193 intf_to_xfer ( struct interface *intf ) {
194 return container_of ( intf, struct xfer_interface, intf );
198 * Get reference to destination data transfer interface
200 * @v xfer Data transfer interface
201 * @ret dest Destination interface
203 static inline __attribute__ (( always_inline )) struct xfer_interface *
204 xfer_get_dest ( struct xfer_interface *xfer ) {
205 return intf_to_xfer ( intf_get ( xfer->intf.dest ) );
209 * Drop reference to data transfer interface
211 * @v xfer Data transfer interface
213 static inline __attribute__ (( always_inline )) void
214 xfer_put ( struct xfer_interface *xfer ) {
215 intf_put ( &xfer->intf );
219 * Plug a data transfer interface into a new destination interface
221 * @v xfer Data transfer interface
222 * @v dest New destination interface
224 static inline __attribute__ (( always_inline )) void
225 xfer_plug ( struct xfer_interface *xfer, struct xfer_interface *dest ) {
226 plug ( &xfer->intf, &dest->intf );
230 * Plug two data transfer interfaces together
232 * @v a Data transfer interface A
233 * @v b Data transfer interface B
235 static inline __attribute__ (( always_inline )) void
236 xfer_plug_plug ( struct xfer_interface *a, struct xfer_interface *b ) {
237 plug_plug ( &a->intf, &b->intf );
241 * Unplug a data transfer interface
243 * @v xfer Data transfer interface
245 static inline __attribute__ (( always_inline )) void
246 xfer_unplug ( struct xfer_interface *xfer ) {
247 plug ( &xfer->intf, &null_xfer.intf );
251 * Stop using a data transfer interface
253 * @v xfer Data transfer interface
255 * After calling this method, no further messages will be received via
258 static inline void xfer_nullify ( struct xfer_interface *xfer ) {
259 xfer->op = &null_xfer_ops;
262 #endif /* _GPXE_XFER_H */