summaryrefslogtreecommitdiffstats
path: root/src/include/gpxe/xfer.h
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 */