]> git.ipfire.org Git - people/ms/network.git/commitdiff
bird: Write IPv6 router advertisement configuration
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 31 Mar 2019 12:14:55 +0000 (14:14 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 31 Mar 2019 12:14:55 +0000 (14:14 +0200)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/functions/functions.bird

index c6fea321c6743e8795135c8541aec133b718bb0b..950bb787a27442409d535e5f934766f7a6a6cd09 100644 (file)
@@ -84,6 +84,9 @@ bird_generate_config() {
                print "}"
                print
        done >> ${BIRD_CONF}
+
+       # Write IPv6 Router Advertisement configuration
+       __bird_ipv6_radv >> ${BIRD_CONF}
 }
 
 __bird_static_routes() {
@@ -122,3 +125,89 @@ __bird_static_routes() {
                esac
        done < ${NETWORK_CONFIG_ROUTES}
 }
+
+__bird_ipv6_radv() {
+       print "protocol radv {"
+
+       local zone
+       for zone in $(zones_get_local); do
+               log DEBUG "Writing bird radv configuration for ${zone}"
+
+               # Skip if there is no prefix or prefix is link-local.
+               local addr="$(db_get "${zone}/ipv6/local-ip-address")"
+               if [ -z "${addr}" ] || [ "${addr:0:5}" = "fe80:" ]; then
+                       continue
+               fi
+
+               # Check if the subnet is configured by the DHCP server.
+               local dhcp="false"
+               local prefix="$(ipv6_get_network "${addr}")"
+               if isset prefix && dhcpd_subnet_match ipv6 "${prefix}"; then
+                       dhcp="true"
+               fi
+
+               print " interface \"${zone}\" {"
+                       # Failover to other routers within 10s
+                       print "         max ra interval 10;"
+
+                       # Tell clients we are running DHCP
+                       if enabled dhcp; then
+                               print "         managed yes;"
+                               print "         other config yes;"
+                       fi
+
+                       if device_exists "${zone}"; then
+                               # Announce link MTU
+                               local mtu="$(device_get_mtu "${zone}")"
+                               print "         link mtu ${mtu};"
+                       fi
+
+                       print # empty line
+
+                       # Announce all prefixes
+                       print "         prefix ::/0 {"
+
+                       if enabled dhcp; then
+                               print "                 autonomous off;"
+                       fi
+
+                       print "         };"
+               print " };\n"
+       done
+
+       # Advertise any DNS servers
+       if enabled DNS_ADVERTISE_SERVERS; then
+               # Get a list of all IPv6 name servers
+               local servers=()
+               local server
+               for server in $(dns_server_list_sorted); do
+                       # Skip any non-IPv6 servers
+                       ipv6_is_valid "${server}" || continue
+
+                       servers+=( "${server}" )
+               done
+
+               if isset servers; then
+                       print " rdnss {"
+
+                       local server
+                       for server in ${servers}; do
+                               print "         ns ${server};"
+                       done
+
+                       print " };"
+               fi
+       fi
+
+       # DNS Search Domain
+       print " dnssl {"
+
+       local domain
+       for domain in $(dns_get_search_domains); do
+               print "         domain \"${domain}\";"
+       done
+
+       print " };"
+
+       print "}\n"
+}