4 static void remove_announcement(flxServer *s, flxAnnouncement *a) {
8 flx_time_event_queue_remove(s->time_event_queue, a->time_event);
10 FLX_LLIST_REMOVE(flxAnnouncement, by_interface, a->interface->announcements, a);
11 FLX_LLIST_REMOVE(flxAnnouncement, by_entry, a->entry->announcements, a);
16 static void elapse_announce(flxTimeEvent *e, void *userdata) {
17 flxAnnouncement *a = userdata;
24 if (a->n_announced >= 3) {
25 g_message("Enough announcements for record [%s]", t = flx_record_to_string(a->entry->record));
27 remove_announcement(a->server, a);
31 flx_interface_post_response(a->interface, a->entry->record);
34 g_message("Announcement #%i on interface %s.%i for entry [%s]", a->n_announced, a->interface->hardware->name, a->interface->protocol, t = flx_record_to_string(a->entry->record));
37 flx_elapse_time(&tv, 1000, 100);
38 flx_time_event_queue_update(a->server->time_event_queue, a->time_event, &tv);
41 static void new_announcement(flxServer *s, flxInterface *i, flxServerEntry *e) {
50 if (!flx_interface_match(i, e->interface, e->protocol) || !flx_interface_relevant(i))
53 /* We don't want duplicates */
54 for (a = e->announcements; a; a = a->by_entry_next)
55 if (a->interface == i)
58 g_message("New announcement on interface %s.%i for entry [%s]", i->hardware->name, i->protocol, t = flx_record_to_string(e->record));
61 flx_interface_post_response(i, e->record);
63 a = g_new(flxAnnouncement, 1);
69 FLX_LLIST_PREPEND(flxAnnouncement, by_interface, i->announcements, a);
70 FLX_LLIST_PREPEND(flxAnnouncement, by_entry, e->announcements, a);
72 flx_elapse_time(&tv, 1000, 100);
73 a->time_event = flx_time_event_queue_add(s->time_event_queue, &tv, elapse_announce, a);
76 void flx_announce_interface(flxServer *s, flxInterface *i) {
82 if (!flx_interface_relevant(i))
85 for (e = s->entries; e; e = e->entry_next)
86 new_announcement(s, i, e);
89 void flx_announce_entry(flxServer *s, flxServerEntry *e) {
93 if (e->interface > 0) {
95 if (e->protocol != AF_UNSPEC) {
98 if ((i = flx_interface_monitor_get_interface(s->monitor, e->interface, e->protocol)))
99 new_announcement(s, i, e);
103 if ((hw = flx_interface_monitor_get_hw_interface(s->monitor, e->interface))) {
106 for (i = hw->interfaces; i; i = i->by_hardware_next)
107 new_announcement(s, i, e);
113 for (i = s->monitor->interfaces; i; i = i->interface_next)
114 new_announcement(s, i, e);
118 static flxRecord *make_goodbye_record(flxRecord *r) {
123 g_message("Preparing goodbye for record [%s]", t = flx_record_to_string(r));
126 return flx_record_new(r->key, r->data, r->size, 0);
129 void flx_goodbye_interface(flxServer *s, flxInterface *i, gboolean goodbye) {
133 while (i->announcements)
134 remove_announcement(s, i->announcements);
136 if (goodbye && flx_interface_relevant(i)) {
139 for (e = s->entries; e; e = e->entry_next)
140 if (flx_interface_match(i, e->interface, e->protocol)) {
141 flxRecord *g = make_goodbye_record(e->record);
142 flx_interface_post_response(i, g);
148 void flx_goodbye_entry(flxServer *s, flxServerEntry *e, gboolean goodbye) {
152 while (e->announcements)
153 remove_announcement(s, e->announcements);
156 flxRecord *g = make_goodbye_record(e->record);
157 flx_server_post_response(s, e->interface, e->protocol, g);
162 void flx_goodbye_all(flxServer *s, gboolean goodbye) {
167 for (e = s->entries; e; e = e->entry_next)
168 flx_goodbye_entry(s, e, goodbye);