|
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/pccrr.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. | |
| #define | PEERDISC_REPEAT_TIMEOUT ( 1 * TICKS_PER_SEC ) |
| Time between repeated discovery attempts. | |
| #define | PEERDISC_DEFAULT_TIMEOUT_SECS 2 |
| Default discovery timeout (in seconds). | |
Functions | |
| FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
| FILE_SECBOOT (PERMITTED) | |
| static | LIST_HEAD (peerdisc_segments) |
| List of discovery segments. | |
| static struct peerdisc_segment * | peerdisc_find (const char *id) |
| Find PeerDist discovery segment. | |
| static int | peerdisc_discovered (struct peerdisc_segment *segment, struct peerdist_retrieval *retrieval, const char *location) |
| Add discovered PeerDist peer. | |
| void | peerdisc_stat (struct interface *intf, struct peerdisc_peer *peer, struct list_head *peers) |
| Report peer discovery statistics. | |
| static int | peerdisc_socket_open (void) |
| Open all PeerDist discovery sockets. | |
| static void | peerdisc_socket_tx (const char *uuid, const char *id) |
| Attempt to transmit PeerDist discovery requests on all sockets. | |
| static int | peerdisc_socket_rx (struct peerdisc_socket *socket, struct io_buffer *iobuf, struct xfer_metadata *meta __unused) |
| Handle received PeerDist discovery reply. | |
| static void | peerdisc_socket_close (int rc) |
| Close all PeerDist discovery sockets. | |
| static void | peerdisc_free (struct refcnt *refcnt) |
| Free PeerDist discovery segment. | |
| static void | peerdisc_expired (struct retry_timer *timer, int over __unused) |
| Handle discovery timer expiry. | |
| static struct peerdisc_segment * | peerdisc_create (const char *id) |
| Create PeerDist discovery segment. | |
| static void | peerdisc_destroy (struct peerdisc_segment *segment) |
| Destroy PeerDist discovery segment. | |
| int | peerdisc_open (struct peerdisc_client *peerdisc, const void *id, size_t len) |
| Open PeerDist discovery client. | |
| void | peerdisc_close (struct peerdisc_client *peerdisc) |
| Close PeerDist discovery client. | |
| const struct setting peerhost_setting | __setting (SETTING_MISC, peerhost) |
| PeerDist hosted cache server setting. | |
| const struct setting peerpath_setting | __setting (SETTING_MISC, peerpath) |
| PeerDist local cache directory setting. | |
| static int | apply_peerdisc_settings (void) |
| Apply PeerDist discovery settings. | |
Variables | |
| unsigned int | peerdisc_timeout_secs = PEERDISC_DEFAULT_TIMEOUT_SECS |
| Recommended discovery timeout (in seconds). | |
| static char * | peerdisc_recent |
| Most recently discovered peer (for any block). | |
| static char * | peerhost |
| Hosted cache server. | |
| static char * | peerpath |
| Local cache directory. | |
| static struct interface_operation | peerdisc_socket_operations [] |
| PeerDist discovery socket interface operations. | |
| static struct interface_descriptor | peerdisc_socket_desc |
| PeerDist discovery socket interface descriptor. | |
| struct peerdisc_socket peerdisc_socket_ipv4 | __peerdisc_socket |
| PeerDist discovery IPv4 socket. | |
| struct settings_applicator peerdisc_applicator | __settings_applicator |
| PeerDist discovery settings applicator. | |
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 56 of file peerdisc.c.
Referenced by peerdisc_expired().
| #define PEERDISC_REPEAT_TIMEOUT ( 1 * TICKS_PER_SEC ) |
Time between repeated discovery attempts.
Definition at line 59 of file peerdisc.c.
Referenced by peerdisc_expired().
| #define PEERDISC_DEFAULT_TIMEOUT_SECS 2 |
Default discovery timeout (in seconds).
Definition at line 62 of file peerdisc.c.
Referenced by peerdisc_socket_rx().
| FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
| FILE_SECBOOT | ( | PERMITTED | ) |
|
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 373 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 |
| retrieval | PeerDist retrieval protocol |
| location | Peer location |
| rc | Return status code |
Definition at line 393 of file peerdisc.c.
References DBGC2, peerdisc_client_operations::discovered, ENOMEM, free, peerdisc_client::list, list_add_tail, list_for_each_entry, list_for_each_entry_safe, peerdisc_client::op, peer, peerdisc_recent, peerhost, peerpath, 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 106 of file peerdisc.c.
References dest, interface::intf, intf_get_dest_op, intf_object(), intf_put(), op, peer, 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 134 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.
Definition at line 163 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, netdev, netdev_is_open(), PEERDISC_DISCARD_RATE, PEERDISC_SOCKETS, peerdist_discovery_request(), rc, request, peerdisc_socket::sa, sa, 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 230 of file peerdisc.c.
References __unused, io_buffer::data, DBGC, DBGC_HDA, free_iob(), id, peerdist_discovery_reply::ids, iob_len(), peerdist_discovery_reply::locations, meta, peerdisc_socket::name, PEERDISC_DEFAULT_TIMEOUT_SECS, PEERDISC_DISCARD_RATE, peerdisc_discovered(), peerdisc_find(), peerdisc_timeout_secs, peerdist_post, rc, segment, strerror(), and strlen().
|
static |
Close all PeerDist discovery sockets.
| rc | Reason for close |
Definition at line 296 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 351 of file peerdisc.c.
References container_of, free, peerdisc_peer::list, list_del, list_for_each_entry_safe, peer, segment, and tmp.
Referenced by peerdisc_create().
|
static |
Handle discovery timer expiry.
| timer | Discovery timer |
| over | Failure indicator |
Definition at line 445 of file peerdisc.c.
References __unused, 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 463 of file peerdisc.c.
References DBGC2, INIT_LIST_HEAD, list_add_tail, memcpy(), NULL, peerdisc_discovered(), peerdisc_expired(), peerdisc_free(), peerdisc_recent, peerdist_get, peerdist_post, peerhost, peerpath, random(), rc, ref_init, ref_put, segment, start_timer_nodelay(), strlen(), uuid_ntoa(), and zalloc().
Referenced by peerdisc_open().
|
static |
Destroy PeerDist discovery segment.
| segment | PeerDist discovery segment |
Definition at line 552 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.
| rc | Return status code |
Definition at line 580 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 618 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.
References __setting, peerhost, and SETTING_MISC.
| const struct setting peerpath_setting __setting | ( | SETTING_MISC | , |
| peerpath | ) |
PeerDist local cache directory setting.
References __setting, peerpath, and SETTING_MISC.
|
static |
Apply PeerDist discovery settings.
| rc | Return status code |
Definition at line 674 of file peerdisc.c.
References DBGC, fetch_string_setting_copy(), free, NULL, peerhost, peerpath, and strcmp().
| 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 76 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 79 of file peerdisc.c.
Referenced by peerdisc_create(), and peerdisc_discovered().
|
static |
Hosted cache server.
Definition at line 82 of file peerdisc.c.
Referenced by __setting(), apply_peerdisc_settings(), peerdisc_create(), and peerdisc_discovered().
|
static |
Local cache directory.
Definition at line 85 of file peerdisc.c.
Referenced by __setting(), apply_peerdisc_settings(), peerdisc_create(), and peerdisc_discovered().
|
static |
PeerDist discovery socket interface operations.
Definition at line 305 of file peerdisc.c.
|
static |
PeerDist discovery socket interface descriptor.
Definition at line 310 of file peerdisc.c.
| struct peerdisc_socket peerdisc_socket_ipv6 __peerdisc_socket |
PeerDist discovery IPv4 socket.
PeerDist discovery IPv6 socket.
Definition at line 314 of file peerdisc.c.
| struct settings_applicator peerdisc_applicator __settings_applicator |
PeerDist discovery settings applicator.
Definition at line 700 of file peerdisc.c.