forked from jbagg/QtZeroConf
196 lines
6.5 KiB
C
196 lines
6.5 KiB
C
#ifndef fooifacehfoo
|
|
#define fooifacehfoo
|
|
|
|
/***
|
|
This file is part of avahi.
|
|
|
|
avahi is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Lesser General Public License as
|
|
published by the Free Software Foundation; either version 2.1 of the
|
|
License, or (at your option) any later version.
|
|
|
|
avahi is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
|
Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with avahi; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
USA.
|
|
***/
|
|
|
|
typedef struct AvahiInterfaceMonitor AvahiInterfaceMonitor;
|
|
typedef struct AvahiInterfaceAddress AvahiInterfaceAddress;
|
|
typedef struct AvahiInterface AvahiInterface;
|
|
typedef struct AvahiHwInterface AvahiHwInterface;
|
|
|
|
#include <avahi-common/llist.h>
|
|
#include <avahi-common/address.h>
|
|
|
|
#include "internal.h"
|
|
#include "cache.h"
|
|
#include "response-sched.h"
|
|
#include "query-sched.h"
|
|
#include "probe-sched.h"
|
|
#include "dns.h"
|
|
#include "announce.h"
|
|
#include "browse.h"
|
|
#include "querier.h"
|
|
|
|
#ifdef HAVE_NETLINK
|
|
#include "iface-linux.h"
|
|
#elif defined(HAVE_PF_ROUTE)
|
|
#include "iface-pfroute.h"
|
|
#else
|
|
typedef struct AvahiInterfaceMonitorOSDep AvahiInterfaceMonitorOSDep;
|
|
struct AvahiInterfaceMonitorOSDep {
|
|
|
|
unsigned query_addr_seq, query_link_seq;
|
|
|
|
enum {
|
|
LIST_IFACE,
|
|
LIST_ADDR,
|
|
LIST_DONE
|
|
} list;
|
|
};
|
|
#endif
|
|
|
|
#define AVAHI_MAC_ADDRESS_MAX 32
|
|
|
|
struct AvahiInterfaceMonitor {
|
|
AvahiServer *server;
|
|
AvahiHashmap *hashmap;
|
|
|
|
AVAHI_LLIST_HEAD(AvahiInterface, interfaces);
|
|
AVAHI_LLIST_HEAD(AvahiHwInterface, hw_interfaces);
|
|
|
|
int list_complete;
|
|
AvahiInterfaceMonitorOSDep osdep;
|
|
};
|
|
|
|
struct AvahiHwInterface {
|
|
AvahiInterfaceMonitor *monitor;
|
|
|
|
AVAHI_LLIST_FIELDS(AvahiHwInterface, hardware);
|
|
|
|
char *name;
|
|
AvahiIfIndex index;
|
|
int flags_ok;
|
|
|
|
unsigned mtu;
|
|
|
|
uint8_t mac_address[AVAHI_MAC_ADDRESS_MAX];
|
|
size_t mac_address_size;
|
|
|
|
AvahiSEntryGroup *entry_group;
|
|
|
|
/* Packet rate limiting */
|
|
struct timeval ratelimit_begin;
|
|
unsigned ratelimit_counter;
|
|
|
|
AVAHI_LLIST_HEAD(AvahiInterface, interfaces);
|
|
};
|
|
|
|
struct AvahiInterface {
|
|
AvahiInterfaceMonitor *monitor;
|
|
AvahiHwInterface *hardware;
|
|
|
|
AVAHI_LLIST_FIELDS(AvahiInterface, interface);
|
|
AVAHI_LLIST_FIELDS(AvahiInterface, by_hardware);
|
|
|
|
AvahiProtocol protocol;
|
|
int announcing;
|
|
AvahiAddress local_mcast_address;
|
|
int mcast_joined;
|
|
|
|
AvahiCache *cache;
|
|
|
|
AvahiQueryScheduler *query_scheduler;
|
|
AvahiResponseScheduler * response_scheduler;
|
|
AvahiProbeScheduler *probe_scheduler;
|
|
|
|
AVAHI_LLIST_HEAD(AvahiInterfaceAddress, addresses);
|
|
AVAHI_LLIST_HEAD(AvahiAnnouncer, announcers);
|
|
|
|
AvahiHashmap *queriers_by_key;
|
|
AVAHI_LLIST_HEAD(AvahiQuerier, queriers);
|
|
};
|
|
|
|
struct AvahiInterfaceAddress {
|
|
AvahiInterfaceMonitor *monitor;
|
|
AvahiInterface *interface;
|
|
|
|
AVAHI_LLIST_FIELDS(AvahiInterfaceAddress, address);
|
|
|
|
AvahiAddress address;
|
|
unsigned prefix_len;
|
|
|
|
int global_scope;
|
|
int deprecated;
|
|
|
|
AvahiSEntryGroup *entry_group;
|
|
};
|
|
|
|
AvahiInterfaceMonitor *avahi_interface_monitor_new(AvahiServer *server);
|
|
void avahi_interface_monitor_free(AvahiInterfaceMonitor *m);
|
|
|
|
int avahi_interface_monitor_init_osdep(AvahiInterfaceMonitor *m);
|
|
void avahi_interface_monitor_free_osdep(AvahiInterfaceMonitor *m);
|
|
void avahi_interface_monitor_sync(AvahiInterfaceMonitor *m);
|
|
|
|
typedef void (*AvahiInterfaceMonitorWalkCallback)(AvahiInterfaceMonitor *m, AvahiInterface *i, void* userdata);
|
|
void avahi_interface_monitor_walk(AvahiInterfaceMonitor *m, AvahiIfIndex idx, AvahiProtocol protocol, AvahiInterfaceMonitorWalkCallback callback, void* userdata);
|
|
int avahi_dump_caches(AvahiInterfaceMonitor *m, AvahiDumpCallback callback, void* userdata);
|
|
|
|
void avahi_interface_monitor_update_rrs(AvahiInterfaceMonitor *m, int remove_rrs);
|
|
int avahi_address_is_local(AvahiInterfaceMonitor *m, const AvahiAddress *a);
|
|
void avahi_interface_monitor_check_relevant(AvahiInterfaceMonitor *m);
|
|
|
|
/* AvahiHwInterface */
|
|
|
|
AvahiHwInterface *avahi_hw_interface_new(AvahiInterfaceMonitor *m, AvahiIfIndex idx);
|
|
void avahi_hw_interface_free(AvahiHwInterface *hw, int send_goodbye);
|
|
|
|
void avahi_hw_interface_update_rrs(AvahiHwInterface *hw, int remove_rrs);
|
|
void avahi_hw_interface_check_relevant(AvahiHwInterface *hw);
|
|
|
|
AvahiHwInterface* avahi_interface_monitor_get_hw_interface(AvahiInterfaceMonitor *m, int idx);
|
|
|
|
/* AvahiInterface */
|
|
|
|
AvahiInterface* avahi_interface_new(AvahiInterfaceMonitor *m, AvahiHwInterface *hw, AvahiProtocol protocol);
|
|
void avahi_interface_free(AvahiInterface *i, int send_goodbye);
|
|
|
|
void avahi_interface_update_rrs(AvahiInterface *i, int remove_rrs);
|
|
void avahi_interface_check_relevant(AvahiInterface *i);
|
|
int avahi_interface_is_relevant(AvahiInterface *i);
|
|
|
|
void avahi_interface_send_packet(AvahiInterface *i, AvahiDnsPacket *p);
|
|
void avahi_interface_send_packet_unicast(AvahiInterface *i, AvahiDnsPacket *p, const AvahiAddress *a, uint16_t port);
|
|
|
|
int avahi_interface_post_query(AvahiInterface *i, AvahiKey *k, int immediately, unsigned *ret_id);
|
|
int avahi_interface_withraw_query(AvahiInterface *i, unsigned id);
|
|
int avahi_interface_post_response(AvahiInterface *i, AvahiRecord *record, int flush_cache, const AvahiAddress *querier, int immediately);
|
|
int avahi_interface_post_probe(AvahiInterface *i, AvahiRecord *p, int immediately);
|
|
|
|
int avahi_interface_match(AvahiInterface *i, AvahiIfIndex idx, AvahiProtocol protocol);
|
|
int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a);
|
|
int avahi_interface_has_address(AvahiInterfaceMonitor *m, AvahiIfIndex iface, const AvahiAddress *a);
|
|
|
|
AvahiInterface* avahi_interface_monitor_get_interface(AvahiInterfaceMonitor *m, AvahiIfIndex idx, AvahiProtocol protocol);
|
|
|
|
/* AvahiInterfaceAddress */
|
|
|
|
AvahiInterfaceAddress *avahi_interface_address_new(AvahiInterfaceMonitor *m, AvahiInterface *i, const AvahiAddress *addr, unsigned prefix_len);
|
|
void avahi_interface_address_free(AvahiInterfaceAddress *a);
|
|
|
|
void avahi_interface_address_update_rrs(AvahiInterfaceAddress *a, int remove_rrs);
|
|
int avahi_interface_address_is_relevant(AvahiInterfaceAddress *a);
|
|
|
|
AvahiInterfaceAddress* avahi_interface_monitor_get_address(AvahiInterfaceMonitor *m, AvahiInterface *i, const AvahiAddress *raddr);
|
|
|
|
AvahiIfIndex avahi_find_interface_for_address(AvahiInterfaceMonitor *m, const AvahiAddress *a);
|
|
|
|
#endif
|