/* * multicast.h * * Created on: 05.07.2010 * Author: schalli */ #ifndef __TINC_MULTICAST_H__ #define __TINC_MULTICAST_H__ #include "system.h" #include "logger.h" #include "net.h" #include "utils.h" #ifdef HAVE_MINGW #include // Set the flags to pass to GetAdaptersAddresses extern const ULONG flags; #endif // Multicast TTL is 1, since we announce to local network extern const int multicastTTL; // Multicast port is 16655 for every network extern const int multicastPort; /* IPv4 Multicast address */ extern struct sockaddr_in multicastAddr4; /* IPv6 Multicast address */ extern struct sockaddr_in6 multicastAddr6; /** keeps all multicast sockets */ extern listen_socket_t multicast_socket[MAXSOCKETS]; extern int multicast_sockets; /** The challenge we sent */ #define MC_CHALLENGE_SIZE 128 extern char mc_challenge[]; extern struct timeval mc_timestamp; #define STRLEN 64 typedef enum mcpacket_type_t { MCPKT_ANNOUNCE, /* Multicast announce */ MCPKT_RESPONSE /* Multicast response to announce */ } mcpacket_type_t; typedef struct mcpacket_announce_t { } mcpacket_announce_t; typedef struct mcpacket_response_t { u_short port; char signature[EVP_MAX_MD_SIZE]; } mcpacket_response_t; typedef struct mcpacket_t { mcpacket_type_t type; char netname[STRLEN]; char hostname[STRLEN]; char challenge[MC_CHALLENGE_SIZE]; union { mcpacket_announce_t announce; mcpacket_response_t response; }; } mcpacket_t; extern mcpacket_t *new_mcpacket(void) __attribute__ ((__malloc__)); extern void free_mcpacket(mcpacket_t *); extern int check_signature(const node_t *, mcpacket_t *); extern void set_signature(const node_t *, mcpacket_t *); extern void init_multicast(void); extern void handle_multicast_data(int); extern void receive_multicast_packet(int, mcpacket_t *, union sockaddr_t *); extern void send_multicast_announces(void); extern void send_multicast_announce(const mcpacket_t *, const int socketIdx); extern void receive_multicast_announce(const int, const mcpacket_t *, const node_t *, const sockaddr_t *); extern void send_multicast_response(const int, const mcpacket_t *, const node_t *, const sockaddr_t *); extern void receive_multicast_response(node_t *, const sockaddr_t *, const mcpacket_t *); extern void bind_multicast_sockets(void); extern void bind_multicast_socket(sockaddr_t *, int); extern void close_multicast_sockets(void); extern void close_multicast_socket(const int); #endif /* __TINC_MULTICAST_H__ */