[lxc-devel] [PATCH v2] Add lxc.network.mtu configuration

Ryousei Takano ryousei at gmail.com
Sat Mar 21 18:56:04 UTC 2009


Hi Daniel,

Thanks for your comments.


This patch allows users to specify the MTU size of the veth interface.
 It helps to use jumbo frames on the container.

Changes from v1:
	- Fix failing if the 'mtu' is not specified.
	- Delete the 'mtu' entry at time of lxc-destroy.

Signed-off-by: Ryousei Takano <takano-ryousei at aist.go.jp>
---
 src/lxc/lxc_conf.c   |   29 +++++++++++++++++++++++------
 src/lxc/lxc_conf.h   |    1 +
 src/lxc/lxc_config.c |   24 ++++++++++++++++++++++++
 src/lxc/network.c    |   11 ++++++++---
 src/lxc/network.h    |    4 ++--
 5 files changed, 58 insertions(+), 11 deletions(-)

diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index 68eeaf2..c45f232 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -53,6 +53,7 @@

 #define MAXHWLEN    18
 #define MAXINDEXLEN 20
+#define MAXMTULEN   16
 #define MAXLINELEN  128

 #ifndef MS_REC
@@ -252,12 +253,17 @@ static int configure_netdev(const char *path,
struct lxc_netdev *netdev)

 	if (netdev->hwaddr) {
 		if (write_info(path, "hwaddr", netdev->hwaddr))
-			goto out_up;
+			goto out_hwaddr;
+	}
+
+	if (netdev->mtu) {
+		if (write_info(path, "mtu", netdev->mtu))
+			goto out_mtu;
 	}

 	if (netdev->flags & IFF_UP) {
 		if (write_info(path, "up", ""))
-			goto out_hwaddr;
+			goto out_up;
 	}

 	if (!lxc_list_empty(&netdev->ipv4)) {
@@ -278,9 +284,11 @@ out_ipv6:
 	delete_info(path, "ipv4");
 out_ipv4:
 	delete_info(path, "up");
-out_hwaddr:
-	delete_info(path, "hwaddr");
 out_up:
+	delete_info(path, "mtu");
+out_mtu:
+	delete_info(path, "hwaddr");
+out_hwaddr:
 	delete_info(path, "name");
 out_newname:
 	delete_info(path, "link");
@@ -696,6 +704,7 @@ static int unconfigure_network_cb(const char
*name, const char *directory,
 	delete_info(path, "addr");
 	delete_info(path, "link");
 	delete_info(path, "hwaddr");
+	delete_info(path, "mtu");
 	delete_info(path, "up");
 	unconfigure_ip_addresses(path);
 	rmdir(path);
@@ -1364,7 +1373,8 @@ static int instanciate_veth(const char
*directory, const char *file, pid_t pid)
 {
 	char *path = NULL, *strindex = NULL, *veth1 = NULL, *veth2 = NULL;
 	char bridge[IFNAMSIZ];
-	int ifindex, ret = -1;
+	char strmtu[MAXMTULEN];
+	int ifindex, mtu = 0, ret = -1;
 			
 	if (!asprintf(&veth1, "%s_%d", file, pid) ||
 	    !asprintf(&veth2, "%s~%d", file, pid) ||
@@ -1378,7 +1388,14 @@ static int instanciate_veth(const char
*directory, const char *file, pid_t pid)
 		goto out;
 	}

-	if (lxc_configure_veth(veth1, veth2, bridge)) {
+	if (!read_info(path, "mtu", strmtu, MAXMTULEN)) {
+		if (sscanf(strmtu, "%u", &mtu) < 1) {
+			lxc_log_error("invalid mtu size '%d'", mtu);
+			goto out;
+		}
+	}
+
+	if (lxc_configure_veth(veth1, veth2, bridge, mtu)) {
 		lxc_log_error("failed to create %s-%s/%s", veth1, veth2, bridge);
 		goto out;
 	}
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h
index 6968187..485bd5e 100644
--- a/src/lxc/lxc_conf.h
+++ b/src/lxc/lxc_conf.h
@@ -79,6 +79,7 @@ struct lxc_netdev {
 	char *ifname;
 	char *newname;
 	char *hwaddr;
+	char *mtu;
 	struct lxc_list ipv4;
 	struct lxc_list ipv6;
 	struct lxc_list route4;
diff --git a/src/lxc/lxc_config.c b/src/lxc/lxc_config.c
index a1ef998..1637f20 100644
--- a/src/lxc/lxc_config.c
+++ b/src/lxc/lxc_config.c
@@ -47,6 +47,7 @@ static int config_network_flags(const char *, char
*, struct lxc_conf *);
 static int config_network_link(const char *, char *, struct lxc_conf *);
 static int config_network_name(const char *, char *, struct lxc_conf *);
 static int config_network_hwaddr(const char *, char *, struct lxc_conf *);
+static int config_network_mtu(const char *, char *, struct lxc_conf *);
 static int config_network_ipv4(const char *, char *, struct lxc_conf *);
 static int config_network_ipv6(const char *, char *, struct lxc_conf *);

@@ -70,6 +71,7 @@ static struct config config[] = {
 	{ "lxc.network.link",   config_network_link   },
 	{ "lxc.network.name",   config_network_name   },
 	{ "lxc.network.hwaddr", config_network_hwaddr },
+	{ "lxc.network.mtu",    config_network_mtu    },
 	{ "lxc.network.ipv4",   config_network_ipv4   },
 	{ "lxc.network.ipv6",   config_network_ipv6   },
 };
@@ -248,6 +250,28 @@ static int config_network_hwaddr(const char *key,
char *value, struct lxc_conf *
 	return 0;
 }

+static int config_network_mtu(const char *key, char *value, struct
lxc_conf *lxc_conf)
+{
+	struct lxc_list *networks = &lxc_conf->networks;
+	struct lxc_network *network;
+	struct lxc_netdev *netdev;
+
+	if (lxc_list_empty(networks)) {
+		lxc_log_error("network is not created for %s", value);
+		return -1;
+	}
+
+	network = lxc_list_first_elem(networks);
+	if (!network) {
+		lxc_log_error("no network defined for %s", value);
+		return -1;
+	}
+
+	netdev = lxc_list_first_elem(&network->netdev);
+	netdev->mtu = strdup(value);
+	return 0;
+}
+
 static int config_network_ipv4(const char *key, char *value, struct
lxc_conf *lxc_conf)
 {
 	struct lxc_list *networks = &lxc_conf->networks;
diff --git a/src/lxc/network.c b/src/lxc/network.c
index 3ae5858..d987147 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -281,7 +281,7 @@ out:
 	return err;
 }

-int veth_create(const char *name1, const char *name2)
+int veth_create(const char *name1, const char *name2, const int mtu)
 {
 	struct nl_handler nlh;
 	struct nlmsg *nlmsg = NULL, *answer = NULL;
@@ -344,6 +344,10 @@ int veth_create(const char *name1, const char *name2)
 	if (nla_put_string(nlmsg, IFLA_IFNAME, name1))
 		goto out;

+	if (mtu)
+		if (nla_put_u32(nlmsg, IFLA_MTU, mtu))
+			goto out;
+
 	if (netlink_transaction(&nlh, nlmsg, answer))
 		goto out;

@@ -690,10 +694,11 @@ int bridge_detach(const char *bridge, const char *ifname)
 	return bridge_add_del_interface(bridge, ifname, 1);
 }

-int lxc_configure_veth(const char *veth1, const char *veth2, const
char *bridge)
+int lxc_configure_veth(const char *veth1, const char *veth2,
+		       const char *bridge, const int mtu)
 {
 	int err = -1;
-	if (veth_create(veth1, veth2)) {
+	if (veth_create(veth1, veth2, mtu)) {
 		fprintf(stderr, "failed to create veth interfaces %s/%s\n",
 			veth1, veth2);
 		return -1;
diff --git a/src/lxc/network.h b/src/lxc/network.h
index 223276e..86f163b 100644
--- a/src/lxc/network.h
+++ b/src/lxc/network.h
@@ -32,7 +32,7 @@ extern int lxc_configure_macvlan(const char *link,
const char *peer);
  * Create a veth pair virtual device
  */
 extern int lxc_configure_veth(const char *veth1, const char *veth2,
-			      const char *bridge);
+			      const char *bridge, const int mtu);

 /*
  * Convert a string mac address to a socket structure
@@ -67,7 +67,7 @@ extern int device_rename(const char *oldname, const
char *newname);
 /*
  * Create a veth network device
  */
-extern int veth_create(const char *name1, const char *name2);
+extern int veth_create(const char *name1, const char *name2, const int mtu);

 /*
  * Create a macvlan network device
-- 
1.5.6.3




More information about the lxc-devel mailing list