]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: create "kernel" setting for IPForwarding
authorNick Owens <nick.owens@coreos.com>
Fri, 1 May 2015 18:48:08 +0000 (11:48 -0700)
committerNick Owens <nick.owens@coreos.com>
Thu, 11 Jun 2015 19:09:21 +0000 (12:09 -0700)
In 5a8bcb674f71a20e95df55319b34c556638378ce, IPForwarding was introduced
to set forwarding flags on interfaces in .network files. networkd sets
forwarding options regardless of the previous setting, even if it was
set by e.g. sysctl. This commit creates a new option for IPForwarding,
"kernel", that preserves the sysctl settings rather than always setting
them.

See https://bugs.freedesktop.org/show_bug.cgi?id=89509 for the initial
bug report.

src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd.h

index 7841f69dab0eafab1223292a6729b6b0da512498..b1947886b7737388aa1bb7479a3a586a966a8a1e 100644 (file)
@@ -1477,6 +1477,9 @@ static int link_set_ipv4_forward(Link *link) {
         const char *p = NULL;
         int r;
 
+        if (link->network->ip_forward == _ADDRESS_FAMILY_BOOLEAN_INVALID)
+                return 0;
+
         p = strjoina("/proc/sys/net/ipv4/conf/", link->ifname, "/forwarding");
         r = write_string_file_no_create(p, one_zero(link_ipv4_forward_enabled(link)));
         if (r < 0)
@@ -1493,6 +1496,9 @@ static int link_set_ipv6_forward(Link *link) {
         if (!socket_ipv6_is_supported())
                 return 0;
 
+        if (link->network->ip_forward == _ADDRESS_FAMILY_BOOLEAN_INVALID)
+                return 0;
+
         p = strjoina("/proc/sys/net/ipv6/conf/", link->ifname, "/forwarding");
         r = write_string_file_no_create(p, one_zero(link_ipv6_forward_enabled(link)));
         if (r < 0)
index 8abf5bcf2e8097cb3ca58602049ce08c4ba32ed9..b05bc949f2fa66486f1e61f699aa4d405bc8fead 100644 (file)
@@ -15,69 +15,69 @@ struct ConfigPerfItem;
 %struct-type
 %includes
 %%
-Match.MACAddress,            config_parse_hwaddr,                0,                             offsetof(Network, match_mac)
-Match.Path,                  config_parse_strv,                  0,                             offsetof(Network, match_path)
-Match.Driver,                config_parse_strv,                  0,                             offsetof(Network, match_driver)
-Match.Type,                  config_parse_strv,                  0,                             offsetof(Network, match_type)
-Match.Name,                  config_parse_ifnames,               0,                             offsetof(Network, match_name)
-Match.Host,                  config_parse_net_condition,         CONDITION_HOST,                offsetof(Network, match_host)
-Match.Virtualization,        config_parse_net_condition,         CONDITION_VIRTUALIZATION,      offsetof(Network, match_virt)
-Match.KernelCommandLine,     config_parse_net_condition,         CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, match_kernel)
-Match.Architecture,          config_parse_net_condition,         CONDITION_ARCHITECTURE,        offsetof(Network, match_arch)
-Link.MACAddress,             config_parse_hwaddr,                0,                             offsetof(Network, mac)
-Link.MTUBytes,               config_parse_iec_size,              0,                             offsetof(Network, mtu)
-Network.Description,         config_parse_string,                0,                             offsetof(Network, description)
-Network.Bridge,              config_parse_netdev,                0,                             offsetof(Network, bridge)
-Network.Bond,                config_parse_netdev,                0,                             offsetof(Network, bond)
-Network.VLAN,                config_parse_netdev,                0,                             0
-Network.MACVLAN,             config_parse_netdev,                0,                             0
-Network.IPVLAN,              config_parse_netdev,                0,                             0
-Network.VXLAN,               config_parse_netdev,                0,                             0
-Network.Tunnel,              config_parse_tunnel,                0,                             0
-Network.DHCP,                config_parse_dhcp,                  0,                             offsetof(Network, dhcp)
-Network.DHCPServer,          config_parse_bool,                  0,                             offsetof(Network, dhcp_server)
-Network.LinkLocalAddressing, config_parse_address_family_boolean,0,                             offsetof(Network, link_local)
-Network.IPv4LLRoute,         config_parse_bool,                  0,                             offsetof(Network, ipv4ll_route)
-Network.IPv6Token,           config_parse_ipv6token,             0,                             offsetof(Network, ipv6_token)
-Network.LLDP,                config_parse_bool,                  0,                             offsetof(Network, lldp)
-Network.Address,             config_parse_address,               0,                             0
-Network.Gateway,             config_parse_gateway,               0,                             0
-Network.Domains,             config_parse_domains,               0,                             offsetof(Network, domains)
-Network.DNS,                 config_parse_strv,                  0,                             offsetof(Network, dns)
-Network.LLMNR,               config_parse_llmnr,                 0,                             offsetof(Network, llmnr)
-Network.NTP,                 config_parse_strv,                  0,                             offsetof(Network, ntp)
-Network.IPForward,           config_parse_address_family_boolean,0,                             offsetof(Network, ip_forward)
-Network.IPMasquerade,        config_parse_bool,                  0,                             offsetof(Network, ip_masquerade)
-Network.BindCarrier,         config_parse_strv,                  0,                             offsetof(Network, bind_carrier)
-Address.Address,             config_parse_address,               0,                             0
-Address.Peer,                config_parse_address,               0,                             0
-Address.Broadcast,           config_parse_broadcast,             0,                             0
-Address.Label,               config_parse_label,                 0,                             0
-Route.Gateway,               config_parse_gateway,               0,                             0
-Route.Destination,           config_parse_destination,           0,                             0
-Route.Source,                config_parse_destination,           0,                             0
-Route.Metric,                config_parse_route_priority,        0,                             0
-Route.Scope,                 config_parse_route_scope,           0,                             0
-DHCP.ClientIdentifier,       config_parse_dhcp_client_identifier,0,                             offsetof(Network, dhcp_client_identifier)
-DHCP.UseDNS,                 config_parse_bool,                  0,                             offsetof(Network, dhcp_dns)
-DHCP.UseNTP,                 config_parse_bool,                  0,                             offsetof(Network, dhcp_ntp)
-DHCP.UseMTU,                 config_parse_bool,                  0,                             offsetof(Network, dhcp_mtu)
-DHCP.UseHostname,            config_parse_bool,                  0,                             offsetof(Network, dhcp_hostname)
-DHCP.UseDomains,             config_parse_bool,                  0,                             offsetof(Network, dhcp_domains)
-DHCP.UseRoutes,              config_parse_bool,                  0,                             offsetof(Network, dhcp_routes)
-DHCP.SendHostname,           config_parse_bool,                  0,                             offsetof(Network, dhcp_sendhost)
-DHCP.RequestBroadcast,       config_parse_bool,                  0,                             offsetof(Network, dhcp_broadcast)
-DHCP.CriticalConnection,     config_parse_bool,                  0,                             offsetof(Network, dhcp_critical)
-DHCP.VendorClassIdentifier,  config_parse_string,                0,                             offsetof(Network, dhcp_vendor_class_identifier)
-DHCP.RouteMetric,            config_parse_unsigned,              0,                             offsetof(Network, dhcp_route_metric)
-Bridge.Cost,                 config_parse_unsigned,              0,                             offsetof(Network, cost)
-BridgeFDB.MACAddress,        config_parse_fdb_hwaddr,            0,                             0
-BridgeFDB.VLANId,            config_parse_fdb_vlan_id,           0,                             0
+Match.MACAddress,            config_parse_hwaddr,                            0,                             offsetof(Network, match_mac)
+Match.Path,                  config_parse_strv,                              0,                             offsetof(Network, match_path)
+Match.Driver,                config_parse_strv,                              0,                             offsetof(Network, match_driver)
+Match.Type,                  config_parse_strv,                              0,                             offsetof(Network, match_type)
+Match.Name,                  config_parse_ifnames,                           0,                             offsetof(Network, match_name)
+Match.Host,                  config_parse_net_condition,                     CONDITION_HOST,                offsetof(Network, match_host)
+Match.Virtualization,        config_parse_net_condition,                     CONDITION_VIRTUALIZATION,      offsetof(Network, match_virt)
+Match.KernelCommandLine,     config_parse_net_condition,                     CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, match_kernel)
+Match.Architecture,          config_parse_net_condition,                     CONDITION_ARCHITECTURE,        offsetof(Network, match_arch)
+Link.MACAddress,             config_parse_hwaddr,                            0,                             offsetof(Network, mac)
+Link.MTUBytes,               config_parse_iec_size,                          0,                             offsetof(Network, mtu)
+Network.Description,         config_parse_string,                            0,                             offsetof(Network, description)
+Network.Bridge,              config_parse_netdev,                            0,                             offsetof(Network, bridge)
+Network.Bond,                config_parse_netdev,                            0,                             offsetof(Network, bond)
+Network.VLAN,                config_parse_netdev,                            0,                             0
+Network.MACVLAN,             config_parse_netdev,                            0,                             0
+Network.IPVLAN,              config_parse_netdev,                            0,                             0
+Network.VXLAN,               config_parse_netdev,                            0,                             0
+Network.Tunnel,              config_parse_tunnel,                            0,                             0
+Network.DHCP,                config_parse_dhcp,                              0,                             offsetof(Network, dhcp)
+Network.DHCPServer,          config_parse_bool,                              0,                             offsetof(Network, dhcp_server)
+Network.LinkLocalAddressing, config_parse_address_family_boolean,            0,                             offsetof(Network, link_local)
+Network.IPv4LLRoute,         config_parse_bool,                              0,                             offsetof(Network, ipv4ll_route)
+Network.IPv6Token,           config_parse_ipv6token,                         0,                             offsetof(Network, ipv6_token)
+Network.LLDP,                config_parse_bool,                              0,                             offsetof(Network, lldp)
+Network.Address,             config_parse_address,                           0,                             0
+Network.Gateway,             config_parse_gateway,                           0,                             0
+Network.Domains,             config_parse_domains,                           0,                             offsetof(Network, domains)
+Network.DNS,                 config_parse_strv,                              0,                             offsetof(Network, dns)
+Network.LLMNR,               config_parse_llmnr,                             0,                             offsetof(Network, llmnr)
+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)
+Network.BindCarrier,         config_parse_strv,                              0,                             offsetof(Network, bind_carrier)
+Address.Address,             config_parse_address,                           0,                             0
+Address.Peer,                config_parse_address,                           0,                             0
+Address.Broadcast,           config_parse_broadcast,                         0,                             0
+Address.Label,               config_parse_label,                             0,                             0
+Route.Gateway,               config_parse_gateway,                           0,                             0
+Route.Destination,           config_parse_destination,                       0,                             0
+Route.Source,                config_parse_destination,                       0,                             0
+Route.Metric,                config_parse_route_priority,                    0,                             0
+Route.Scope,                 config_parse_route_scope,                       0,                             0
+DHCP.ClientIdentifier,       config_parse_dhcp_client_identifier,            0,                             offsetof(Network, dhcp_client_identifier)
+DHCP.UseDNS,                 config_parse_bool,                              0,                             offsetof(Network, dhcp_dns)
+DHCP.UseNTP,                 config_parse_bool,                              0,                             offsetof(Network, dhcp_ntp)
+DHCP.UseMTU,                 config_parse_bool,                              0,                             offsetof(Network, dhcp_mtu)
+DHCP.UseHostname,            config_parse_bool,                              0,                             offsetof(Network, dhcp_hostname)
+DHCP.UseDomains,             config_parse_bool,                              0,                             offsetof(Network, dhcp_domains)
+DHCP.UseRoutes,              config_parse_bool,                              0,                             offsetof(Network, dhcp_routes)
+DHCP.SendHostname,           config_parse_bool,                              0,                             offsetof(Network, dhcp_sendhost)
+DHCP.RequestBroadcast,       config_parse_bool,                              0,                             offsetof(Network, dhcp_broadcast)
+DHCP.CriticalConnection,     config_parse_bool,                              0,                             offsetof(Network, dhcp_critical)
+DHCP.VendorClassIdentifier,  config_parse_string,                            0,                             offsetof(Network, dhcp_vendor_class_identifier)
+DHCP.RouteMetric,            config_parse_unsigned,                          0,                             offsetof(Network, dhcp_route_metric)
+Bridge.Cost,                 config_parse_unsigned,                          0,                             offsetof(Network, cost)
+BridgeFDB.MACAddress,        config_parse_fdb_hwaddr,                        0,                             0
+BridgeFDB.VLANId,            config_parse_fdb_vlan_id,                       0,                             0
 /* backwards compatibility: do not add new entries to this section */
-Network.IPv4LL,              config_parse_ipv4ll,                0,                             offsetof(Network, link_local)
-DHCPv4.UseDNS,               config_parse_bool,                  0,                             offsetof(Network, dhcp_dns)
-DHCPv4.UseMTU,               config_parse_bool,                  0,                             offsetof(Network, dhcp_mtu)
-DHCPv4.UseHostname,          config_parse_bool,                  0,                             offsetof(Network, dhcp_hostname)
-DHCP.UseDomainName,          config_parse_bool,                  0,                             offsetof(Network, dhcp_domains)
-DHCPv4.UseDomainName,        config_parse_bool,                  0,                             offsetof(Network, dhcp_domains)
-DHCPv4.CriticalConnection,   config_parse_bool,                  0,                             offsetof(Network, dhcp_critical)
+Network.IPv4LL,              config_parse_ipv4ll,                            0,                             offsetof(Network, link_local)
+DHCPv4.UseDNS,               config_parse_bool,                              0,                             offsetof(Network, dhcp_dns)
+DHCPv4.UseMTU,               config_parse_bool,                              0,                             offsetof(Network, dhcp_mtu)
+DHCPv4.UseHostname,          config_parse_bool,                              0,                             offsetof(Network, dhcp_hostname)
+DHCP.UseDomainName,          config_parse_bool,                              0,                             offsetof(Network, dhcp_domains)
+DHCPv4.UseDomainName,        config_parse_bool,                              0,                             offsetof(Network, dhcp_domains)
+DHCPv4.CriticalConnection,   config_parse_bool,                              0,                             offsetof(Network, dhcp_critical)
index 6f32e5f4a4aa542422bda373e4f8656ae0cc75a6..ec95c8661e31dc3bd002395d16cf356539e91508 100644 (file)
@@ -717,3 +717,37 @@ int config_parse_ipv6token(
 
         return 0;
 }
+
+int config_parse_address_family_boolean_with_kernel(
+                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) {
+
+        AddressFamilyBoolean *fwd = data, s;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        s = address_family_boolean_from_string(rvalue);
+        if (s < 0) {
+                if (streq(rvalue, "kernel"))
+                        s = _ADDRESS_FAMILY_BOOLEAN_INVALID;
+                else {
+                        log_syntax(unit, LOG_ERR, filename, line, s, "Failed to parse IPForwarding option, ignoring: %s", rvalue);
+                        return 0;
+                }
+        }
+
+        *fwd = s;
+
+        return 0;
+}
index 4b13d4aed1b01cc6beedbb8cd2a8229f7e3e5aa7..2c191a780c9da441fc4e09211e1487e2c3c9c695 100644 (file)
@@ -448,6 +448,9 @@ AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
 
 int config_parse_address_family_boolean(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);
 
+/* IPForwarding parser */
+int config_parse_address_family_boolean_with_kernel(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);
+
 /* Operational State */
 
 const char* link_operstate_to_string(LinkOperationalState s) _const_;