summaryrefslogtreecommitdiffstats
path: root/avahi-core/server.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-05-23 16:15:12 +0000
committerLennart Poettering <lennart@poettering.net>2005-05-23 16:15:12 +0000
commite1f934bbe96fd8e7f3f5212b783c0d3a434d4789 (patch)
treec451f719afdf2cc190304277b8dd1cc441059894 /avahi-core/server.c
parent5d67f2aefcdb84d2938fdc522d1f906ca6616e3d (diff)
* add the first bits of a mDNS reflector
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@90 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/server.c')
-rw-r--r--avahi-core/server.c53
1 files changed, 52 insertions, 1 deletions
diff --git a/avahi-core/server.c b/avahi-core/server.c
index fe2c5f8..e95fcca 100644
--- a/avahi-core/server.c
+++ b/avahi-core/server.c
@@ -465,6 +465,52 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP
avahi_record_list_flush(s->record_list);
}
+
+static void reflect_response(AvahiServer *s, AvahiInterface *i, AvahiRecord *r, gboolean flush_cache) {
+ AvahiInterface *j;
+
+ g_assert(s);
+ g_assert(i);
+ g_assert(r);
+
+ if (!s->config.enable_reflector)
+ return;
+
+ for (j = s->monitor->interfaces; j; j = j->interface_next)
+ if (j != i)
+ avahi_interface_post_response(j, r, flush_cache, NULL, TRUE);
+}
+
+static void reflect_query(AvahiServer *s, AvahiInterface *i, AvahiKey *k) {
+ AvahiInterface *j;
+
+ g_assert(s);
+ g_assert(i);
+ g_assert(k);
+
+ if (!s->config.enable_reflector)
+ return;
+
+ for (j = s->monitor->interfaces; j; j = j->interface_next)
+ if (j != i)
+ avahi_interface_post_query(j, k, TRUE);
+}
+
+static void reflect_probe(AvahiServer *s, AvahiInterface *i, AvahiRecord *r) {
+ AvahiInterface *j;
+
+ g_assert(s);
+ g_assert(i);
+ g_assert(r);
+
+ if (!s->config.enable_reflector)
+ return;
+
+ for (j = s->monitor->interfaces; j; j = j->interface_next)
+ if (j != i)
+ avahi_interface_post_probe(j, r, TRUE);
+}
+
static void handle_query(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, const AvahiAddress *a, guint16 port, gboolean legacy_unicast) {
guint n;
@@ -487,6 +533,7 @@ static void handle_query(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, c
goto fail;
}
+ reflect_query(s, i, key);
avahi_query_scheduler_incoming(i->query_scheduler, key);
avahi_server_prepare_matching_responses(s, i, key, unicast_response);
avahi_key_unref(key);
@@ -520,8 +567,10 @@ static void handle_query(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, c
goto fail;
}
- if (record->key->type != AVAHI_DNS_TYPE_ANY)
+ if (record->key->type != AVAHI_DNS_TYPE_ANY) {
+ reflect_probe(s, i, record);
incoming_probe(s, record, i);
+ }
avahi_record_unref(record);
}
@@ -563,6 +612,7 @@ static void handle_response(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i
/* g_free(txt); */
if (handle_conflict(s, i, record, cache_flush, a)) {
+ reflect_response(s, i, record, cache_flush);
avahi_cache_update(i->cache, record, cache_flush, a);
avahi_response_scheduler_incoming(i->response_scheduler, record, cache_flush);
}
@@ -1511,6 +1561,7 @@ AvahiServerConfig* avahi_server_config_init(AvahiServerConfig *c) {
c->check_response_ttl = TRUE;
c->announce_domain = TRUE;
c->use_iff_running = FALSE;
+ c->enable_reflector = FALSE;
return c;
}