summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-05-19 22:14:18 +0200
committerMichael Brown2007-05-19 22:14:18 +0200
commit5e25a89e7473827f81703038c650c0bb6fce7186 (patch)
tree78bd526d30b835745f33998a849de581b6c67809
parentRename pkbpad.c to iobpad.c (diff)
downloadipxe-5e25a89e7473827f81703038c650c0bb6fce7186.tar.gz
ipxe-5e25a89e7473827f81703038c650c0bb6fce7186.tar.xz
ipxe-5e25a89e7473827f81703038c650c0bb6fce7186.zip
Add local address to socket openers.
-rw-r--r--src/core/open.c13
-rw-r--r--src/include/gpxe/open.h9
2 files changed, 15 insertions, 7 deletions
diff --git a/src/core/open.c b/src/core/open.c
index af01b2b4..284d00a9 100644
--- a/src/core/open.c
+++ b/src/core/open.c
@@ -77,9 +77,13 @@ int xfer_open_uri ( struct xfer_interface *xfer, const char *uri_string ) {
* @v xfer Data transfer interface
* @v domain Communication domain (e.g. PF_INET)
* @v type 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 domain, int type, struct sockaddr *sa ) {
+ int domain, int type, struct sockaddr *peer,
+ struct sockaddr *local ) {
struct socket_opener *opener;
DBGC ( xfer, "XFER %p opening (%s,%s) socket\n", xfer,
@@ -88,7 +92,7 @@ int xfer_open_socket ( struct xfer_interface *xfer,
for ( opener = socket_openers; opener < socket_openers_end; opener++ ){
if ( ( opener->domain == domain ) &&
( opener->type == type ) ) {
- return opener->open ( xfer, sa );
+ return opener->open ( xfer, peer, local );
}
}
@@ -115,9 +119,10 @@ int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args ) {
case LOCATION_SOCKET: {
int domain = va_arg ( args, int );
int type = va_arg ( args, int );
- struct sockaddr *sa = va_arg ( args, struct sockaddr * );
+ struct sockaddr *peer = va_arg ( args, struct sockaddr * );
+ struct sockaddr *local = va_arg ( args, struct sockaddr * );
- return xfer_open_socket ( xfer, domain, type, sa ); }
+ return xfer_open_socket ( xfer, domain, type, peer, local ); }
default:
DBGC ( xfer, "XFER %p attempted to open unsupported location "
"type %d\n", xfer, type );
diff --git a/src/include/gpxe/open.h b/src/include/gpxe/open.h
index caa96f7e..229d2d78 100644
--- a/src/include/gpxe/open.h
+++ b/src/include/gpxe/open.h
@@ -63,10 +63,12 @@ struct socket_opener {
/** Open socket
*
* @v xfer Data transfer interface
- * @v sa Socket address
+ * @v peer Peer socket address
+ * @v local Local socket address, or NULL
* @ret rc Return status code
*/
- int ( * open ) ( struct xfer_interface *xfer, struct sockaddr *sa );
+ int ( * open ) ( struct xfer_interface *xfer, struct sockaddr *peer,
+ struct sockaddr *local );
};
/** Register a socket opener */
@@ -75,7 +77,8 @@ struct socket_opener {
extern int xfer_open_uri ( struct xfer_interface *xfer,
const char *uri_string );
extern int xfer_open_socket ( struct xfer_interface *xfer,
- int domain, int type, struct sockaddr *sa );
+ int domain, int type, struct sockaddr *peer,
+ struct sockaddr *local );
extern int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args );
extern int xfer_open ( struct xfer_interface *xfer, int type, ... );