Ben,

The code looks good to me and it also works for me.

-Vasu


On Tue, Feb 4, 2014 at 12:05 PM, Ben Pfaff <b...@nicira.com> wrote:

> Until now, the tcp_stream() code has ignored any TCP packets that don't
> correspond to a stream that began with a TCP SYN.  This commit changes the
> code so that any TCP packet that contains a payload starts a new stream.
>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> Reported-by: Vasu Dasari <vdas...@gmail.com>
> ---
>  AUTHORS         |    1 +
>  lib/pcap-file.c |   63
> +++++++++++++++++++++++++++++++++++--------------------
>  2 files changed, 41 insertions(+), 23 deletions(-)
>
> diff --git a/AUTHORS b/AUTHORS
> index c53e97a..652b611 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -245,6 +245,7 @@ Timothy Chen            tc...@nicira.com
>  Torbjorn Tornkvist      kruska...@gmail.com
>  Valentin Bud            valen...@hackaserver.com
>  Vasiliy Tolstov         v.tols...@selfip.ru
> +Vasu Dasari             vdas...@gmail.com
>  Vishal Swarankar        vishal.swarn...@gmail.com
>  Vjekoslav Brajkovic     bal...@cs.washington.edu
>  Voravit T.              vora...@kth.se
> diff --git a/lib/pcap-file.c b/lib/pcap-file.c
> index fdff33ca..2d3f9fe 100644
> --- a/lib/pcap-file.c
> +++ b/lib/pcap-file.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2009, 2010, 2012, 2013 Nicira, Inc.
> + * Copyright (c) 2009, 2010, 2012, 2013, 2014 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -254,28 +254,27 @@ tcp_reader_close(struct tcp_reader *r)
>  }
>
>  static struct tcp_stream *
> -tcp_stream_lookup(struct tcp_reader *r, const struct flow *flow)
> +tcp_stream_lookup(struct tcp_reader *r,
> +                  const struct tcp_key *key, uint32_t hash)
>  {
>      struct tcp_stream *stream;
> -    struct tcp_key key;
> -    uint32_t hash;
> -
> -    memset(&key, 0, sizeof key);
> -    key.nw_src = flow->nw_src;
> -    key.nw_dst = flow->nw_dst;
> -    key.tp_src = flow->tp_src;
> -    key.tp_dst = flow->tp_dst;
> -    hash = hash_bytes(&key, sizeof key, 0);
>
>      HMAP_FOR_EACH_WITH_HASH (stream, hmap_node, hash, &r->streams) {
> -        if (!memcmp(&stream->key, &key, sizeof key)) {
> +        if (!memcmp(&stream->key, key, sizeof *key)) {
>              return stream;
>          }
>      }
> +    return NULL;
> +}
> +
> +static struct tcp_stream *
> +tcp_stream_new(struct tcp_reader *r, const struct tcp_key *key, uint32_t
> hash)
> +{
> +    struct tcp_stream *stream;
>
>      stream = xmalloc(sizeof *stream);
>      hmap_insert(&r->streams, &stream->hmap_node, hash);
> -    memcpy(&stream->key, &key, sizeof key);
> +    memcpy(&stream->key, key, sizeof *key);
>      stream->seq_no = 0;
>      ofpbuf_init(&stream->payload, 2048);
>      return stream;
> @@ -299,6 +298,9 @@ tcp_reader_run(struct tcp_reader *r, const struct flow
> *flow,
>      struct tcp_stream *stream;
>      struct tcp_header *tcp;
>      struct ofpbuf *payload;
> +    unsigned int l7_length;
> +    struct tcp_key key;
> +    uint32_t hash;
>      uint32_t seq;
>      uint8_t flags;
>
> @@ -307,14 +309,32 @@ tcp_reader_run(struct tcp_reader *r, const struct
> flow *flow,
>          || !packet->l7) {
>          return NULL;
>      }
> -
> -    stream = tcp_stream_lookup(r, flow);
> -    payload = &stream->payload;
> -
>      tcp = packet->l4;
>      flags = TCP_FLAGS(tcp->tcp_ctl);
> +    l7_length = (char *) ofpbuf_end(packet) - (char *) packet->l7;
>      seq = ntohl(get_16aligned_be32(&tcp->tcp_seq));
> -    if (flags & TCP_SYN) {
> +
> +    /* Construct key. */
> +    memset(&key, 0, sizeof key);
> +    key.nw_src = flow->nw_src;
> +    key.nw_dst = flow->nw_dst;
> +    key.tp_src = flow->tp_src;
> +    key.tp_dst = flow->tp_dst;
> +    hash = hash_bytes(&key, sizeof key, 0);
> +
> +    /* Find existing stream or start a new one for a SYN or if there's
> data. */
> +    stream = tcp_stream_lookup(r, &key, hash);
> +    if (!stream) {
> +        if (flags & TCP_SYN || l7_length) {
> +            stream = tcp_stream_new(r, &key, hash);
> +            stream->seq_no = flags & TCP_SYN ? seq + 1 : seq;
> +        } else {
> +            return NULL;
> +        }
> +    }
> +
> +    payload = &stream->payload;
> +    if (flags & TCP_SYN || !stream->seq_no) {
>          ofpbuf_clear(payload);
>          stream->seq_no = seq + 1;
>          return NULL;
> @@ -322,16 +342,13 @@ tcp_reader_run(struct tcp_reader *r, const struct
> flow *flow,
>          tcp_stream_destroy(r, stream);
>          return NULL;
>      } else if (seq == stream->seq_no) {
> -        size_t length;
> -
>          /* Shift all of the existing payload to the very beginning of the
>           * allocated space, so that we reuse allocated space instead of
>           * continually expanding it. */
>          ofpbuf_shift(payload, (char *) payload->base - (char *)
> payload->data);
>
> -        length = (char *) ofpbuf_end(packet) - (char *) packet->l7;
> -        ofpbuf_put(payload, packet->l7, length);
> -        stream->seq_no += length;
> +        ofpbuf_put(payload, packet->l7, l7_length);
> +        stream->seq_no += l7_length;
>          return payload;
>      } else {
>          return NULL;
> --
> 1.7.10.4
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to