These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / peerblk.h
1 #ifndef _IPXE_PEERBLK_H
2 #define _IPXE_PEERBLK_H
3
4 /** @file
5  *
6  * Peer Content Caching and Retrieval (PeerDist) protocol block downloads
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
12 #include <stdint.h>
13 #include <ipxe/refcnt.h>
14 #include <ipxe/interface.h>
15 #include <ipxe/crypto.h>
16 #include <ipxe/aes.h>
17 #include <ipxe/xferbuf.h>
18 #include <ipxe/retry.h>
19 #include <ipxe/process.h>
20 #include <ipxe/pccrc.h>
21 #include <ipxe/peerdisc.h>
22
23 /** A PeerDist retrieval protocol decryption buffer descriptor */
24 struct peerdist_block_decrypt {
25         /** Data transfer buffer */
26         struct xfer_buffer *xferbuf;
27         /** Offset within data transfer buffer */
28         size_t offset;
29         /** Length to use from data transfer buffer */
30         size_t len;
31 };
32
33 /** PeerDist retrieval protocol decryption data transfer buffer indices */
34 enum peerdist_block_decrypt_index {
35         /** Data before the trimmed content */
36         PEERBLK_BEFORE = 0,
37         /** Data within the trimmed content */
38         PEERBLK_DURING,
39         /** Data after the trimmed content */
40         PEERBLK_AFTER,
41         /** Number of decryption buffers */
42         PEERBLK_NUM_BUFFERS
43 };
44
45 /** A PeerDist block download */
46 struct peerdist_block {
47         /** Reference count */
48         struct refcnt refcnt;
49         /** Data transfer interface */
50         struct interface xfer;
51         /** Raw data interface */
52         struct interface raw;
53         /** Retrieval protocol interface */
54         struct interface retrieval;
55
56         /** Original URI */
57         struct uri *uri;
58         /** Content range of this block */
59         struct peerdist_range range;
60         /** Trimmed range of this block */
61         struct peerdist_range trim;
62         /** Offset of first byte in trimmed range within overall download */
63         size_t offset;
64
65         /** Digest algorithm */
66         struct digest_algorithm *digest;
67         /** Digest size
68          *
69          * Note that this may be shorter than the digest size of the
70          * digest algorithm.
71          */
72         size_t digestsize;
73         /** Digest context (statically allocated at instantiation time) */
74         void *digestctx;
75
76         /** Cipher algorithm */
77         struct cipher_algorithm *cipher;
78         /** Cipher context (dynamically allocated as needed) */
79         void *cipherctx;
80
81         /** Segment index */
82         unsigned int segment;
83         /** Segment identifier */
84         uint8_t id[PEERDIST_DIGEST_MAX_SIZE];
85         /** Segment secret */
86         uint8_t secret[PEERDIST_DIGEST_MAX_SIZE];
87         /** Block index */
88         unsigned int block;
89         /** Block hash */
90         uint8_t hash[PEERDIST_DIGEST_MAX_SIZE];
91
92         /** Current position (relative to incoming data stream) */
93         size_t pos;
94         /** Start of trimmed content (relative to incoming data stream) */
95         size_t start;
96         /** End of trimmed content (relative to incoming data stream) */
97         size_t end;
98         /** Data buffer */
99         struct xfer_buffer buffer;
100
101         /** Decryption process */
102         struct process process;
103         /** Decryption data buffer descriptors */
104         struct peerdist_block_decrypt decrypt[PEERBLK_NUM_BUFFERS];
105         /** Remaining decryption length */
106         size_t cipher_remaining;
107         /** Remaining digest length (excluding AES padding bytes) */
108         size_t digest_remaining;
109
110         /** Discovery client */
111         struct peerdisc_client discovery;
112         /** Current position in discovered peer list */
113         struct peerdisc_peer *peer;
114         /** Retry timer */
115         struct retry_timer timer;
116         /** Number of full attempt cycles completed */
117         unsigned int cycles;
118         /** Most recent attempt failure */
119         int rc;
120
121         /** Time at which block download was started */
122         unsigned long started;
123         /** Time at which most recent attempt was started */
124         unsigned long attempted;
125 };
126
127 /** Retrieval protocol block fetch response (including transport header)
128  *
129  * @v digestsize        Digest size
130  * @v len               Data block length
131  * @v vrf_len           Length of uselessness
132  * @v blksize           Cipher block size
133  */
134 #define peerblk_msg_blk_t( digestsize, len, vrf_len, blksize )          \
135         struct {                                                        \
136                 struct peerdist_msg_transport_header hdr;               \
137                 peerdist_msg_blk_t ( digestsize, len, vrf_len,          \
138                                      blksize ) msg;                     \
139         } __attribute__ (( packed ))
140
141 extern int peerblk_open ( struct interface *xfer, struct uri *uri,
142                           struct peerdist_info_block *block );
143
144 #endif /* _IPXE_PEERBLK_H */