54 #define PEERDISC_REPEAT_COUNT 2 57 #define PEERDISC_REPEAT_TIMEOUT ( 1 * TICKS_PER_SEC ) 60 #define PEERDISC_DEFAULT_TIMEOUT_SECS 2 84 const char *location );
108 op (
object,
peer, peers );
137 DBGC ( socket,
"PEERDISC %s could not open socket: " 202 DBGC ( socket,
"PEERDISC %s could not transmit " 203 "via %s: %s\n", socket->
name,
240 DBGC ( socket,
"PEERDISC %s could not parse reply: %s\n",
251 DBGC ( socket,
"PEERDISC %s restoring timeout to %d seconds\n",
257 for (
id = reply.
ids ; *
id ;
id += (
strlen (
id ) + 1 ) ) {
262 DBGC ( socket,
"PEERDISC %s ignoring reply for %s\n",
268 for ( location = reply.
locations ; *location ;
269 location += (
strlen ( location ) + 1 ) ) {
385 const char *location ) {
393 if (
strcmp (
peer->location, location ) == 0 ) {
412 recent =
strdup ( location );
467 for ( i = 0 ; i < (
sizeof ( random_uuid.dword ) /
468 sizeof ( random_uuid.dword[0] ) ) ; i++ )
469 random_uuid.dword[i] =
random();
473 id_len = (
strlen (
id ) + 1 );
480 id_copy = ( ( (
void * )
segment ) +
sizeof ( *segment ) );
481 memcpy ( id_copy,
id, id_len );
482 uuid_copy = ( ( (
void * ) id_copy ) + id_len );
568 for ( id_chr =
id_string ; *id_chr ; id_chr++ )
609 DBGC (
segment,
"PEERDISC %p reducing timeout to %d " 637 .description =
"PeerDist hosted cache",
638 .type = &setting_type_string,
struct list_head peers
List of discovered peers.
An object interface operation.
uint16_t segment
Code segment.
struct arbelprm_rc_send_wqe rc
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
#define AF_INET6
IPv6 Internet addresses.
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
int xfer_deliver_raw_meta(struct interface *intf, const void *data, size_t len, struct xfer_metadata *meta)
Deliver datagram as raw data.
static void peerdisc_socket_tx(const char *uuid, const char *id)
Attempt to transmit PeerDist discovery requests on all sockets.
#define ref_init(refcnt, free)
Initialise a reference counter.
int xfer_open_socket(struct interface *intf, int semantics, struct sockaddr *peer, struct sockaddr *local)
Open socket.
static void peerdisc_socket_close(int rc)
Close all PeerDist discovery sockets.
A PeerDist discovery socket.
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
uint64_t address
Base address.
#define INTF_INIT(descriptor)
Initialise a static object interface.
A PeerDist discovery segment.
#define PEERDIST_DISCOVERY_IPV4
PeerDist discovery IPv4 address (239.255.255.250)
const struct setting peerhost_setting __setting(SETTING_MISC, peerhost)
PeerDist hosted cache server setting.
static struct interface_operation peerdisc_socket_operations[]
PeerDist discovery socket interface operations.
#define SETTING_MISC
Miscellaneous settings.
#define PEERDISC_SOCKETS
PeerDist discovery socket table.
static char * peerdisc_recent
Most recently discovered peer (for any block)
static void peerdisc_free(struct refcnt *refcnt)
Free PeerDist discovery segment.
struct list_head list
List of clients.
Peer Content Caching and Retrieval (PeerDist) protocol peer discovery.
#define PEERDISC_DISCARD_RATE
unsigned int scope_id
Scope ID.
static struct peerdisc_segment * peerdisc_find(const char *id)
Find PeerDist discovery segment.
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
A doubly-linked list entry (or list head)
Data transfer interfaces.
struct interface * intf
Original interface.
void peerdisc_stat(struct interface *intf, struct peerdisc_peer *peer, struct list_head *peers)
Report peer discovery statistics.
#define list_empty(list)
Test whether a list is empty.
static size_t base16_encoded_len(size_t raw_len)
Calculate length of base16-encoded data.
static int toupper(int character)
Convert character to upper case.
struct interface xfer
Data transfer interface.
#define list_del(list)
Delete an entry from a list.
#define ENOMEM
Not enough space.
void(* discovered)(struct peerdisc_client *peerdisc)
New peers have been discovered.
char * peerdist_discovery_request(const char *uuid, const char *id)
Construct discovery request.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
A PeerDist discovery client.
int peerdisc_open(struct peerdisc_client *peerdisc, const void *id, size_t len)
Open PeerDist discovery client.
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
#define __unused
Declare a variable or data structure as unused.
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Peer Content Caching and Retrieval: Discovery Protocol [MS-PCCRD].
A PeerDist discovery reply.
static struct net_device * netdev
Transport-network layer interface.
char * strcpy(char *dest, const char *src)
Copy string.
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
char * locations
List of peer locations.
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
uint8_t id
Request identifier.
static char * peerhost
Hosted cache server.
struct settings_applicator peerdisc_applicator __settings_applicator
PeerDist discovery settings applicator.
Generalized socket address structure.
An object interface descriptor.
uint8_t id_string[24]
ID string.
char * strerror(int errno)
Retrieve string representation of error number.
static void(* free)(struct refcnt *refcnt))
void * zalloc(size_t size)
Allocate cleared memory.
#define for_each_netdev(netdev)
Iterate over all network devices.
#define ref_get(refcnt)
Get additional reference to object.
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
#define PEERDISC_REPEAT_TIMEOUT
Time between repeated discovery attempts.
#define PEERDIST_DISCOVERY_IPV6
PeerDist discovery IPv6 address (ff02::c)
static int peerdisc_socket_rx(struct peerdisc_socket *socket, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
Handle received PeerDist discovery reply.
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
char * strdup(const char *src)
Duplicate string.
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
size_t strlen(const char *src)
Get length of string.
Data transfer interface opening.
static void peerdisc_expired(struct retry_timer *timer, int over __unused)
Handle discovery timer expiry.
union peerdisc_socket::@643 address
Socket address.
char * ids
List of segment ID strings.
const char * uuid_ntoa(const union uuid *uuid)
Convert UUID to printable string.
struct peerdisc_segment * segment
Discovery segment.
static struct interface_descriptor peerdisc_socket_desc
PeerDist discovery socket interface descriptor.
static struct peerdisc_segment * peerdisc_create(const char *id)
Create PeerDist discovery segment.
Network device management.
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
static LIST_HEAD(peerdisc_segments)
List of discovery segments.
static uint16_t struct vmbus_xfer_pages_operations * op
#define INIT_LIST_HEAD(list)
Initialise a list head.
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
void stop_timer(struct retry_timer *timer)
Stop timer.
struct list_head list
List of segments.
#define PEERDISC_REPEAT_COUNT
Number of repeated discovery attempts.
char name[NETDEV_NAME_LEN]
Name of this network device.
#define peerdisc_stat_TYPE(object_type)
static void peerdisc_destroy(struct peerdisc_segment *segment)
Destroy PeerDist discovery segment.
int strcmp(const char *first, const char *second)
Compare strings.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
void * data
Start of data.
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
u8 request[0]
List of IEs requested.
static int peerdisc_discovered(struct peerdisc_segment *segment, const char *location)
Add discovered PeerDist peer.
struct peerdisc_socket peerdisc_socket_ipv4 __peerdisc_socket
PeerDist discovery IPv4 socket.
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
int(* apply)(void)
Apply updated settings.
static int apply_peerdisc_settings(void)
Apply PeerDist discovery settings.
struct peerdisc_client_operations * op
Operations.
struct mschapv2_challenge peer
Peer challenge.
#define PEERDISC_DEFAULT_TIMEOUT_SECS
Default discovery timeout (in seconds)
struct list_head list
List of peers.
#define PEERDIST_DISCOVERY_PORT
PeerDist discovery port.
#define for_each_table_entry_continue_reverse(pointer, table)
Iterate through all remaining entries within a linker table in reverse order.
#define NULL
NULL pointer (VOID *)
static int peerdisc_socket_open(void)
Open all PeerDist discovery sockets.
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
#define AF_INET
IPv4 Internet addresses.
#define ref_put(refcnt)
Drop reference to object.
void * memset(void *dest, int character, size_t len) __nonnull
void peerdisc_close(struct peerdisc_client *peerdisc)
Close PeerDist discovery client.
unsigned int peerdisc_timeout_secs
Recommended discovery timeout (in seconds)
A PeerDist discovery peer.