]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: implement sending goodbye mDNS packet
authorDmitry Rozhkov <dmitry.rozhkov@linux.intel.com>
Fri, 2 Dec 2016 13:56:27 +0000 (15:56 +0200)
committerDmitry Rozhkov <dmitry.rozhkov@linux.intel.com>
Thu, 19 Jan 2017 09:51:21 +0000 (11:51 +0200)
resolved: remove unneeded braces

Signed-off-by: Dmitry Rozhkov <dmitry.rozhkov@linux.intel.com>
src/resolve/resolved-dns-answer.h
src/resolve/resolved-dns-packet.c
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-scope.h
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-link.c

index c0a819873a3e1ad2d958f27a3c343a86d585659e..11d2e25eebd815d6bcc771d4a8e31a8b9399c65f 100644 (file)
@@ -33,10 +33,11 @@ typedef struct DnsAnswerItem DnsAnswerItem;
  * Note that we usually encode the empty DnsAnswer object as a simple NULL. */
 
 typedef enum DnsAnswerFlags {
-        DNS_ANSWER_AUTHENTICATED = 1, /* Item has been authenticated */
-        DNS_ANSWER_CACHEABLE     = 2, /* Item is subject to caching */
-        DNS_ANSWER_SHARED_OWNER  = 4, /* For mDNS: RRset may be owner by multiple peers */
-        DNS_ANSWER_CACHE_FLUSH   = 8, /* For mDNS: sets cache-flush bit in the rrclass of response records */
+        DNS_ANSWER_AUTHENTICATED = 1,  /* Item has been authenticated */
+        DNS_ANSWER_CACHEABLE     = 2,  /* Item is subject to caching */
+        DNS_ANSWER_SHARED_OWNER  = 4,  /* For mDNS: RRset may be owner by multiple peers */
+        DNS_ANSWER_CACHE_FLUSH   = 8,  /* For mDNS: sets cache-flush bit in the rrclass of response records */
+        DNS_ANSWER_GOODBYE       = 16, /* For mDNS: item is subject to disappear */
 } DnsAnswerFlags;
 
 struct DnsAnswerItem {
index 8231c21450b0d1e891172e75a23dfd80cf9223ab..652970284ed666ba09ce75f8e2aa50c0da63557f 100644 (file)
@@ -796,6 +796,7 @@ int dns_packet_truncate_opt(DnsPacket *p) {
 int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAnswerFlags flags, size_t *start, size_t *rdata_start) {
 
         size_t saved_size, rdlength_offset, end, rdlength, rds;
+        uint32_t ttl;
         int r;
 
         assert(p);
@@ -807,7 +808,8 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAns
         if (r < 0)
                 goto fail;
 
-        r = dns_packet_append_uint32(p, rr->ttl, NULL);
+        ttl = flags & DNS_ANSWER_GOODBYE ? 0 : rr->ttl;
+        r = dns_packet_append_uint32(p, ttl, NULL);
         if (r < 0)
                 goto fail;
 
index b47cb7979519a23ed00dafaa8152ed99fd370cbd..750409eebf8bd2233034b5a12b9602a6d7746a34 100644 (file)
@@ -1068,11 +1068,11 @@ static int on_announcement_timeout(sd_event_source *s, usec_t usec, void *userda
 
         scope->announce_event_source = sd_event_source_unref(scope->announce_event_source);
 
-        dns_scope_announce(scope);
+        dns_scope_announce(scope, false);
         return 0;
 }
 
-void dns_scope_announce(DnsScope *scope) {
+void dns_scope_announce(DnsScope *scope, bool goodbye) {
         _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL;
         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
         LinkAddress *a;
@@ -1086,12 +1086,12 @@ void dns_scope_announce(DnsScope *scope) {
 
         answer = dns_answer_new(4);
         LIST_FOREACH(addresses, a, scope->link->addresses) {
-                r = dns_answer_add(answer, a->mdns_address_rr, 0, DNS_ANSWER_CACHE_FLUSH);
+                r = dns_answer_add(answer, a->mdns_address_rr, 0, goodbye ? DNS_ANSWER_GOODBYE : DNS_ANSWER_CACHE_FLUSH);
                 if (r < 0) {
                         log_debug_errno(r, "Failed to add address RR to answer: %m");
                         return;
                 }
-                r = dns_answer_add(answer, a->mdns_ptr_rr, 0, DNS_ANSWER_CACHE_FLUSH);
+                r = dns_answer_add(answer, a->mdns_ptr_rr, 0, goodbye ? DNS_ANSWER_GOODBYE : DNS_ANSWER_CACHE_FLUSH);
                 if (r < 0) {
                         log_debug_errno(r, "Failed to add PTR RR to answer: %m");
                         return;
index 65b61c56aa12a4f7ffbfe0c89009ea0ba146deec..360d86bc2501fdef38671ac25ae605c183a936e7 100644 (file)
@@ -117,4 +117,4 @@ bool dns_scope_network_good(DnsScope *s);
 
 int dns_scope_ifindex(DnsScope *s);
 
-void dns_scope_announce(DnsScope *scope);
+void dns_scope_announce(DnsScope *scope, bool goodbye);
index 672f0e4cb2b03f32cbe116832d44fb89da2b879c..81131df91e0b607e44e6fab2fde4a2eb1bc4dff5 100644 (file)
@@ -363,9 +363,8 @@ void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state) {
         SET_FOREACH_MOVE(z, t->notify_zone_items_done, t->notify_zone_items)
                 dns_zone_item_notify(z);
         SWAP_TWO(t->notify_zone_items, t->notify_zone_items_done);
-        if (t->probing) {
-                dns_scope_announce(t->scope);
-        }
+        if (t->probing)
+                dns_scope_announce(t->scope, false);
 
         SET_FOREACH_MOVE(d, t->notify_transactions_done, t->notify_transactions)
                 dns_transaction_notify(d, t);
index 4d7447b507ed675d83c86dd4266d6cb27ac834d4..7b6e4f8398c5902bb692978d2eaa1790e57fa13b 100644 (file)
@@ -85,6 +85,10 @@ Link *link_free(Link *l) {
         if (!l)
                 return NULL;
 
+        /* Send goodbye messages. */
+        dns_scope_announce(l->mdns_ipv4_scope, true);
+        dns_scope_announce(l->mdns_ipv6_scope, true);
+
         link_flush_settings(l);
 
         while (l->addresses)