Unverified Commit 6f6bd412 by Stéphane Graber Committed by GitHub

Merge pull request #3248 from brauner/2020-01-05/veth_devices

network: improve veth device creation
parents 90ddf3c0 8bf64b77
......@@ -487,11 +487,11 @@ static char *find_line(char *buf_start, char *buf_end, char *name,
return NULL;
}
static int instantiate_veth(char *veth1, char *veth2)
static int instantiate_veth(char *veth1, char *veth2, pid_t pid, unsigned int mtu)
{
int ret;
ret = lxc_veth_create(veth1, veth2);
ret = lxc_veth_create(veth1, veth2, pid, mtu);
if (ret < 0) {
errno = -ret;
CMD_SYSERROR("Failed to create %s-%s\n", veth1, veth2);
......@@ -524,8 +524,9 @@ static int get_mtu(char *name)
static int create_nic(char *nic, char *br, int pid, char **cnic)
{
unsigned int mtu = 1500;
int ret;
char veth1buf[IFNAMSIZ], veth2buf[IFNAMSIZ];
int mtu, ret;
ret = snprintf(veth1buf, IFNAMSIZ, "%s", nic);
if (ret < 0 || ret >= IFNAMSIZ) {
......@@ -539,16 +540,19 @@ static int create_nic(char *nic, char *br, int pid, char **cnic)
return -1;
}
if (strcmp(br, "none"))
mtu = get_mtu(br);
if (!mtu)
mtu = 1500;
/* create the nics */
ret = instantiate_veth(veth1buf, veth2buf);
ret = instantiate_veth(veth1buf, veth2buf, pid, mtu);
if (ret < 0) {
usernic_error("%s", "Error creating veth tunnel\n");
return -1;
}
if (strcmp(br, "none")) {
/* copy the bridge's mtu to both ends */
mtu = get_mtu(br);
if (mtu > 0) {
ret = lxc_netdev_set_mtu(veth1buf, mtu);
if (ret < 0) {
......@@ -556,13 +560,6 @@ static int create_nic(char *nic, char *br, int pid, char **cnic)
mtu, veth1buf);
goto out_del;
}
ret = lxc_netdev_set_mtu(veth2buf, mtu);
if (ret < 0) {
usernic_error("Failed to set mtu to %d on %s\n",
mtu, veth2buf);
goto out_del;
}
}
/* attach veth1 to bridge */
......@@ -573,14 +570,6 @@ static int create_nic(char *nic, char *br, int pid, char **cnic)
}
}
/* pass veth2 to target netns */
ret = lxc_netdev_move_by_name(veth2buf, pid, NULL);
if (ret < 0) {
usernic_error("Error moving %s to network namespace of %d\n",
veth2buf, pid);
goto out_del;
}
*cnic = strdup(veth2buf);
if (!*cnic) {
usernic_error("Failed to copy string \"%s\"\n", veth2buf);
......
......@@ -203,7 +203,8 @@ extern int lxc_netdev_down(const char *name);
extern int lxc_netdev_set_mtu(const char *name, int mtu);
/* Create a virtual network devices. */
extern int lxc_veth_create(const char *name1, const char *name2);
extern int lxc_veth_create(const char *name1, const char *name2, pid_t pid,
unsigned int mtu);
extern int lxc_macvlan_create(const char *master, const char *name, int mode);
extern int lxc_vlan_create(const char *master, const char *name,
unsigned short vid);
......
......@@ -29,17 +29,46 @@
#include "lxc/lxccontainer.h"
#include "lxctest.h"
#include "utils.h"
#ifndef HAVE_STRLCPY
#include "include/strlcpy.h"
#endif
#define TSTNAME "lxc-api-reboot"
int main(int argc, char *argv[])
{
int i;
struct lxc_container *c;
int ret = EXIT_FAILURE;
struct lxc_log log;
char template[sizeof(P_tmpdir"/reboot_XXXXXX")];
(void)strlcpy(template, P_tmpdir"/reboot_XXXXXX", sizeof(template));
i = lxc_make_tmpfile(template, false);
if (i < 0) {
lxc_error("Failed to create temporary log file for container %s\n", TSTNAME);
exit(EXIT_FAILURE);
} else {
lxc_debug("Using \"%s\" as temporary log file for container %s\n", template, TSTNAME);
close(i);
}
log.name = TSTNAME;
log.file = template;
log.level = "TRACE";
log.prefix = "reboot";
log.quiet = false;
log.lxcpath = NULL;
if (lxc_log_init(&log))
exit(ret);
/* Test that the reboot() API function properly waits for containers to
* restart.
*/
c = lxc_container_new("reboot", NULL);
c = lxc_container_new(TSTNAME, NULL);
if (!c) {
lxc_error("%s", "Failed to create container \"reboot\"");
exit(ret);
......@@ -120,8 +149,24 @@ on_error_stop:
on_error_put:
lxc_container_put(c);
if (ret == EXIT_SUCCESS)
if (ret == EXIT_SUCCESS) {
lxc_debug("%s\n", "All reboot tests passed");
} else {
int fd;
fd = open(template, O_RDONLY);
if (fd >= 0) {
char buf[4096];
ssize_t buflen;
while ((buflen = read(fd, buf, 1024)) > 0) {
buflen = write(STDERR_FILENO, buf, buflen);
if (buflen <= 0)
break;
}
close(fd);
}
}
(void)unlink(template);
exit(ret);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment