Browse Source

Add concept of transfer metadata, to be used by UDP in order to

implement sendto()/recvfrom() equivalents.
tags/v0.9.3
Michael Brown 17 years ago
parent
commit
95adce0ce1
6 changed files with 54 additions and 13 deletions
  1. 5
    2
      src/core/posix_io.c
  2. 22
    5
      src/core/xfer.c
  3. 18
    3
      src/include/gpxe/xfer.h
  4. 3
    1
      src/net/tcp.c
  5. 3
    1
      src/net/tcp/ftp.c
  6. 3
    1
      src/net/tcp/http.c

+ 5
- 2
src/core/posix_io.c View File

141
  *
141
  *
142
  * @v xfer		POSIX file data transfer interface
142
  * @v xfer		POSIX file data transfer interface
143
  * @v iobuf		I/O buffer
143
  * @v iobuf		I/O buffer
144
+ * @v meta		Data transfer metadata, or NULL
144
  * @ret rc		Return status code
145
  * @ret rc		Return status code
145
  */
146
  */
146
-static int posix_file_xfer_deliver_iob ( struct xfer_interface *xfer,
147
-					 struct io_buffer *iobuf ) {
147
+static int
148
+posix_file_xfer_deliver_iob ( struct xfer_interface *xfer,
149
+			      struct io_buffer *iobuf,
150
+			      struct xfer_metadata *meta __unused ) {
148
 	struct posix_file *file =
151
 	struct posix_file *file =
149
 		container_of ( xfer, struct posix_file, xfer );
152
 		container_of ( xfer, struct posix_file, xfer );
150
 
153
 

+ 22
- 5
src/core/xfer.c View File

174
 }
174
 }
175
 
175
 
176
 /**
176
 /**
177
- * Deliver datagram
177
+ * Deliver datagram as I/O buffer with metadata
178
  *
178
  *
179
  * @v xfer		Data transfer interface
179
  * @v xfer		Data transfer interface
180
  * @v iobuf		Datagram I/O buffer
180
  * @v iobuf		Datagram I/O buffer
181
+ * @v meta		Data transfer metadata, or NULL
181
  * @ret rc		Return status code
182
  * @ret rc		Return status code
182
  */
183
  */
183
-int xfer_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf ) {
184
+int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
185
+			    struct io_buffer *iobuf,
186
+			    struct xfer_metadata *meta ) {
184
 	struct xfer_interface *dest = xfer_get_dest ( xfer );
187
 	struct xfer_interface *dest = xfer_get_dest ( xfer );
185
 	int rc;
188
 	int rc;
186
 
189
 
187
 	DBGC ( xfer, "XFER %p->%p deliver_iob %zd\n", xfer, dest,
190
 	DBGC ( xfer, "XFER %p->%p deliver_iob %zd\n", xfer, dest,
188
 	       iob_len ( iobuf ) );
191
 	       iob_len ( iobuf ) );
189
 
192
 
190
-	rc = dest->op->deliver_iob ( dest, iobuf );
193
+	rc = dest->op->deliver_iob ( dest, iobuf, meta );
191
 
194
 
192
 	if ( rc != 0 ) {
195
 	if ( rc != 0 ) {
193
 		DBGC ( xfer, "XFER %p<-%p deliver_iob: %s\n", xfer, dest,
196
 		DBGC ( xfer, "XFER %p<-%p deliver_iob: %s\n", xfer, dest,
197
 	return rc;
200
 	return rc;
198
 }
201
 }
199
 
202
 
203
+/**
204
+ * Deliver datagram as I/O buffer with metadata
205
+ *
206
+ * @v xfer		Data transfer interface
207
+ * @v iobuf		Datagram I/O buffer
208
+ * @ret rc		Return status code
209
+ */
210
+int xfer_deliver_iob ( struct xfer_interface *xfer,
211
+		       struct io_buffer *iobuf ) {
212
+	return xfer_deliver_iob_meta ( xfer, iobuf, NULL );
213
+}
214
+
200
 /**
215
 /**
201
  * Deliver datagram as raw data
216
  * Deliver datagram as raw data
202
  *
217
  *
341
  *
356
  *
342
  * @v xfer		Data transfer interface
357
  * @v xfer		Data transfer interface
343
  * @v iobuf		Datagram I/O buffer
358
  * @v iobuf		Datagram I/O buffer
359
+ * @v meta		Data transfer metadata
344
  * @ret rc		Return status code
360
  * @ret rc		Return status code
345
  *
361
  *
346
  * This function is intended to be used as the deliver() method for
362
  * This function is intended to be used as the deliver() method for
347
  * data transfer interfaces that prefer to handle raw data.
363
  * data transfer interfaces that prefer to handle raw data.
348
  */
364
  */
349
 int xfer_deliver_as_raw ( struct xfer_interface *xfer,
365
 int xfer_deliver_as_raw ( struct xfer_interface *xfer,
350
-			  struct io_buffer *iobuf ) {
366
+			  struct io_buffer *iobuf,
367
+			  struct xfer_metadata *meta __unused ) {
351
 	int rc;
368
 	int rc;
352
 
369
 
353
 	rc = xfer->op->deliver_raw ( xfer, iobuf->data, iob_len ( iobuf ) );
370
 	rc = xfer->op->deliver_raw ( xfer, iobuf->data, iob_len ( iobuf ) );
375
 		return -ENOMEM;
392
 		return -ENOMEM;
376
 
393
 
377
 	memcpy ( iob_put ( iobuf, len ), data, len );
394
 	memcpy ( iob_put ( iobuf, len ), data, len );
378
-	return xfer->op->deliver_iob ( xfer, iobuf );
395
+	return xfer->op->deliver_iob ( xfer, iobuf, NULL );
379
 }
396
 }
380
 
397
 
381
 /**
398
 /**

+ 18
- 3
src/include/gpxe/xfer.h View File

13
 #include <gpxe/iobuf.h>
13
 #include <gpxe/iobuf.h>
14
 
14
 
15
 struct xfer_interface;
15
 struct xfer_interface;
16
+struct xfer_metadata;
16
 
17
 
17
 /** Data transfer interface operations */
18
 /** Data transfer interface operations */
18
 struct xfer_interface_operations {
19
 struct xfer_interface_operations {
63
 	 */
64
 	 */
64
 	struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,
65
 	struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,
65
 					     size_t len );
66
 					     size_t len );
66
-	/** Deliver datagram as I/O buffer
67
+	/** Deliver datagram as I/O buffer with metadata
67
 	 *
68
 	 *
68
 	 * @v xfer		Data transfer interface
69
 	 * @v xfer		Data transfer interface
69
 	 * @v iobuf		Datagram I/O buffer
70
 	 * @v iobuf		Datagram I/O buffer
71
+	 * @v meta		Data transfer metadata, or NULL
70
 	 * @ret rc		Return status code
72
 	 * @ret rc		Return status code
71
 	 *
73
 	 *
72
 	 * A data transfer interface that wishes to support only raw
74
 	 * A data transfer interface that wishes to support only raw
78
 	 * fatal error.
80
 	 * fatal error.
79
 	 */
81
 	 */
80
 	int ( * deliver_iob ) ( struct xfer_interface *xfer,
82
 	int ( * deliver_iob ) ( struct xfer_interface *xfer,
81
-				struct io_buffer *iobuf );
83
+				struct io_buffer *iobuf,
84
+				struct xfer_metadata *meta );
82
 	/** Deliver datagram as raw data
85
 	/** Deliver datagram as raw data
83
 	 *
86
 	 *
84
 	 * @v xfer		Data transfer interface
87
 	 * @v xfer		Data transfer interface
106
 	struct xfer_interface_operations *op;
109
 	struct xfer_interface_operations *op;
107
 };
110
 };
108
 
111
 
112
+/** Data transfer metadata */
113
+struct xfer_metadata {
114
+	/** Source socket address, or NULL */
115
+	struct sockaddr *src;
116
+	/** Destination socket address, or NULL */
117
+	struct sockaddr *dest;
118
+};
119
+
109
 /** Basis positions for seek() events */
120
 /** Basis positions for seek() events */
110
 enum seek_whence {
121
 enum seek_whence {
111
 	SEEK_SET = 0,
122
 	SEEK_SET = 0,
141
 					   size_t len );
152
 					   size_t len );
142
 extern int xfer_deliver_iob ( struct xfer_interface *xfer,
153
 extern int xfer_deliver_iob ( struct xfer_interface *xfer,
143
 			      struct io_buffer *iobuf );
154
 			      struct io_buffer *iobuf );
155
+extern int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
156
+				   struct io_buffer *iobuf,
157
+				   struct xfer_metadata *meta );
144
 extern int xfer_deliver_raw ( struct xfer_interface *xfer,
158
 extern int xfer_deliver_raw ( struct xfer_interface *xfer,
145
 			      const void *data, size_t len );
159
 			      const void *data, size_t len );
146
 extern int xfer_vprintf ( struct xfer_interface *xfer,
160
 extern int xfer_vprintf ( struct xfer_interface *xfer,
158
 extern struct io_buffer * default_xfer_alloc_iob ( struct xfer_interface *xfer,
172
 extern struct io_buffer * default_xfer_alloc_iob ( struct xfer_interface *xfer,
159
 						   size_t len );
173
 						   size_t len );
160
 extern int xfer_deliver_as_raw ( struct xfer_interface *xfer,
174
 extern int xfer_deliver_as_raw ( struct xfer_interface *xfer,
161
-				 struct io_buffer *iobuf );
175
+				 struct io_buffer *iobuf,
176
+				 struct xfer_metadata *meta );
162
 extern int xfer_deliver_as_iob ( struct xfer_interface *xfer,
177
 extern int xfer_deliver_as_iob ( struct xfer_interface *xfer,
163
 				 const void *data, size_t len );
178
 				 const void *data, size_t len );
164
 extern int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,
179
 extern int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,

+ 3
- 1
src/net/tcp.c View File

930
  *
930
  *
931
  * @v xfer		Data transfer interface
931
  * @v xfer		Data transfer interface
932
  * @v iobuf		Datagram I/O buffer
932
  * @v iobuf		Datagram I/O buffer
933
+ * @v meta		Data transfer metadata, or NULL
933
  * @ret rc		Return status code
934
  * @ret rc		Return status code
934
  */
935
  */
935
 static int tcp_xfer_deliver_iob ( struct xfer_interface *xfer,
936
 static int tcp_xfer_deliver_iob ( struct xfer_interface *xfer,
936
-				  struct io_buffer *iobuf ) {
937
+				  struct io_buffer *iobuf,
938
+				  struct xfer_metadata *meta __unused ) {
937
 	struct tcp_connection *tcp =
939
 	struct tcp_connection *tcp =
938
 		container_of ( xfer, struct tcp_connection, xfer );
940
 		container_of ( xfer, struct tcp_connection, xfer );
939
 
941
 

+ 3
- 1
src/net/tcp/ftp.c View File

338
  *
338
  *
339
  * @v xfer		FTP data channel interface
339
  * @v xfer		FTP data channel interface
340
  * @v iobuf		I/O buffer
340
  * @v iobuf		I/O buffer
341
+ * @v meta		Data transfer metadata, or NULL
341
  * @ret rc		Return status code
342
  * @ret rc		Return status code
342
  */
343
  */
343
 static int ftp_data_deliver_iob ( struct xfer_interface *data,
344
 static int ftp_data_deliver_iob ( struct xfer_interface *data,
344
-				  struct io_buffer *iobuf ) {
345
+				  struct io_buffer *iobuf,
346
+				  struct xfer_metadata *meta __unused ) {
345
 	struct ftp_request *ftp =
347
 	struct ftp_request *ftp =
346
 		container_of ( data, struct ftp_request, data );
348
 		container_of ( data, struct ftp_request, data );
347
 	int rc;
349
 	int rc;

+ 3
- 1
src/net/tcp/http.c View File

316
  *
316
  *
317
  * @v socket		Transport layer interface
317
  * @v socket		Transport layer interface
318
  * @v iobuf		I/O buffer
318
  * @v iobuf		I/O buffer
319
+ * @v meta		Data transfer metadata, or NULL
319
  * @ret rc		Return status code
320
  * @ret rc		Return status code
320
  */
321
  */
321
 static int http_socket_deliver_iob ( struct xfer_interface *socket,
322
 static int http_socket_deliver_iob ( struct xfer_interface *socket,
322
-				     struct io_buffer *iobuf ) {
323
+				     struct io_buffer *iobuf,
324
+				     struct xfer_metadata *meta __unused ) {
323
 	struct http_request *http =
325
 	struct http_request *http =
324
 		container_of ( socket, struct http_request, socket );
326
 		container_of ( socket, struct http_request, socket );
325
 	struct http_line_handler *lh;
327
 	struct http_line_handler *lh;

Loading…
Cancel
Save