]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: nexthop: add OnLink= setting
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 14 Feb 2021 05:49:35 +0000 (14:49 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 20 Feb 2021 20:16:23 +0000 (05:16 +0900)
man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/networkd-nexthop.c
src/network/networkd-nexthop.h
src/network/networkd-route.c
test/fuzz/fuzz-network-parser/directives.network

index 015fcf01f99f5f597863a8fa8cfa2833bb0ca821..4741e8731811a7cba4db24b05f9d92391a03094b 100644 (file)
@@ -1340,6 +1340,15 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
             to <literal>ipv4</literal>.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>OnLink=</varname></term>
+          <listitem>
+            <para>Takes a boolean. If set to true, the kernel does not have to check if the gateway is
+            reachable directly by the current machine (i.e., attached to the local network), so that we
+            can insert the nexthop in the kernel table without it being complained about. Defaults to
+            <literal>no</literal>.</para>
+          </listitem>
+        </varlistentry>
       </variablelist>
   </refsect1>
 
@@ -1361,9 +1370,9 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
           <term><varname>GatewayOnLink=</varname></term>
           <listitem>
             <para>Takes a boolean. If set to true, the kernel does not have to check if the gateway is
-            reachable directly by the current machine (i.e., the kernel does not need to check if the
-            gateway is attached to the local network), so that we can insert the route in the kernel
-            table without it being complained about. Defaults to <literal>no</literal>.</para>
+            reachable directly by the current machine (i.e., attached to the local network), so that we
+            can insert the route in the kernel table without it being complained about. Defaults to
+            <literal>no</literal>.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
index e74a44b2a64697c2340fb3bd5094526788ef07ba..6e70e979891494f3774f5b097319bc6d83fdf6d7 100644 (file)
@@ -189,6 +189,7 @@ Route.NextHop,                               config_parse_route_nexthop,
 NextHop.Id,                                  config_parse_nexthop_id,                                  0,                             0
 NextHop.Gateway,                             config_parse_nexthop_gateway,                             0,                             0
 NextHop.Family,                              config_parse_nexthop_family,                              0,                             0
+NextHop.OnLink,                              config_parse_nexthop_onlink,                              0,                             0
 DHCPv4.ClientIdentifier,                     config_parse_dhcp_client_identifier,                      0,                             offsetof(Network, dhcp_client_identifier)
 DHCPv4.UseDNS,                               config_parse_dhcp_use_dns,                                0,                             0
 DHCPv4.RoutesToDNS,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_routes_to_dns)
index 07842ae6089c91f7692583c3883663050a3b4f5c..f98adf468e9973510cbb61ca157462cb8f82f897 100644 (file)
@@ -47,6 +47,7 @@ static int nexthop_new(NextHop **ret) {
 
         *nexthop = (NextHop) {
                 .family = AF_UNSPEC,
+                .onlink = -1,
         };
 
         *ret = TAKE_PTR(nexthop);
@@ -360,6 +361,12 @@ static int nexthop_configure(const NextHop *nexthop, Link *link) {
                 r = netlink_message_append_in_addr_union(req, NHA_GATEWAY, nexthop->family, &nexthop->gw);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not append NHA_GATEWAY attribute: %m");
+
+                if (nexthop->onlink > 0) {
+                        r = sd_rtnl_message_nexthop_set_flags(req, RTNH_F_ONLINK);
+                        if (r < 0)
+                                return log_link_error_errno(link, r, "Failed to set RTNH_F_ONLINK flag: %m");
+                }
         }
 
         r = netlink_call_async(link->manager->rtnl, NULL, req, nexthop_handler,
@@ -549,6 +556,16 @@ static int nexthop_section_verify(NextHop *nh) {
                 /* When no Gateway= is specified, assume IPv4. */
                 nh->family = AF_INET;
 
+        if (nh->onlink < 0 && in_addr_is_set(nh->family, &nh->gw) &&
+            ordered_hashmap_isempty(nh->network->addresses_by_section)) {
+                /* If no address is configured, in most cases the gateway cannot be reachable.
+                 * TODO: we may need to improve the condition above. */
+                log_warning("%s: Gateway= without static address configured. "
+                            "Enabling OnLink= option.",
+                            nh->section->filename);
+                nh->onlink = true;
+        }
+
         return 0;
 }
 
@@ -722,3 +739,48 @@ int config_parse_nexthop_family(
         TAKE_PTR(n);
         return 0;
 }
+
+int config_parse_nexthop_onlink(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        _cleanup_(nexthop_free_or_set_invalidp) NextHop *n = NULL;
+        Network *network = userdata;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = nexthop_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return log_oom();
+
+        if (isempty(rvalue)) {
+                n->onlink = -1;
+                TAKE_PTR(n);
+                return 0;
+        }
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to parse %s=, ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        n->onlink = r;
+
+        TAKE_PTR(n);
+        return 0;
+}
index 06673d4369dbf95b2d89df591d990231d9b6f6c2..0356e997ecb9cc2a39ffad742abaca61a170b49f 100644 (file)
@@ -27,6 +27,7 @@ typedef struct NextHop {
         uint32_t id;
         int family;
         union in_addr_union gw;
+        int onlink;
 } NextHop;
 
 NextHop *nexthop_free(NextHop *nexthop);
@@ -41,3 +42,4 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
 CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_id);
 CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_gateway);
 CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_family);
+CONFIG_PARSER_PROTOTYPE(config_parse_nexthop_onlink);
index ddfa4d4df7a84b51b7ce57e29211898659a3cda3..aa744d54700ad94db2e922d27b95bbf742753f1f 100644 (file)
@@ -2743,9 +2743,10 @@ static int route_section_verify(Route *route, Network *network) {
         if (route->family == AF_INET6 && route->priority == 0)
                 route->priority = IP6_RT_PRIO_USER;
 
-        if (ordered_hashmap_isempty(network->addresses_by_section) &&
-            in_addr_is_set(route->gw_family, &route->gw) &&
-            route->gateway_onlink < 0) {
+        if (route->gateway_onlink < 0 && in_addr_is_set(route->gw_family, &route->gw) &&
+            ordered_hashmap_isempty(network->addresses_by_section)) {
+                /* If no address is configured, in most cases the gateway cannot be reachable.
+                 * TODO: we may need to improve the condition above. */
                 log_warning("%s: Gateway= without static address configured. "
                             "Enabling GatewayOnLink= option.",
                             network->filename);
index 90420f42b59fee18e20e944e983c1c83fb0cdb1a..04a2a4c9c193c3b047c9efd5ad2e3c002bb856ee 100644 (file)
@@ -352,6 +352,7 @@ SendVendorOption=
 Id=
 Gateway=
 Family=
+OnLink=
 [QDisc]
 Parent=
 Handle=