X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=iface.h;h=16e96508498fa58f987be3379692d58eecf5975f;hb=4aa744ffac20c7b5e18cb3b23e5dbac8221c0043;hp=90bfc05857623adf02012ac5d54ad5de46786914;hpb=d6e2dbabccb08970da991e6d2b0fda7a56d83e6f;p=catta diff --git a/iface.h b/iface.h index 90bfc05..16e9650 100644 --- a/iface.h +++ b/iface.h @@ -3,60 +3,97 @@ #include -struct _flxInterfaceMonitor; typedef struct _flxInterfaceMonitor flxInterfaceMonitor; - -struct _flxInterfaceAddress; typedef struct _flxInterfaceAddress flxInterfaceAddress; - -struct _flxInterface; typedef struct _flxInterface flxInterface; +typedef struct _flxHwInterface flxHwInterface; #include "address.h" #include "server.h" #include "netlink.h" +#include "cache.h" +#include "llist.h" +#include "psched.h" +#include "dns.h" +#include "announce.h" struct _flxInterfaceMonitor { flxServer *server; flxNetlink *netlink; GHashTable *hash_table; - flxInterface *interfaces; + FLX_LLIST_HEAD(flxInterface, interfaces); + FLX_LLIST_HEAD(flxHwInterface, hw_interfaces); guint query_addr_seq, query_link_seq; - enum { LIST_IFACE, LIST_ADDR, LIST_DONE } list; + enum { + LIST_IFACE, + LIST_ADDR, + LIST_DONE + } list; }; -struct _flxInterface { +struct _flxHwInterface { + FLX_LLIST_FIELDS(flxHwInterface, hardware); + flxInterfaceMonitor *monitor; + gchar *name; gint index; guint flags; + guint mtu; + + FLX_LLIST_HEAD(flxInterface, interfaces); +}; - guint n_ipv6_addrs, n_ipv4_addrs; +struct _flxInterface { + FLX_LLIST_FIELDS(flxInterface, interface); + FLX_LLIST_FIELDS(flxInterface, by_hardware); + flxInterfaceMonitor *monitor; - flxInterfaceAddress *addresses; - flxInterface *next, *prev; + flxHwInterface *hardware; + guchar protocol; + gboolean announcing; + + flxCache *cache; + flxPacketScheduler *scheduler; + + FLX_LLIST_HEAD(flxInterfaceAddress, addresses); + FLX_LLIST_HEAD(flxAnnouncement, announcements); }; struct _flxInterfaceAddress { + FLX_LLIST_FIELDS(flxInterfaceAddress, address); + flxInterfaceMonitor *monitor; + guchar flags; guchar scope; flxAddress address; - flxInterface *interface; - flxInterfaceAddress *next, *prev; - gint rr_id; + flxInterface *interface; }; flxInterfaceMonitor *flx_interface_monitor_new(flxServer *server); void flx_interface_monitor_free(flxInterfaceMonitor *m); -const flxInterface* flx_interface_monitor_get_interface(flxInterfaceMonitor *m, gint index); -const flxInterface* flx_interface_monitor_get_first(flxInterfaceMonitor *m); +flxInterface* flx_interface_monitor_get_interface(flxInterfaceMonitor *m, gint index, guchar protocol); +flxHwInterface* flx_interface_monitor_get_hw_interface(flxInterfaceMonitor *m, gint index); + +void flx_interface_send_packet(flxInterface *i, flxDnsPacket *p); + +void flx_interface_post_query(flxInterface *i, flxKey *k, gboolean immediately); +void flx_interface_post_response(flxInterface *i, flxRecord *rr, gboolean immediately); -int flx_interface_is_relevant(flxInterface *i); -int flx_address_is_relevant(flxInterfaceAddress *a); +void flx_dump_caches(flxInterfaceMonitor *m, FILE *f); + +gboolean flx_interface_relevant(flxInterface *i); +gboolean flx_interface_address_relevant(flxInterfaceAddress *a); + +gboolean flx_interface_match(flxInterface *i, gint index, guchar protocol); + +typedef void (*flxInterfaceMonitorWalkCallback)(flxInterfaceMonitor *m, flxInterface *i, gpointer userdata); +void flx_interface_monitor_walk(flxInterfaceMonitor *m, gint index, guchar protocol, flxInterfaceMonitorWalkCallback callback, gpointer userdata); + #endif