]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd,resolved: add a per-interface mdns configuration option
authorLennart Poettering <lennart@poettering.net>
Tue, 5 Jan 2016 16:32:25 +0000 (17:32 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 5 Jan 2016 16:41:41 +0000 (17:41 +0100)
man/systemd.network.xml
src/libsystemd/sd-network/sd-network.c
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/resolve/resolved-link.c
src/systemd/sd-network.h

index 5ad03f75e64f49cc45c7019f1a941bf9e39cd13a..6091f2fdf5daaa83ccd01048d90de1349d429ee5 100644 (file)
         <varlistentry>
           <term><varname>LLMNR=</varname></term>
           <listitem>
-            <para>A boolean or <literal>resolve</literal>. When true, enables
-            Link-Local Multicast Name Resolution on the link. When set to
-            <literal>resolve</literal>, only resolution is enabled, but not
-            announcement. Defaults to true.</para>
+            <para>A boolean or <literal>resolve</literal>. When true,
+            enables <ulink
+            url="https://tools.ietf.org/html/rfc4795">Link-Local
+            Multicast Name Resolution</ulink> on the link. When set to
+            <literal>resolve</literal>, only resolution is enabled,
+            but not host registration and announcement. Defaults to
+            true. This setting is read by
+            <citerefentry><refentrytitle>systemd-resolved.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>MulticastDNS=</varname></term>
+          <listitem>
+            <para>A boolean or <literal>resolve</literal>. When true,
+            enables <ulink
+            url="https://tools.ietf.org/html/rfc6762">Multicast
+            DNS</ulink> support on the link. When set to
+            <literal>resolve</literal>, only resolution is enabled,
+            but not host or service registration and
+            announcement. Defaults to false. This setting is read by
+            <citerefentry><refentrytitle>systemd-resolved.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
@@ -1013,7 +1030,8 @@ DHCP=yes
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-networkd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.link</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-resolved.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index d01c4ae8e299e37be67bf86b63887e2ff791effc..a63ff46c685ddd7e3f11aca722a9012b30e13fdb 100644 (file)
@@ -139,6 +139,10 @@ _public_ int sd_network_link_get_llmnr(int ifindex, char **llmnr) {
         return network_link_get_string(ifindex, "LLMNR", llmnr);
 }
 
+_public_ int sd_network_link_get_mdns(int ifindex, char **mdns) {
+        return network_link_get_string(ifindex, "MDNS", mdns);
+}
+
 _public_ int sd_network_link_get_lldp(int ifindex, char **lldp) {
         _cleanup_free_ char *s = NULL, *p = NULL;
         size_t size;
index 9811526c6d37e21b586aae78868925e7e3d0a693..2013a8eae784868554fcb50e7ad6a4e9628d5392 100644 (file)
@@ -2868,6 +2868,8 @@ int link_save(Link *link) {
 
                 fprintf(f, "LLMNR=%s\n",
                         resolve_support_to_string(link->network->llmnr));
+                fprintf(f, "MDNS=%s\n",
+                        resolve_support_to_string(link->network->mdns));
 
                 fputs("ADDRESSES=", f);
                 space = false;
index 5c962e57094bc07a2fbabdfdd34c8a12fb76445c..c66ca3c1ccd693458f227721abe1652522af4a1b 100644 (file)
@@ -46,6 +46,7 @@ Network.Gateway,                        config_parse_gateway,
 Network.Domains,                        config_parse_domains,                           0,                             offsetof(Network, domains)
 Network.DNS,                            config_parse_strv,                              0,                             offsetof(Network, dns)
 Network.LLMNR,                          config_parse_resolve_support,                   0,                             offsetof(Network, llmnr)
+Network.MulticastDNS,                   config_parse_resolve_support,                   0,                             offsetof(Network, mdns)
 Network.NTP,                            config_parse_strv,                              0,                             offsetof(Network, ntp)
 Network.IPForward,                      config_parse_address_family_boolean_with_kernel,0,                             offsetof(Network, ip_forward)
 Network.IPMasquerade,                   config_parse_bool,                              0,                             offsetof(Network, ip_masquerade)
index 29723a852fb6d32a951a14803518f81a2cf29a16..7544280a7a22c13f6e4c7948ffdf52472612a01b 100644 (file)
@@ -121,6 +121,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->unicast_flood = true;
 
         network->llmnr = RESOLVE_SUPPORT_YES;
+        network->mdns = RESOLVE_SUPPORT_NO;
 
         network->link_local = ADDRESS_FAMILY_IPV6;
 
index 297823da24446c34f4d91ba43da8e1891e4ba1e3..91e90e6d741c7b90f7c523f3d4481a9a2d168c7b 100644 (file)
@@ -145,6 +145,7 @@ struct Network {
         char **domains, **dns, **ntp, **bind_carrier;
 
         ResolveSupport llmnr;
+        ResolveSupport mdns;
 
         LIST_FIELDS(Network, networks);
 };
index 6202ddeca1def8a406dccba417ebe87cdf1942ad..a1f28633bae4366258daccf2f580cfb29c393eb2 100644 (file)
@@ -246,6 +246,33 @@ clear:
         return r;
 }
 
+static int link_update_mdns_support(Link *l) {
+        _cleanup_free_ char *b = NULL;
+        int r;
+
+        assert(l);
+
+        r = sd_network_link_get_mdns(l->ifindex, &b);
+        if (r == -ENODATA) {
+                r = 0;
+                goto clear;
+        }
+        if (r < 0)
+                goto clear;
+
+        l->mdns_support = resolve_support_from_string(b);
+        if (l->mdns_support < 0) {
+                r = -EINVAL;
+                goto clear;
+        }
+
+        return 0;
+
+clear:
+        l->mdns_support = RESOLVE_SUPPORT_NO;
+        return r;
+}
+
 static int link_update_search_domains(Link *l) {
         _cleanup_strv_free_ char **domains = NULL;
         char **i;
@@ -295,6 +322,7 @@ int link_update_monitor(Link *l) {
 
         link_update_dns_servers(l);
         link_update_llmnr_support(l);
+        link_update_mdns_support(l);
         link_allocate_scopes(l);
 
         r = link_update_search_domains(l);
index 79b4bf9ea3c07e20be788bd717bf6613ca7b25a2..6765be041babb9f74bdbbb7d209a847b1a462903 100644 (file)
@@ -111,6 +111,13 @@ int sd_network_link_get_ntp(int ifindex, char ***addr);
  */
 int sd_network_link_get_llmnr(int ifindex, char **llmnr);
 
+/* Indicates whether or not MDNS should be enabled for the link
+ * Possible levels of support: yes, no, resolve
+ * Possible return codes:
+ *   -ENODATA: networkd is not aware of the link
+ */
+int sd_network_link_get_mdns(int ifindex, char **mdns);
+
 int sd_network_link_get_lldp(int ifindex, char **lldp);
 
 /* Get the DNS domain names for a given link. */