2 * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <gpxe/xfer.h>
25 * Data transfer interfaces
30 * Send redirection event
32 * @v xfer Data-transfer interface
33 * @v type New location type
34 * @v args Remaining arguments depend upon location type
35 * @ret rc Return status code
37 int vredirect ( struct xfer_interface *xfer, int type, va_list args ) {
38 struct xfer_interface *dest = xfer_dest ( xfer );
40 return dest->op->vredirect ( dest, type, args );
44 * Send redirection event
46 * @v xfer Data-transfer interface
47 * @v type New location type
48 * @v ... Remaining arguments depend upon location type
49 * @ret rc Return status code
51 int redirect ( struct xfer_interface *xfer, int type, ... ) {
55 va_start ( args, type );
56 rc = vredirect ( xfer, type, args );
64 * @v xfer Data-transfer interface
65 * @v iobuf Datagram I/O buffer
66 * @ret rc Return status code
68 int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf ) {
69 struct xfer_interface *dest = xfer_dest ( xfer );
71 return dest->op->deliver ( dest, iobuf );
75 * Deliver datagram as raw data
77 * @v xfer Data-transfer interface
78 * @v iobuf Datagram I/O buffer
79 * @ret rc Return status code
81 int deliver_raw ( struct xfer_interface *xfer, const void *data, size_t len ) {
82 struct xfer_interface *dest = xfer_dest ( xfer );
84 return dest->op->deliver_raw ( dest, data, len );
87 /****************************************************************************
91 * These functions are designed to be used as methods in the
92 * xfer_interface_operations table.
97 * Deliver datagram as raw data
99 * @v xfer Data-transfer interface
100 * @v iobuf Datagram I/O buffer
101 * @ret rc Return status code
103 * This function is intended to be used as the deliver() method for
104 * data transfer interfaces that prefer to handle raw data.
106 int deliver_as_raw ( struct xfer_interface *xfer,
107 struct io_buffer *iobuf ) {
110 rc = xfer->op->deliver_raw ( xfer, iobuf->data, iob_len ( iobuf ) );
116 * Deliver datagram as I/O buffer
118 * @v xfer Data-transfer interface
119 * @v data Data buffer
120 * @v len Length of data buffer
121 * @ret rc Return status code
123 * This function is intended to be used as the deliver_raw() method
124 * for data transfer interfaces that prefer to handle I/O buffers.
126 int deliver_as_iobuf ( struct xfer_interface *xfer,
127 const void *data, size_t len ) {
128 struct io_buffer *iobuf;
130 iobuf = alloc_iob ( len );
134 memcpy ( iob_put ( iobuf, len ), data, len );
135 return xfer->op->deliver ( xfer, iobuf );
138 /****************************************************************************
140 * Null data transfer interface
145 * Null deliver datagram as raw data
147 * @v xfer Data-transfer interface
148 * @v data Data buffer
149 * @v len Length of data buffer
150 * @ret rc Return status code
152 static int null_deliver_raw ( struct xfer_interface *xfer,
153 const void *data __unused, size_t len ) {
154 DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
155 ( ( xfer == &null_xfer ) ?
156 "before connection" : "after termination" ) );
160 /** Null data transfer interface operations */
161 struct xfer_interface_operations null_xfer_ops = {
162 .deliver = deliver_as_raw,
163 .deliver_raw = null_deliver_raw,
167 * Null data transfer interface
169 * This is the interface to which data transfer interfaces are
170 * connected when unplugged. It will never generate messages, and
171 * will silently absorb all received messages.
173 struct xfer_interface null_xfer = {
175 .dest = &null_xfer.intf,
176 .refcnt = null_refcnt,
178 .op = &null_xfer_ops,