diff options
author | Zhang Chen | 2017-01-24 09:53:46 +0100 |
---|---|---|
committer | Jason Wang | 2017-02-15 04:18:57 +0100 |
commit | a935cc3132aea175502f76c06eba7a78521ef3ba (patch) | |
tree | 1c6d5f789bd551c0d75072a16b208b1b0691bb14 | |
parent | net: e1000e: fix dead code in e1000e_write_packet_to_guest (diff) | |
download | qemu-a935cc3132aea175502f76c06eba7a78521ef3ba.tar.gz qemu-a935cc3132aea175502f76c06eba7a78521ef3ba.tar.xz qemu-a935cc3132aea175502f76c06eba7a78521ef3ba.zip |
colo-compare: sort TCP packet queue by sequence number
Improve efficiency of TCP packet comparison.
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
-rw-r--r-- | net/colo-compare.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/net/colo-compare.c b/net/colo-compare.c index 4962976c22..162fd6a570 100644 --- a/net/colo-compare.c +++ b/net/colo-compare.c @@ -101,6 +101,15 @@ static int compare_chr_send(CharBackend *out, const uint8_t *buf, uint32_t size); +static gint seq_sorter(Packet *a, Packet *b, gpointer data) +{ + struct tcphdr *atcp, *btcp; + + atcp = (struct tcphdr *)(a->transport_header); + btcp = (struct tcphdr *)(b->transport_header); + return ntohl(atcp->th_seq) - ntohl(btcp->th_seq); +} + /* * Return 0 on success, if return -1 means the pkt * is unsupported(arp and ipv6) and will be sent later @@ -137,6 +146,11 @@ static int packet_enqueue(CompareState *s, int mode) if (g_queue_get_length(&conn->primary_list) <= MAX_QUEUE_SIZE) { g_queue_push_tail(&conn->primary_list, pkt); + if (conn->ip_proto == IPPROTO_TCP) { + g_queue_sort(&conn->primary_list, + (GCompareDataFunc)seq_sorter, + NULL); + } } else { error_report("colo compare primary queue size too big," "drop packet"); @@ -145,6 +159,11 @@ static int packet_enqueue(CompareState *s, int mode) if (g_queue_get_length(&conn->secondary_list) <= MAX_QUEUE_SIZE) { g_queue_push_tail(&conn->secondary_list, pkt); + if (conn->ip_proto == IPPROTO_TCP) { + g_queue_sort(&conn->secondary_list, + (GCompareDataFunc)seq_sorter, + NULL); + } } else { error_report("colo compare secondary queue size too big," "drop packet"); |