iPXE
|
Peer Content Caching and Retrieval (PeerDist) protocol peer discovery. More...
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <ipxe/xfer.h>
#include <ipxe/iobuf.h>
#include <ipxe/open.h>
#include <ipxe/tcpip.h>
#include <ipxe/uuid.h>
#include <ipxe/base16.h>
#include <ipxe/netdevice.h>
#include <ipxe/timer.h>
#include <ipxe/fault.h>
#include <ipxe/settings.h>
#include <ipxe/pccrd.h>
#include <ipxe/peerdisc.h>
Go to the source code of this file.
Macros | |
#define | PEERDISC_REPEAT_COUNT 2 |
Number of repeated discovery attempts. More... | |
#define | PEERDISC_REPEAT_TIMEOUT ( 1 * TICKS_PER_SEC ) |
Time between repeated discovery attempts. More... | |
#define | PEERDISC_DEFAULT_TIMEOUT_SECS 2 |
Default discovery timeout (in seconds) More... | |
Functions | |
FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
static | LIST_HEAD (peerdisc_segments) |
List of discovery segments. More... | |
static struct peerdisc_segment * | peerdisc_find (const char *id) |
Find PeerDist discovery segment. More... | |
static int | peerdisc_discovered (struct peerdisc_segment *segment, const char *location) |
Add discovered PeerDist peer. More... | |
void | peerdisc_stat (struct interface *intf, struct peerdisc_peer *peer, struct list_head *peers) |
Report peer discovery statistics. More... | |
static int | peerdisc_socket_open (void) |
Open all PeerDist discovery sockets. More... | |
static void | peerdisc_socket_tx (const char *uuid, const char *id) |
Attempt to transmit PeerDist discovery requests on all sockets. More... | |
static int | peerdisc_socket_rx (struct peerdisc_socket *socket, struct io_buffer *iobuf, struct xfer_metadata *meta __unused) |
Handle received PeerDist discovery reply. More... | |
static void | peerdisc_socket_close (int rc) |
Close all PeerDist discovery sockets. More... | |
static void | peerdisc_free (struct refcnt *refcnt) |
Free PeerDist discovery segment. More... | |
static void | peerdisc_expired (struct retry_timer *timer, int over __unused) |
Handle discovery timer expiry. More... | |
static struct peerdisc_segment * | peerdisc_create (const char *id) |
Create PeerDist discovery segment. More... | |
static void | peerdisc_destroy (struct peerdisc_segment *segment) |
Destroy PeerDist discovery segment. More... | |
int | peerdisc_open (struct peerdisc_client *peerdisc, const void *id, size_t len) |
Open PeerDist discovery client. More... | |
void | peerdisc_close (struct peerdisc_client *peerdisc) |
Close PeerDist discovery client. More... | |
const struct setting peerhost_setting | __setting (SETTING_MISC, peerhost) |
PeerDist hosted cache server setting. More... | |
static int | apply_peerdisc_settings (void) |
Apply PeerDist discovery settings. More... | |
Variables | |
unsigned int | peerdisc_timeout_secs = PEERDISC_DEFAULT_TIMEOUT_SECS |
Recommended discovery timeout (in seconds) More... | |
static char * | peerdisc_recent |
Most recently discovered peer (for any block) More... | |
static char * | peerhost |
Hosted cache server. More... | |
static struct interface_operation | peerdisc_socket_operations [] |
PeerDist discovery socket interface operations. More... | |
static struct interface_descriptor | peerdisc_socket_desc |
PeerDist discovery socket interface descriptor. More... | |
struct peerdisc_socket peerdisc_socket_ipv4 | __peerdisc_socket |
PeerDist discovery IPv4 socket. More... | |
struct settings_applicator peerdisc_applicator | __settings_applicator |
PeerDist discovery settings applicator. More... | |
Peer Content Caching and Retrieval (PeerDist) protocol peer discovery.
Definition in file peerdisc.c.
#define PEERDISC_REPEAT_COUNT 2 |
Number of repeated discovery attempts.
Definition at line 54 of file peerdisc.c.
#define PEERDISC_REPEAT_TIMEOUT ( 1 * TICKS_PER_SEC ) |
Time between repeated discovery attempts.
Definition at line 57 of file peerdisc.c.
#define PEERDISC_DEFAULT_TIMEOUT_SECS 2 |
Default discovery timeout (in seconds)
Definition at line 60 of file peerdisc.c.
FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
|
static |
List of discovery segments.
|
static |
Find PeerDist discovery segment.
id | Segment ID |
segment | PeerDist discovery segment, or NULL if not found |
Definition at line 365 of file peerdisc.c.
References peerdisc_segment::list, list_for_each_entry, NULL, segment, and strcmp().
Referenced by peerdisc_open(), and peerdisc_socket_rx().
|
static |
Add discovered PeerDist peer.
segment | PeerDist discovery segment |
location | Peer location |
rc | Return status code |
Definition at line 384 of file peerdisc.c.
References DBGC2, peerdisc_client_operations::discovered, ENOMEM, free, peerdisc_peer::list, peerdisc_client::list, list_add_tail, list_for_each_entry, list_for_each_entry_safe, peerdisc_peer::location, peerdisc_client::op, peerdisc_recent, segment, strcmp(), strcpy(), strdup(), strlen(), tmp, and zalloc().
Referenced by peerdisc_create(), and peerdisc_socket_rx().
void peerdisc_stat | ( | struct interface * | intf, |
struct peerdisc_peer * | peer, | ||
struct list_head * | peers | ||
) |
Report peer discovery statistics.
intf | Interface |
peer | Selected peer (or NULL) |
peers | List of available peers |
Definition at line 100 of file peerdisc.c.
References dest, interface::intf, intf_get_dest_op, intf_object(), intf_put(), op, peerdisc_stat(), and peerdisc_stat_TYPE.
Referenced by peerblk_done(), and peerdisc_stat().
|
static |
Open all PeerDist discovery sockets.
rc | Return status code |
Definition at line 128 of file peerdisc.c.
References peerdisc_socket::address, DBGC, for_each_table_entry, for_each_table_entry_continue_reverse, intf_restart(), peerdisc_socket::name, NULL, PEERDISC_SOCKETS, rc, peerdisc_socket::sa, SOCK_DGRAM, strerror(), peerdisc_socket::xfer, and xfer_open_socket().
Referenced by peerdisc_open().
|
static |
Attempt to transmit PeerDist discovery requests on all sockets.
uuid | Message UUID string |
id | Segment identifier string |
Definition at line 157 of file peerdisc.c.
References address, peerdisc_socket::address, DBGC, for_each_netdev, for_each_table_entry, free, len, memcpy(), memset(), meta(), peerdisc_socket::name, net_device::name, netdev, netdev_is_open(), PEERDISC_DISCARD_RATE, PEERDISC_SOCKETS, peerdist_discovery_request(), rc, request, peerdisc_socket::sa, sa, net_device::scope_id, st, strerror(), strlen(), peerdisc_socket::xfer, and xfer_deliver_raw_meta().
Referenced by peerdisc_expired().
|
static |
Handle received PeerDist discovery reply.
socket | PeerDist discovery socket |
iobuf | I/O buffer |
meta | Data transfer metadata |
rc | Return status code |
Definition at line 224 of file peerdisc.c.
References io_buffer::data, DBGC, DBGC_HDA, free_iob(), id, peerdist_discovery_reply::ids, iob_len(), peerdist_discovery_reply::locations, peerdisc_socket::name, PEERDISC_DEFAULT_TIMEOUT_SECS, PEERDISC_DISCARD_RATE, peerdisc_discovered(), peerdisc_find(), peerdisc_timeout_secs, rc, segment, strerror(), and strlen().
|
static |
Close all PeerDist discovery sockets.
rc | Reason for close |
Definition at line 288 of file peerdisc.c.
References for_each_table_entry, intf_restart(), PEERDISC_SOCKETS, rc, and peerdisc_socket::xfer.
Referenced by peerdisc_close().
|
static |
Free PeerDist discovery segment.
refcnt | Reference count |
Definition at line 343 of file peerdisc.c.
References container_of, free, peerdisc_peer::list, list_del, list_for_each_entry_safe, segment, and tmp.
Referenced by peerdisc_create().
|
static |
Handle discovery timer expiry.
timer | Discovery timer |
over | Failure indicator |
Definition at line 432 of file peerdisc.c.
References container_of, PEERDISC_REPEAT_COUNT, PEERDISC_REPEAT_TIMEOUT, peerdisc_socket_tx(), segment, and start_timer_fixed().
Referenced by peerdisc_create().
|
static |
Create PeerDist discovery segment.
id | Segment ID |
segment | PeerDist discovery segment, or NULL on error |
Definition at line 450 of file peerdisc.c.
References DBGC2, INIT_LIST_HEAD, list_add_tail, memcpy(), NULL, peerdisc_discovered(), peerdisc_expired(), peerdisc_free(), peerdisc_recent, peerhost, random(), rc, ref_init, ref_put, segment, start_timer_nodelay(), strlen(), uuid, uuid_ntoa(), and zalloc().
Referenced by peerdisc_open().
|
static |
Destroy PeerDist discovery segment.
segment | PeerDist discovery segment |
Definition at line 531 of file peerdisc.c.
References assert(), list_del, list_empty, ref_put, segment, and stop_timer().
Referenced by peerdisc_close().
int peerdisc_open | ( | struct peerdisc_client * | peerdisc, |
const void * | id, | ||
size_t | len | ||
) |
Open PeerDist discovery client.
peerdisc | PeerDist discovery client |
id | Segment ID |
len | Length of segment ID |
rc | Return status code |
Definition at line 559 of file peerdisc.c.
References assert(), base16_encoded_len(), ENOMEM, id_string, len, peerdisc_client::list, list_add_tail, list_empty, NULL, peerdisc_create(), peerdisc_find(), peerdisc_socket_open(), rc, ref_get, peerdisc_client::segment, segment, and toupper().
Referenced by peerblk_open().
void peerdisc_close | ( | struct peerdisc_client * | peerdisc | ) |
Close PeerDist discovery client.
peerdisc | PeerDist discovery client |
Definition at line 597 of file peerdisc.c.
References DBGC, peerdisc_client::list, list_del, list_empty, NULL, peerdisc_destroy(), peerdisc_socket_close(), peerdisc_timeout_secs, ref_put, peerdisc_client::segment, and segment.
Referenced by peerblk_close().
const struct setting peerhost_setting __setting | ( | SETTING_MISC | , |
peerhost | |||
) |
PeerDist hosted cache server setting.
|
static |
Apply PeerDist discovery settings.
rc | Return status code |
Definition at line 646 of file peerdisc.c.
References DBGC, fetch_string_setting_copy(), free, NULL, and peerhost.
unsigned int peerdisc_timeout_secs = PEERDISC_DEFAULT_TIMEOUT_SECS |
Recommended discovery timeout (in seconds)
We reduce the recommended discovery timeout whenever a segment fails to discover any peers, and restore the default value whenever a valid discovery reply is received. We continue to send discovery requests even if the recommended timeout is reduced to zero.
This strategy is intended to minimise discovery delays when no peers are available on the network, while allowing downloads to quickly switch back to using PeerDist acceleration if new peers become available.
Definition at line 74 of file peerdisc.c.
Referenced by peerblk_open(), peerdisc_close(), and peerdisc_socket_rx().
|
static |
Most recently discovered peer (for any block)
Definition at line 77 of file peerdisc.c.
Referenced by peerdisc_create(), and peerdisc_discovered().
|
static |
Hosted cache server.
Definition at line 80 of file peerdisc.c.
Referenced by apply_peerdisc_settings(), and peerdisc_create().
|
static |
PeerDist discovery socket interface operations.
Definition at line 297 of file peerdisc.c.
|
static |
PeerDist discovery socket interface descriptor.
Definition at line 302 of file peerdisc.c.
struct peerdisc_socket peerdisc_socket_ipv6 __peerdisc_socket |
PeerDist discovery IPv4 socket.
PeerDist discovery IPv6 socket.
Definition at line 306 of file peerdisc.c.
struct settings_applicator peerdisc_applicator __settings_applicator |
PeerDist discovery settings applicator.
Definition at line 663 of file peerdisc.c.