Hello,<br><br>This commit adds traffic control support (download and upload limit rate) for lxc containers. At the moment, the changes apply just for veth devices. In order to do this, we have attached a new structure (lxc_traffic_control) to struct lxc_netdev. This structure contains values for download and upload rate limits and can be extended with other traffic control options.<br>
<br>In the configuration file the user has to complete the options for limiting traffic and to attach a script that handles the limitation (in the upscript option). We have attached here an example of script - lxc_upscript.sh. The lines in the configuration file that deal with limitation are:<br>
lxc.network.download.rate<br>lxc.network.upload.rate<br>lxc.network.up.script<br><br>We have also attached an example of configuration file - conf_example.conf.<br><br>The body of the patch is:<br><br>From c4529b9c03cfdc11e11fa674bd240e2566c2bf05 Mon Sep 17 00:00:00 2001<br>
From: Ana-Maria Farcasi <<a href="mailto:farcasia@gmail.com">farcasia@gmail.com</a>><br>Date: Sat, 7 May 2011 03:52:47 -0700<br>Subject: [PATCH] traffic control setup<br><br><br>Signed-off-by: Ana-Maria Farcasi <<a href="mailto:farcasia@gmail.com">farcasia@gmail.com</a>><br>
Signed-off-by: Irina Presa <<a href="mailto:irina.presa@gmail.com">irina.presa@gmail.com</a>><br>---<br> src/lxc/conf.c    |   27 +++++++++++++++++++++++++--<br> src/lxc/conf.h    |    6 ++++++<br> src/lxc/confile.c |   24 ++++++++++++++++++++++++<br>
 3 files changed, 55 insertions(+), 2 deletions(-)<br><br>diff --git a/src/lxc/conf.c b/src/lxc/conf.c<br>index ae5b259..32445da 100644<br>--- a/src/lxc/conf.c<br>+++ b/src/lxc/conf.c<br>@@ -67,6 +67,7 @@ lxc_log_define(lxc_conf, lxc);<br>
 #define MAXINDEXLEN 20<br> #define MAXMTULEN   16<br> #define MAXLINELEN  128<br>+#define MAXTCARGSIZE 80<br> <br> #ifndef MS_DIRSYNC<br> #define MS_DIRSYNC  128<br>@@ -1360,7 +1361,15 @@ static int instanciate_veth(struct lxc_handler *handler, struct lxc_netdev *netd<br>
 {<br>     char veth1buf[IFNAMSIZ], *veth1;<br>     char veth2buf[IFNAMSIZ], *veth2;<br>-    int err;<br>+    int err, ret_tc;<br>+    char *tc;<br>+<br>+    tc = malloc(MAXTCARGSIZE);<br>+    if (!tc) {<br>+        ERROR("failed to allocate memory");<br>
+        return -1;<br>+    }<br>+    memset(tc, 0, MAXTCARGSIZE);<br> <br>     if (netdev->priv.veth_attr.pair)<br>         veth1 = netdev->priv.veth_attr.pair;<br>@@ -1416,9 +1425,21 @@ static int instanciate_veth(struct lxc_handler *handler, struct lxc_netdev *netd<br>
         goto out_delete;<br>     }<br> <br>+    ret_tc = 0;<br>+<br>+    if (netdev->tc.download_rate) {<br>+        ret_tc += snprintf(tc + ret_tc, MAXTCARGSIZE, "%s %s ",<br>+                "downloadRate", netdev->tc.download_rate);<br>
+    }<br>+<br>+    if (netdev->tc.upload_rate) {<br>+        ret_tc += snprintf(tc + ret_tc, MAXTCARGSIZE, "%s %s ",<br>+                "uploadRate", netdev->tc.upload_rate);<br>+    }<br>+<br>
     if (netdev->upscript) {<br>         err = run_script(handler->name, "net", netdev->upscript, "up",<br>-                 "veth", veth1, (char*) NULL);<br>+                "veth", veth1, tc);<br>
         if (err)<br>             goto out_delete;<br>     }<br>@@ -1426,6 +1447,8 @@ static int instanciate_veth(struct lxc_handler *handler, struct lxc_netdev *netd<br>     DEBUG("instanciated veth '%s/%s', index is '%d'",<br>
           veth1, veth2, netdev->ifindex);<br> <br>+    free(tc);<br>+<br>     return 0;<br> <br> out_delete:<br>diff --git a/src/lxc/conf.h b/src/lxc/conf.h<br>index 8fd3dd8..bce418a 100644<br>--- a/src/lxc/conf.h<br>
+++ b/src/lxc/conf.h<br>@@ -94,6 +94,11 @@ union netdev_p {<br>     struct ifla_macvlan macvlan_attr;<br> };<br> <br>+struct lxc_traffic_control {<br>+    char *upload_rate;<br>+    char *download_rate;<br>+};<br>+<br> /*<br>
  * Defines a structure to configure a network device<br>  * @link       : lxc.network.link, name of bridge or host iface to attach if any<br>@@ -115,6 +120,7 @@ struct lxc_netdev {<br>     struct lxc_list ipv4;<br>     struct lxc_list ipv6;<br>
     char *upscript;<br>+    struct lxc_traffic_control tc;<br> };<br> <br> /*<br>diff --git a/src/lxc/confile.c b/src/lxc/confile.c<br>index 791f04f..6eeae6f 100644<br>--- a/src/lxc/confile.c<br>+++ b/src/lxc/confile.c<br>
@@ -65,6 +65,8 @@ static int config_network_mtu(const char *, char *, struct lxc_conf *);<br> static int config_network_ipv4(const char *, char *, struct lxc_conf *);<br> static int config_network_script(const char *, char *, struct lxc_conf *);<br>
 static int config_network_ipv6(const char *, char *, struct lxc_conf *);<br>+static int config_network_rate_download(const char *, char *, struct lxc_conf *);<br>+static int config_network_rate_upload(const char *, char *, struct lxc_conf *);<br>
 static int config_cap_drop(const char *, char *, struct lxc_conf *);<br> static int config_console(const char *, char *, struct lxc_conf *);<br> <br>@@ -95,6 +97,8 @@ static struct config config[] = {<br>     { "lxc.network.script.up",    config_network_script       },<br>
     { "lxc.network.hwaddr",       config_network_hwaddr       },<br>     { "lxc.network.mtu",          config_network_mtu          },<br>+    { "lxc.network.upload.rate",  config_network_rate_upload  },<br>
+    { "lxc.network.download.rate",config_network_rate_download},<br>     { "<a href="http://lxc.network.vlan.id">lxc.network.vlan.id</a>",      config_network_vlan_id      },<br>     { "lxc.network.ipv4",         config_network_ipv4         },<br>
     { "lxc.network.ipv6",         config_network_ipv6         },<br>@@ -480,6 +484,26 @@ static int config_network_ipv6(const char *key, char *value,<br>     return 0;<br> }<br> <br>+static int config_network_rate_upload(const char *key, char *value,<br>
+                        struct lxc_conf *lxc_conf){<br>+    struct lxc_netdev *netdev;<br>+<br>+    netdev = network_netdev(key, value, &lxc_conf->network);<br>+    netdev->tc.upload_rate = strdup(value);<br>+<br>
+    return 0;<br>+}<br>+<br>+static int config_network_rate_download(const char *key, char *value,<br>+                        struct lxc_conf *lxc_conf){<br>+    struct lxc_netdev *netdev;<br>+<br>+    netdev = network_netdev(key, value, &lxc_conf->network);<br>
+    netdev->tc.download_rate = strdup(value);<br>+<br>+    return 0;<br>+}<br>+<br> static int config_network_script(const char *key, char *value,<br>                  struct lxc_conf *lxc_conf)<br> {<br>-- <br>1.7.1<br>
<br>Ana and Irina.<br>