From mboxrd@z Thu Jan 1 00:00:00 1970 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 From: Zhang Chen Date: Tue, 22 Dec 2015 18:42:57 +0800 Message-ID: <1450780978-19123-10-git-send-email-zhangchen.fnst@cn.fujitsu.com> 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 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [RFC PATCH v2 09/10] net/colo-proxy: Compare pri pkt to sec pkt List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu devel , Jason Wang , Stefan Hajnoczi Cc: Li Zhijian , Gui jianfeng , "eddie.dong" , "Dr. David Alan Gilbert" , Huang peng , Gong lei , jan.kiszka@siemens.com, Zhang Chen , Yang Hongyang , zhanghailiang 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) { -- 1.9.1