[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 13/18] net/colo-compare.c: Optimize unpredictable tcp
From: |
Jason Wang |
Subject: |
[Qemu-devel] [PULL 13/18] net/colo-compare.c: Optimize unpredictable tcp options comparison |
Date: |
Fri, 8 Sep 2017 10:05:19 +0800 |
From: Zhang Chen <address@hidden>
When network is busy, some tcp options(like sack) will unpredictable
occur in primary side or secondary side. it will make packet size
not same, but the two packet's payload is identical. colo just
care about packet payload, so we skip the option field.
Signed-off-by: Zhang Chen <address@hidden>
Signed-off-by: Jason Wang <address@hidden>
---
net/colo-compare.c | 39 +++++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 5fe8e3f..612fbac 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -186,7 +186,10 @@ static int packet_enqueue(CompareState *s, int mode)
* return: 0 means packet same
* > 0 || < 0 means packet different
*/
-static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
+static int colo_packet_compare_common(Packet *ppkt,
+ Packet *spkt,
+ int poffset,
+ int soffset)
{
if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
@@ -201,12 +204,13 @@ static int colo_packet_compare_common(Packet *ppkt,
Packet *spkt, int offset)
sec_ip_src, sec_ip_dst);
}
- offset = ppkt->vnet_hdr_len + offset;
+ poffset = ppkt->vnet_hdr_len + poffset;
+ soffset = ppkt->vnet_hdr_len + soffset;
- if (ppkt->size == spkt->size) {
- return memcmp(ppkt->data + offset,
- spkt->data + offset,
- spkt->size - offset);
+ if (ppkt->size - poffset == spkt->size - soffset) {
+ return memcmp(ppkt->data + poffset,
+ spkt->data + soffset,
+ spkt->size - soffset);
} else {
trace_colo_compare_main("Net packet size are not the same");
return -1;
@@ -263,13 +267,22 @@ static int colo_packet_compare_tcp(Packet *spkt, Packet
*ppkt)
* so we just need skip this field.
*/
if (ptcp->th_off > 5) {
- ptrdiff_t tcp_offset;
+ ptrdiff_t ptcp_offset, stcp_offset;
- tcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
- + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
- res = colo_packet_compare_common(ppkt, spkt, tcp_offset);
+ ptcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
+ + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
+ stcp_offset = spkt->transport_header - (uint8_t *)spkt->data
+ + (stcp->th_off * 4) - spkt->vnet_hdr_len;
+
+ /*
+ * When network is busy, some tcp options(like sack) will unpredictable
+ * occur in primary side or secondary side. it will make packet size
+ * not same, but the two packet's payload is identical. colo just
+ * care about packet payload, so we skip the option field.
+ */
+ res = colo_packet_compare_common(ppkt, spkt, ptcp_offset, stcp_offset);
} else if (ptcp->th_sum == stcp->th_sum) {
- res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN);
+ res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN, ETH_HLEN);
} else {
res = -1;
}
@@ -330,6 +343,7 @@ static int colo_packet_compare_udp(Packet *spkt, Packet
*ppkt)
* the ip payload here.
*/
ret = colo_packet_compare_common(ppkt, spkt,
+ network_header_length + ETH_HLEN,
network_header_length + ETH_HLEN);
if (ret) {
@@ -367,6 +381,7 @@ static int colo_packet_compare_icmp(Packet *spkt, Packet
*ppkt)
* the ip payload here.
*/
if (colo_packet_compare_common(ppkt, spkt,
+ network_header_length + ETH_HLEN,
network_header_length + ETH_HLEN)) {
trace_colo_compare_icmp_miscompare("primary pkt size",
ppkt->size);
@@ -404,7 +419,7 @@ static int colo_packet_compare_other(Packet *spkt, Packet
*ppkt)
sec_ip_src, sec_ip_dst);
}
- return colo_packet_compare_common(ppkt, spkt, 0);
+ return colo_packet_compare_common(ppkt, spkt, 0, 0);
}
static int colo_old_packet_check_one(Packet *pkt, int64_t *check_time)
--
2.7.4
- [Qemu-devel] [PULL 03/18] net/rocker: Plug memory leak in pci_rocker_init(), (continued)
- [Qemu-devel] [PULL 03/18] net/rocker: Plug memory leak in pci_rocker_init(), Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 04/18] net/rocker: Convert to realize(), Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 05/18] net/rocker: Fix the unusual macro name, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 06/18] net: rtl8139: do not use old_mmio accesses, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 07/18] MAINTAINERS: Update mail address for COLO Proxy, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 08/18] net/socket: Don't treat odd socket type as SOCK_STREAM, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 09/18] net/socket: Convert several helper functions to Error, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 10/18] net/net: Convert parse_host_port() to Error, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 12/18] e1000: Rename the SEC symbol to SEQEC, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 11/18] net/socket: Improve -net socket error reporting, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 13/18] net/colo-compare.c: Optimize unpredictable tcp options comparison,
Jason Wang <=
- [Qemu-devel] [PULL 14/18] net/colo-compare.c: Adjust net queue pop order for performance, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 15/18] net/colo-compare.c: Fix comments and scheme, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 16/18] qemu-iothread: IOThread supports the GMainContext event loop, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 17/18] colo-compare: Use IOThread to Check old packet regularly and Process pactkets of the primary, Jason Wang, 2017/09/07
- [Qemu-devel] [PULL 18/18] colo-compare: Update the COLO document to add the IOThread configuration, Jason Wang, 2017/09/07
- Re: [Qemu-devel] [PULL 00/18] Net patches, Peter Maydell, 2017/09/08