xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
To: Xen devel <xen-devel@lists.xenproject.org>,
	Wei Liu <wei.liu2@citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
Cc: Yang Hongyang <imhy.yang@gmail.com>,
	Bian Naimeng <biannm@cn.fujitsu.com>,
	eddie <eddie.dong@intel.com>,
	Li Zhijian <lizhijian@cn.fujitsu.com>,
	Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Subject: [PATCH RFC V2 5/7] COLO-Proxy: Add primary userspace colo proxy start args
Date: Wed, 15 Feb 2017 17:54:31 +0800	[thread overview]
Message-ID: <1487152473-3693-6-git-send-email-zhangchen.fnst@cn.fujitsu.com> (raw)
In-Reply-To: <1487152473-3693-1-git-send-email-zhangchen.fnst@cn.fujitsu.com>

Qemu need this args to start userspace colo-proxy.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_dm.c      | 98 +++++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_nic.c     | 78 ++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_types.idl | 31 +++++++++++++-
 tools/libxl/xl_cmdimpl.c    | 58 +++++++++++++++++++++++++++
 4 files changed, 264 insertions(+), 1 deletion(-)

diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 281058d..abd4edd 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1244,7 +1244,105 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
                                            nics[i].devid, ifname,
                                            libxl_tapif_script(gc),
                                            libxl_tapif_script(gc)));
+
+                /* Userspace COLO Proxy need this */
+#define APPEND_COLO_SOCK_SERVER(sock_id, sock_ip, sock_port) ({             \
+    if (nics[i].colo_##sock_id &&                                           \
+        nics[i].colo_##sock_ip &&                                           \
+        nics[i].colo_##sock_port) {                                         \
+        flexarray_append(dm_args, "-chardev");                              \
+        flexarray_append(dm_args,                                           \
+            GCSPRINTF("socket,id=%s,host=%s,port=%s,server,nowait",         \
+                      nics[i].colo_##sock_id,                               \
+                      nics[i].colo_##sock_ip,                               \
+                      nics[i].colo_##sock_port));                           \
+        }                                                                   \
+})
+
+#define APPEND_COLO_SOCK_CLIENT(sock_id, sock_ip, sock_port) ({             \
+    if (nics[i].colo_##sock_id &&                                           \
+        nics[i].colo_##sock_ip &&                                           \
+        nics[i].colo_##sock_port) {                                         \
+        flexarray_append(dm_args, "-chardev");                              \
+        flexarray_append(dm_args,                                           \
+            GCSPRINTF("socket,id=%s,host=%s,port=%s",                       \
+                      nics[i].colo_##sock_id,                               \
+                      nics[i].colo_##sock_ip,                               \
+                      nics[i].colo_##sock_port));                           \
+        }                                                                   \
+})
+
+                if (state->saved_state) {
+                    /* secondary colo run */
+                } else {
+                    /* primary colo run */
+
+                    APPEND_COLO_SOCK_SERVER(sock_mirror_id,
+                                            sock_mirror_ip,
+                                            sock_mirror_port);
+
+                    APPEND_COLO_SOCK_SERVER(sock_compare_pri_in_id,
+                                            sock_compare_pri_in_ip,
+                                            sock_compare_pri_in_port);
+
+                    APPEND_COLO_SOCK_SERVER(sock_compare_sec_in_id,
+                                            sock_compare_sec_in_ip,
+                                            sock_compare_sec_in_port);
+
+                    APPEND_COLO_SOCK_SERVER(sock_redirector0_id,
+                                            sock_redirector0_ip,
+                                            sock_redirector0_port);
+
+                    APPEND_COLO_SOCK_CLIENT(sock_redirector1_id,
+                                            sock_redirector1_ip,
+                                            sock_redirector1_port);
+
+                    APPEND_COLO_SOCK_CLIENT(sock_redirector2_id,
+                                            sock_redirector2_ip,
+                                            sock_redirector2_port);
+
+                    if (nics[i].colo_filter_mirror_queue &&
+                        nics[i].colo_filter_mirror_outdev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-mirror,id=m1,netdev=net%d,queue=%s,outdev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_mirror_queue,
+                                     nics[i].colo_filter_mirror_outdev));
+                    }
+                    if (nics[i].colo_filter_redirector0_queue &&
+                        nics[i].colo_filter_redirector0_indev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-redirector,id=r1,netdev=net%d,queue=%s,indev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_redirector0_queue,
+                                     nics[i].colo_filter_redirector0_indev));
+                    }
+                    if (nics[i].colo_filter_redirector1_queue &&
+                        nics[i].colo_filter_redirector1_outdev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                          GCSPRINTF("filter-redirector,id=r2,netdev=net%d,queue=%s,outdev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_redirector1_queue,
+                                     nics[i].colo_filter_redirector1_outdev));
+                    }
+                    if (nics[i].colo_compare_pri_in &&
+                        nics[i].colo_compare_sec_in &&
+                        nics[i].colo_compare_out) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("colo-compare,id=c1,primary_in=%s,secondary_in=%s,outdev=%s",
+                                     nics[i].colo_compare_pri_in,
+                                     nics[i].colo_compare_sec_in,
+                                     nics[i].colo_compare_out));
+                    }
+                }
                 ioemu_nics++;
+
+#undef APPEND_COLO_SOCK_SERVER
+#undef APPEND_COLO_SOCK_CLIENT
             }
         }
         /* If we have no emulated nics, tell qemu not to create any */
diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c
index 61b55ca..7c57bcf 100644
--- a/tools/libxl/libxl_nic.c
+++ b/tools/libxl/libxl_nic.c
@@ -196,6 +196,45 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
         flexarray_append(back, nic->coloft_forwarddev);
     }
 
+#define MAYBE_ADD_COLO_ARGS(arg) ({                                       \
+    if (nic->colo_##arg) {                                                \
+        flexarray_append(back, "colo_"#arg);                              \
+        flexarray_append(back, nic->colo_##arg);                          \
+    }                                                                     \
+})
+
+    MAYBE_ADD_COLO_ARGS(sock_mirror_id);
+    MAYBE_ADD_COLO_ARGS(sock_mirror_ip);
+    MAYBE_ADD_COLO_ARGS(sock_mirror_port);
+    MAYBE_ADD_COLO_ARGS(sock_compare_pri_in_id);
+    MAYBE_ADD_COLO_ARGS(sock_compare_pri_in_ip);
+    MAYBE_ADD_COLO_ARGS(sock_compare_pri_in_port);
+    MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_id);
+    MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_ip);
+    MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_port);
+    MAYBE_ADD_COLO_ARGS(sock_redirector0_id);
+    MAYBE_ADD_COLO_ARGS(sock_redirector0_ip);
+    MAYBE_ADD_COLO_ARGS(sock_redirector0_port);
+    MAYBE_ADD_COLO_ARGS(sock_redirector1_id);
+    MAYBE_ADD_COLO_ARGS(sock_redirector1_ip);
+    MAYBE_ADD_COLO_ARGS(sock_redirector1_port);
+    MAYBE_ADD_COLO_ARGS(sock_redirector2_id);
+    MAYBE_ADD_COLO_ARGS(sock_redirector2_ip);
+    MAYBE_ADD_COLO_ARGS(sock_redirector2_port);
+    MAYBE_ADD_COLO_ARGS(filter_mirror_queue);
+    MAYBE_ADD_COLO_ARGS(filter_mirror_outdev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector0_queue);
+    MAYBE_ADD_COLO_ARGS(filter_redirector0_indev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector0_outdev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector1_queue);
+    MAYBE_ADD_COLO_ARGS(filter_redirector1_indev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector1_outdev);
+    MAYBE_ADD_COLO_ARGS(compare_pri_in);
+    MAYBE_ADD_COLO_ARGS(compare_sec_in);
+    MAYBE_ADD_COLO_ARGS(compare_out);
+
+#undef MAYBE_ADD_COLO_ARGS
+
     flexarray_append(back, "mac");
     flexarray_append(back,GCSPRINTF(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
     if (nic->ip) {
@@ -349,6 +388,45 @@ static int libxl__device_nic_from_xenstore(libxl__gc *gc,
                                 (const char **)(&nic->coloft_forwarddev));
     if (rc) goto out;
 
+#define CHECK_COLO_ARGS(arg) ({                                           \
+    rc = libxl__xs_read_checked(NOGC, XBT_NULL,                           \
+                                GCSPRINTF("%s/colo_"#arg, libxl_path),    \
+                                (const char **)(&nic->colo_##arg));       \
+    if (rc) goto out;                                                     \
+})
+
+    CHECK_COLO_ARGS(sock_mirror_id);
+    CHECK_COLO_ARGS(sock_mirror_ip);
+    CHECK_COLO_ARGS(sock_mirror_port);
+    CHECK_COLO_ARGS(sock_compare_pri_in_id);
+    CHECK_COLO_ARGS(sock_compare_pri_in_ip);
+    CHECK_COLO_ARGS(sock_compare_pri_in_port);
+    CHECK_COLO_ARGS(sock_compare_sec_in_id);
+    CHECK_COLO_ARGS(sock_compare_sec_in_ip);
+    CHECK_COLO_ARGS(sock_compare_sec_in_port);
+    CHECK_COLO_ARGS(sock_redirector0_id);
+    CHECK_COLO_ARGS(sock_redirector0_ip);
+    CHECK_COLO_ARGS(sock_redirector0_port);
+    CHECK_COLO_ARGS(sock_redirector1_id);
+    CHECK_COLO_ARGS(sock_redirector1_ip);
+    CHECK_COLO_ARGS(sock_redirector1_port);
+    CHECK_COLO_ARGS(sock_redirector2_id);
+    CHECK_COLO_ARGS(sock_redirector2_ip);
+    CHECK_COLO_ARGS(sock_redirector2_port);
+    CHECK_COLO_ARGS(filter_mirror_queue);
+    CHECK_COLO_ARGS(filter_mirror_outdev);
+    CHECK_COLO_ARGS(filter_redirector0_queue);
+    CHECK_COLO_ARGS(filter_redirector0_indev);
+    CHECK_COLO_ARGS(filter_redirector0_outdev);
+    CHECK_COLO_ARGS(filter_redirector1_queue);
+    CHECK_COLO_ARGS(filter_redirector1_indev);
+    CHECK_COLO_ARGS(filter_redirector1_outdev);
+    CHECK_COLO_ARGS(compare_pri_in);
+    CHECK_COLO_ARGS(compare_sec_in);
+    CHECK_COLO_ARGS(compare_out);
+
+#undef CHECK_COLO_ARGS
+
     /* vif_ioemu nics use the same xenstore entries as vif interfaces */
     rc = libxl__xs_read_checked(gc, XBT_NULL,
                                 GCSPRINTF("%s/type", libxl_path), &tmp);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 89c2c9d..07ce345 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -629,7 +629,36 @@ libxl_device_nic = Struct("device_nic", [
     ("gatewaydev", string),
     # Note that the COLO configuration settings should be considered unstable.
     # They may change incompatibly in future versions of Xen.
-    ("coloft_forwarddev", string)
+    ("coloft_forwarddev", string),
+    ("colo_sock_mirror_id", string),
+    ("colo_sock_mirror_ip", string),
+    ("colo_sock_mirror_port", string),
+    ("colo_sock_compare_pri_in_id", string),
+    ("colo_sock_compare_pri_in_ip", string),
+    ("colo_sock_compare_pri_in_port", string),
+    ("colo_sock_compare_sec_in_id", string),
+    ("colo_sock_compare_sec_in_ip", string),
+    ("colo_sock_compare_sec_in_port", string),
+    ("colo_sock_redirector0_id", string),
+    ("colo_sock_redirector0_ip", string),
+    ("colo_sock_redirector0_port", string),
+    ("colo_sock_redirector1_id", string),
+    ("colo_sock_redirector1_ip", string),
+    ("colo_sock_redirector1_port", string),
+    ("colo_sock_redirector2_id", string),
+    ("colo_sock_redirector2_ip", string),
+    ("colo_sock_redirector2_port", string),
+    ("colo_filter_mirror_queue", string),
+    ("colo_filter_mirror_outdev", string),
+    ("colo_filter_redirector0_queue", string),
+    ("colo_filter_redirector0_indev", string),
+    ("colo_filter_redirector0_outdev", string),
+    ("colo_filter_redirector1_queue", string),
+    ("colo_filter_redirector1_indev", string),
+    ("colo_filter_redirector1_outdev", string),
+    ("colo_compare_pri_in", string),
+    ("colo_compare_sec_in", string),
+    ("colo_compare_out", string)
     ])
 
 libxl_device_pci = Struct("device_pci", [
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index b286d47..e6cb015 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1060,6 +1060,64 @@ static int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *to
         parse_vif_rate(config, oparg, nic);
     } else if (MATCH_OPTION("forwarddev", token, oparg)) {
         replace_string(&nic->coloft_forwarddev, oparg);
+    } else if (MATCH_OPTION("colo_sock_mirror_id", token, oparg)) {
+        replace_string(&nic->colo_sock_mirror_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_mirror_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_mirror_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_mirror_port", token, oparg)) {
+        replace_string(&nic->colo_sock_mirror_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_sec_in_id", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_sec_in_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_sec_in_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_sec_in_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_sec_in_port", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_sec_in_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector0_id", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector0_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector0_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector0_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector0_port", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector0_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector1_id", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector1_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector1_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector1_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector1_port", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector1_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector2_id", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector2_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector2_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector2_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector2_port", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector2_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_pri_in_id", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_pri_in_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_pri_in_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_pri_in_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_pri_in_port", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_pri_in_port, oparg);
+    } else if (MATCH_OPTION("colo_filter_mirror_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_mirror_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_mirror_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_mirror_outdev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector0_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector0_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector0_indev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector0_indev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector0_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector0_outdev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector1_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector1_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector1_indev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector1_indev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector1_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector1_outdev, oparg);
+    } else if (MATCH_OPTION("colo_compare_pri_in", token, oparg)) {
+        replace_string(&nic->colo_compare_pri_in, oparg);
+    } else if (MATCH_OPTION("colo_compare_sec_in", token, oparg)) {
+        replace_string(&nic->colo_compare_sec_in, oparg);
+    } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
+        replace_string(&nic->colo_compare_out, oparg);
     } else if (MATCH_OPTION("accel", token, oparg)) {
         fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
     } else {
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2017-02-15  9:55 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-15  9:54 [PATCH RFC V2 0/7] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
2017-02-15  9:54 ` [PATCH RFC V2 1/7] COLO-Proxy: Add remus command to open userspace proxy Zhang Chen
2017-02-15  9:54 ` [PATCH RFC V2 2/7] COLO-Proxy: Setup userspace colo-proxy on primary side Zhang Chen
2017-02-15  9:54 ` [PATCH RFC V2 3/7] tools/libxl: refactor do_domain_create() Zhang Chen
2017-02-15  9:54 ` [PATCH RFC V2 4/7] COLO-Proxy: Setup userspace colo-proxy on secondary side Zhang Chen
2017-02-15  9:54 ` Zhang Chen [this message]
2017-02-15  9:54 ` [PATCH RFC V2 6/7] COLO-Proxy: Add secondary userspace colo-proxy start args Zhang Chen
2017-02-15  9:54 ` [PATCH RFC V2 7/7] COLO-Proxy: Use socket to get checkpoint event Zhang Chen
2017-02-15 16:24   ` Konrad Rzeszutek Wilk
2017-02-16  1:48     ` Zhang Chen
2017-02-15 16:18 ` [PATCH RFC V2 0/7] COLO-Proxy: Make Xen COLO use userspace colo-proxy Konrad Rzeszutek Wilk
2017-02-16  1:36   ` Zhang Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1487152473-3693-6-git-send-email-zhangchen.fnst@cn.fujitsu.com \
    --to=zhangchen.fnst@cn.fujitsu.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=biannm@cn.fujitsu.com \
    --cc=eddie.dong@intel.com \
    --cc=imhy.yang@gmail.com \
    --cc=lizhijian@cn.fujitsu.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).