]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: add DefaultRouteOnDevice= setting in [Network] section
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 14 May 2019 07:43:14 +0000 (16:43 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 15 May 2019 03:44:30 +0000 (12:44 +0900)
When enabled, then default route bound to the interface will be created.
This is useful when adding routes on point-to-point interfaces.

Closes #788.

man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/network/networkd-route.c
src/network/networkd-route.h
test/fuzz/fuzz-network-parser/directives.network

index 2ce7c7096e4e36cf22671bd6c6dc8568f0780ebc..dd0535a06ee1b5471d751d2c16436ae60e201439 100644 (file)
             </para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>DefaultRouteOnDevice=</varname></term>
+          <listitem>
+            <para>Takes a boolean. If set to true, sets up the default route bound to the interface.
+            Defaults to false. This is useful when creating routes on point-to-point interfaces.
+            This is equivalent to e.g. the following.
+            <programlisting>ip route add default dev veth99</programlisting></para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>IPv6Token=</varname></term>
           <listitem>
index f87d7def44c7ba28735c85eba05a4e89bb431b3c..3c6b5ac100410714a2f6d37055f84d3bda802680 100644 (file)
@@ -53,6 +53,7 @@ Network.DHCP,                           config_parse_dhcp,
 Network.DHCPServer,                     config_parse_bool,                               0,                             offsetof(Network, dhcp_server)
 Network.LinkLocalAddressing,            config_parse_link_local_address_family_boolean,  0,                             offsetof(Network, link_local)
 Network.IPv4LLRoute,                    config_parse_bool,                               0,                             offsetof(Network, ipv4ll_route)
+Network.DefaultRouteOnDevice,           config_parse_bool,                               0,                             offsetof(Network, default_route_on_device)
 Network.IPv6Token,                      config_parse_ipv6token,                          0,                             offsetof(Network, ipv6_token)
 Network.LLDP,                           config_parse_lldp_mode,                          0,                             offsetof(Network, lldp_mode)
 Network.EmitLLDP,                       config_parse_lldp_emit,                          0,                             offsetof(Network, lldp_emit)
index 56a45379c164936a4c8c6c6e205c0e1c256b9476..755cd604dcafa50ab80b59f41aac7a4a6c04aa35 100644 (file)
@@ -454,6 +454,11 @@ int network_load_one(Manager *manager, const char *filename) {
         if (r < 0)
                 log_warning_errno(r, "%s: Failed to add IPv4LL route, ignoring: %m", network->filename);
 
+        r = network_add_default_route_on_device(network);
+        if (r < 0)
+                log_warning_errno(r, "%s: Failed to add default route on device, ignoring: %m",
+                                  network->filename);
+
         r = ordered_hashmap_ensure_allocated(&manager->networks, &string_hash_ops);
         if (r < 0)
                 return r;
index d00062fe5999b55feb9f0d7bdab4cd9461b18908..22c7dc5afd71594c8e1e6801dcb245f6b96ae84b 100644 (file)
@@ -151,6 +151,8 @@ struct Network {
         AddressFamilyBoolean link_local;
         bool ipv4ll_route;
 
+        bool default_route_on_device;
+
         /* IPv6 prefix delegation support */
         RADVPrefixDelegation router_prefix_delegation;
         usec_t router_lifetime_usec;
index 179eeac017b9a4f5ce905510c36bd7ef3dc8e149..24ef5b46bc728e3c393f4bfa4de5cc30f17312f1 100644 (file)
@@ -712,6 +712,30 @@ int network_add_ipv4ll_route(Network *network) {
         return 0;
 }
 
+int network_add_default_route_on_device(Network *network) {
+        _cleanup_(route_free_or_set_invalidp) Route *n = NULL;
+        int r;
+
+        assert(network);
+
+        if (!network->default_route_on_device)
+                return 0;
+
+        /* DefaultRouteOnDevice= is in [Network] section. */
+        r = route_new_static(network, NULL, 0, &n);
+        if (r < 0)
+                return r;
+
+        r = in_addr_from_string(AF_INET, "169.254.0.0", &n->dst);
+        if (r < 0)
+                return r;
+
+        n->family = AF_INET;
+
+        TAKE_PTR(n);
+        return 0;
+}
+
 int config_parse_gateway(
                 const char *unit,
                 const char *filename,
index 892da25bd5678c1db4e3cf2a3b6d86464eec87a9..4643f7785478cd265ffabeb9e376ff3fa77968c6 100644 (file)
@@ -62,6 +62,7 @@ int route_section_verify(Route *route, Network *network);
 DEFINE_NETWORK_SECTION_FUNCTIONS(Route, route_free);
 
 int network_add_ipv4ll_route(Network *network);
+int network_add_default_route_on_device(Network *network);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_gateway);
 CONFIG_PARSER_PROTOTYPE(config_parse_preferred_src);
index 06813c29fe33095f36325c6cbdd085ca3790d11b..ef29c7951f3c1a24ecfe311d74c44b308e00bc76 100644 (file)
@@ -89,6 +89,7 @@ IPMasquerade=
 ProxyARP=
 PrimarySlave=
 IPv4LLRoute=
+DefaultRouteOnDevice=
 Address=
 IPv6ProxyNDPAddress=
 IPv6AcceptRA=