]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[xfer] Add xfer_check_order() utility function
authorMichael Brown <mcb30@ipxe.org>
Mon, 20 Jul 2015 16:53:30 +0000 (17:53 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 22 Jul 2015 20:17:47 +0000 (21:17 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/xfer.c
src/include/ipxe/xfer.h

index 8d12a9efc5cadf7a9146c6e2940c3800cd0538d9..112fee1bf91fef75a247195059d32fb98433536f 100644 (file)
@@ -359,3 +359,34 @@ int xfer_seek ( struct interface *intf, off_t offset ) {
 
        return xfer_deliver ( intf, iobuf, &meta );
 }
+
+/**
+ * Check that data is delivered strictly in order
+ *
+ * @v meta             Data transfer metadata
+ * @v pos              Current position
+ * @v len              Length of data
+ * @ret rc             Return status code
+ */
+int xfer_check_order ( struct xfer_metadata *meta, size_t *pos, size_t len ) {
+       size_t new_pos;
+
+       /* Allow out-of-order zero-length packets (as used by xfer_seek()) */
+       if ( len == 0 )
+               return 0;
+
+       /* Calculate position of this delivery */
+       new_pos = *pos;
+       if ( meta->flags & XFER_FL_ABS_OFFSET )
+               new_pos = 0;
+       new_pos += meta->offset;
+
+       /* Fail if delivery position is not equal to current position */
+       if ( new_pos != *pos )
+               return -EPROTO;
+
+       /* Update current position */
+       *pos += len;
+
+       return 0;
+}
index 00218078bfb15e926370768a4caf7c4c98b202de..3a35fa924e0f71cc83ce70d61603e880e98f2efb 100644 (file)
@@ -103,5 +103,7 @@ extern int xfer_vprintf ( struct interface *intf,
 extern int __attribute__ (( format ( printf, 2, 3 ) ))
 xfer_printf ( struct interface *intf, const char *format, ... );
 extern int xfer_seek ( struct interface *intf, off_t offset );
+extern int xfer_check_order ( struct xfer_metadata *meta, size_t *pos,
+                             size_t len );
 
 #endif /* _IPXE_XFER_H */