[ovs-dev] [PATCH] conntrack: Fix tcp payload length in case multi-segments.
Zhike Wang
wangzk320 at 163.com
Fri Nov 8 09:08:12 UTC 2019
Signed-off-by: Zhike Wang <wangzk320 at 163.com>
---
lib/conntrack-private.h | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/lib/conntrack-private.h b/lib/conntrack-private.h
index 590f139..1d21f6e 100644
--- a/lib/conntrack-private.h
+++ b/lib/conntrack-private.h
@@ -233,13 +233,17 @@ conn_update_expiration(struct conntrack *ct, struct conn *conn,
static inline uint32_t
tcp_payload_length(struct dp_packet *pkt)
{
- const char *tcp_payload = dp_packet_get_tcp_payload(pkt);
- if (tcp_payload) {
- return ((char *) dp_packet_tail(pkt) - dp_packet_l2_pad_size(pkt)
- - tcp_payload);
- } else {
- return 0;
+ size_t l4_size = dp_packet_l4_size(pkt);
+
+ if (OVS_LIKELY(l4_size >= TCP_HEADER_LEN)) {
+ struct tcp_header *tcp = dp_packet_l4(pkt);
+ int tcp_len = TCP_OFFSET(tcp->tcp_ctl) * 4;
+
+ if (OVS_LIKELY(tcp_len >= TCP_HEADER_LEN && tcp_len <= l4_size)) {
+ return (l4_size - tcp_len);
+ }
}
+ return 0;
}
#endif /* conntrack-private.h */
--
1.8.3.1
More information about the dev
mailing list