summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhang Chen2017-04-18 04:20:19 +0200
committerJason Wang2017-04-25 13:17:25 +0200
commit184d4d42033d5c111276e4eef9ea273c2e114d18 (patch)
treece2e3c1c8630b5d97aaf5059b19992bb28350a56
parentslirp: add a fake NC-SI backend (diff)
downloadqemu-184d4d42033d5c111276e4eef9ea273c2e114d18.tar.gz
qemu-184d4d42033d5c111276e4eef9ea273c2e114d18.tar.xz
qemu-184d4d42033d5c111276e4eef9ea273c2e114d18.zip
COLO-compare: Optimize tcp compare for option field
In this patch we support packet that have tcp options field. Add tcp options field check, If the packet have options field we just skip it and compare tcp payload, Avoid unnecessary checkpoint, optimize performance. Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
-rw-r--r--net/colo-compare.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 9b09cfc9c0..4ab80b1cbb 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -233,7 +233,32 @@ static int colo_packet_compare_tcp(Packet *spkt, Packet *ppkt)
spkt->ip->ip_sum = ppkt->ip->ip_sum;
}
- if (ptcp->th_sum == stcp->th_sum) {
+ /*
+ * Check tcp header length for tcp option field.
+ * th_off > 5 means this tcp packet have options field.
+ * The tcp options maybe always different.
+ * for example:
+ * From RFC 7323.
+ * TCP Timestamps option (TSopt):
+ * Kind: 8
+ *
+ * Length: 10 bytes
+ *
+ * +-------+-------+---------------------+---------------------+
+ * |Kind=8 | 10 | TS Value (TSval) |TS Echo Reply (TSecr)|
+ * +-------+-------+---------------------+---------------------+
+ * 1 1 4 4
+ *
+ * In this case the primary guest's timestamp always different with
+ * the secondary guest's timestamp. COLO just focus on payload,
+ * so we just need skip this field.
+ */
+ if (ptcp->th_off > 5) {
+ ptrdiff_t tcp_offset;
+ tcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
+ + (ptcp->th_off * 4);
+ res = colo_packet_compare_common(ppkt, spkt, tcp_offset);
+ } else if (ptcp->th_sum == stcp->th_sum) {
res = colo_packet_compare_common(ppkt, spkt, ETH_HLEN);
} else {
res = -1;