0e577e93319d1836ca9888dc96d4242e1804231b
[people/sha0/gpxe.git] / src / include / gpxe / xfer.h
1 #ifndef _GPXE_XFER_H
2 #define _GPXE_XFER_H
3
4 /** @file
5  *
6  * Data transfer interfaces
7  *
8  */
9
10 #include <stddef.h>
11 #include <gpxe/interface.h>
12 #include <gpxe/iobuf.h>
13
14 struct xfer_interface;
15
16 /** Data transfer interface operations */
17 struct xfer_interface_operations {
18         /** Deliver datagram
19          *
20          * @v xfer              Data-transfer interface
21          * @v src               Source  interface
22          * @v iobuf             Datagram I/O buffer
23          * @ret rc              Return status code
24          */
25         int ( * deliver ) ( struct xfer_interface *xfer,
26                             struct xfer_interface *src,
27                             struct io_buffer *iobuf );
28 };
29
30 /** A data transfer interface */
31 struct xfer_interface {
32         /** Generic object communication interface */
33         struct interface intf;
34         /** Operations for received messages */
35         struct xfer_interface_operations *op;
36 };
37
38 extern struct xfer_interface null_xfer;
39 extern struct xfer_interface_operations null_xfer_ops;
40
41 static inline struct xfer_interface *
42 xfer_dest ( struct xfer_interface *xfer ) {
43         return container_of ( xfer->intf.dest, struct xfer_interface, intf );
44 }
45
46 /**
47  * Plug a data-transfer interface into a new destination interface
48  *
49  * @v xfer              Data-transfer interface
50  * @v dest              New destination interface
51  */
52 static inline void xfer_plug ( struct xfer_interface *xfer,
53                                struct xfer_interface *dest ) {
54         plug ( &xfer->intf, &dest->intf );
55 }
56
57 /**
58  * Unplug a data-transfer interface
59  *
60  * @v xfer              Data-transfer interface
61  */
62 static inline void xfer_unplug ( struct xfer_interface *xfer ) {
63         plug ( &xfer->intf, &null_xfer.intf );
64 }
65
66 /**
67  * Terminate a data-transfer interface
68  *
69  * @v xfer              Data-transfer interface
70  *
71  * After calling this method, no further messages will be received via
72  * the interface.
73  */
74 static inline void xfer_terminate ( struct xfer_interface *xfer ) {
75         xfer->op = &null_xfer_ops;
76 };
77
78 #endif /* _GPXE_XFER_H */