#ifndef _IPXE_PEERDISC_H #define _IPXE_PEERDISC_H /** @file * * Peer Content Caching and Retrieval (PeerDist) protocol peer discovery * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include #include #include #include #include #include /** A PeerDist discovery socket */ struct peerdisc_socket { /** Name */ const char *name; /** Data transfer interface */ struct interface xfer; /** Socket address */ union { struct sockaddr sa; struct sockaddr_in sin; struct sockaddr_in6 sin6; } address; }; /** PeerDist discovery socket table */ #define PEERDISC_SOCKETS __table ( struct peerdisc_socket, "peerdisc_sockets" ) /** Declare a PeerDist discovery socket */ #define __peerdisc_socket __table_entry ( PEERDISC_SOCKETS, 01 ) /** A PeerDist discovery segment */ struct peerdisc_segment { /** Reference count */ struct refcnt refcnt; /** List of segments */ struct list_head list; /** Segment identifier string * * This is MS-PCCRC's "HoHoDk", transcribed as an upper-case * Base16-encoded string. */ const char *id; /** Message UUID string */ const char *uuid; /** List of discovered peers * * The list of peers may be appended to during the lifetime of * the discovery segment. Discovered peers will not be * removed from the list until the last discovery has been * closed; this allows users to safely maintain a pointer to a * current position within the list. */ struct list_head peers; /** List of active clients */ struct list_head clients; /** Transmission timer */ struct retry_timer timer; }; /** A PeerDist discovery peer */ struct peerdisc_peer { /** List of peers */ struct list_head list; /** Peer location */ char location[0]; }; /** A PeerDist discovery client */ struct peerdisc_client { /** Discovery segment */ struct peerdisc_segment *segment; /** List of clients */ struct list_head list; /** Operations */ struct peerdisc_client_operations *op; }; /** PeerDist discovery client operations */ struct peerdisc_client_operations { /** New peers have been discovered * * @v peerdisc PeerDist discovery client */ void ( * discovered ) ( struct peerdisc_client *peerdisc ); }; /** * Initialise PeerDist discovery * * @v peerdisc PeerDist discovery client * @v op Discovery operations */ static inline __attribute__ (( always_inline )) void peerdisc_init ( struct peerdisc_client *peerdisc, struct peerdisc_client_operations *op ) { peerdisc->op = op; } extern unsigned int peerdisc_timeout_secs; extern void peerdisc_stat ( struct interface *intf, struct peerdisc_peer *peer, struct list_head *peers ); #define peerdisc_stat_TYPE( object_type ) \ typeof ( void ( object_type, struct peerdisc_peer *peer, \ struct list_head *peers ) ) extern int peerdisc_open ( struct peerdisc_client *peerdisc, const void *id, size_t len ); extern void peerdisc_close ( struct peerdisc_client *peerdisc ); #endif /* _IPXE_PEERDISC_H */