mirror of
https://github.com/ipxe/ipxe
synced 2025-12-16 17:41:18 +03:00
[peerdist] Add block download multiplexer
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -254,6 +254,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#define ERRFILE_httpdigest ( ERRFILE_NET | 0x00440000 )
|
||||
#define ERRFILE_peerdisc ( ERRFILE_NET | 0x00450000 )
|
||||
#define ERRFILE_peerblk ( ERRFILE_NET | 0x00460000 )
|
||||
#define ERRFILE_peermux ( ERRFILE_NET | 0x00470000 )
|
||||
|
||||
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
|
||||
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
|
||||
|
||||
73
src/include/ipxe/peermux.h
Normal file
73
src/include/ipxe/peermux.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#ifndef _IPXE_PEERMUX_H
|
||||
#define _IPXE_PEERMUX_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Peer Content Caching and Retrieval (PeerDist) protocol multiplexer
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <stdint.h>
|
||||
#include <ipxe/list.h>
|
||||
#include <ipxe/refcnt.h>
|
||||
#include <ipxe/interface.h>
|
||||
#include <ipxe/process.h>
|
||||
#include <ipxe/uri.h>
|
||||
#include <ipxe/xferbuf.h>
|
||||
#include <ipxe/pccrc.h>
|
||||
|
||||
/** Maximum number of concurrent block downloads */
|
||||
#define PEERMUX_MAX_BLOCKS 32
|
||||
|
||||
/** PeerDist download content information cache */
|
||||
struct peerdist_info_cache {
|
||||
/** Content information */
|
||||
struct peerdist_info info;
|
||||
/** Content information segment */
|
||||
struct peerdist_info_segment segment;
|
||||
/** Content information block */
|
||||
struct peerdist_info_block block;
|
||||
};
|
||||
|
||||
/** A PeerDist multiplexed block download */
|
||||
struct peerdist_multiplexed_block {
|
||||
/** PeerDist download multiplexer */
|
||||
struct peerdist_multiplexer *peermux;
|
||||
/** List of multiplexed blocks */
|
||||
struct list_head list;
|
||||
/** Data transfer interface */
|
||||
struct interface xfer;
|
||||
};
|
||||
|
||||
/** A PeerDist download multiplexer */
|
||||
struct peerdist_multiplexer {
|
||||
/** Reference count */
|
||||
struct refcnt refcnt;
|
||||
/** Data transfer interface */
|
||||
struct interface xfer;
|
||||
/** Content information interface */
|
||||
struct interface info;
|
||||
/** Original URI */
|
||||
struct uri *uri;
|
||||
|
||||
/** Content information data transfer buffer */
|
||||
struct xfer_buffer buffer;
|
||||
/** Content information cache */
|
||||
struct peerdist_info_cache cache;
|
||||
|
||||
/** Block download initiation process */
|
||||
struct process process;
|
||||
/** List of busy block downloads */
|
||||
struct list_head busy;
|
||||
/** List of idle block downloads */
|
||||
struct list_head idle;
|
||||
/** Block downloads */
|
||||
struct peerdist_multiplexed_block block[PEERMUX_MAX_BLOCKS];
|
||||
};
|
||||
|
||||
extern int peermux_filter ( struct interface *xfer, struct interface *info,
|
||||
struct uri *uri );
|
||||
|
||||
#endif /* _IPXE_PEERMUX_H */
|
||||
Reference in New Issue
Block a user