diff options
author | Zhang Chen <zhangchen.fnst@cn.fujitsu.com> | 2017-01-24 16:53:46 +0800 |
---|---|---|
committer | Jason Wang <jasowang@redhat.com> | 2017-02-15 11:18:57 +0800 |
commit | a935cc3132aea175502f76c06eba7a78521ef3ba (patch) | |
tree | 1c6d5f789bd551c0d75072a16b208b1b0691bb14 /net/colo-compare.c | |
parent | e514fc7e1231c6d95011e448e6c626f2bb6f3cd8 (diff) | |
download | qemu-a935cc3132aea175502f76c06eba7a78521ef3ba.zip qemu-a935cc3132aea175502f76c06eba7a78521ef3ba.tar.gz qemu-a935cc3132aea175502f76c06eba7a78521ef3ba.tar.bz2 |
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>
Diffstat (limited to 'net/colo-compare.c')
-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 4962976..162fd6a 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"); |