From patchwork Tue Dec 22 10:42:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 560015 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 420C4140BB7 for ; Tue, 22 Dec 2015 23:46:08 +1100 (AEDT) Received: from localhost ([::1]:50090 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBMKM-0000UD-9L for incoming@patchwork.ozlabs.org; Tue, 22 Dec 2015 07:46:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41516) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBMDk-0005Fm-Lw for qemu-devel@nongnu.org; Tue, 22 Dec 2015 07:39:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aBMDj-00008L-JU for qemu-devel@nongnu.org; Tue, 22 Dec 2015 07:39:16 -0500 Received: from [59.151.112.132] (port=32502 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBMDj-0008WD-6k for qemu-devel@nongnu.org; Tue, 22 Dec 2015 07:39:15 -0500 X-IronPort-AV: E=Sophos;i="5.20,346,1444665600"; d="scan'208";a="1856285" Received: from bogon (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 22 Dec 2015 18:43:11 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id 851364092565; Tue, 22 Dec 2015 18:42:53 +0800 (CST) Received: from G08FNSTD140215.g08.fujitsu.local (10.167.226.56) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.181.6; Tue, 22 Dec 2015 18:42:53 +0800 From: Zhang Chen To: qemu devel , Jason Wang , Stefan Hajnoczi Date: Tue, 22 Dec 2015 18:42:57 +0800 Message-ID: <1450780978-19123-10-git-send-email-zhangchen.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450780978-19123-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> References: <1450780978-19123-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> MIME-Version: 1.0 X-Originating-IP: [10.167.226.56] X-yoursite-MailScanner-ID: 851364092565.A8B4A X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: zhangchen.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Cc: Li Zhijian , Gui jianfeng , "eddie.dong" , "Dr. David Alan Gilbert" , Huang peng , Gong lei , jan.kiszka@siemens.com, Zhang Chen , Yang Hongyang , zhanghailiang Subject: [Qemu-devel] [RFC PATCH v2 09/10] net/colo-proxy: Compare pri pkt to sec pkt X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: zhangchen We will compare packet sent by primary guest to secondary guest,if same,send primary packet. else we will notify colo to do checkpoint to make secondary guset running same as primary Signed-off-by: zhangchen Signed-off-by: zhanghailiang --- net/colo-proxy.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/net/colo-proxy.c b/net/colo-proxy.c index 06bab80..abb289f 100644 --- a/net/colo-proxy.c +++ b/net/colo-proxy.c @@ -602,6 +602,70 @@ static void colo_proxy_notify_checkpoint(void) colo_do_checkpoint = true; } +/* + * The IP packets sent by primary and secondary + * will be comparison in here + * TODOļ¼š support ip fragment + * return: 0 means packet same + * > 0 || < 0 means packet different + */ +static int colo_packet_compare(Packet *ppkt, Packet *spkt) +{ + trace_colo_proxy("colo_packet_compare data ppkt"); + trace_colo_proxy_packet_size(ppkt->size); + trace_colo_proxy_packet_src(inet_ntoa(ppkt->ip->ip_src)); + trace_colo_proxy_packet_dst(inet_ntoa(ppkt->ip->ip_dst)); + colo_proxy_dump_packet(ppkt); + trace_colo_proxy("colo_packet_compare data spkt"); + trace_colo_proxy_packet_size(spkt->size); + trace_colo_proxy_packet_src(inet_ntoa(spkt->ip->ip_src)); + trace_colo_proxy_packet_dst(inet_ntoa(spkt->ip->ip_dst)); + colo_proxy_dump_packet(spkt); + + if (ppkt->size == spkt->size) { + return memcmp(ppkt->data, spkt->data, spkt->size); + } else { + trace_colo_proxy("colo_packet_compare size not same"); + return -1; + } +} + +static void colo_compare_connection(void *opaque, void *user_data) +{ + Connection *conn = opaque; + Packet *pkt = NULL; + GList *result = NULL; + + while (!g_queue_is_empty(&conn->primary_list) && + !g_queue_is_empty(&conn->secondary_list)) { + pkt = g_queue_pop_head(&conn->primary_list); + result = g_queue_find_custom(&conn->secondary_list, + pkt, (GCompareFunc)colo_packet_compare); + if (result) { + colo_send_primary_packet(pkt, NULL); + trace_colo_proxy("packet same and release packet"); + } else { + g_queue_push_tail(&conn->primary_list, pkt); + trace_colo_proxy("packet different"); + colo_proxy_notify_checkpoint(); + break; + } + } +} + +static void *colo_proxy_compare_thread(void *opaque) +{ + COLOProxyState *s = opaque; + + while (s->status == COLO_PROXY_RUNNING) { + qemu_event_wait(&s->need_compare_ev); + qemu_event_reset(&s->need_compare_ev); + g_queue_foreach(&s->conn_list, colo_compare_connection, NULL); + } + + return NULL; +} + static void colo_proxy_start_one(NetFilterState *nf, void *opaque, Error **errp) {