Hi Darrell, In TSO case, the packet may use multi-segments mbuf, and I do not think we need to make it linearal. In this case, we can NOT use pointer to calculate the tcp length.
Br, Zhike Wang JDCloud, Product Development, IaaS ------------------------------------------------------------------------------------------------ Mobile/+86 13466719566 E- mail/[email protected] Address/5F Building A,North-Star Century Center,8 Beichen West Street,Chaoyang District Beijing Https://JDCloud.com ------------------------------------------------------------------------------------------------ From: Darrell Ball [mailto:[email protected]] Sent: Saturday, November 09, 2019 8:12 AM To: Zhike Wang Cc: ovs dev; 王志克 Subject: Re: [ovs-dev] [PATCH] conntrack: Fix tcp payload length in case multi-segments. Thanks for the patch Would you mind describing the use case that this patch is aiming to support ? On Fri, Nov 8, 2019 at 1:23 AM Zhike Wang <[email protected]> wrote: Signed-off-by: Zhike Wang <[email protected]> --- 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); + } Maybe I missed something, but it looks like the same calculation is arrived at. } + return 0; } #endif /* conntrack-private.h */ -- 1.8.3.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
