These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / peerblk.h
diff --git a/qemu/roms/ipxe/src/include/ipxe/peerblk.h b/qemu/roms/ipxe/src/include/ipxe/peerblk.h
new file mode 100644 (file)
index 0000000..6fc9172
--- /dev/null
@@ -0,0 +1,144 @@
+#ifndef _IPXE_PEERBLK_H
+#define _IPXE_PEERBLK_H
+
+/** @file
+ *
+ * Peer Content Caching and Retrieval (PeerDist) protocol block downloads
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/refcnt.h>
+#include <ipxe/interface.h>
+#include <ipxe/crypto.h>
+#include <ipxe/aes.h>
+#include <ipxe/xferbuf.h>
+#include <ipxe/retry.h>
+#include <ipxe/process.h>
+#include <ipxe/pccrc.h>
+#include <ipxe/peerdisc.h>
+
+/** A PeerDist retrieval protocol decryption buffer descriptor */
+struct peerdist_block_decrypt {
+       /** Data transfer buffer */
+       struct xfer_buffer *xferbuf;
+       /** Offset within data transfer buffer */
+       size_t offset;
+       /** Length to use from data transfer buffer */
+       size_t len;
+};
+
+/** PeerDist retrieval protocol decryption data transfer buffer indices */
+enum peerdist_block_decrypt_index {
+       /** Data before the trimmed content */
+       PEERBLK_BEFORE = 0,
+       /** Data within the trimmed content */
+       PEERBLK_DURING,
+       /** Data after the trimmed content */
+       PEERBLK_AFTER,
+       /** Number of decryption buffers */
+       PEERBLK_NUM_BUFFERS
+};
+
+/** A PeerDist block download */
+struct peerdist_block {
+       /** Reference count */
+       struct refcnt refcnt;
+       /** Data transfer interface */
+       struct interface xfer;
+       /** Raw data interface */
+       struct interface raw;
+       /** Retrieval protocol interface */
+       struct interface retrieval;
+
+       /** Original URI */
+       struct uri *uri;
+       /** Content range of this block */
+       struct peerdist_range range;
+       /** Trimmed range of this block */
+       struct peerdist_range trim;
+       /** Offset of first byte in trimmed range within overall download */
+       size_t offset;
+
+       /** Digest algorithm */
+       struct digest_algorithm *digest;
+       /** Digest size
+        *
+        * Note that this may be shorter than the digest size of the
+        * digest algorithm.
+        */
+       size_t digestsize;
+       /** Digest context (statically allocated at instantiation time) */
+       void *digestctx;
+
+       /** Cipher algorithm */
+       struct cipher_algorithm *cipher;
+       /** Cipher context (dynamically allocated as needed) */
+       void *cipherctx;
+
+       /** Segment index */
+       unsigned int segment;
+       /** Segment identifier */
+       uint8_t id[PEERDIST_DIGEST_MAX_SIZE];
+       /** Segment secret */
+       uint8_t secret[PEERDIST_DIGEST_MAX_SIZE];
+       /** Block index */
+       unsigned int block;
+       /** Block hash */
+       uint8_t hash[PEERDIST_DIGEST_MAX_SIZE];
+
+       /** Current position (relative to incoming data stream) */
+       size_t pos;
+       /** Start of trimmed content (relative to incoming data stream) */
+       size_t start;
+       /** End of trimmed content (relative to incoming data stream) */
+       size_t end;
+       /** Data buffer */
+       struct xfer_buffer buffer;
+
+       /** Decryption process */
+       struct process process;
+       /** Decryption data buffer descriptors */
+       struct peerdist_block_decrypt decrypt[PEERBLK_NUM_BUFFERS];
+       /** Remaining decryption length */
+       size_t cipher_remaining;
+       /** Remaining digest length (excluding AES padding bytes) */
+       size_t digest_remaining;
+
+       /** Discovery client */
+       struct peerdisc_client discovery;
+       /** Current position in discovered peer list */
+       struct peerdisc_peer *peer;
+       /** Retry timer */
+       struct retry_timer timer;
+       /** Number of full attempt cycles completed */
+       unsigned int cycles;
+       /** Most recent attempt failure */
+       int rc;
+
+       /** Time at which block download was started */
+       unsigned long started;
+       /** Time at which most recent attempt was started */
+       unsigned long attempted;
+};
+
+/** Retrieval protocol block fetch response (including transport header)
+ *
+ * @v digestsize       Digest size
+ * @v len              Data block length
+ * @v vrf_len          Length of uselessness
+ * @v blksize          Cipher block size
+ */
+#define peerblk_msg_blk_t( digestsize, len, vrf_len, blksize )         \
+       struct {                                                        \
+               struct peerdist_msg_transport_header hdr;               \
+               peerdist_msg_blk_t ( digestsize, len, vrf_len,          \
+                                    blksize ) msg;                     \
+       } __attribute__ (( packed ))
+
+extern int peerblk_open ( struct interface *xfer, struct uri *uri,
+                         struct peerdist_info_block *block );
+
+#endif /* _IPXE_PEERBLK_H */