mirror of
https://github.com/ipxe/ipxe
synced 2025-12-22 21:11:03 +03:00
[interface] Convert all data-xfer interfaces to generic interfaces
Remove data-xfer as an interface type, and replace data-xfer interfaces with generic interfaces supporting the data-xfer methods. Filter interfaces (as used by the TLS layer) are handled using the generic pass-through interface capability. A side-effect of this is that deliver_raw() no longer exists as a data-xfer method. (In practice this doesn't lose any efficiency, since there are no instances within the current codebase where xfer_deliver_raw() is used to pass data to an interface supporting the deliver_raw() method.) Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -35,14 +35,14 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||
/**
|
||||
* Open URI
|
||||
*
|
||||
* @v xfer Data transfer interface
|
||||
* @v intf Data transfer interface
|
||||
* @v uri URI
|
||||
* @ret rc Return status code
|
||||
*
|
||||
* The URI will be regarded as being relative to the current working
|
||||
* URI (see churi()).
|
||||
*/
|
||||
int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
|
||||
int xfer_open_uri ( struct interface *intf, struct uri *uri ) {
|
||||
struct uri_opener *opener;
|
||||
struct uri *resolved_uri;
|
||||
int rc = -ENOTSUP;
|
||||
@@ -55,14 +55,16 @@ int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
|
||||
/* Find opener which supports this URI scheme */
|
||||
for_each_table_entry ( opener, URI_OPENERS ) {
|
||||
if ( strcmp ( resolved_uri->scheme, opener->scheme ) == 0 ) {
|
||||
DBGC ( xfer, "XFER %p opening %s URI\n",
|
||||
xfer, opener->scheme );
|
||||
rc = opener->open ( xfer, resolved_uri );
|
||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT
|
||||
" opening %s URI\n", INTF_DBG ( intf ),
|
||||
resolved_uri->scheme );
|
||||
rc = opener->open ( intf, resolved_uri );
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme "
|
||||
"\"%s\"\n", xfer, resolved_uri->scheme );
|
||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to open "
|
||||
"unsupported URI scheme \"%s\"\n",
|
||||
INTF_DBG ( intf ), resolved_uri->scheme );
|
||||
|
||||
done:
|
||||
uri_put ( resolved_uri );
|
||||
@@ -72,25 +74,26 @@ int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
|
||||
/**
|
||||
* Open URI string
|
||||
*
|
||||
* @v xfer Data transfer interface
|
||||
* @v intf Data transfer interface
|
||||
* @v uri_string URI string (e.g. "http://ipxe.org/kernel")
|
||||
* @ret rc Return status code
|
||||
*
|
||||
* The URI will be regarded as being relative to the current working
|
||||
* URI (see churi()).
|
||||
*/
|
||||
int xfer_open_uri_string ( struct xfer_interface *xfer,
|
||||
int xfer_open_uri_string ( struct interface *intf,
|
||||
const char *uri_string ) {
|
||||
struct uri *uri;
|
||||
int rc;
|
||||
|
||||
DBGC ( xfer, "XFER %p opening URI %s\n", xfer, uri_string );
|
||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " opening URI %s\n",
|
||||
INTF_DBG ( intf ), uri_string );
|
||||
|
||||
uri = parse_uri ( uri_string );
|
||||
if ( ! uri )
|
||||
return -ENOMEM;
|
||||
|
||||
rc = xfer_open_uri ( xfer, uri );
|
||||
rc = xfer_open_uri ( intf, uri );
|
||||
|
||||
uri_put ( uri );
|
||||
return rc;
|
||||
@@ -99,29 +102,30 @@ int xfer_open_uri_string ( struct xfer_interface *xfer,
|
||||
/**
|
||||
* Open socket
|
||||
*
|
||||
* @v xfer Data transfer interface
|
||||
* @v intf Data transfer interface
|
||||
* @v semantics Communication semantics (e.g. SOCK_STREAM)
|
||||
* @v peer Peer socket address
|
||||
* @v local Local socket address, or NULL
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int xfer_open_socket ( struct xfer_interface *xfer, int semantics,
|
||||
int xfer_open_socket ( struct interface *intf, int semantics,
|
||||
struct sockaddr *peer, struct sockaddr *local ) {
|
||||
struct socket_opener *opener;
|
||||
|
||||
DBGC ( xfer, "XFER %p opening (%s,%s) socket\n", xfer,
|
||||
socket_semantics_name ( semantics ),
|
||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " opening (%s,%s) socket\n",
|
||||
INTF_DBG ( intf ), socket_semantics_name ( semantics ),
|
||||
socket_family_name ( peer->sa_family ) );
|
||||
|
||||
for_each_table_entry ( opener, SOCKET_OPENERS ) {
|
||||
if ( ( opener->semantics == semantics ) &&
|
||||
( opener->family == peer->sa_family ) ) {
|
||||
return opener->open ( xfer, peer, local );
|
||||
return opener->open ( intf, peer, local );
|
||||
}
|
||||
}
|
||||
|
||||
DBGC ( xfer, "XFER %p attempted to open unsupported socket type "
|
||||
"(%s,%s)\n", xfer, socket_semantics_name ( semantics ),
|
||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to open "
|
||||
"unsupported socket type (%s,%s)\n",
|
||||
INTF_DBG ( intf ), socket_semantics_name ( semantics ),
|
||||
socket_family_name ( peer->sa_family ) );
|
||||
return -ENOTSUP;
|
||||
}
|
||||
@@ -129,30 +133,31 @@ int xfer_open_socket ( struct xfer_interface *xfer, int semantics,
|
||||
/**
|
||||
* Open location
|
||||
*
|
||||
* @v xfer Data transfer interface
|
||||
* @v intf Data transfer interface
|
||||
* @v type Location type
|
||||
* @v args Remaining arguments depend upon location type
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args ) {
|
||||
int xfer_vopen ( struct interface *intf, int type, va_list args ) {
|
||||
switch ( type ) {
|
||||
case LOCATION_URI_STRING: {
|
||||
const char *uri_string = va_arg ( args, const char * );
|
||||
|
||||
return xfer_open_uri_string ( xfer, uri_string ); }
|
||||
return xfer_open_uri_string ( intf, uri_string ); }
|
||||
case LOCATION_URI: {
|
||||
struct uri *uri = va_arg ( args, struct uri * );
|
||||
|
||||
return xfer_open_uri ( xfer, uri ); }
|
||||
return xfer_open_uri ( intf, uri ); }
|
||||
case LOCATION_SOCKET: {
|
||||
int semantics = va_arg ( args, int );
|
||||
struct sockaddr *peer = va_arg ( args, struct sockaddr * );
|
||||
struct sockaddr *local = va_arg ( args, struct sockaddr * );
|
||||
|
||||
return xfer_open_socket ( xfer, semantics, peer, local ); }
|
||||
return xfer_open_socket ( intf, semantics, peer, local ); }
|
||||
default:
|
||||
DBGC ( xfer, "XFER %p attempted to open unsupported location "
|
||||
"type %d\n", xfer, type );
|
||||
DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to "
|
||||
"open unsupported location type %d\n",
|
||||
INTF_DBG ( intf ), type );
|
||||
return -ENOTSUP;
|
||||
}
|
||||
}
|
||||
@@ -160,17 +165,17 @@ int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args ) {
|
||||
/**
|
||||
* Open location
|
||||
*
|
||||
* @v xfer Data transfer interface
|
||||
* @v intf Data transfer interface
|
||||
* @v type Location type
|
||||
* @v ... Remaining arguments depend upon location type
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int xfer_open ( struct xfer_interface *xfer, int type, ... ) {
|
||||
int xfer_open ( struct interface *intf, int type, ... ) {
|
||||
va_list args;
|
||||
int rc;
|
||||
|
||||
va_start ( args, type );
|
||||
rc = xfer_vopen ( xfer, type, args );
|
||||
rc = xfer_vopen ( intf, type, args );
|
||||
va_end ( args );
|
||||
return rc;
|
||||
}
|
||||
@@ -178,7 +183,7 @@ int xfer_open ( struct xfer_interface *xfer, int type, ... ) {
|
||||
/**
|
||||
* Reopen location
|
||||
*
|
||||
* @v xfer Data transfer interface
|
||||
* @v intf Data transfer interface
|
||||
* @v type Location type
|
||||
* @v args Remaining arguments depend upon location type
|
||||
* @ret rc Return status code
|
||||
@@ -187,11 +192,11 @@ int xfer_open ( struct xfer_interface *xfer, int type, ... ) {
|
||||
* using xfer_vopen(). It is intended to be used as a .vredirect
|
||||
* method handler.
|
||||
*/
|
||||
int xfer_vreopen ( struct xfer_interface *xfer, int type, va_list args ) {
|
||||
int xfer_vreopen ( struct interface *intf, int type, va_list args ) {
|
||||
|
||||
/* Close existing connection */
|
||||
xfer_close ( xfer, 0 );
|
||||
intf_restart ( intf, 0 );
|
||||
|
||||
/* Open new location */
|
||||
return xfer_vopen ( xfer, type, args );
|
||||
return xfer_vopen ( intf, type, args );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user