qemu/net
Mao Zhongyi f449c9e549 colo: compare the packet based on the tcp sequence number
Packet size some time different or when network is busy.
Based on same payload size, but TCP protocol can not
guarantee send the same one packet in the same way,

like that:
We send this payload:
------------------------------
| header |1|2|3|4|5|6|7|8|9|0|
------------------------------

primary:
ppkt1:
----------------
| header |1|2|3|
----------------
ppkt2:
------------------------
| header |4|5|6|7|8|9|0|
------------------------

secondary:
spkt1:
------------------------------
| header |1|2|3|4|5|6|7|8|9|0|
------------------------------

In the original method, ppkt1 and ppkt2 are different in size and
spkt1, so they can't compare and trigger the checkpoint.

I have tested FTP get 200M and 1G file many times, I found that
the performance was less than 1% of the native.

Now I reconstructed the comparison of TCP packets based on the
TCP sequence number. first of all, ppkt1 and spkt1 have the same
starting sequence number, so they can compare, even though their
length is different. And then ppkt1 with a smaller payload length
is used as the comparison length, if the payload is same, send
out the ppkt1 and record the offset(the length of ppkt1 payload)
in spkt1. The next comparison, ppkt2 and spkt1 can be compared
from the recorded position of spkt1.

like that:
----------------
| header |1|2|3| ppkt1
---------|-----|
         |     |
---------v-----v--------------
| header |1|2|3|4|5|6|7|8|9|0| spkt1
---------------|\------------|
               | \offset     |
      ---------v-------------v
      | header |4|5|6|7|8|9|0| ppkt2
      ------------------------

In this way, the performance can reach native 20% in my multiple
tests.

Cc: Zhang Chen <zhangckid@gmail.com>
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>
Cc: Jason Wang <jasowang@redhat.com>

Signed-off-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Signed-off-by: Zhang Chen <zhangckid@gmail.com>
Reviewed-by: Zhang Chen <zhangckid@gmail.com>
Tested-by: Zhang Chen <zhangckid@gmail.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
2018-01-29 16:05:37 +08:00
..
checksum.c net: optimize checksum computation 2017-01-20 10:36:38 +08:00
clients.h net: use Netdev instead of NetClientOptions in client init 2016-07-19 13:21:08 +02:00
colo-compare.c colo: compare the packet based on the tcp sequence number 2018-01-29 16:05:37 +08:00
colo.c colo: compare the packet based on the tcp sequence number 2018-01-29 16:05:37 +08:00
colo.h colo: compare the packet based on the tcp sequence number 2018-01-29 16:05:37 +08:00
dump.c object: use more specific property type names 2017-06-20 14:31:32 +02:00
eth.c net/eth: fix incorrect check of iov_to_buf() return value 2017-07-31 13:06:38 +03:00
filter-buffer.c object: use more specific property type names 2017-06-20 14:31:32 +02:00
filter-mirror.c filter-mirror: segfault when specifying non existent device 2017-10-16 23:16:06 +03:00
filter-replay.c record/replay: add network support 2017-01-06 10:38:00 +08:00
filter-rewriter.c net/filter-rewriter.c: Fix rewirter checksum bug when use virtio-net 2017-09-08 08:17:35 +08:00
filter.c qapi: Change data type of the FOO_lookup generated for enum FOO 2017-09-04 13:09:13 +02:00
hub.c General warn report fixups 2017-09-19 14:09:34 +02:00
hub.h net: fix qemu_flush_queued_packets() in presence of a hub 2013-02-27 16:10:23 +01:00
l2tpv3.c qapi: Change Netdev into a flat union 2016-07-19 20:18:02 +02:00
Makefile.objs buildsys: Move vde libs to per object 2017-09-22 10:20:34 +08:00
net.c net: Remove the legacy "-net channel" parameter 2017-12-22 10:05:26 +08:00
netmap.c qapi: Change Netdev into a flat union 2016-07-19 20:18:02 +02:00
queue.c net: Clean up includes 2016-02-04 17:41:30 +00:00
slirp.c net: Remove the legacy "-net channel" parameter 2017-12-22 10:05:26 +08:00
socket.c net/socket: fix coverity issue 2017-11-13 18:05:12 +08:00
tap-bsd.c tap-bsd: OpenBSD uses tap(4) now 2016-10-26 09:57:59 +08:00
tap-linux.c Convert error_report() to warn_report() 2017-07-13 13:49:58 +02:00
tap-linux.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
tap-solaris.c util: move declarations out of qemu-common.h 2016-03-22 22:20:17 +01:00
tap-stub.c net/tap: Replace tap-haiku.c and tap-aix.c by a generic tap-stub.c 2017-05-23 10:10:38 +08:00
tap-win32.c qapi: Change Netdev into a flat union 2016-07-19 20:18:02 +02:00
tap.c -----BEGIN PGP SIGNATURE----- 2017-01-20 14:56:40 +00:00
tap_int.h Clean up header guards that don't match their file name 2016-07-12 16:19:16 +02:00
trace-events colo: compare the packet based on the tcp sequence number 2018-01-29 16:05:37 +08:00
util.c net: Clean up includes 2016-02-04 17:41:30 +00:00
util.h all: Clean up includes 2016-02-23 12:43:05 +00:00
vde.c qapi: Change Netdev into a flat union 2016-07-19 20:18:02 +02:00
vhost-user.c vhost-user: fix watcher need be removed when vhost-user hotplug 2017-08-02 00:13:26 +03:00