On 09/05/2017 10:11 AM, Dou Liyang wrote:
Hi Chen,

At 09/04/2017 02:14 PM, Zhang Chen wrote:
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 <zhangchen.f...@cn.fujitsu.com>
---
 net/colo-compare.c | 40 ++++++++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 12 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index ca67c68..18a9ebf 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(TRACE_COLO_COMPARE_MISCOMPARE)) {
char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20]; @@ -201,12 +204,14 @@ 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 == spkt->size ||
+        ppkt->size - poffset == spkt->size - soffset) {

This logic has a problem:

ppkt->data
   |-----------|---------rangeP---------|
               |                    \   |
           poffset                 ppkt->size
                 \    equal range     \
spkt->data        \                    \
   |---------------|------rangeS--------|
                   |                    |
                soffset            spkt->size

See the above picture, (ppkt->size == spkt->size) is true,
if  [soffset, spkt->size] == [poffset, poffset+(spkt->size- soffset) is
also ture, the code will return 0, but actually, they are not equal.

Please use following code instead,

if (ppkt->size - poffset == spkt->size - soffset)

I am a new boy in COLO, let's see what we actually want to compare,
If I am wrong, please correct me. :-)

ppkt->data
   |-----------|---------rangeP---------|
               |                        |
           poffset                 ppkt->size

spkt->data
   |----|----------rangeS---------|
        |                         |
     soffset                 spkt->size

The data in rangeP and rangeS is what we want to compare.
So, we just need care about the rangeX's size and head pointer,
not the whole size.

Yes, I have already considered this rare situation, but for packet comparing efficiency I ignored it. As you know, every packet will be compared in COLO FT, most of packet have the same offset, in this time use pkt->size is ok. the other packet with different offset always have a different pkt->size. But we need cover all situation firstly,
I will update the V6 later.

Thanks
Zhang Chen



Thanks,
    dou.
.


--
Thanks
Zhang Chen




Reply via email to