Message ID | 1485248026-9628-1-git-send-email-zhangchen.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2017年01月24日 16:53, Zhang Chen wrote: > 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> > --- > net/colo-compare.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/net/colo-compare.c b/net/colo-compare.c > index 9bfc736..5a4f335 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"); Applied. Thanks
diff --git a/net/colo-compare.c b/net/colo-compare.c index 9bfc736..5a4f335 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");