Add local address to socket openers.
authorMichael Brown <mcb30@etherboot.org>
Sat, 19 May 2007 20:14:18 +0000 (20:14 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sat, 19 May 2007 20:14:18 +0000 (20:14 +0000)
src/core/open.c
src/include/gpxe/open.h

index af01b2b..284d00a 100644 (file)
@@ -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 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 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,
        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 ) ) {
        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 );
        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 );
        default:
                DBGC ( xfer, "XFER %p attempted to open unsupported location "
                       "type %d\n", xfer, type );
index caa96f7..229d2d7 100644 (file)
@@ -63,10 +63,12 @@ struct socket_opener {
        /** Open socket
         *
         * @v xfer              Data transfer interface
        /** 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
         */
         * @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 */
 };
 
 /** 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,
 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, ... );
 
 extern int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args );
 extern int xfer_open ( struct xfer_interface *xfer, int type, ... );