mirror of https://github.com/ipxe/ipxe.git
parent
ff1222a8d3
commit
280160139d
|
@ -45,7 +45,7 @@ static struct socket_opener socket_openers_end[0]
|
||||||
/**
|
/**
|
||||||
* Open URI
|
* Open URI
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v uri_string URI string (e.g. "http://etherboot.org/kernel")
|
* @v uri_string URI string (e.g. "http://etherboot.org/kernel")
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
|
@ -74,7 +74,7 @@ int open_uri ( struct xfer_interface *xfer, const char *uri_string ) {
|
||||||
/**
|
/**
|
||||||
* Open socket
|
* Open socket
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v domain Communication domain (e.g. PF_INET)
|
* @v domain Communication domain (e.g. PF_INET)
|
||||||
* @v type Communication semantics (e.g. SOCK_STREAM)
|
* @v type Communication semantics (e.g. SOCK_STREAM)
|
||||||
*/
|
*/
|
||||||
|
@ -101,7 +101,7 @@ int open_socket ( struct xfer_interface *xfer,
|
||||||
/**
|
/**
|
||||||
* Open location
|
* Open location
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v type Location type
|
* @v type Location type
|
||||||
* @v args Remaining arguments depend upon location type
|
* @v args Remaining arguments depend upon location type
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
|
@ -128,7 +128,7 @@ int vopen ( struct xfer_interface *xfer, int type, va_list args ) {
|
||||||
/**
|
/**
|
||||||
* Open location
|
* Open location
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v type Location type
|
* @v type Location type
|
||||||
* @v ... Remaining arguments depend upon location type
|
* @v ... Remaining arguments depend upon location type
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
|
|
|
@ -26,10 +26,36 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close data transfer interface
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
|
* @v rc Reason for close
|
||||||
|
*/
|
||||||
|
void close ( struct xfer_interface *xfer, int rc ) {
|
||||||
|
struct xfer_interface *dest = xfer_dest ( xfer );
|
||||||
|
|
||||||
|
dest->op->close ( dest, rc );
|
||||||
|
xfer_unplug ( xfer );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seek to position
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
|
* @v pos New position
|
||||||
|
* @ret rc Return status code
|
||||||
|
*/
|
||||||
|
int seek ( struct xfer_interface *xfer, size_t pos ) {
|
||||||
|
struct xfer_interface *dest = xfer_dest ( xfer );
|
||||||
|
|
||||||
|
return dest->op->seek ( dest, pos );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send redirection event
|
* Send redirection event
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v type New location type
|
* @v type New location type
|
||||||
* @v args Remaining arguments depend upon location type
|
* @v args Remaining arguments depend upon location type
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
|
@ -43,7 +69,7 @@ int vredirect ( struct xfer_interface *xfer, int type, va_list args ) {
|
||||||
/**
|
/**
|
||||||
* Send redirection event
|
* Send redirection event
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v type New location type
|
* @v type New location type
|
||||||
* @v ... Remaining arguments depend upon location type
|
* @v ... Remaining arguments depend upon location type
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
|
@ -61,7 +87,7 @@ int redirect ( struct xfer_interface *xfer, int type, ... ) {
|
||||||
/**
|
/**
|
||||||
* Deliver datagram
|
* Deliver datagram
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v iobuf Datagram I/O buffer
|
* @v iobuf Datagram I/O buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
|
@ -74,7 +100,7 @@ int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf ) {
|
||||||
/**
|
/**
|
||||||
* Deliver datagram as raw data
|
* Deliver datagram as raw data
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v iobuf Datagram I/O buffer
|
* @v iobuf Datagram I/O buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
|
@ -93,10 +119,44 @@ int deliver_raw ( struct xfer_interface *xfer, const void *data, size_t len ) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore close()
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
|
* @v rc Reason for close
|
||||||
|
*/
|
||||||
|
void ignore_close ( struct xfer_interface *xfer __unused, int rc __unused ) {
|
||||||
|
/* Nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore vredirect()
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
|
* @v type New location type
|
||||||
|
* @v args Remaining arguments depend upon location type
|
||||||
|
* @ret rc Return status code
|
||||||
|
*/
|
||||||
|
int ignore_vredirect ( struct xfer_interface *xfer __unused,
|
||||||
|
int type __unused, va_list args __unused ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore seek()
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
|
* @v pos New position
|
||||||
|
* @ret rc Return status code
|
||||||
|
*/
|
||||||
|
int ignore_seek ( struct xfer_interface *xfer __unused, size_t pos __unused ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deliver datagram as raw data
|
* Deliver datagram as raw data
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v iobuf Datagram I/O buffer
|
* @v iobuf Datagram I/O buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*
|
*
|
||||||
|
@ -115,7 +175,7 @@ int deliver_as_raw ( struct xfer_interface *xfer,
|
||||||
/**
|
/**
|
||||||
* Deliver datagram as I/O buffer
|
* Deliver datagram as I/O buffer
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v data Data buffer
|
* @v data Data buffer
|
||||||
* @v len Length of data buffer
|
* @v len Length of data buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
|
@ -135,32 +195,29 @@ int deliver_as_iobuf ( struct xfer_interface *xfer,
|
||||||
return xfer->op->deliver ( xfer, iobuf );
|
return xfer->op->deliver ( xfer, iobuf );
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
*
|
|
||||||
* Null data transfer interface
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Null deliver datagram as raw data
|
* Ignore datagram as raw data
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v data Data buffer
|
* @v data Data buffer
|
||||||
* @v len Length of data buffer
|
* @v len Length of data buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int null_deliver_raw ( struct xfer_interface *xfer,
|
int ignore_deliver_raw ( struct xfer_interface *xfer,
|
||||||
const void *data __unused, size_t len ) {
|
const void *data __unused, size_t len ) {
|
||||||
DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
|
DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
|
||||||
( ( xfer == &null_xfer ) ?
|
( ( xfer == &null_xfer ) ?
|
||||||
"before connection" : "after termination" ) );
|
"before connection" : "after termination" ) );
|
||||||
return -EPIPE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Null data transfer interface operations */
|
/** Null data transfer interface operations */
|
||||||
struct xfer_interface_operations null_xfer_ops = {
|
struct xfer_interface_operations null_xfer_ops = {
|
||||||
|
.close = ignore_close,
|
||||||
|
.vredirect = ignore_vredirect,
|
||||||
|
.seek = ignore_seek,
|
||||||
.deliver = deliver_as_raw,
|
.deliver = deliver_as_raw,
|
||||||
.deliver_raw = null_deliver_raw,
|
.deliver_raw = ignore_deliver_raw,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -41,7 +41,7 @@ struct uri_opener {
|
||||||
const char *scheme;
|
const char *scheme;
|
||||||
/** Open URI
|
/** Open URI
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v uri URI
|
* @v uri URI
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*
|
*
|
||||||
|
@ -62,7 +62,7 @@ struct socket_opener {
|
||||||
int type;
|
int type;
|
||||||
/** Open socket
|
/** Open socket
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v sa Socket address
|
* @v sa Socket address
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -32,22 +32,29 @@ struct xfer_interface_operations {
|
||||||
|
|
||||||
/** Close interface
|
/** Close interface
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v rc Reason for close
|
* @v rc Reason for close
|
||||||
*/
|
*/
|
||||||
void ( * close ) ( struct xfer_interface *xfer, int rc );
|
void ( * close ) ( struct xfer_interface *xfer, int rc );
|
||||||
/** Redirect to new location
|
/** Redirect to new location
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v type New location type
|
* @v type New location type
|
||||||
* @v args Remaining arguments depend upon location type
|
* @v args Remaining arguments depend upon location type
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
int ( * vredirect ) ( struct xfer_interface *xfer, int type,
|
int ( * vredirect ) ( struct xfer_interface *xfer, int type,
|
||||||
va_list args );
|
va_list args );
|
||||||
|
/** Seek to position
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
|
* @v pos New position
|
||||||
|
* @ret rc Return status code
|
||||||
|
*/
|
||||||
|
int ( * seek ) ( struct xfer_interface *xfer, size_t pos );
|
||||||
/** Deliver datagram
|
/** Deliver datagram
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v iobuf Datagram I/O buffer
|
* @v iobuf Datagram I/O buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*
|
*
|
||||||
|
@ -59,7 +66,7 @@ struct xfer_interface_operations {
|
||||||
struct io_buffer *iobuf );
|
struct io_buffer *iobuf );
|
||||||
/** Deliver datagram as raw data
|
/** Deliver datagram as raw data
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v data Data buffer
|
* @v data Data buffer
|
||||||
* @v len Length of data buffer
|
* @v len Length of data buffer
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
|
@ -83,32 +90,67 @@ struct xfer_interface {
|
||||||
extern struct xfer_interface null_xfer;
|
extern struct xfer_interface null_xfer;
|
||||||
extern struct xfer_interface_operations null_xfer_ops;
|
extern struct xfer_interface_operations null_xfer_ops;
|
||||||
|
|
||||||
|
extern void close ( struct xfer_interface *xfer, int rc );
|
||||||
|
extern int seek ( struct xfer_interface *xfer, size_t pos );
|
||||||
extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
|
extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
|
||||||
extern int redirect ( struct xfer_interface *xfer, int type, ... );
|
extern int redirect ( struct xfer_interface *xfer, int type, ... );
|
||||||
extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
|
extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
|
||||||
extern int deliver_raw ( struct xfer_interface *xfer,
|
extern int deliver_raw ( struct xfer_interface *xfer,
|
||||||
const void *data, size_t len );
|
const void *data, size_t len );
|
||||||
|
|
||||||
|
extern void ignore_close ( struct xfer_interface *xfer, int rc );
|
||||||
|
extern int ignore_vredirect ( struct xfer_interface *xfer,
|
||||||
|
int type, va_list args );
|
||||||
|
extern int ignore_seek ( struct xfer_interface *xfer, size_t pos );
|
||||||
extern int deliver_as_raw ( struct xfer_interface *xfer,
|
extern int deliver_as_raw ( struct xfer_interface *xfer,
|
||||||
struct io_buffer *iobuf );
|
struct io_buffer *iobuf );
|
||||||
extern int deliver_as_iobuf ( struct xfer_interface *xfer,
|
extern int deliver_as_iobuf ( struct xfer_interface *xfer,
|
||||||
const void *data, size_t len );
|
const void *data, size_t len );
|
||||||
|
extern int ignore_deliver_raw ( struct xfer_interface *xfer,
|
||||||
|
const void *data __unused, size_t len );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get destination data-transfer interface
|
* Initialise a data transfer interface
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
|
* @v op Data transfer interface operations
|
||||||
|
* @v refcnt Data transfer interface reference counting method
|
||||||
|
*/
|
||||||
|
static inline void xfer_init ( struct xfer_interface *xfer,
|
||||||
|
struct xfer_interface_operations *op,
|
||||||
|
void ( * refcnt ) ( struct interface *intf,
|
||||||
|
int delta ) ) {
|
||||||
|
xfer->intf.dest = &null_xfer.intf;
|
||||||
|
xfer->intf.refcnt = refcnt;
|
||||||
|
xfer->op = op;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data transfer interface from generic object communication interface
|
||||||
|
*
|
||||||
|
* @v intf Generic object communication interface
|
||||||
|
* @ret xfer Data transfer interface
|
||||||
|
*/
|
||||||
|
static inline struct xfer_interface *
|
||||||
|
intf_to_xfer ( struct interface *intf ) {
|
||||||
|
return container_of ( intf, struct xfer_interface, intf );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get destination data transfer interface
|
||||||
|
*
|
||||||
|
* @v xfer Data transfer interface
|
||||||
* @ret dest Destination interface
|
* @ret dest Destination interface
|
||||||
*/
|
*/
|
||||||
static inline struct xfer_interface *
|
static inline struct xfer_interface *
|
||||||
xfer_dest ( struct xfer_interface *xfer ) {
|
xfer_dest ( struct xfer_interface *xfer ) {
|
||||||
return container_of ( xfer->intf.dest, struct xfer_interface, intf );
|
return intf_to_xfer ( xfer->intf.dest );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plug a data-transfer interface into a new destination interface
|
* Plug a data transfer interface into a new destination interface
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
* @v dest New destination interface
|
* @v dest New destination interface
|
||||||
*/
|
*/
|
||||||
static inline void xfer_plug ( struct xfer_interface *xfer,
|
static inline void xfer_plug ( struct xfer_interface *xfer,
|
||||||
|
@ -117,23 +159,23 @@ static inline void xfer_plug ( struct xfer_interface *xfer,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unplug a data-transfer interface
|
* Unplug a data transfer interface
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
*/
|
*/
|
||||||
static inline void xfer_unplug ( struct xfer_interface *xfer ) {
|
static inline void xfer_unplug ( struct xfer_interface *xfer ) {
|
||||||
plug ( &xfer->intf, &null_xfer.intf );
|
plug ( &xfer->intf, &null_xfer.intf );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Terminate a data-transfer interface
|
* Stop using a data transfer interface
|
||||||
*
|
*
|
||||||
* @v xfer Data-transfer interface
|
* @v xfer Data transfer interface
|
||||||
*
|
*
|
||||||
* After calling this method, no further messages will be received via
|
* After calling this method, no further messages will be received via
|
||||||
* the interface.
|
* the interface.
|
||||||
*/
|
*/
|
||||||
static inline void xfer_terminate ( struct xfer_interface *xfer ) {
|
static inline void xfer_nullify ( struct xfer_interface *xfer ) {
|
||||||
xfer->op = &null_xfer_ops;
|
xfer->op = &null_xfer_ops;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue