resolved-link.c revision 8a516214c4412e8a40544bd725a6d499a30cbbbf
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering This file is part of systemd.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Copyright 2014 Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is free software; you can redistribute it and/or modify it
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering under the terms of the GNU Lesser General Public License as published by
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (at your option) any later version.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is distributed in the hope that it will be useful, but
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Lesser General Public License for more details.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering You should have received a copy of the GNU Lesser General Public License
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringint link_new(Manager *m, Link **ret, int ifindex) {
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt r = hashmap_ensure_allocated(&m->links, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = hashmap_put(m->links, INT_TO_PTR(ifindex), l);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering dns_search_domain_unlink_all(l->search_domains);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering hashmap_remove(l->manager->links, INT_TO_PTR(l->ifindex));
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poettering set_free_free(l->dnssec_negative_trust_anchors);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poetteringstatic void link_allocate_scopes(Link *l) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = dns_scope_new(l->manager, &l->unicast_scope, l, DNS_PROTOCOL_DNS, AF_UNSPEC);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to allocate DNS scope: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering l->unicast_scope = dns_scope_free(l->unicast_scope);
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->llmnr_support != RESOLVE_SUPPORT_NO &&
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->manager->llmnr_support != RESOLVE_SUPPORT_NO) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = dns_scope_new(l->manager, &l->llmnr_ipv4_scope, l, DNS_PROTOCOL_LLMNR, AF_INET);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to allocate LLMNR IPv4 scope: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering l->llmnr_ipv4_scope = dns_scope_free(l->llmnr_ipv4_scope);
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->llmnr_support != RESOLVE_SUPPORT_NO &&
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->manager->llmnr_support != RESOLVE_SUPPORT_NO &&
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = dns_scope_new(l->manager, &l->llmnr_ipv6_scope, l, DNS_PROTOCOL_LLMNR, AF_INET6);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to allocate LLMNR IPv6 scope: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering l->llmnr_ipv6_scope = dns_scope_free(l->llmnr_ipv6_scope);
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->manager->mdns_support != RESOLVE_SUPPORT_NO) {
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack r = dns_scope_new(l->manager, &l->mdns_ipv4_scope, l, DNS_PROTOCOL_MDNS, AF_INET);
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack log_warning_errno(r, "Failed to allocate mDNS IPv4 scope: %m");
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack l->mdns_ipv4_scope = dns_scope_free(l->mdns_ipv4_scope);
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->manager->mdns_support != RESOLVE_SUPPORT_NO) {
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack r = dns_scope_new(l->manager, &l->mdns_ipv6_scope, l, DNS_PROTOCOL_MDNS, AF_INET6);
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack log_warning_errno(r, "Failed to allocate mDNS IPv6 scope: %m");
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack l->mdns_ipv6_scope = dns_scope_free(l->mdns_ipv6_scope);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringvoid link_add_rrs(Link *l, bool force_remove) {
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersenint link_update_rtnl(Link *l, sd_netlink_message *m) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering const char *n = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_rtnl_message_link_get_flags(m, &l->flags);
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen sd_netlink_message_read_u32(m, IFLA_MTU, &l->mtu);
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen if (sd_netlink_message_read_string(m, IFLA_IFNAME, &n) >= 0) {
6f4dedb250f2d607eceefaa491f338becbeee7c0Tom Gundersen _cleanup_strv_free_ char **nameservers = NULL;
d6731e4c7964ee2860d4f5abdb0b52acd7a66960Tom Gundersen r = sd_network_link_get_dns(l->ifindex, &nameservers);
6f4dedb250f2d607eceefaa491f338becbeee7c0Tom Gundersen r = in_addr_from_string_auto(*nameserver, &family, &a);
4b95f1798f22c1bb75295f448188560cb6ec9eceLennart Poettering s = dns_server_find(l->dns_servers, family, &a);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a);
4b95f1798f22c1bb75295f448188560cb6ec9eceLennart Poettering dns_server_unlink_marked(l->dns_servers);
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poetteringstatic int link_update_llmnr_support(Link *l) {
d6731e4c7964ee2860d4f5abdb0b52acd7a66960Tom Gundersen r = sd_network_link_get_llmnr(l->ifindex, &b);
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering l->llmnr_support = resolve_support_from_string(b);
aaa297d4e5401fd4466632555432774863457f1dLennart Poetteringstatic int link_update_mdns_support(Link *l) {
aaa297d4e5401fd4466632555432774863457f1dLennart Poettering r = sd_network_link_get_mdns(l->ifindex, &b);
aaa297d4e5401fd4466632555432774863457f1dLennart Poettering l->mdns_support = resolve_support_from_string(b);
ad6c04756115809d615dede330213d73edf732a8Lennart Poetteringstatic int link_update_dnssec_mode(Link *l) {
ad6c04756115809d615dede330213d73edf732a8Lennart Poettering r = sd_network_link_get_dnssec(l->ifindex, &m);
ad6c04756115809d615dede330213d73edf732a8Lennart Poettering l->dnssec_mode = dnssec_mode_from_string(m);
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poetteringstatic int link_update_dnssec_negative_trust_anchors(Link *l) {
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poettering r = sd_network_link_get_dnssec_negative_trust_anchors(l->ifindex, &ntas);
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poettering set_free_free(l->dnssec_negative_trust_anchors);
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poettering l->dnssec_negative_trust_anchors = set_free_free(l->dnssec_negative_trust_anchors);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poetteringstatic int link_update_search_domains(Link *l) {
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering _cleanup_strv_free_ char **domains = NULL;
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering r = sd_network_link_get_domains(l->ifindex, &domains);
1ade96e980d3c0855a04140f4728b3ffd429bbeaLennart Poettering /* networkd knows nothing about this interface, and that's fine. */
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering dns_search_domain_mark_all(l->search_domains);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering r = dns_search_domain_find(l->search_domains, *i, &d);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering dns_search_domain_move_back_and_unmark(d);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering r = dns_search_domain_new(l->manager, NULL, DNS_SEARCH_DOMAIN_LINK, l, *i);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering dns_search_domain_unlink_marked(l->search_domains);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering dns_search_domain_unlink_all(l->search_domains);
125ae29d1bc3a6362c9bb1acddbe09fe1b274cfcLennart Poettering log_warning_errno(r, "Failed to read DNS servers for interface %s, ignoring: %m", l->name);
125ae29d1bc3a6362c9bb1acddbe09fe1b274cfcLennart Poettering log_warning_errno(r, "Failed to read LLMNR support for interface %s, ignoring: %m", l->name);
125ae29d1bc3a6362c9bb1acddbe09fe1b274cfcLennart Poettering log_warning_errno(r, "Failed to read mDNS support for interface %s, ignoring: %m", l->name);
ad6c04756115809d615dede330213d73edf732a8Lennart Poettering log_warning_errno(r, "Failed to read DNSSEC mode for interface %s, ignoring: %m", l->name);
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poettering r = link_update_dnssec_negative_trust_anchors(l);
8a516214c4412e8a40544bd725a6d499a30cbbbfLennart Poettering log_warning_errno(r, "Failed to read DNSSEC negative trust anchors for interface %s, ignoring: %m", l->name);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering log_warning_errno(r, "Failed to read search domains for interface %s, ignoring: %m", l->name);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering /* A link is relevant if it isn't a loopback or pointopoint
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * device, has a link beat, can do multicast and has at least
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * one relevant IP address */
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (l->flags & (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_DORMANT))
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if ((l->flags & (IFF_UP|IFF_LOWER_UP|IFF_MULTICAST)) != (IFF_UP|IFF_LOWER_UP|IFF_MULTICAST))
d6731e4c7964ee2860d4f5abdb0b52acd7a66960Tom Gundersen sd_network_link_get_operational_state(l->ifindex, &state);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (state && !STR_IN_SET(state, "unknown", "degraded", "routable"))
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (a->family == family && link_address_relevant(a))
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart PoetteringLinkAddress *link_find_address(Link *l, int family, const union in_addr_union *in_addr) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (a->family == family && in_addr_equal(family, &a->in_addr, in_addr))
2c27fbca2d88214bd305272308a370a962818f1eLennart PoetteringDnsServer* link_set_dns_server(Link *l, DnsServer *s) {
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering in_addr_to_string(s->family, &s->address, &ip);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_info("Switching to DNS server %s for interface %s.", strna(ip), l->name);
0eac462399c8e87bcce252cf058eba9f2678f2bdLennart Poettering l->current_dns_server = dns_server_ref(s);
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering dns_cache_flush(&l->unicast_scope->cache);
0eac462399c8e87bcce252cf058eba9f2678f2bdLennart Poettering /* Change to the next one, but make sure to follow the linked
0eac462399c8e87bcce252cf058eba9f2678f2bdLennart Poettering * list only if this server is actually still linked. */
0eac462399c8e87bcce252cf058eba9f2678f2bdLennart Poettering if (l->current_dns_server->linked && l->current_dns_server->servers_next) {
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering link_set_dns_server(l, l->current_dns_server->servers_next);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poetteringint link_address_new(Link *l, LinkAddress **ret, int family, const union in_addr_union *in_addr) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering LIST_PREPEND(addresses, l->addresses, a);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringLinkAddress *link_address_free(LinkAddress *a) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering LIST_REMOVE(addresses, a->link->addresses, a);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (a->family == AF_INET && a->link->llmnr_ipv4_scope)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv4_scope->zone, a->llmnr_address_rr);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering else if (a->family == AF_INET6 && a->link->llmnr_ipv6_scope)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv6_scope->zone, a->llmnr_address_rr);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (a->family == AF_INET && a->link->llmnr_ipv4_scope)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv4_scope->zone, a->llmnr_ptr_rr);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering else if (a->family == AF_INET6 && a->link->llmnr_ipv6_scope)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv6_scope->zone, a->llmnr_ptr_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dns_resource_record_unref(a->llmnr_address_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dns_resource_record_unref(a->llmnr_ptr_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringvoid link_address_add_rrs(LinkAddress *a, bool force_remove) {
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering a->link->llmnr_support == RESOLVE_SUPPORT_YES &&
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering a->link->manager->llmnr_support == RESOLVE_SUPPORT_YES) {
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering if (!a->link->manager->llmnr_host_ipv4_key) {
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering a->link->manager->llmnr_host_ipv4_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, a->link->manager->llmnr_hostname);
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering if (!a->link->manager->llmnr_host_ipv4_key) {
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering a->llmnr_address_rr = dns_resource_record_new(a->link->manager->llmnr_host_ipv4_key);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_address_rr->a.in_addr = a->in_addr.in;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_address_rr->ttl = LLMNR_DEFAULT_TTL;
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering r = dns_resource_record_new_reverse(&a->llmnr_ptr_rr, a->family, &a->in_addr, a->link->manager->llmnr_hostname);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_ptr_rr->ttl = LLMNR_DEFAULT_TTL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = dns_zone_put(&a->link->llmnr_ipv4_scope->zone, a->link->llmnr_ipv4_scope, a->llmnr_address_rr, true);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to add A record to LLMNR zone: %m");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = dns_zone_put(&a->link->llmnr_ipv4_scope->zone, a->link->llmnr_ipv4_scope, a->llmnr_ptr_rr, false);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to add IPv6 PTR record to LLMNR zone: %m");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv4_scope->zone, a->llmnr_address_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_address_rr = dns_resource_record_unref(a->llmnr_address_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv4_scope->zone, a->llmnr_ptr_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_ptr_rr = dns_resource_record_unref(a->llmnr_ptr_rr);
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering a->link->llmnr_support == RESOLVE_SUPPORT_YES &&
af49ca27ffd790d78dbbb465b978266dfd5c93daLennart Poettering a->link->manager->llmnr_support == RESOLVE_SUPPORT_YES) {
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering if (!a->link->manager->llmnr_host_ipv6_key) {
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering a->link->manager->llmnr_host_ipv6_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, a->link->manager->llmnr_hostname);
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering if (!a->link->manager->llmnr_host_ipv6_key) {
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering a->llmnr_address_rr = dns_resource_record_new(a->link->manager->llmnr_host_ipv6_key);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_address_rr->aaaa.in6_addr = a->in_addr.in6;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_address_rr->ttl = LLMNR_DEFAULT_TTL;
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering r = dns_resource_record_new_reverse(&a->llmnr_ptr_rr, a->family, &a->in_addr, a->link->manager->llmnr_hostname);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_ptr_rr->ttl = LLMNR_DEFAULT_TTL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = dns_zone_put(&a->link->llmnr_ipv6_scope->zone, a->link->llmnr_ipv6_scope, a->llmnr_address_rr, true);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to add AAAA record to LLMNR zone: %m");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = dns_zone_put(&a->link->llmnr_ipv6_scope->zone, a->link->llmnr_ipv6_scope, a->llmnr_ptr_rr, false);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_warning_errno(r, "Failed to add IPv6 PTR record to LLMNR zone: %m");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv6_scope->zone, a->llmnr_address_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_address_rr = dns_resource_record_unref(a->llmnr_address_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dns_zone_remove_rr(&a->link->llmnr_ipv6_scope->zone, a->llmnr_ptr_rr);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering a->llmnr_ptr_rr = dns_resource_record_unref(a->llmnr_ptr_rr);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_debug_errno(r, "Failed to update address RRs: %m");
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersenint link_address_update_rtnl(LinkAddress *a, sd_netlink_message *m) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_rtnl_message_addr_get_flags(m, &a->flags);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering sd_rtnl_message_addr_get_scope(m, &a->scope);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringbool link_address_relevant(LinkAddress *a) {
7b85d72f824cdf34554b349712b6b8e39095dbd4Lennart Poettering if (a->flags & (IFA_F_DEPRECATED|IFA_F_TENTATIVE))