david/ipxe
david
/
ipxe
Archived
1
0
Fork 0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/ipxe/peermux.h

87 lines
2.1 KiB
C

#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;
};
/** PeerDist statistics */
struct peerdist_statistics {
/** Maximum observed number of peers */
unsigned int peers;
/** Number of blocks downloaded in total */
unsigned int total;
/** Number of blocks downloaded from peers */
unsigned int local;
};
/** 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];
/** Statistics */
struct peerdist_statistics stats;
};
extern int peermux_filter ( struct interface *xfer, struct interface *info,
struct uri *uri );
#endif /* _IPXE_PEERMUX_H */