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.
- 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!".
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