#pragma once #include #include "error.h" #define DISCOVERY_MULTICAST_GROUP "224.0.0.251" #define DISCOVERY_PORT 5353 #define DISCOVERY_PROTOCOL_VERSION 1 #define DISCOVERY_MAX_NAME_LEN 255 #define DISCOVERY_MAX_PEERS 64 /* function_flags bits — matches protocol doc */ #define DISCOVERY_FLAG_SOURCE (1u << 0) #define DISCOVERY_FLAG_RELAY (1u << 1) #define DISCOVERY_FLAG_SINK (1u << 2) #define DISCOVERY_FLAG_CONTROLLER (1u << 3) struct Discovery_Peer { uint32_t addr; /* source IPv4, network byte order */ uint16_t site_id; uint16_t tcp_port; uint16_t function_flags; char name[DISCOVERY_MAX_NAME_LEN + 1]; }; typedef void (*Discovery_Peer_Found_Cb)(const struct Discovery_Peer *peer, void *userdata); typedef void (*Discovery_Peer_Lost_Cb)(const struct Discovery_Peer *peer, void *userdata); struct Discovery_Config { /* our own identity */ uint16_t site_id; uint16_t tcp_port; uint16_t function_flags; const char *name; /* timing */ uint32_t interval_ms; /* announcement interval; 0 = use default (5000) */ uint32_t timeout_intervals; /* missed intervals before peer_lost; 0 = use default (3) */ /* callbacks */ Discovery_Peer_Found_Cb on_peer_found; /* required */ Discovery_Peer_Lost_Cb on_peer_lost; /* optional */ void *userdata; }; struct Discovery; struct App_Error discovery_create(struct Discovery **out, struct Discovery_Config *config); struct App_Error discovery_start(struct Discovery *d); void discovery_destroy(struct Discovery *d);