Added deliver-as-iobuf/deliver-as-raw concepts.
[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          * A data transfer interface that wishes to support only raw
26          * data delivery should set this method to
27          * deliver_as_raw().
28          */
29         int ( * deliver ) ( struct xfer_interface *xfer,
30                             struct xfer_interface *src,
31                             struct io_buffer *iobuf );
32         /** Deliver datagram as raw data
33          *
34          * @v xfer              Data-transfer interface
35          * @v src               Source interface
36          * @v data              Data buffer
37          * @v len               Length of data buffer
38          * @ret rc              Return status code
39          *
40          * A data transfer interface that wishes to support only I/O
41          * buffer delivery should set this method to
42          * deliver_as_iobuf().
43          */
44         int ( * deliver_raw ) ( struct xfer_interface *xfer,
45                                 struct xfer_interface *src,
46                                 const void *data, size_t len );
47 };
48
49 /** A data transfer interface */
50 struct xfer_interface {
51         /** Generic object communication interface */
52         struct interface intf;
53         /** Operations for received messages */
54         struct xfer_interface_operations *op;
55 };
56
57 extern struct xfer_interface null_xfer;
58 extern struct xfer_interface_operations null_xfer_ops;
59
60 extern int deliver_as_raw ( struct xfer_interface *xfer,
61                             struct xfer_interface *src,
62                             struct io_buffer *iobuf );
63 extern int deliver_as_iobuf ( struct xfer_interface *xfer,
64                               struct xfer_interface *src,
65                               const void *data, size_t len );
66
67 /**
68  * Get destination data-transfer interface
69  *
70  * @v xfer              Data-transfer interface
71  * @ret dest            Destination interface
72  */
73 static inline struct xfer_interface *
74 xfer_dest ( struct xfer_interface *xfer ) {
75         return container_of ( xfer->intf.dest, struct xfer_interface, intf );
76 }
77
78 /**
79  * Plug a data-transfer interface into a new destination interface
80  *
81  * @v xfer              Data-transfer interface
82  * @v dest              New destination interface
83  */
84 static inline void xfer_plug ( struct xfer_interface *xfer,
85                                struct xfer_interface *dest ) {
86         plug ( &xfer->intf, &dest->intf );
87 }
88
89 /**
90  * Unplug a data-transfer interface
91  *
92  * @v xfer              Data-transfer interface
93  */
94 static inline void xfer_unplug ( struct xfer_interface *xfer ) {
95         plug ( &xfer->intf, &null_xfer.intf );
96 }
97
98 /**
99  * Terminate a data-transfer interface
100  *
101  * @v xfer              Data-transfer interface
102  *
103  * After calling this method, no further messages will be received via
104  * the interface.
105  */
106 static inline void xfer_terminate ( struct xfer_interface *xfer ) {
107         xfer->op = &null_xfer_ops;
108 };
109
110 #endif /* _GPXE_XFER_H */