The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/2981

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Handles more errors and gives better error messages.

Signed-off-by: tomponline <[email protected]>
From 906f0e216e15ec6ea8437e139de1c6f7fcd3b09c Mon Sep 17 00:00:00 2001
From: tomponline <[email protected]>
Date: Tue, 7 May 2019 14:23:24 +0100
Subject: [PATCH] network: Re-works veth gateway logic

Handles more errors and gives better error messages.

Signed-off-by: tomponline <[email protected]>
---
 src/lxc/network.c | 70 +++++++++++++++++++++++++----------------------
 1 file changed, 37 insertions(+), 33 deletions(-)

diff --git a/src/lxc/network.c b/src/lxc/network.c
index 09240b15c1..7d78530fa1 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -3377,6 +3377,7 @@ static int lxc_setup_netdev_in_child_namespaces(struct 
lxc_netdev *netdev)
        int err;
        const char *net_type_name;
        char *current_ifname = ifname;
+       char bufinet4[INET_ADDRSTRLEN], bufinet6[INET6_ADDRSTRLEN];
 
        /* empty network namespace */
        if (!netdev->ifindex) {
@@ -3501,11 +3502,6 @@ static int lxc_setup_netdev_in_child_namespaces(struct 
lxc_netdev *netdev)
                }
        }
 
-       /* We can only set up the default routes after bringing
-        * up the interface, since bringing up the interface adds
-        * the link-local routes and we can't add a default
-        * route if the gateway is not reachable. */
-
        /* setup ipv4 gateway on the interface */
        if (netdev->ipv4_gateway || netdev->ipv4_gateway_dev) {
                if (!(netdev->flags & IFF_UP)) {
@@ -3529,26 +3525,31 @@ static int lxc_setup_netdev_in_child_namespaces(struct 
lxc_netdev *netdev)
                                return minus_one_set_errno(-err);
                        }
                } else {
+                       /* Check the gateway address is valid */
+                       if (!inet_ntop(AF_INET, netdev->ipv4_gateway, bufinet4, 
sizeof(bufinet4)))
+                               return minus_one_set_errno(-errno);
+
+                       /* Try adding a default route to the gateway address */
                        err = lxc_ipv4_gateway_add(netdev->ifindex, 
netdev->ipv4_gateway);
-                       if (err) {
+                       if (err < 0) {
+                               /* If adding the default route fails, this 
could be because the
+                                * gateway address is in a different subnet to 
the container's address.
+                                * To work around this, we try adding a static 
device route to the
+                                * gateway address first, and then try again.
+                                */
                                err = lxc_ipv4_dest_add(netdev->ifindex, 
netdev->ipv4_gateway, 32);
-                               if (err) {
+                               if (err < 0) {
                                        errno = -err;
-                                       SYSERROR("Failed to add ipv4 dest for 
network device \"%s\"",
-                                               ifname);
+                                       SYSERROR("Failed to add ipv4 dest 
\"%s\" for network device \"%s\"",
+                                               bufinet4, ifname);
+                                       return -1;
                                }
 
                                err = lxc_ipv4_gateway_add(netdev->ifindex, 
netdev->ipv4_gateway);
-                               if (err) {
+                               if (err < 0) {
                                        errno = -err;
-                                       SYSERROR("Failed to setup ipv4 gateway 
for network device \"%s\"",
-                                               ifname);
-
-                                       if (netdev->ipv4_gateway_auto) {
-                                               char buf[INET_ADDRSTRLEN];
-                                               inet_ntop(AF_INET, 
netdev->ipv4_gateway, buf, sizeof(buf));
-                                               ERROR("Tried to set 
autodetected ipv4 gateway \"%s\"", buf);
-                                       }
+                                       SYSERROR("Failed to setup ipv4 gateway 
\"%s\" for network device \"%s\"",
+                                               bufinet4, ifname);
                                        return -1;
                                }
                        }
@@ -3578,28 +3579,31 @@ static int lxc_setup_netdev_in_child_namespaces(struct 
lxc_netdev *netdev)
                                return minus_one_set_errno(-err);
                        }
                } else {
+                       /* Check the gateway address is valid */
+                       if (!inet_ntop(AF_INET6, netdev->ipv6_gateway, 
bufinet6, sizeof(bufinet6)))
+                               return minus_one_set_errno(-errno);
+
+                       /* Try adding a default route to the gateway address */
                        err = lxc_ipv6_gateway_add(netdev->ifindex, 
netdev->ipv6_gateway);
-                       if (err) {
+                       if (err < 0) {
+                               /* If adding the default route fails, this 
could be because the
+                                * gateway address is in a different subnet to 
the container's address.
+                                * To work around this, we try adding a static 
device route to the
+                                * gateway address first, and then try again.
+                                */
                                err = lxc_ipv6_dest_add(netdev->ifindex, 
netdev->ipv6_gateway, 128);
-                               if (err) {
+                               if (err < 0) {
                                        errno = -err;
-                                       SYSERROR("Failed to add ipv6 dest for 
network device \"%s\"",
-                                               ifname);
+                                       SYSERROR("Failed to add ipv6 dest 
\"%s\" for network device \"%s\"",
+                                               bufinet6, ifname);
+                                       return -1;
                                }
 
                                err = lxc_ipv6_gateway_add(netdev->ifindex, 
netdev->ipv6_gateway);
-                               if (err) {
+                               if (err < 0) {
                                        errno = -err;
-                                       SYSERROR("Failed to setup ipv6 gateway 
for network device \"%s\"",
-                                               ifname);
-
-                                       if (netdev->ipv6_gateway_auto) {
-                                               char buf[INET6_ADDRSTRLEN];
-                                               inet_ntop(AF_INET6, 
netdev->ipv6_gateway, buf, sizeof(buf));
-                                               ERROR("Tried to set 
autodetected ipv6 "
-                                               "gateway for network device "
-                                               "\"%s\"", buf);
-                                       }
+                                       SYSERROR("Failed to setup ipv6 gateway 
\"%s\" for network device \"%s\"",
+                                               bufinet6, ifname);
                                        return -1;
                                }
                        }
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to