[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v2 05/10] net/colo-proxy: Add colo interface to
From: |
Zhang Chen |
Subject: |
[Qemu-devel] [RFC PATCH v2 05/10] net/colo-proxy: Add colo interface to use proxy |
Date: |
Tue, 22 Dec 2015 18:42:53 +0800 |
From: zhangchen <address@hidden>
Add interface used by migration/colo.c
so colo framework can work with proxy
Signed-off-by: zhangchen <address@hidden>
Signed-off-by: zhanghailiang <address@hidden>
---
net/colo-proxy.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 93 insertions(+)
diff --git a/net/colo-proxy.c b/net/colo-proxy.c
index f448ee1..ba2bbe7 100644
--- a/net/colo-proxy.c
+++ b/net/colo-proxy.c
@@ -167,6 +167,11 @@ static int connection_key_equal(const void *opaque1, const
void *opaque2)
return memcmp(opaque1, opaque2, sizeof(ConnectionKey)) == 0;
}
+bool colo_proxy_query_checkpoint(void)
+{
+ return colo_do_checkpoint;
+}
+
static ssize_t colo_proxy_receive_iov(NetFilterState *nf,
NetClientState *sender,
unsigned flags,
@@ -203,6 +208,94 @@ static void colo_proxy_cleanup(NetFilterState *nf)
qemu_event_destroy(&s->need_compare_ev);
}
+static void colo_proxy_notify_checkpoint(void)
+{
+ trace_colo_proxy("colo_proxy_notify_checkpoint");
+ colo_do_checkpoint = true;
+}
+
+static void colo_proxy_start_one(NetFilterState *nf,
+ void *opaque, Error **errp)
+{
+ COLOProxyState *s;
+ int mode, ret;
+
+ if (strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_COLO_PROXY)) {
+ return;
+ }
+
+ mode = *(int *)opaque;
+ s = FILTER_COLO_PROXY(nf);
+ assert(s->colo_mode == mode);
+
+ if (s->colo_mode == COLO_MODE_PRIMARY) {
+ char thread_name[1024];
+
+ ret = colo_proxy_connect(s);
+ if (ret) {
+ error_setg(errp, "colo proxy connect failed");
+ return ;
+ }
+
+ s->status = COLO_PROXY_RUNNING;
+ sprintf(thread_name, "proxy compare %s", nf->netdev_id);
+ qemu_thread_create(&s->thread, thread_name,
+ colo_proxy_compare_thread, s,
+ QEMU_THREAD_JOINABLE);
+ } else {
+ ret = colo_wait_incoming(s);
+ if (ret) {
+ error_setg(errp, "colo proxy wait incoming failed");
+ return ;
+ }
+ s->status = COLO_PROXY_RUNNING;
+ }
+}
+
+int colo_proxy_start(int mode)
+{
+ Error *err = NULL;
+ qemu_foreach_netfilter(colo_proxy_start_one, &mode, &err);
+ if (err) {
+ return -1;
+ }
+ return 0;
+}
+
+static void colo_proxy_stop_one(NetFilterState *nf,
+ void *opaque, Error **errp)
+{
+ COLOProxyState *s;
+ int mode;
+
+ if (strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_COLO_PROXY)) {
+ return;
+ }
+
+ s = FILTER_COLO_PROXY(nf);
+ mode = *(int *)opaque;
+ assert(s->colo_mode == mode);
+
+ s->status = COLO_PROXY_DONE;
+ if (s->sockfd >= 0) {
+ qemu_set_fd_handler(s->sockfd, NULL, NULL, NULL);
+ closesocket(s->sockfd);
+ }
+ if (s->colo_mode == COLO_MODE_PRIMARY) {
+ colo_proxy_primary_checkpoint(s);
+ qemu_event_set(&s->need_compare_ev);
+ qemu_thread_join(&s->thread);
+ } else {
+ colo_proxy_secondary_checkpoint(s);
+ }
+}
+
+void colo_proxy_stop(int mode)
+{
+ Error *err = NULL;
+ qemu_foreach_netfilter(colo_proxy_stop_one, &mode, &err);
+}
+
static void colo_proxy_setup(NetFilterState *nf, Error **errp)
{
COLOProxyState *s = FILTER_COLO_PROXY(nf);
--
1.9.1
- [Qemu-devel] [RFC PATCH v2 00/10] Add colo-proxy based on netfilter, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 02/10] Jhash: add linux kernel jhashtable in qemu, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 04/10] Colo-proxy: add data structure and jhash func, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 03/10] Colo-proxy: add colo-proxy framework, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 01/10] Init colo-proxy object based on netfilter, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 06/10] net/colo-proxy: add socket used by forward func, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 10/10] net/colo-proxy: Colo-proxy do checkpoint and clear, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 09/10] net/colo-proxy: Compare pri pkt to sec pkt, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 07/10] net/colo-proxy: Add packet enqueue & handle func, Zhang Chen, 2015/12/22
- [Qemu-devel] [RFC PATCH v2 05/10] net/colo-proxy: Add colo interface to use proxy,
Zhang Chen <=
- [Qemu-devel] [RFC PATCH v2 08/10] net/colo-proxy: Handle packet and connection, Zhang Chen, 2015/12/22
- Re: [Qemu-devel] [RFC PATCH v2 00/10] Add colo-proxy based on netfilter, Zhang Chen, 2015/12/29
- Re: [Qemu-devel] [RFC PATCH v2 00/10] Add colo-proxy based on netfilter, Jason Wang, 2015/12/30