From patchwork Mon Oct 21 20:09:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matteo Croce X-Patchwork-Id: 1180839 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 (no SPF record) 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=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="iuWukpnh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46xnnr44ySz9s7T for ; Tue, 22 Oct 2019 07:10:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730294AbfJUUKb (ORCPT ); Mon, 21 Oct 2019 16:10:31 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:53971 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726672AbfJUUKa (ORCPT ); Mon, 21 Oct 2019 16:10:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571688629; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tIRfkARawuYx5E17weGS9sdJ1VOiUwg/d8BMqTS+xF4=; b=iuWukpnhAp5fVoiPpV1ZhizQuaprjNdTX0ggFKuwzBko00BXMW67Q01WxdvcoiCWndl6L+ uVjqRtq9QRJGNyPm3XzeDlmRQ+sHpk6TrVga1qTErhVKtJRji1Ww3rFQIfUQ6AhE8TOqjP FuuMLOJxPBN1msbcS4lc7EOfz4xo5aU= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-168-6Buyy3G_MOCrG4jyuVyEoA-1; Mon, 21 Oct 2019 16:10:27 -0400 Received: by mail-wm1-f72.google.com with SMTP id i23so29707wmb.3 for ; Mon, 21 Oct 2019 13:10:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SMEGf4c6Ma+Bze2+ZiGp43bjN8huF03EIdt6wvA9wXw=; b=EzoMQPMGhZ9vQ1ZeM8NFbReM1xyIVUaPeNailtbhXQyMsVrT6/iYc+e7tZiOc8gS9l BA6qEar7py4eQKowS9gConjZhU8dhSJUiDjP875jpW0XkQ59M19kvJCX3PX69knUjpL6 afw5fArSTlJLIXHtzM6UqDoyGCRaNvLC15EPidN/VJ7S6fbwmeKrkyE36VvQWlDWIdxE p0a9WlHgUrqVLEono/nBuVi9jhFvRlpjk7OP594qfnQILKYepLHE3njc1KnyS+xUk3vj IL0eJAE054OdhGtsHV4jlLdsZMxX4BcUENOcpOrdgt0DtJB0ZYks39kOCkKw1gL6RRrl mnIw== X-Gm-Message-State: APjAAAXvAWd+YskcW4rl+aY2VqpCGesKM7ZEoXUuuSmE9p+45dYGTXSj id8/0oCbSNV4JU+Bbm1ZdGaykgx9Gs8weVM1qQYqmdLlZ341KH8IhDfYzxdaib514WT24ch+DOD UQHEF0GzD7UX1t4qQ X-Received: by 2002:a1c:c912:: with SMTP id f18mr8901558wmb.168.1571688626069; Mon, 21 Oct 2019 13:10:26 -0700 (PDT) X-Google-Smtp-Source: APXvYqx15FjYZFXXvyV63hNCvlR9L6mdwPxb6AMjC6rMphOyiOSYm40k8lVTtPDL8hhtsd7I1xplIA== X-Received: by 2002:a1c:c912:: with SMTP id f18mr8901544wmb.168.1571688625838; Mon, 21 Oct 2019 13:10:25 -0700 (PDT) Received: from turbo.teknoraver.net (net-109-115-41-234.cust.vodafonedsl.it. [109.115.41.234]) by smtp.gmail.com with ESMTPSA id l18sm20701933wrn.48.2019.10.21.13.10.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Oct 2019 13:10:25 -0700 (PDT) From: Matteo Croce To: netdev@vger.kernel.org Cc: Jay Vosburgh , Veaceslav Falico , Andy Gospodarek , "David S . Miller " , Stanislav Fomichev , Daniel Borkmann , Song Liu , Alexei Starovoitov , Paul Blakey , linux-kernel@vger.kernel.org Subject: [PATCH net-next 1/4] flow_dissector: add meaningful comments Date: Mon, 21 Oct 2019 22:09:45 +0200 Message-Id: <20191021200948.23775-2-mcroce@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191021200948.23775-1-mcroce@redhat.com> References: <20191021200948.23775-1-mcroce@redhat.com> MIME-Version: 1.0 X-MC-Unique: 6Buyy3G_MOCrG4jyuVyEoA-1 X-Mimecast-Spam-Score: 0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Documents two piece of code which can't be understood at a glance. Signed-off-by: Matteo Croce Reviewed-by: Simon Horman --- include/net/flow_dissector.h | 1 + net/core/flow_dissector.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index 90bd210be060..7747af3cc500 100644 --- a/include/net/flow_dissector.h +++ b/include/net/flow_dissector.h @@ -282,6 +282,7 @@ struct flow_keys { struct flow_dissector_key_vlan cvlan; struct flow_dissector_key_keyid keyid; struct flow_dissector_key_ports ports; + /* 'addrs' must be the last member */ struct flow_dissector_key_addrs addrs; }; diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 7c09d87d3269..affde70dad47 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -1374,6 +1374,9 @@ static inline size_t flow_keys_hash_length(const struct flow_keys *flow) { size_t diff = FLOW_KEYS_HASH_OFFSET + sizeof(flow->addrs); BUILD_BUG_ON((sizeof(*flow) - FLOW_KEYS_HASH_OFFSET) % sizeof(u32)); + /* flow.addrs MUST be the last member in struct flow_keys because + * different L3 protocols have different address length + */ BUILD_BUG_ON(offsetof(typeof(*flow), addrs) != sizeof(*flow) - sizeof(flow->addrs)); @@ -1421,6 +1424,9 @@ __be32 flow_get_u32_dst(const struct flow_keys *flow) } EXPORT_SYMBOL(flow_get_u32_dst); +/* Sort the source and destination IP (and the ports if the IP are the same), + * to have consistent hash within the two directions + */ static inline void __flow_hash_consistentify(struct flow_keys *keys) { int addr_diff, i; From patchwork Mon Oct 21 20:09:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matteo Croce X-Patchwork-Id: 1180840 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 (no SPF record) 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=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="OFd3EbEE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46xnnv4MTRz9s7T for ; Tue, 22 Oct 2019 07:10:59 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730214AbfJUUK6 (ORCPT ); Mon, 21 Oct 2019 16:10:58 -0400 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:20092 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730069AbfJUUK5 (ORCPT ); Mon, 21 Oct 2019 16:10:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571688655; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=c6Zm4IY7VrUnQ8RKTixaznYCgJL3nPqGqx5Lz+kk3DI=; b=OFd3EbEEXhbnQEI415XsMvGbR1rw1WEeWmYgYS+tRN+470O/kh5+bPUDaFLW0wej8Empi4 G+LcCxcjxfZf6yrlFk19Xul7WyWjrhfy8UE0dkLYnhHC8Iwsl+OPe8BRXz1z1SxlHO8FAt 3DrvnHTTnqQ0IG4KjfHXHp8aq5ZHwxM= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-193-_-nTbgsYMfy8fsdU9k-agw-1; Mon, 21 Oct 2019 16:10:54 -0400 Received: by mail-wm1-f72.google.com with SMTP id z24so5245848wmk.8 for ; Mon, 21 Oct 2019 13:10:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FOEIRt2uhE+VjfvSvcsGDHwxP6iiWF3+DKbQW0z4Upk=; b=QvnAVvf3W36P9XMPvjwsYDk5qENeT+/i2T29FL9P8ksdbaNtFtyF+sPPZ43cJ5xTpH pDqThzpfaiWPgSA4gm1HEe93Hjo+lXTxA/BLcgxeIE6YGm0snXhgHfotS6lqN8GLtx8H oYOzN2ASFc6w1r+Ug9kQCivHNOAjZWyTKVtbmDluzvNW6Z39cpUftWXFAjTCIM9fSwKZ OSuUSdSDF14aBDbc/n0Wkc0UTE/xmIAXBn7oweZ9PuLW3nFxzl/GrVBHprAtDd4FmG0Q h2DnFC3MOEnQDTU2DnYL51STnzeFptQpG+/5X7FomZYhiaHTKM3GnNlyC5bu8ZRRkU2Z Uj6Q== X-Gm-Message-State: APjAAAVf8QnHhFB2AyAJ/W6O7xOuqoDKgTEMVEl9ILiSEVEl+THjuvdb QemJg8Vcvzv4mDPS2O0G+NUaXSQxQKIfwlUFqubfDGBy2ep8di3qEaTOx73xgluo+H7/J0NSR3Z xLPB9S2zZQ9BtzVHq X-Received: by 2002:adf:9001:: with SMTP id h1mr56209wrh.185.1571688652940; Mon, 21 Oct 2019 13:10:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqyjKq5z+ZvGKweJtbSOvFKPAgD60uXyeSii8F8KpwtDz1LQXgx+Y5uWrPkX1jc35qNA0oxQQg== X-Received: by 2002:adf:9001:: with SMTP id h1mr56197wrh.185.1571688652744; Mon, 21 Oct 2019 13:10:52 -0700 (PDT) Received: from turbo.teknoraver.net (net-109-115-41-234.cust.vodafonedsl.it. [109.115.41.234]) by smtp.gmail.com with ESMTPSA id l18sm20701933wrn.48.2019.10.21.13.10.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Oct 2019 13:10:52 -0700 (PDT) From: Matteo Croce To: netdev@vger.kernel.org Cc: Jay Vosburgh , Veaceslav Falico , Andy Gospodarek , "David S . Miller " , Stanislav Fomichev , Daniel Borkmann , Song Liu , Alexei Starovoitov , Paul Blakey , linux-kernel@vger.kernel.org Subject: [PATCH net-next 2/4] flow_dissector: skip the ICMP dissector for non ICMP packets Date: Mon, 21 Oct 2019 22:09:46 +0200 Message-Id: <20191021200948.23775-3-mcroce@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191021200948.23775-1-mcroce@redhat.com> References: <20191021200948.23775-1-mcroce@redhat.com> MIME-Version: 1.0 X-MC-Unique: _-nTbgsYMfy8fsdU9k-agw-1 X-Mimecast-Spam-Score: 0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org FLOW_DISSECTOR_KEY_ICMP is checked for every packet, not only ICMP ones. Even if the test overhead is probably negligible, move the ICMP dissector code under the big 'switch(ip_proto)' so it gets called only for ICMP packets. Signed-off-by: Matteo Croce Reviewed-by: Simon Horman --- net/core/flow_dissector.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index affde70dad47..6443fac65ce8 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -203,6 +203,25 @@ __be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto, } EXPORT_SYMBOL(__skb_flow_get_ports); +/* If FLOW_DISSECTOR_KEY_ICMP is set, get the Type and Code from an ICMP packet + * using skb_flow_get_be16(). + */ +static void __skb_flow_dissect_icmp(const struct sk_buff *skb, + struct flow_dissector *flow_dissector, + void *target_container, + void *data, int thoff, int hlen) +{ + struct flow_dissector_key_icmp *key_icmp; + + if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ICMP)) + return; + + key_icmp = skb_flow_dissector_target(flow_dissector, + FLOW_DISSECTOR_KEY_ICMP, + target_container); + key_icmp->icmp = skb_flow_get_be16(skb, thoff, data, hlen); +} + void skb_flow_dissect_meta(const struct sk_buff *skb, struct flow_dissector *flow_dissector, void *target_container) @@ -853,7 +872,6 @@ bool __skb_flow_dissect(const struct net *net, struct flow_dissector_key_basic *key_basic; struct flow_dissector_key_addrs *key_addrs; struct flow_dissector_key_ports *key_ports; - struct flow_dissector_key_icmp *key_icmp; struct flow_dissector_key_tags *key_tags; struct flow_dissector_key_vlan *key_vlan; struct bpf_prog *attached = NULL; @@ -1295,6 +1313,12 @@ bool __skb_flow_dissect(const struct net *net, data, nhoff, hlen); break; + case IPPROTO_ICMP: + case IPPROTO_ICMPV6: + __skb_flow_dissect_icmp(skb, flow_dissector, target_container, + data, nhoff, hlen); + break; + default: break; } @@ -1308,14 +1332,6 @@ bool __skb_flow_dissect(const struct net *net, data, hlen); } - if (dissector_uses_key(flow_dissector, - FLOW_DISSECTOR_KEY_ICMP)) { - key_icmp = skb_flow_dissector_target(flow_dissector, - FLOW_DISSECTOR_KEY_ICMP, - target_container); - key_icmp->icmp = skb_flow_get_be16(skb, nhoff, data, hlen); - } - /* Process result of IP proto processing */ switch (fdret) { case FLOW_DISSECT_RET_PROTO_AGAIN: From patchwork Mon Oct 21 20:09:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matteo Croce X-Patchwork-Id: 1180841 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 (no SPF record) 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=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="NZZyn7yd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46xnpF4rJRz9sPT for ; Tue, 22 Oct 2019 07:11:17 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730327AbfJUULO (ORCPT ); Mon, 21 Oct 2019 16:11:14 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:27822 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730106AbfJUULN (ORCPT ); Mon, 21 Oct 2019 16:11:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571688672; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FXZ+SxgXr/2IGwUb0gOTBXyZ2gLzS6PaHZmM+kn9m+w=; b=NZZyn7ydNCA72ESKbU5cfsOCOtQvG5clDa/Yro9b1y/CNmEVd/a2GP2Wm9Y0TQ1JDWclwC pY4iV34EvHZTaRUAZ69NdNrVcCR4u9ioHRfRrlyXO5aZdlzYj0faPRzcEzIL07PTZ8fYlQ NnQm+AhthhWGBCABPa0W2XLYUPRli/g= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-372-bcYYO6lyP16HLdl7KU64bA-1; Mon, 21 Oct 2019 16:11:04 -0400 Received: by mail-wm1-f70.google.com with SMTP id a81so2897144wma.4 for ; Mon, 21 Oct 2019 13:11:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jJvmymGcUv0ZDOsi0Z21jQGhJ08AOs478/mU5pDqUEY=; b=cWefM6KXqcYyC3pJHaUld29xNBkSUsk54rmCzwnqx1S8uVACE0wao/O29dK5LMJkSb huPUVGdGmMvkyZzolqYoTsyyHxPd0aLp619YSU31KnUVgcmPJIbb2qdHBX0y1tZVF8y/ gEUW3bx1iFhsZ8hQ9pZGbcW3UP6+yhnV26lfah/DEk8KMzpRmBXACk/i3VqOCC1+ndMB BCa2r3dwDFL36gyFa507X5k2MC2nWf+v1XESFuj/WPhXBoOu9/Mi0yjdiwshFNnPL8au abpZQ55VlHGTXbbOnreqy/vNDXw8EDzJQ8SvnkHPTfFXxMGz4X1wLpDZZdODaYuqlw7I 1AyQ== X-Gm-Message-State: APjAAAVWibYoVh/4jnRjZHnKV4iQ/5h71vYGOyydL7xXNlP0d8KkdUnM /TpJ3KJTSF23I4PMTO4gwR1ub1dWO77GgcOYgZM2ztP5qlRocl2TawUQFvuo3IBnTlgKSvmJhzd 2ee0EWK67TImPbh4E X-Received: by 2002:adf:f145:: with SMTP id y5mr66183wro.330.1571688662755; Mon, 21 Oct 2019 13:11:02 -0700 (PDT) X-Google-Smtp-Source: APXvYqy+sI/Xw1A3bu0WOul8+P7IPlqyM4jG0vQhFy1OpPQi1LCIpA14yvUaDPuSrhvcoK7tVZPyXA== X-Received: by 2002:adf:f145:: with SMTP id y5mr66158wro.330.1571688662477; Mon, 21 Oct 2019 13:11:02 -0700 (PDT) Received: from turbo.teknoraver.net (net-109-115-41-234.cust.vodafonedsl.it. [109.115.41.234]) by smtp.gmail.com with ESMTPSA id l18sm20701933wrn.48.2019.10.21.13.11.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Oct 2019 13:11:01 -0700 (PDT) From: Matteo Croce To: netdev@vger.kernel.org Cc: Jay Vosburgh , Veaceslav Falico , Andy Gospodarek , "David S . Miller " , Stanislav Fomichev , Daniel Borkmann , Song Liu , Alexei Starovoitov , Paul Blakey , linux-kernel@vger.kernel.org Subject: [PATCH net-next 3/4] flow_dissector: extract more ICMP information Date: Mon, 21 Oct 2019 22:09:47 +0200 Message-Id: <20191021200948.23775-4-mcroce@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191021200948.23775-1-mcroce@redhat.com> References: <20191021200948.23775-1-mcroce@redhat.com> MIME-Version: 1.0 X-MC-Unique: bcYYO6lyP16HLdl7KU64bA-1 X-Mimecast-Spam-Score: 0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The ICMP flow dissector currently parses only the Type and Code fields. Some ICMP packets (echo, timestamp) have a 16 bit Identifier field which is used to correlate packets. Add such field in flow_dissector_key_icmp and replace skb_flow_get_be16() with a more complex function which populate this field. Signed-off-by: Matteo Croce --- include/net/flow_dissector.h | 10 +++++- net/core/flow_dissector.c | 64 ++++++++++++++++++++++-------------- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index 7747af3cc500..86c6bf5eab31 100644 --- a/include/net/flow_dissector.h +++ b/include/net/flow_dissector.h @@ -6,6 +6,8 @@ #include #include +struct sk_buff; + /** * struct flow_dissector_key_control: * @thoff: Transport header offset @@ -160,6 +162,7 @@ struct flow_dissector_key_ports { * icmp: ICMP type (high) and code (low) * type: ICMP type * code: ICMP code + * id: session identifier */ struct flow_dissector_key_icmp { union { @@ -169,6 +172,7 @@ struct flow_dissector_key_icmp { u8 code; }; }; + u16 id; }; /** @@ -282,6 +286,7 @@ struct flow_keys { struct flow_dissector_key_vlan cvlan; struct flow_dissector_key_keyid keyid; struct flow_dissector_key_ports ports; + struct flow_dissector_key_icmp icmp; /* 'addrs' must be the last member */ struct flow_dissector_key_addrs addrs; }; @@ -312,10 +317,13 @@ void make_flow_keys_digest(struct flow_keys_digest *digest, static inline bool flow_keys_have_l4(const struct flow_keys *keys) { - return (keys->ports.ports || keys->tags.flow_label); + return keys->ports.ports || keys->tags.flow_label || keys->icmp.id; } u32 flow_hash_from_keys(struct flow_keys *keys); +void skb_flow_get_icmp_tci(const struct sk_buff *skb, + struct flow_dissector_key_icmp *key_icmp, + void *data, int thoff, int hlen); static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector, enum flow_dissector_key_id key_id) diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 6443fac65ce8..90dcf6f2ef19 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -147,27 +147,6 @@ int skb_flow_dissector_bpf_prog_detach(const union bpf_attr *attr) mutex_unlock(&flow_dissector_mutex); return 0; } -/** - * skb_flow_get_be16 - extract be16 entity - * @skb: sk_buff to extract from - * @poff: offset to extract at - * @data: raw buffer pointer to the packet - * @hlen: packet header length - * - * The function will try to retrieve a be32 entity at - * offset poff - */ -static __be16 skb_flow_get_be16(const struct sk_buff *skb, int poff, - void *data, int hlen) -{ - __be16 *u, _u; - - u = __skb_header_pointer(skb, poff, sizeof(_u), data, hlen, &_u); - if (u) - return *u; - - return 0; -} /** * __skb_flow_get_ports - extract the upper layer ports and return them @@ -203,8 +182,44 @@ __be32 __skb_flow_get_ports(const struct sk_buff *skb, int thoff, u8 ip_proto, } EXPORT_SYMBOL(__skb_flow_get_ports); -/* If FLOW_DISSECTOR_KEY_ICMP is set, get the Type and Code from an ICMP packet - * using skb_flow_get_be16(). +/** + * skb_flow_get_icmp_tci - extract ICMP(6) Type, Code and Identifier fields + * @skb: sk_buff to extract from + * @key_icmp: struct flow_dissector_key_icmp to fill + * @data: raw buffer pointer to the packet + * @toff: offset to extract at + * @hlen: packet header length + */ +void skb_flow_get_icmp_tci(const struct sk_buff *skb, + struct flow_dissector_key_icmp *key_icmp, + void *data, int thoff, int hlen) +{ + struct icmphdr *ih, _ih; + + ih = __skb_header_pointer(skb, thoff, sizeof(_ih), data, hlen, &_ih); + if (!ih) + return; + + key_icmp->type = ih->type; + key_icmp->code = ih->code; + key_icmp->id = 0; + switch (ih->type) { + case ICMP_ECHO: + case ICMP_ECHOREPLY: + case ICMP_TIMESTAMP: + case ICMP_TIMESTAMPREPLY: + case ICMPV6_ECHO_REQUEST: + case ICMPV6_ECHO_REPLY: + /* As we use 0 to signal that the Id field is not present, + * avoid confusion with packets without such field + */ + key_icmp->id = ih->un.echo.id ? : 1; + } +} +EXPORT_SYMBOL(skb_flow_get_icmp_tci); + +/* If FLOW_DISSECTOR_KEY_ICMP is set, dissect an ICMP packet + * using skb_flow_get_icmp_tci(). */ static void __skb_flow_dissect_icmp(const struct sk_buff *skb, struct flow_dissector *flow_dissector, @@ -219,7 +234,8 @@ static void __skb_flow_dissect_icmp(const struct sk_buff *skb, key_icmp = skb_flow_dissector_target(flow_dissector, FLOW_DISSECTOR_KEY_ICMP, target_container); - key_icmp->icmp = skb_flow_get_be16(skb, thoff, data, hlen); + + skb_flow_get_icmp_tci(skb, key_icmp, data, thoff, hlen); } void skb_flow_dissect_meta(const struct sk_buff *skb, From patchwork Mon Oct 21 20:09:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matteo Croce X-Patchwork-Id: 1180842 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 (no SPF record) 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=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="Ddua8wSz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46xnpm3sHQz9s7T for ; Tue, 22 Oct 2019 07:11:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730338AbfJUULn (ORCPT ); Mon, 21 Oct 2019 16:11:43 -0400 Received: from us-smtp-2.mimecast.com ([205.139.110.61]:44329 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730052AbfJUULn (ORCPT ); Mon, 21 Oct 2019 16:11:43 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571688701; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fKQgbWuikOflsblq1Eqq9EME7qTpUP9bfFsTutkuQ7M=; b=Ddua8wSz2zhvRY8DDn8fHFNIlAjkhH43UwJOXZljSZmn3yfFNAPMEx9J+HLVVgPVFpQ748 Do8w77pAHe3j8tUqZo1Ao84he/AwxapLziFoOmPMn6YPJxdK1xarTWhT8p6kxnmJETnCUe X4drbnroJdxM3Xd1grMW5QCHnxYhXiQ= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-200-HCRPstR-N1qIecd6Pa9tKw-1; Mon, 21 Oct 2019 16:11:38 -0400 Received: by mail-wr1-f71.google.com with SMTP id x9so1558865wrq.5 for ; Mon, 21 Oct 2019 13:11:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=51LIoCpMIxhBzrnm/L7yqZ4c2j05Lx5qfysNEUKia7M=; b=kEmDxaYdsdY8+QIb5hLTBa6fDHy0qNp8UApv44ruODtf9g4ihFG9k9miSfcJj/meBe Legs9MvnOqm5OpaUbsZ7zabqbtX+QBbRGlp6yNDWBcjNBnfEZAkh0WsLC2KzbS2su/m5 M3iZBw2EobCe1hrFTuW7jpNiLvoN7ankGlGTNoTQfj2gP5RuGyCQRAgSVGsujY9ji/dt 3e8SiqsH1AF1tNrzin/B09c8mYXl+qw4sn0ldNxtUYcB1Cyn+DMqz3esP+47nVCBkBrV gk0HpotFMZ3KuxM1MkGs7fEO722SLir0CbEdx2wmKFPhIYxmuC1Cg+EUzXH7wXqH3hHj bt0A== X-Gm-Message-State: APjAAAXB1CfmzjHOfocrPRdztD61BqJ3YsPbQkB7GVbbWbwMMWHV7l/5 IEmFVN+IIF7uq4WefkLIfq4JnKX9Gw+IGyIVToH9PX5tFQIT+o9lNptlXUm+CAoLwTYessJnlyU bBg6EbVXrzjMX1n+G X-Received: by 2002:a1c:7c13:: with SMTP id x19mr20545142wmc.80.1571688697035; Mon, 21 Oct 2019 13:11:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqw4eoHxAWTQ+LvXncS6zBXjbLAyI3z6egZ5xoXP+n9ihgqP+iqXdVTfi0xJTu60J9hIc740cg== X-Received: by 2002:a1c:7c13:: with SMTP id x19mr20545124wmc.80.1571688696804; Mon, 21 Oct 2019 13:11:36 -0700 (PDT) Received: from turbo.teknoraver.net (net-109-115-41-234.cust.vodafonedsl.it. [109.115.41.234]) by smtp.gmail.com with ESMTPSA id l18sm20701933wrn.48.2019.10.21.13.11.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Oct 2019 13:11:36 -0700 (PDT) From: Matteo Croce To: netdev@vger.kernel.org Cc: Jay Vosburgh , Veaceslav Falico , Andy Gospodarek , "David S . Miller " , Stanislav Fomichev , Daniel Borkmann , Song Liu , Alexei Starovoitov , Paul Blakey , linux-kernel@vger.kernel.org Subject: [PATCH net-next 4/4] bonding: balance ICMP echoes in layer3+4 mode Date: Mon, 21 Oct 2019 22:09:48 +0200 Message-Id: <20191021200948.23775-5-mcroce@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191021200948.23775-1-mcroce@redhat.com> References: <20191021200948.23775-1-mcroce@redhat.com> MIME-Version: 1.0 X-MC-Unique: HCRPstR-N1qIecd6Pa9tKw-1 X-Mimecast-Spam-Score: 0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The bonding uses the L4 ports to balance flows between slaves. As the ICMP protocol has no ports, those packets are sent all to the same device: # tcpdump -qltnni veth0 ip |sed 's/^/0: /' & # tcpdump -qltnni veth1 ip |sed 's/^/1: /' & # ping -qc1 192.168.0.2 1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 315, seq 1, length 64 1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 315, seq 1, length 64 # ping -qc1 192.168.0.2 1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 316, seq 1, length 64 1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 316, seq 1, length 64 # ping -qc1 192.168.0.2 1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 317, seq 1, length 64 1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 317, seq 1, length 64 But some ICMP packets have an Identifier field which is used to match packets within sessions, let's use this value in the hash function to balance these packets between bond slaves: # ping -qc1 192.168.0.2 0: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 303, seq 1, length 64 0: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 303, seq 1, length 64 # ping -qc1 192.168.0.2 1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 304, seq 1, length 64 1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 304, seq 1, length 64 Signed-off-by: Matteo Croce --- drivers/net/bonding/bond_main.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 21d8fcc83c9c..83afb03f4d07 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -3267,6 +3267,8 @@ static bool bond_flow_dissect(struct bonding *bond, struct sk_buff *skb, return skb_flow_dissect_flow_keys(skb, fk, 0); fk->ports.ports = 0; + fk->icmp.icmp = 0; + fk->icmp.id = 0; noff = skb_network_offset(skb); if (skb->protocol == htons(ETH_P_IP)) { if (unlikely(!pskb_may_pull(skb, noff + sizeof(*iph)))) @@ -3286,8 +3288,14 @@ static bool bond_flow_dissect(struct bonding *bond, struct sk_buff *skb, } else { return false; } - if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34 && proto >= 0) - fk->ports.ports = skb_flow_get_ports(skb, noff, proto); + if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34 && proto >= 0) { + if (proto == IPPROTO_ICMP || proto == IPPROTO_ICMPV6) + skb_flow_get_icmp_tci(skb, &fk->icmp, skb->data, + skb_transport_offset(skb), + skb_headlen(skb)); + else + fk->ports.ports = skb_flow_get_ports(skb, noff, proto); + } return true; } @@ -3314,10 +3322,14 @@ u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb) return bond_eth_hash(skb); if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER23 || - bond->params.xmit_policy == BOND_XMIT_POLICY_ENCAP23) + bond->params.xmit_policy == BOND_XMIT_POLICY_ENCAP23) { hash = bond_eth_hash(skb); - else - hash = (__force u32)flow.ports.ports; + } else { + if (flow.icmp.id) + memcpy(&hash, &flow.icmp, sizeof(hash)); + else + memcpy(&hash, &flow.ports.ports, sizeof(hash)); + } hash ^= (__force u32)flow_get_u32_dst(&flow) ^ (__force u32)flow_get_u32_src(&flow); hash ^= (hash >> 16);