Jesse, I believe that Pravin is traveling today.  Will you review this?

On Mon, Apr 07, 2014 at 03:35:26PM -0700, Ben Pfaff wrote:
> Flow statistics need to take into account the TCP flags from the packet
> currently being processed (in 'key'), not the TCP flags matched by the
> flow found in the kernel flow table (in 'flow').
> 
> This bug made the Open vSwitch userspace fin_timeout action have no effect
> in many cases.
> 
> Bug #1219516.
> Reported-by: Len Gao <l...@vmware.com>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  datapath/datapath.c |    4 ++--
>  datapath/flow.c     |    4 ++--
>  datapath/flow.h     |    5 +++--
>  3 files changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index c6d42db..25edd7d 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2007-2013 Nicira, Inc.
> + * Copyright (c) 2007-2014 Nicira, Inc.
>   *
>   * This program is free software; you can redistribute it and/or
>   * modify it under the terms of version 2 of the GNU General Public
> @@ -278,7 +278,7 @@ void ovs_dp_process_received_packet(struct vport *p, 
> struct sk_buff *skb)
>       OVS_CB(skb)->flow = flow;
>       OVS_CB(skb)->pkt_key = &key;
>  
> -     ovs_flow_stats_update(OVS_CB(skb)->flow, skb);
> +     ovs_flow_stats_update(OVS_CB(skb)->flow, key.tp.flags, skb);
>       ovs_execute_actions(dp, skb);
>       stats_counter = &stats->n_hit;
>  
> diff --git a/datapath/flow.c b/datapath/flow.c
> index f270f3a..c52081b 100644
> --- a/datapath/flow.c
> +++ b/datapath/flow.c
> @@ -62,10 +62,10 @@ u64 ovs_flow_used_time(unsigned long flow_jiffies)
>  
>  #define TCP_FLAGS_BE16(tp) (*(__be16 *)&tcp_flag_word(tp) & htons(0x0FFF))
>  
> -void ovs_flow_stats_update(struct sw_flow *flow, struct sk_buff *skb)
> +void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags,
> +                        struct sk_buff *skb)
>  {
>       struct flow_stats *stats;
> -     __be16 tcp_flags = flow->key.tp.flags;
>       int node = numa_node_id();
>  
>       stats = rcu_dereference(flow->stats[node]);
> diff --git a/datapath/flow.h b/datapath/flow.h
> index 5043a6e..1bb6ce0 100644
> --- a/datapath/flow.h
> +++ b/datapath/flow.h
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2007-2013 Nicira, Inc.
> + * Copyright (c) 2007-2014 Nicira, Inc.
>   *
>   * This program is free software; you can redistribute it and/or
>   * modify it under the terms of version 2 of the GNU General Public
> @@ -182,7 +182,8 @@ struct arp_eth_header {
>       unsigned char       ar_tip[4];          /* target IP address        */
>  } __packed;
>  
> -void ovs_flow_stats_update(struct sw_flow *, struct sk_buff *);
> +void ovs_flow_stats_update(struct sw_flow *, __be16 tcp_flags,
> +                        struct sk_buff *);
>  void ovs_flow_stats_get(const struct sw_flow *, struct ovs_flow_stats *,
>                       unsigned long *used, __be16 *tcp_flags);
>  void ovs_flow_stats_clear(struct sw_flow *);
> -- 
> 1.7.10.4
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to