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