ifupdown: pass interface device name for ipv6 route commands
authorTimo Teräs <timo.teras@iki.fi>
Mon, 26 Oct 2015 16:06:12 +0000 (17:06 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 26 Oct 2015 16:06:12 +0000 (17:06 +0100)
IPv6 routes need the device argument for link-local routes, or they
cannot be used at all. E.g. "gateway fe80::def" seems to be used in
some places, but kernel refuses to insert the route unless device
name is explicitly specified in the route addition.

Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ifupdown.c

index 7c45e8927043d643406ffcdc33b485381aca3479..d477ff6d11d8494d0c5e4a9e8c8230b7fe1aaeb4 100644 (file)
@@ -394,8 +394,8 @@ static int FAST_FUNC static_up6(struct interface_defn_t *ifd, execfn *exec)
 # if ENABLE_FEATURE_IFUPDOWN_IP
        result = execute("ip addr add %address%/%netmask% dev %iface%[[ label %label%]]", ifd, exec);
        result += execute("ip link set[[ mtu %mtu%]][[ addr %hwaddress%]] %iface% up", ifd, exec);
-       /* Was: "[[ ip ....%gateway% ]]". Removed extra spaces w/o checking */
-       result += execute("[[ip route add ::/0 via %gateway%]][[ metric %metric%]]", ifd, exec);
+       /* Reportedly, IPv6 needs "dev %iface%", but IPv4 does not: */
+       result += execute("[[ip route add ::/0 via %gateway% dev %iface%]][[ metric %metric%]]", ifd, exec);
 # else
        result = execute("ifconfig %iface%[[ media %media%]][[ hw %hwaddress%]][[ mtu %mtu%]] up", ifd, exec);
        result += execute("ifconfig %iface% add %address%/%netmask%", ifd, exec);
@@ -421,7 +421,8 @@ static int FAST_FUNC v4tunnel_up(struct interface_defn_t *ifd, execfn *exec)
                        "%endpoint%[[ local %local%]][[ ttl %ttl%]]", ifd, exec);
        result += execute("ip link set %iface% up", ifd, exec);
        result += execute("ip addr add %address%/%netmask% dev %iface%", ifd, exec);
-       result += execute("[[ip route add ::/0 via %gateway%]]", ifd, exec);
+       /* Reportedly, IPv6 needs "dev %iface%", but IPv4 does not: */
+       result += execute("[[ip route add ::/0 via %gateway% dev %iface%]]", ifd, exec);
        return ((result == 4) ? 4 : 0);
 }