]> 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>
Tue, 2 Jun 2015 22:31:48 +0000 (15:31 -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-manager.c
src/network/networkd.h

index f039a2d6878ce5c8cd9f18d3b459a624f034fee3..b30fd7ae89aac52e086815c65d01346f634d3a7a 100644 (file)
@@ -1481,6 +1481,9 @@ static int link_set_ipv4_forward(Link *link) {
         const char *p = NULL;
         int r;
 
+        if (link->network->ip_forward == ADDRESS_FAMILY_KERNEL)
+                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)
@@ -1497,6 +1500,9 @@ static int link_set_ipv6_forward(Link *link) {
         if (!socket_ipv6_is_supported())
                 return 0;
 
+        if (link->network->ip_forward == ADDRESS_FAMILY_KERNEL)
+                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 db737ad484e0a5bcfad46c8673066c18b34c1861..2cc53df4b189750b23c1ec3effe1cecf1abdbc19 100644 (file)
@@ -853,6 +853,8 @@ const char *address_family_boolean_to_string(AddressFamilyBoolean b) {
                 return "ipv4";
         if (b == ADDRESS_FAMILY_IPV6)
                 return "ipv6";
+        if (b == ADDRESS_FAMILY_KERNEL)
+                return "kernel";
 
         return NULL;
 }
@@ -872,6 +874,8 @@ AddressFamilyBoolean address_family_boolean_from_string(const char *s) {
                 return ADDRESS_FAMILY_IPV4;
         if (streq(s, "ipv6"))
                 return ADDRESS_FAMILY_IPV6;
+        if (streq(s, "kernel"))
+                return ADDRESS_FAMILY_KERNEL;
 
         return _ADDRESS_FAMILY_BOOLEAN_INVALID;
 }
index 4b13d4aed1b01cc6beedbb8cd2a8229f7e3e5aa7..49afeffe81cc2ef64720ce5f27b976ab771525db 100644 (file)
@@ -60,6 +60,7 @@ typedef enum AddressFamilyBoolean {
         ADDRESS_FAMILY_IPV4 = 1,
         ADDRESS_FAMILY_IPV6 = 2,
         ADDRESS_FAMILY_YES = 3,
+        ADDRESS_FAMILY_KERNEL = 4,
         _ADDRESS_FAMILY_BOOLEAN_MAX,
         _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
 } AddressFamilyBoolean;