[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xl: network2-attach command



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1275890981 -3600
# Node ID 112f706e1d481dd25a5088c3faf5647950bbe630
# Parent  ca6a1a4f5c522045826ce0795170c33d66ada941
xl: network2-attach command

Usage: xl network2-attach <Domain> [front_mac=<mac>]
[back_mac=<mac>]
[backend=<BackDomain>] [trusted=<0|1>] [back_trusted=<0|1>]
[bridge=<bridge>] [filter_mac=<0|1>] [front_filter_mac=<0|1>]
[pdev=<PDEV>] [max_bypasses=n]

Signed-off-by: Eric Chanudet <eric.chanudet@xxxxxxxxxx>
---
 tools/libxl/libxl.c          |  103 ++++++++++++++++++++++++
 tools/libxl/libxl.h          |   18 ++++
 tools/libxl/libxl_device.c   |    1 
 tools/libxl/libxl_internal.h |    1 
 tools/libxl/libxl_utils.c    |   15 +++
 tools/libxl/libxl_utils.h    |    1 
 tools/libxl/xl.h             |    1 
 tools/libxl/xl_cmdimpl.c     |  179 ++++++++++++++++++++++++++++++++++++++++++-
 tools/libxl/xl_cmdtable.c    |    8 +
 9 files changed, 324 insertions(+), 3 deletions(-)

diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/libxl.c       Mon Jun 07 07:09:41 2010 +0100
@@ -1590,6 +1590,109 @@ libxl_nicinfo *libxl_list_nics(struct li
     return res;
 }
 
+/******************************************************************************/
+int libxl_device_net2_add(struct libxl_ctx *ctx, uint32_t domid, 
libxl_device_net2 *net2)
+{
+    flexarray_t *front, *back;
+    unsigned int boffset = 0, foffset = 0;
+    libxl_device device;
+    char *dompath, *dom, **l;
+    unsigned int nb;
+
+    front = flexarray_make(16, 1);
+    if (!front)
+        return ERROR_NOMEM;
+    back = flexarray_make(16, 1);
+    if (!back)
+        return ERROR_NOMEM;
+
+    if (!(dompath = libxl_xs_get_dompath(ctx, domid))) {
+        return ERROR_FAIL;
+    }
+    dom = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/name", dompath));
+
+    if (net2->devid == -1) {
+        if (!(l = libxl_xs_directory(ctx, XBT_NULL,
+                                     libxl_sprintf(ctx, "%s/device/vif2", 
dompath), &nb))) {
+            net2->devid = 0;
+        } else {
+            net2->devid = strtoul(l[nb - 1], NULL, 10) + 1;
+            libxl_free(ctx, l);
+        }
+    }
+
+    device.backend_devid = net2->devid;
+    device.backend_domid = net2->backend_domid;
+    device.backend_kind = DEVICE_VIF2;
+    device.devid = net2->devid;
+    device.domid = net2->domid;
+    device.kind = DEVICE_VIF2;
+
+    flexarray_set(back, boffset++, "domain");
+    flexarray_set(back, boffset++, dom);
+    flexarray_set(back, boffset++, "frontend-id");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", net2->domid));
+
+    flexarray_set(back, boffset++, "local-trusted");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 
net2->back_trusted));
+    flexarray_set(back, boffset++, "mac");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+                                                 net2->back_mac[0], 
net2->back_mac[1],
+                                                 net2->back_mac[2], 
net2->back_mac[3],
+                                                 net2->back_mac[4], 
net2->back_mac[5]));
+
+    flexarray_set(back, boffset++, "remote-trusted");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", net2->trusted));
+    flexarray_set(back, boffset++, "remote-mac");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+                                                 net2->front_mac[0], 
net2->front_mac[1],
+                                                 net2->front_mac[2], 
net2->front_mac[3],
+                                                 net2->front_mac[4], 
net2->front_mac[5]));
+
+    flexarray_set(back, boffset++, "max-bypasses");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 
net2->max_bypasses));
+    flexarray_set(back, boffset++, "filter-mac");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", 
!!(net2->filter_mac)));
+    flexarray_set(back, boffset++, "handle");
+    flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", net2->devid));
+    flexarray_set(back, boffset++, "online");
+    flexarray_set(back, boffset++, "1");
+    flexarray_set(back, boffset++, "state");
+    flexarray_set(back, boffset++, "1");
+
+    flexarray_set(front, foffset++, "backend-id");
+    flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
net2->backend_domid));
+
+    flexarray_set(front, foffset++, "local-trusted");
+    flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", net2->trusted));
+    flexarray_set(front, foffset++, "mac");
+    flexarray_set(front, foffset++, libxl_sprintf(ctx, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+                                                  net2->front_mac[0], 
net2->front_mac[1],
+                                                  net2->front_mac[2], 
net2->front_mac[3],
+                                                  net2->front_mac[4], 
net2->front_mac[5]));
+
+    flexarray_set(front, foffset++, "remote-trusted");
+    flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
net2->back_trusted));
+    flexarray_set(front, foffset++, "remote-mac");
+    flexarray_set(front, foffset++, libxl_sprintf(ctx, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+                                                  net2->back_mac[0], 
net2->back_mac[1],
+                                                  net2->back_mac[2], 
net2->back_mac[3],
+                                                  net2->back_mac[4], 
net2->back_mac[5]));
+
+    flexarray_set(front, foffset++, "filter-mac");
+    flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d", 
!!(net2->filter_mac)));
+    flexarray_set(front, foffset++, "state");
+    flexarray_set(front, foffset++, "1");
+
+    libxl_device_generic_add(ctx, &device,
+                             libxl_xs_kvs_of_flexarray(ctx, back, boffset),
+                             libxl_xs_kvs_of_flexarray(ctx, front, foffset));
+
+    /* FIXME: wait for plug */
+    flexarray_free(back);
+    flexarray_free(front);
+    return 0;
+}
 
 
/******************************************************************************/
 int libxl_device_console_add(struct libxl_ctx *ctx, uint32_t domid, 
libxl_device_console *console)
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/libxl.h       Mon Jun 07 07:09:41 2010 +0100
@@ -241,6 +241,21 @@ typedef struct {
     char *script;
     libxl_nic_type nictype;
 } libxl_device_nic;
+
+typedef struct {
+    int devid;
+    uint8_t front_mac[6];
+    uint8_t back_mac[6];
+    uint32_t backend_domid;
+    uint32_t domid;
+    uint32_t trusted:1;
+    uint32_t back_trusted:1;
+    uint32_t filter_mac:1;
+    uint32_t front_filter_mac:1;
+    uint32_t pdev;
+    uint32_t max_bypasses;
+    char *bridge;
+} libxl_device_net2;
 
 typedef struct  {
     union {
@@ -539,6 +554,9 @@ int libxl_tmem_shared_auth(struct libxl_
 int libxl_tmem_shared_auth(struct libxl_ctx *ctx, uint32_t domid, char* uuid,
                            int auth);
 
+int libxl_device_net2_add(struct libxl_ctx *ctx, uint32_t domid,
+                          libxl_device_net2 *net2);
+
 /* common paths */
 const char *libxl_sbindir_path(void);
 const char *libxl_bindir_path(void);
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/libxl_device.c        Mon Jun 07 07:09:41 2010 +0100
@@ -28,6 +28,7 @@
 
 static const char *string_of_kinds[] = {
     [DEVICE_VIF] = "vif",
+    [DEVICE_VIF2] = "vif2",
     [DEVICE_VBD] = "vbd",
     [DEVICE_TAP] = "tap",
     [DEVICE_PCI] = "pci",
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/libxl_internal.h      Mon Jun 07 07:09:41 2010 +0100
@@ -68,6 +68,7 @@ void xl_log(struct libxl_ctx *ctx, xento
 
 typedef enum {
     DEVICE_VIF = 1,
+    DEVICE_VIF2,
     DEVICE_VBD,
     DEVICE_TAP,
     DEVICE_PCI,
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/libxl_utils.c Mon Jun 07 07:09:41 2010 +0100
@@ -467,3 +467,18 @@ int libxl_devid_to_device_disk(struct li
 
     return 0;
 }
+
+int libxl_strtomac(const char *mac_s, uint8_t *mac)
+{
+    const char *end = mac_s + 17;
+    char val, *endptr;
+
+    for (; mac_s < end; mac_s += 3, ++mac) {
+        val = strtoul(mac_s, &endptr, 16);
+        if (endptr != (mac_s + 2)) {
+            return ERROR_INVAL;
+        }
+        *mac = val;
+    }
+    return 0;
+}
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/libxl_utils.h Mon Jun 07 07:09:41 2010 +0100
@@ -63,6 +63,7 @@ int libxl_devid_to_device_disk(struct li
 int libxl_devid_to_device_disk(struct libxl_ctx *ctx, uint32_t domid,
                                const char *devid, libxl_device_disk *disk);
 
+int libxl_strtomac(const char *mac_s, uint8_t *mac);
 
 #endif
 
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/xl.h
--- a/tools/libxl/xl.h  Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/xl.h  Mon Jun 07 07:09:41 2010 +0100
@@ -72,6 +72,7 @@ int main_tmem_thaw(int argc, char **argv
 int main_tmem_thaw(int argc, char **argv);
 int main_tmem_set(int argc, char **argv);
 int main_tmem_shared_auth(int argc, char **argv);
+int main_network2attach(int argc, char **argv);
 
 void help(char *command);
 
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Mon Jun 07 07:09:41 2010 +0100
@@ -262,6 +262,29 @@ static void init_nic_info(libxl_device_n
     CHK_ERRNO( asprintf(&nic_info->script, "%s/xl-vif-script",
                libxl_xen_script_dir_path()) );
     nic_info->nictype = NICTYPE_IOEMU;
+}
+
+static void init_net2_info(libxl_device_net2 *net2_info, int devnum)
+{
+    memset(net2_info, '\0', sizeof(*net2_info));
+
+    net2_info->devid = devnum;
+    net2_info->front_mac[0] = 0x00;
+    net2_info->front_mac[1] = 0x16;
+    net2_info->front_mac[2] = 0x3e;;
+    net2_info->front_mac[3] = 1 + (int) (0x7f * (rand() / (RAND_MAX + 1.0)));
+    net2_info->front_mac[4] = 1 + (int) (0xff * (rand() / (RAND_MAX + 1.0)));
+    net2_info->front_mac[5] = 1 + (int) (0xff * (rand() / (RAND_MAX + 1.0)));
+    net2_info->back_mac[0] = 0x00;
+    net2_info->back_mac[1] = 0x16;
+    net2_info->back_mac[2] = 0x3e;
+    net2_info->back_mac[3] = 1 + (int) (0x7f * (rand() / (RAND_MAX + 1.0)));
+    net2_info->back_mac[4] = 1 + (int) (0xff * (rand() / (RAND_MAX + 1.0)));
+    net2_info->back_mac[5] = 1 + (int) (0xff * (rand() / (RAND_MAX + 1.0)));
+    net2_info->back_trusted = 1;
+    net2_info->filter_mac = 1;
+    net2_info->max_bypasses = 5;
+    net2_info->bridge = "xenbr0";
 }
 
 static void init_vfb_info(libxl_device_vfb *vfb, int dev_num)
@@ -429,6 +452,8 @@ static void parse_config_data(const char
                               int *num_disks,
                               libxl_device_nic **vifs,
                               int *num_vifs,
+                              libxl_device_net2 **vif2s,
+                              int *num_vif2s,
                               libxl_device_pci **pcidevs,
                               int *num_pcidevs,
                               libxl_device_vfb **vfbs,
@@ -440,7 +465,7 @@ static void parse_config_data(const char
     const char *buf;
     long l;
     XLU_Config *config;
-    XLU_ConfigList *vbds, *nics, *pcis, *cvfbs;
+    XLU_ConfigList *vbds, *nics, *pcis, *cvfbs, *net2s;
     int pci_power_mgmt = 0;
     int pci_msitranslate = 1;
     int i, e;
@@ -675,6 +700,46 @@ skip:
         }
     }
 
+    if (!xlu_cfg_get_list(config, "vif2", &net2s, 0)) {
+        *num_vif2s = 0;
+        *vif2s = NULL;
+        while ((buf = xlu_cfg_get_listitem(net2s, *num_vif2s))) {
+            char *buf2 = strdup(buf);
+            char *p;
+
+            *vif2s = realloc(*vif2s, sizeof (libxl_device_net2) * (*num_vif2s 
+ 1));
+            init_net2_info(*vif2s + *num_vif2s, *num_vif2s);
+
+            for (p = strtok(buf2, ","); p; p = strtok(buf2, ",")) {
+                while (isblank(*p))
+                    p++;
+                if (!strncmp("front_mac=", p, 10)) {
+                    libxl_strtomac(p + 10, (*vif2s)[*num_vif2s].front_mac);
+                } else if (!strncmp("back_mac=", p, 9)) {
+                    libxl_strtomac(p + 9, (*vif2s)[*num_vif2s].back_mac);
+                } else if (!strncmp("backend=", p, 8)) {
+                    domain_qualifier_to_domid(p + 8, 
&((*vif2s)[*num_vif2s].backend_domid), 0);
+                } else if (!strncmp("trusted=", p, 8)) {
+                    (*vif2s)[*num_vif2s].trusted = (*(p + 8) == '1');
+                } else if (!strncmp("back_trusted=", p, 13)) {
+                    (*vif2s)[*num_vif2s].back_trusted = (*(p + 13) == '1');
+                } else if (!strncmp("bridge=", p, 7)) {
+                    (*vif2s)[*num_vif2s].bridge = strdup(p + 13);
+                } else if (!strncmp("filter_mac=", p, 11)) {
+                    (*vif2s)[*num_vif2s].filter_mac = (*(p + 11) == '1');
+                } else if (!strncmp("front_filter_mac=", p, 17)) {
+                    (*vif2s)[*num_vif2s].front_filter_mac = (*(p + 17) == '1');
+                } else if (!strncmp("pdev=", p, 5)) {
+                    (*vif2s)[*num_vif2s].pdev = strtoul(p + 5, NULL, 10);
+                } else if (!strncmp("max_bypasses=", p, 13)) {
+                    (*vif2s)[*num_vif2s].max_bypasses = strtoul(p + 13, NULL, 
10);
+                }
+            }
+            free(buf2);
+            ++(*num_vif2s);
+        }
+    }
+
     if (!xlu_cfg_get_list (config, "vfb", &cvfbs, 0)) {
         *num_vfbs = 0;
         *num_vkbs = 0;
@@ -850,6 +915,7 @@ static int create_domain(struct domain_c
     libxl_device_model_info dm_info;
     libxl_device_disk *disks = NULL;
     libxl_device_nic *vifs = NULL;
+    libxl_device_net2 *vif2s = NULL;
     libxl_device_pci *pcidevs = NULL;
     libxl_device_vfb *vfbs = NULL;
     libxl_device_vkb *vkbs = NULL;
@@ -864,7 +930,7 @@ static int create_domain(struct domain_c
     int migrate_fd = dom_info->migrate_fd;
     char **migration_domname_r = dom_info->migration_domname_r;
 
-    int num_disks = 0, num_vifs = 0, num_pcidevs = 0, num_vfbs = 0, num_vkbs = 
0;
+    int num_disks = 0, num_vifs = 0, num_vif2s = 0, num_pcidevs = 0, num_vfbs 
= 0, num_vkbs = 0;
     int i, fd;
     int need_daemon = 1;
     int ret, rc;
@@ -976,7 +1042,7 @@ static int create_domain(struct domain_c
 
     printf("Parsing config file %s\n", config_file);
 
-    parse_config_data(config_file, config_data, config_len, &info1, &info2, 
&disks, &num_disks, &vifs, &num_vifs, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, 
&vkbs, &num_vkbs, &dm_info);
+    parse_config_data(config_file, config_data, config_len, &info1, &info2, 
&disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, 
&num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info);
 
     if (migrate_fd >= 0) {
         if (info1.name) {
@@ -1045,6 +1111,17 @@ start:
             fprintf(stderr, "cannot add nic %d to domain: %d\n", i, ret);
             ret = ERROR_FAIL;
             goto error_out;
+        }
+    }
+    if (!info1.hvm) {
+        for (i = 0; i < num_vif2s; i++) {
+            vif2s[i].domid = domid;
+            ret = libxl_device_net2_add(&ctx, domid, &(vif2s[i]));
+            if (ret) {
+                fprintf(stderr, "cannot add net2 %d to domain: %d\n", i, ret);
+                ret = ERROR_FAIL;
+                goto error_out;
+            }
         }
     }
     if (info1.hvm) {
@@ -3704,6 +3781,102 @@ int main_blockdetach(int argc, char **ar
     exit(0);
 }
 
+int main_network2attach(int argc, char **argv)
+{
+    int opt;
+    char *tok, *endptr;
+    char *back_dom = NULL;
+    uint32_t domid, back_domid;
+    unsigned int val, i;
+    libxl_device_net2 net2;
+
+    if ((argc < 3) || (argc > 12)) {
+        help("network2-attach");
+        exit(0);
+    }
+    while ((opt = getopt(argc, argv, "h")) != -1) {
+        switch (opt) {
+        case 'h':
+            help("network2-attach");
+            exit(0);
+        default:
+            fprintf(stderr, "option `%c' not supported.\n", opt);
+            break;
+        }
+    }
+
+    if (domain_qualifier_to_domid(argv[2], &domid, 0) < 0) {
+        fprintf(stderr, "%s is an invalid domain identifier\n", argv[1]);
+        exit(1);
+    }
+    init_net2_info(&net2, -1);
+    for (argv += 3, argc -= 3; argc > 0; --argc, ++argv) {
+        if (!strncmp("front_mac=", *argv, 10)) {
+            tok = strtok((*argv) + 10, ":");
+            for (i = 0; tok && i < 6; tok = strtok(NULL, ":"), ++i) {
+                val = strtoul(tok, &endptr, 16);
+                if ((tok == endptr) || (val > 255)) {
+                    fprintf(stderr, "Invalid parameter `front_mac'.\n");
+                    exit(1);
+                }
+                net2.front_mac[i] = val;
+            }
+        } else if (!strncmp("back_mac=", *argv, 9)) {
+            tok = strtok((*argv) + 10, ":");
+            for (i = 0; tok && i < 6; tok = strtok(NULL, ":"), ++i) {
+                val = strtoul(tok, &endptr, 16);
+                if ((tok == endptr) || (val > 255)) {
+                    fprintf(stderr, "Invalid parameter back_mac=%s.\n", *argv 
+ 9);
+                    exit(1);
+                }
+                net2.back_mac[i] = val;
+            }
+        } else if (!strncmp("backend=", *argv, 8)) {
+            back_dom = *argv;
+        } else if (!strncmp("trusted=", *argv, 8)) {
+            net2.trusted = (*((*argv) + 8) == '1');
+        } else if (!strncmp("back_trusted=", *argv, 13)) {
+            net2.back_trusted = (*((*argv) + 13) == '1');
+        } else if (!strncmp("bridge=", *argv, 7)) {
+            net2.bridge = *argv + 13;
+        } else if (!strncmp("filter_mac=", *argv, 11)) {
+            net2.filter_mac = (*((*argv) + 11) == '1');
+        } else if (!strncmp("front_filter_mac=", *argv, 17)) {
+            net2.front_filter_mac = (*((*argv) + 17) == '1');
+        } else if (!strncmp("pdev=", *argv, 5)) {
+            val = strtoul(*argv + 5, &endptr, 10);
+            if (endptr == (*argv + 5)) {
+                fprintf(stderr, "Invalid parameter pdev=%s.\n", *argv + 5);
+                exit(1);
+            }
+            net2.pdev = val;
+        } else if (!strncmp("max_bypasses=", *argv, 13)) {
+            val = strtoul(*argv + 13, &endptr, 10);
+            if (endptr == (*argv + 13)) {
+                fprintf(stderr, "Invalid parameter max_bypasses=%s.\n", *argv 
+ 13);
+                exit(1);
+            }
+            net2.max_bypasses = val;
+        } else {
+            fprintf(stderr, "unrecognized argument `%s'\n", *argv);
+            exit(1);
+        }
+    }
+
+    if (back_dom) {
+        if (domain_qualifier_to_domid(back_dom, &back_domid, 0) < 0) {
+            fprintf(stderr, "%s is an invalid domain identifier\n", back_dom);
+            exit(1);
+        }
+    }
+    net2.domid = domid;
+    net2.backend_domid = back_domid;
+    if (libxl_device_net2_add(&ctx, domid, &net2)) {
+        fprintf(stderr, "libxl_device_net2_add failed.\n");
+    }
+    exit(0);
+}
+
 static char *uptime_to_string(unsigned long time, int short_mode)
 {
     int sec, min, hour, day;
diff -r ca6a1a4f5c52 -r 112f706e1d48 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c Mon Jun 07 07:07:03 2010 +0100
+++ b/tools/libxl/xl_cmdtable.c Mon Jun 07 07:09:41 2010 +0100
@@ -287,6 +287,14 @@ struct cmd_spec cmd_table[] = {
       "                                 
(abcdef01-2345-6789-1234-567890abcdef)\n"
       "  -A AUTH                        0=auth,1=deauth",
     },
+    { "network2-attach",
+      &main_network2attach,
+      "Create a new version 2 virtual network device",
+      "<Domain> [front_mac=<mac>] [back_mac=<mac>] [backend=<BackDomain>]"
+      " [trusted=<0|1>] [back_trusted=<0|1>] [bridge=<bridge>]"
+      " [filter_mac=<0|1>] [front_filter_mac=<0|1>] [pdev=<PDEV>]"
+      " [max_bypasses=n]",
+    },
 };
 
 int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.