From patchwork Fri Nov 8 09:08:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhike Wang X-Patchwork-Id: 1191757 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=163.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=163.com header.i=@163.com header.b="hLHukOAU"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 478ZZX5N57z9sP3 for ; Fri, 8 Nov 2019 20:23:32 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 8320E144C; Fri, 8 Nov 2019 09:23:30 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 2118B143B for ; Fri, 8 Nov 2019 09:23:29 +0000 (UTC) X-Greylist: delayed 00:15:07 by SQLgrey-1.7.6 Received: from m12-14.163.com (m12-14.163.com [220.181.12.14]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 55C74EC for ; Fri, 8 Nov 2019 09:23:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id; bh=JSxEHRu0sccQ7BwRFr o+sjd/SLZ9EJXb+DBnhU1pWY4=; b=hLHukOAUVyYyHdhWSZYiEW+psVpvLx/nIf awYngrFZQxFDxK1Sli3YPS21stsN9/0riXmBC7vUCWo/3N3tCP8SubRVCL3TRfqD 4A0VhXvE+IaoRFPclidJ7EFJk3+m82R72lYBBxf4WrlOVl8JqbD/YwL/qXqpKX3/ csp4tHPLI= Received: from localhost.localdomain (unknown [106.38.115.15]) by smtp10 (Coremail) with SMTP id DsCowABHbuJ8MMVd+1xnCA--.55606S2; Fri, 08 Nov 2019 17:08:17 +0800 (CST) From: Zhike Wang To: dev@openvswitch.org Date: Fri, 8 Nov 2019 17:08:12 +0800 Message-Id: <1573204092-10124-1-git-send-email-wangzk320@163.com> X-Mailer: git-send-email 1.8.3.1 X-CM-TRANSID: DsCowABHbuJ8MMVd+1xnCA--.55606S2 X-Coremail-Antispam: 1Uf129KBjvdXoWrKw4DuFWUZryUtrykWFWrAFb_yoWDZFc_t3 4IqF4vkrWDur92vr98XrWqyF1kWFWxJFWYgFn7trWDA3ZrKr98urnrWF1kuFW3Z3yjgFyj qws8ZrWxAr13GjkaLaAFLSUrUUUUUb8apTn2vfkv8UJUUUU8Yxn0WfASr-VFAUDa7-sFnT 9fnUUvcSsGvfC2KfnxnUUI43ZEXa7xREJ3vUUUUUU== X-Originating-IP: [106.38.115.15] X-CM-SenderInfo: pzdqw6bntsiqqrwthudrp/1tbiGABnulv2Y89CUgABsV X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: wangzhike@jd.com Subject: [ovs-dev] [PATCH] conntrack: Fix tcp payload length in case multi-segments. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Signed-off-by: Zhike Wang Signed-off-by: Zhike Wang --- 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 */