qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 2/4] colo: modified the payload compare funct


From: Mao Zhongyi
Subject: Re: [Qemu-devel] [PATCH v2 2/4] colo: modified the payload compare function
Date: Wed, 13 Dec 2017 13:35:59 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0



On 12/12/2017 11:19 PM, Zhang Chen wrote:


On Wed, Dec 6, 2017 at 5:57 PM, Mao Zhongyi <address@hidden 
<mailto:address@hidden>> wrote:

    Modified the function colo_packet_compare_common to prepare for the
    tcp packet comparison in the next patch.

    Cc: Zhang Chen <address@hidden <mailto:address@hidden>>
    Cc: Li Zhijian <address@hidden <mailto:address@hidden>>
    Cc: Jason Wang <address@hidden <mailto:address@hidden>>

    Signed-off-by: Mao Zhongyi <address@hidden <mailto:address@hidden>>
    ---
     net/colo-compare.c | 71 
++++++++++++++++++++++++++++++------------------------
     1 file changed, 39 insertions(+), 32 deletions(-)

    diff --git a/net/colo-compare.c b/net/colo-compare.c
    index 0afb5f0..f833eba 100644
    --- a/net/colo-compare.c
    +++ b/net/colo-compare.c
    @@ -191,10 +191,11 @@ static int packet_enqueue(CompareState *s, int mode, 
Connection **con)
      * return:    0  means packet same
      *            > 0 || < 0 means packet different
      */
    -static int colo_packet_compare_common(Packet *ppkt,
    -                                      Packet *spkt,
    -                                      int poffset,
    -                                      int soffset)
    +static int colo_compare_packet_payload(Packet *ppkt,
    +                                       Packet *spkt,
    +                                       uint16_t poffset,
    +                                       uint16_t soffset,
    +                                       uint16_t len)
     {
         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];
    @@ -209,17 +210,7 @@ static int colo_packet_compare_common(Packet *ppkt,
                                        sec_ip_src, sec_ip_dst);
         }

    -    poffset = ppkt->vnet_hdr_len + poffset;
    -    soffset = ppkt->vnet_hdr_len + soffset;
    -
    -    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;
    -    }
    +    return memcmp(ppkt->data + poffset, spkt->data + soffset, len);
     }

     /*
    @@ -274,16 +265,23 @@ static int colo_packet_compare_tcp(Packet *spkt, 
Packet *ppkt)
         ptrdiff_t ptcp_offset, stcp_offset;

         ptcp_offset = ppkt->transport_header - (uint8_t *)ppkt->data
    -                  + (ptcp->th_off * 4) - ppkt->vnet_hdr_len;
    +                  + (ptcp->th_off << 2) - ppkt->vnet_hdr_len;
         stcp_offset = spkt->transport_header - (uint8_t *)spkt->data
    -                  + (stcp->th_off * 4) - spkt->vnet_hdr_len;
    +                  + (stcp->th_off << 2) - 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.
          */


In the patch 1,you should remove this comments, it's out of date.

Ah, I got it.




    -    res = colo_packet_compare_common(ppkt, spkt, ptcp_offset, stcp_offset);
    +    if (ppkt->size - ptcp_offset == spkt->size - stcp_offset) {
    +        res = colo_compare_packet_payload(ppkt, spkt,
    +                                          ptcp_offset, stcp_offset,
    +                                          ppkt->size - ptcp_offset);
    +    } else {
    +        trace_colo_compare_main("TCP: the size of packets are different");



Should fix this comments to "TCP: payload size of packets are diffenrent!".

OK,  I will.

Thanks,
Mao


Thanks
Zhang Chen



    +        res = -1;
    +    }

         if (res != 0 &&
             trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
    @@ -325,8 +323,8 @@ static int colo_packet_compare_tcp(Packet *spkt, Packet 
*ppkt)
      */
     static int colo_packet_compare_udp(Packet *spkt, Packet *ppkt)
     {
    -    int ret;
    -    int network_header_length = ppkt->ip->ip_hl * 4;
    +    uint16_t network_header_length = ppkt->ip->ip_hl << 2;
    +    uint16_t offset = network_header_length + ETH_HLEN + 
ppkt->vnet_hdr_len;

         trace_colo_compare_main("compare udp");

    @@ -340,11 +338,12 @@ static int colo_packet_compare_udp(Packet *spkt, 
Packet *ppkt)
          * other field like TOS,TTL,IP Checksum. we only need to compare
          * the ip payload here.
          */
    -    ret = colo_packet_compare_common(ppkt, spkt,
    -                                     network_header_length + ETH_HLEN,
    -                                     network_header_length + ETH_HLEN);
    -
    -    if (ret) {
    +    if (ppkt->size != spkt->size) {
    +        trace_colo_compare_main("UDP: the size of packets are different");
    +        return -1;
    +    }
    +    if (colo_compare_packet_payload(ppkt, spkt, offset, offset,
    +                                    ppkt->size - offset)) {
             trace_colo_compare_udp_miscompare("primary pkt size", ppkt->size);
             trace_colo_compare_udp_miscompare("Secondary pkt size", 
spkt->size);
             if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) 
{
    @@ -353,9 +352,10 @@ static int colo_packet_compare_udp(Packet *spkt, 
Packet *ppkt)
                 qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec 
pkt",
                              spkt->size);
             }
    +        return -1;
    +    } else {
    +        return 0;
         }
    -
    -    return ret;
     }

     /*
    @@ -364,7 +364,8 @@ static int colo_packet_compare_udp(Packet *spkt, Packet 
*ppkt)
      */
     static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
     {
    -    int network_header_length = ppkt->ip->ip_hl * 4;
    +    uint16_t network_header_length = ppkt->ip->ip_hl << 2;
    +    uint16_t offset = network_header_length + ETH_HLEN + 
ppkt->vnet_hdr_len;

         trace_colo_compare_main("compare icmp");

    @@ -378,9 +379,12 @@ static int colo_packet_compare_icmp(Packet *spkt, 
Packet *ppkt)
          * other field like TOS,TTL,IP Checksum. we only need to compare
          * the ip payload here.
          */
    -    if (colo_packet_compare_common(ppkt, spkt,
    -                                   network_header_length + ETH_HLEN,
    -                                   network_header_length + ETH_HLEN)) {
    +    if (ppkt->size != spkt->size) {
    +        trace_colo_compare_main("ICMP: the size of packets are different");
    +        return -1;
    +    }
    +    if (colo_compare_packet_payload(ppkt, spkt, offset, offset,
    +                                    ppkt->size - offset)) {
             trace_colo_compare_icmp_miscompare("primary pkt size",
                                                ppkt->size);
             trace_colo_compare_icmp_miscompare("Secondary pkt size",
    @@ -403,6 +407,8 @@ static int colo_packet_compare_icmp(Packet *spkt, 
Packet *ppkt)
      */
     static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
     {
    +    uint16_t offset = ppkt->vnet_hdr_len;
    +
         trace_colo_compare_main("compare other");
         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];
    @@ -417,7 +423,8 @@ static int colo_packet_compare_other(Packet *spkt, 
Packet *ppkt)
                                        sec_ip_src, sec_ip_dst);
         }

    -    return colo_packet_compare_common(ppkt, spkt, 0, 0);
    +    return colo_compare_packet_payload(ppkt, spkt, offset, offset,
    +                                       ppkt->size - offset);
     }

     static int colo_old_packet_check_one(Packet *pkt, int64_t *check_time)
    --
    2.9.4









reply via email to

[Prev in Thread] Current Thread [Next in Thread]