[ovs-dev] [PATCH] datapath: Fix tracking of flags seen in TCP flows.

Ben Pfaff blp at nicira.com
Tue Apr 8 17:32:49 UTC 2014


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 <leng at vmware.com>
> Signed-off-by: Ben Pfaff <blp at 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
> 



More information about the dev mailing list