浏览代码

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

implement sendto()/recvfrom() equivalents.
tags/v0.9.3
Michael Brown 17 年前
父节点
当前提交
95adce0ce1
共有 6 个文件被更改,包括 54 次插入13 次删除
  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 查看文件

@@ -141,10 +141,13 @@ static int posix_file_xfer_seek ( struct xfer_interface *xfer, off_t offset,
141 141
  *
142 142
  * @v xfer		POSIX file data transfer interface
143 143
  * @v iobuf		I/O buffer
144
+ * @v meta		Data transfer metadata, or NULL
144 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 151
 	struct posix_file *file =
149 152
 		container_of ( xfer, struct posix_file, xfer );
150 153
 

+ 22
- 5
src/core/xfer.c 查看文件

@@ -174,20 +174,23 @@ struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer, size_t len ) {
174 174
 }
175 175
 
176 176
 /**
177
- * Deliver datagram
177
+ * Deliver datagram as I/O buffer with metadata
178 178
  *
179 179
  * @v xfer		Data transfer interface
180 180
  * @v iobuf		Datagram I/O buffer
181
+ * @v meta		Data transfer metadata, or NULL
181 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 187
 	struct xfer_interface *dest = xfer_get_dest ( xfer );
185 188
 	int rc;
186 189
 
187 190
 	DBGC ( xfer, "XFER %p->%p deliver_iob %zd\n", xfer, dest,
188 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 195
 	if ( rc != 0 ) {
193 196
 		DBGC ( xfer, "XFER %p<-%p deliver_iob: %s\n", xfer, dest,
@@ -197,6 +200,18 @@ int xfer_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf ) {
197 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 216
  * Deliver datagram as raw data
202 217
  *
@@ -341,13 +356,15 @@ default_xfer_alloc_iob ( struct xfer_interface *xfer __unused, size_t len ) {
341 356
  *
342 357
  * @v xfer		Data transfer interface
343 358
  * @v iobuf		Datagram I/O buffer
359
+ * @v meta		Data transfer metadata
344 360
  * @ret rc		Return status code
345 361
  *
346 362
  * This function is intended to be used as the deliver() method for
347 363
  * data transfer interfaces that prefer to handle raw data.
348 364
  */
349 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 368
 	int rc;
352 369
 
353 370
 	rc = xfer->op->deliver_raw ( xfer, iobuf->data, iob_len ( iobuf ) );
@@ -375,7 +392,7 @@ int xfer_deliver_as_iob ( struct xfer_interface *xfer,
375 392
 		return -ENOMEM;
376 393
 
377 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 查看文件

@@ -13,6 +13,7 @@
13 13
 #include <gpxe/iobuf.h>
14 14
 
15 15
 struct xfer_interface;
16
+struct xfer_metadata;
16 17
 
17 18
 /** Data transfer interface operations */
18 19
 struct xfer_interface_operations {
@@ -63,10 +64,11 @@ struct xfer_interface_operations {
63 64
 	 */
64 65
 	struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,
65 66
 					     size_t len );
66
-	/** Deliver datagram as I/O buffer
67
+	/** Deliver datagram as I/O buffer with metadata
67 68
 	 *
68 69
 	 * @v xfer		Data transfer interface
69 70
 	 * @v iobuf		Datagram I/O buffer
71
+	 * @v meta		Data transfer metadata, or NULL
70 72
 	 * @ret rc		Return status code
71 73
 	 *
72 74
 	 * A data transfer interface that wishes to support only raw
@@ -78,7 +80,8 @@ struct xfer_interface_operations {
78 80
 	 * fatal error.
79 81
 	 */
80 82
 	int ( * deliver_iob ) ( struct xfer_interface *xfer,
81
-				struct io_buffer *iobuf );
83
+				struct io_buffer *iobuf,
84
+				struct xfer_metadata *meta );
82 85
 	/** Deliver datagram as raw data
83 86
 	 *
84 87
 	 * @v xfer		Data transfer interface
@@ -106,6 +109,14 @@ struct xfer_interface {
106 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 120
 /** Basis positions for seek() events */
110 121
 enum seek_whence {
111 122
 	SEEK_SET = 0,
@@ -141,6 +152,9 @@ extern struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer,
141 152
 					   size_t len );
142 153
 extern int xfer_deliver_iob ( struct xfer_interface *xfer,
143 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 158
 extern int xfer_deliver_raw ( struct xfer_interface *xfer,
145 159
 			      const void *data, size_t len );
146 160
 extern int xfer_vprintf ( struct xfer_interface *xfer,
@@ -158,7 +172,8 @@ extern int ignore_xfer_seek ( struct xfer_interface *xfer, off_t offset,
158 172
 extern struct io_buffer * default_xfer_alloc_iob ( struct xfer_interface *xfer,
159 173
 						   size_t len );
160 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 177
 extern int xfer_deliver_as_iob ( struct xfer_interface *xfer,
163 178
 				 const void *data, size_t len );
164 179
 extern int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,

+ 3
- 1
src/net/tcp.c 查看文件

@@ -930,10 +930,12 @@ static int tcp_xfer_seek ( struct xfer_interface *xfer, off_t offset,
930 930
  *
931 931
  * @v xfer		Data transfer interface
932 932
  * @v iobuf		Datagram I/O buffer
933
+ * @v meta		Data transfer metadata, or NULL
933 934
  * @ret rc		Return status code
934 935
  */
935 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 939
 	struct tcp_connection *tcp =
938 940
 		container_of ( xfer, struct tcp_connection, xfer );
939 941
 

+ 3
- 1
src/net/tcp/ftp.c 查看文件

@@ -338,10 +338,12 @@ static void ftp_data_closed ( struct xfer_interface *data, int rc ) {
338 338
  *
339 339
  * @v xfer		FTP data channel interface
340 340
  * @v iobuf		I/O buffer
341
+ * @v meta		Data transfer metadata, or NULL
341 342
  * @ret rc		Return status code
342 343
  */
343 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 347
 	struct ftp_request *ftp =
346 348
 		container_of ( data, struct ftp_request, data );
347 349
 	int rc;

+ 3
- 1
src/net/tcp/http.c 查看文件

@@ -316,10 +316,12 @@ static int http_rx_data ( struct http_request *http,
316 316
  *
317 317
  * @v socket		Transport layer interface
318 318
  * @v iobuf		I/O buffer
319
+ * @v meta		Data transfer metadata, or NULL
319 320
  * @ret rc		Return status code
320 321
  */
321 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 325
 	struct http_request *http =
324 326
 		container_of ( socket, struct http_request, socket );
325 327
 	struct http_line_handler *lh;

正在加载...
取消
保存