From patchwork Thu Nov 8 01:29:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?67Cw7ISd7KeE?= X-Patchwork-Id: 994601 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="skJwOu7X"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42r5LB3FDfz9s7W for ; Thu, 8 Nov 2018 12:29:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728361AbeKHLCd (ORCPT ); Thu, 8 Nov 2018 06:02:33 -0500 Received: from mailout4.samsung.com ([203.254.224.34]:38764 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728256AbeKHLCd (ORCPT ); Thu, 8 Nov 2018 06:02:33 -0500 Received: from epcas1p3.samsung.com (unknown [182.195.41.47]) by mailout4.samsung.com (KnoxPortal) with ESMTP id 20181108012930epoutp0430af144bfad0af774fcea0fb5ce9ca28~lAe5QutPR1021410214epoutp04B for ; Thu, 8 Nov 2018 01:29:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout4.samsung.com 20181108012930epoutp0430af144bfad0af774fcea0fb5ce9ca28~lAe5QutPR1021410214epoutp04B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1541640570; bh=hmTuRa5ljP47vmiWcVu4D9hAIA+wN9rNJ7Xi2RUJcvg=; h=Subject:Reply-To:From:To:Date:References:From; b=skJwOu7XihmGAPfm9pvLSjMwHyRGpvwhRbj/xKpyj0cAy+Z6pbIF+N0giXEpw66ZO z46x5xFMP2oKK0EUn/QiKrvy9iOR58i1RdYeQGuBITAeUUJgkS6GF4JhK+bX5mzimL 0qFcOLVauyGc5SrwuNuvOSz0Glrinzk/t4SMV6w0= Received: from epsmges1p3.samsung.com (unknown [182.195.40.162]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20181108012929epcas1p4d4ec3ed5d0350dc54dcbab1d0c327cd7~lAe4fBftv2401124011epcas1p46; Thu, 8 Nov 2018 01:29:29 +0000 (GMT) X-AuditID: b6c32a37-887ff70000000fe8-4b-5be391788e32 Received: from epcas1p4.samsung.com ( [182.195.41.48]) by epsmges1p3.samsung.com (Symantec Messaging Gateway) with SMTP id 58.E5.04072.87193EB5; Thu, 8 Nov 2018 10:29:28 +0900 (KST) Mime-Version: 1.0 Subject: [Kernel][NET] Bug report on packet defragmenting Reply-To: soukjin.bae@samsung.com From: =?utf-8?b?67Cw7ISd7KeE?= To: "netdev@vger.kernel.org" X-Priority: 3 X-Content-Kind-Code: NORMAL X-Drm-Type: N,general X-Msg-Generator: Mail X-Msg-Type: PERSONAL X-Reply-Demand: N Message-ID: <20181108012927epcms1p47f719c1908da64a378690362901644ee@epcms1p4> Date: Thu, 08 Nov 2018 10:29:27 +0900 X-CMS-MailID: 20181108012927epcms1p47f719c1908da64a378690362901644ee CMS-TYPE: 101P X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBKsWRmVeSWpSXmKPExsWy7bCmgW7FxMfRBjOPi1ocWyBmMbnvPZMD k0ffllWMHp83yQUwReXYZKQmpqQWKaTmJeenZOal2yp5B8c7x5uaGRjqGlpamCsp5CXmptoq ufgE6Lpl5gBNV1IoS8wpBQoFJBYXK+nb2RTll5akKmTkF5fYKqUWpOQUGBoU6BUn5haX5qXr JefnWhkaGBiZAlUm5GRs3fCBpWCKc8WC1bvYGhiP6HcxcnJICJhIXF0zlb2LkYtDSGAHo8TE JY1ADgcHr4CgxN8dwiA1wgKWEv9f9LOD2EICihJbrq5lgohbSczreAEWZxOwkDj6/i4LiC0i YCox5fwNZoj5vBIz2p+yQNjSEtuXb2WEsEUlbq5+yw5jvz82HyouItF67yxUr6DEg5+7oeJS Ertb5jOD3Ckh0MwosXXaUkYIp4VR4uq3X1Ad+hJX+meCXccr4CsxZ9NDNhCbRUBV4vKBiawQ NS4Sx9pvgtUzC8hLbH87hxnkYWYBTYn1u/QhwnwS7772sMI8sGPeEyYIW1Vi7bNrbDDPNDbe ZAVplRDwkGhpT4OET6BEY/dqtgmMsrMQoTgLya5ZCLsWMDKvYhRLLSjOTU8tNiwwRo64TYzg VKRlvoNxwzmfQ4wCHIxKPLwSio+jhVgTy4orcw8xSnAwK4nw9q5+FC3Em5JYWZValB9fVJqT WnyI0RTo5YnMUqLJ+cA0mVcSb2hqZGxsbGFiZm5maqwkzvtEam60kEB6YklqdmpqQWoRTB8T B6dUA6NwmNjzB5E3VlnVNbPvrHq9aWXM3cZn7n9iNm1kq379v2DW41epdyZuc41vnqt/sSVG vaPV6OxX1wOnJATj5jY/Ltn567K8lLN/7992Te1yOfuodIvWHQsW1W/zn3Dn1puQpo9HQurX 3hA8l7CtxWHF9uz9Qn9LNvsUrjUXtjC9cX2Gg8u8a1JKLMUZiYZazEXFiQAdg7PBWwMAAA== DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20181108012927epcms1p47f719c1908da64a378690362901644ee References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Hello, This is bae working on Samsung Elec. We got the problem that fragmented SIP packet couldn't be deliverd to user layer. And found that they were stoled at HOOK function, ipv6_defrag. In condition with SMP and RPS. After first fragmented packet, they have no further network header except ip. But __skb_flow_dissect function using the port field to determine hash key, 'ports'. So each packet get different hash key, and be sent to different core. Although hash is different, selected cpu could be same. but it just lucky. [exam 2] And addition, when those packets arrived with little time gap. They became ran the ipv6_defrag hook simultaneously in each core. So they each be treated to first fragmented packet. And they can't merged to original packet, and can't be deliverd to upper. [exam 1] If ipv6_defrag hook is not excuted simultaneously, then it's ok. ipv6_defrag hook can handle that. [exam 3] We'll skip 'ports' setting when the packet was fragmented. Because of IPv6 SIP invite packet is usally fragmented, this problem is very often. From be74b56861cf76a16d0f2d054d468c584ed67cce Mon Sep 17 00:00:00 2001 From: soukjin bae Date: Thu, 8 Nov 2018 09:52:29 +0900 Subject: [PATCH] flow_dissector: don't refer port field in fragmented packet After first fragmented packet, they have no further network header except ip. So when try to refer port field in nexthdr, they got the garbage from payload. Skip port set when the packet was fragmented. Signed-off-by: soukjin bae --- net/core/flow_dissector.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 676f3ad629f9..928df25129ba 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -1166,8 +1166,8 @@ bool __skb_flow_dissect(const struct sk_buff *skb, break; } - if (dissector_uses_key(flow_dissector, - FLOW_DISSECTOR_KEY_PORTS)) { + if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS) + && !(key_control->flags & FLOW_DIS_IS_FRAGMENT)) { key_ports = skb_flow_dissector_target(flow_dissector, FLOW_DISSECTOR_KEY_PORTS, target_container);