diff options
-rw-r--r-- | net/openvswitch/datapath.c | 2 | ||||
-rw-r--r-- | net/openvswitch/flow.c | 8 | ||||
-rw-r--r-- | net/openvswitch/flow.h | 2 |
3 files changed, 5 insertions, 7 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 5bc5a4e64758..1408adc2a2a7 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -671,7 +671,7 @@ static int ovs_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp, | |||
671 | used = flow->used; | 671 | used = flow->used; |
672 | stats.n_packets = flow->packet_count; | 672 | stats.n_packets = flow->packet_count; |
673 | stats.n_bytes = flow->byte_count; | 673 | stats.n_bytes = flow->byte_count; |
674 | tcp_flags = flow->tcp_flags; | 674 | tcp_flags = (u8)ntohs(flow->tcp_flags); |
675 | spin_unlock_bh(&flow->lock); | 675 | spin_unlock_bh(&flow->lock); |
676 | 676 | ||
677 | if (used && | 677 | if (used && |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 617810f1a21e..b73c7680a3d2 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
@@ -58,19 +58,17 @@ u64 ovs_flow_used_time(unsigned long flow_jiffies) | |||
58 | return cur_ms - idle_ms; | 58 | return cur_ms - idle_ms; |
59 | } | 59 | } |
60 | 60 | ||
61 | #define TCP_FLAGS_OFFSET 13 | 61 | #define TCP_FLAGS_BE16(tp) (*(__be16 *)&tcp_flag_word(tp) & htons(0x0FFF)) |
62 | #define TCP_FLAG_MASK 0x3f | ||
63 | 62 | ||
64 | void ovs_flow_used(struct sw_flow *flow, struct sk_buff *skb) | 63 | void ovs_flow_used(struct sw_flow *flow, struct sk_buff *skb) |
65 | { | 64 | { |
66 | u8 tcp_flags = 0; | 65 | __be16 tcp_flags = 0; |
67 | 66 | ||
68 | if ((flow->key.eth.type == htons(ETH_P_IP) || | 67 | if ((flow->key.eth.type == htons(ETH_P_IP) || |
69 | flow->key.eth.type == htons(ETH_P_IPV6)) && | 68 | flow->key.eth.type == htons(ETH_P_IPV6)) && |
70 | flow->key.ip.proto == IPPROTO_TCP && | 69 | flow->key.ip.proto == IPPROTO_TCP && |
71 | likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) { | 70 | likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) { |
72 | u8 *tcp = (u8 *)tcp_hdr(skb); | 71 | tcp_flags = TCP_FLAGS_BE16(tcp_hdr(skb)); |
73 | tcp_flags = *(tcp + TCP_FLAGS_OFFSET) & TCP_FLAG_MASK; | ||
74 | } | 72 | } |
75 | 73 | ||
76 | spin_lock(&flow->lock); | 74 | spin_lock(&flow->lock); |
diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h index 098fd1db6a23..204e0ccd116d 100644 --- a/net/openvswitch/flow.h +++ b/net/openvswitch/flow.h | |||
@@ -158,7 +158,7 @@ struct sw_flow { | |||
158 | unsigned long used; /* Last used time (in jiffies). */ | 158 | unsigned long used; /* Last used time (in jiffies). */ |
159 | u64 packet_count; /* Number of packets matched. */ | 159 | u64 packet_count; /* Number of packets matched. */ |
160 | u64 byte_count; /* Number of bytes matched. */ | 160 | u64 byte_count; /* Number of bytes matched. */ |
161 | u8 tcp_flags; /* Union of seen TCP flags. */ | 161 | __be16 tcp_flags; /* Union of seen TCP flags. */ |
162 | }; | 162 | }; |
163 | 163 | ||
164 | struct arp_eth_header { | 164 | struct arp_eth_header { |