From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 7239D49E2 for ; Thu, 17 May 2018 09:04:27 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id y15-v6so4423328wrg.11 for ; Thu, 17 May 2018 00:04:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=wymp9tneIrUo+OFDwK6n2celxr4W0EHPYONa5IHkMWo=; b=JFERobxSb2nLtqpiAlQC+w6XmuqD0QpGCNTm8tivcfZ+WJtbVyDdAnkBl58QLV8jQn s4uB1JV5PErAzK68+jYePuUVmJmdtwwwMJTFeIGtkhAzgHNs88XmgQRhlzS3W+2DxIOt yFtmaz/nV3Ag7VSM/XWxSr3DjBQWXCeq/q+6cjc0hy07J2BrQEpIjM94vWV6FnTFwFQb p21Q7SGfa6rz4ye964ZQV7leLuf166D6IlF98BeAeKXSuWX0VNHkbVgAF4BtcxPSTb4q uebG7YJ6fMp2fAIdm2QVVnKDf6Nc1lJVYX6aQYA14YZSek49yNtUuviThm6vQBuGoT/3 fr9g== 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:mime-version :content-transfer-encoding; bh=wymp9tneIrUo+OFDwK6n2celxr4W0EHPYONa5IHkMWo=; b=ec2ktnIuXfnUTB6rbpfOFdkDwziXy9vpEc/VLtFrHU2Epvlvi3epRBjPK9cTomlZmN gvkkgHrZLTLsJm38vMU/LoZeRRK2TKuWSCdIdEBtKvaxtYG5iZpM5v+glw7PN8+QgE8O CCcWYp0OZpHoBILFZpCgx8S0KeroR36UGm5X9zg6FzI/PWMYBwLFECq1wDmJHKOsh6W/ bgCcOFfVKtSzrQ00R3TTwljrOZegDBNjdOAeKFGE62j44S7gThdrXqtYpynoGGea8pOy +JvdCz3AGfBY5EVtVxGgdGyLACBsvIc0Q3AyCQMKbgld8s8JaKZL9aQrjr6/j0MDM02X GTtg== X-Gm-Message-State: ALKqPwdKQmuy/TiQTLwLea2Wzfg9k2jgapyKFrhPIrbPMYahBIqvgDkH ZQrCsdTzKMrAsj6nZt32hF1XXmK3Hg== X-Google-Smtp-Source: AB8JxZqKcjlxU4CEf6DhJJgGm3sSzclHW1zmu1/1ZZWuX38gNqHagsT27dQ7e6Bqm9boSekdEwmdZw== X-Received: by 2002:adf:a0ea:: with SMTP id n39-v6mr3105370wrn.87.1526540666903; Thu, 17 May 2018 00:04:26 -0700 (PDT) Received: from laranjeiro-vm.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id u89-v6sm7481722wma.4.2018.05.17.00.04.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 May 2018 00:04:26 -0700 (PDT) From: Nelio Laranjeiro To: stable@dpdk.org, Luca Boccassi Cc: =?UTF-8?q?N=C3=A9lio=20Laranjeiro?= Date: Thu, 17 May 2018 09:03:06 +0200 Message-Id: <74ba0188549a0c9d41b8263880f0ce80080412c7.1526540543.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.17.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [17.11] net/mlx5: fix flow validation X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 May 2018 07:04:27 -0000 From: NĂ©lio Laranjeiro [ backported from upstream commit b7a7c97a40cf8c513ca4526c4734d7401907692c ] Item spec and last are wrongly compared to the NIC capability causing a validation failure when the mask is null. This validation function should only verify the user is not configuring unsupported matching fields. Fixes: 2097d0d1e2cc ("net/mlx5: support basic flow items and actions") Cc: stable@dpdk.org Signed-off-by: Nelio Laranjeiro --- drivers/net/mlx5/mlx5_flow.c | 68 ++++++++++++++---------------------- 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 3a9407b00..6f3bf515c 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -488,7 +488,7 @@ struct ibv_spec_header { }; /** - * Check support for a given item. + * Check item is fully supported by the NIC matching capability. * * @param item[in] * Item specification. @@ -505,49 +505,33 @@ static int mlx5_flow_item_validate(const struct rte_flow_item *item, const uint8_t *mask, unsigned int size) { - int ret = 0; - - if (!item->spec && (item->mask || item->last)) - return -1; - if (item->spec && !item->mask) { - unsigned int i; - const uint8_t *spec = item->spec; - - for (i = 0; i < size; ++i) - if ((spec[i] | mask[i]) != mask[i]) - return -1; - } - if (item->last && !item->mask) { - unsigned int i; - const uint8_t *spec = item->last; - - for (i = 0; i < size; ++i) - if ((spec[i] | mask[i]) != mask[i]) - return -1; - } - if (item->mask) { - unsigned int i; - const uint8_t *spec = item->spec; - - for (i = 0; i < size; ++i) - if ((spec[i] | mask[i]) != mask[i]) - return -1; - } - if (item->spec && item->last) { - uint8_t spec[size]; - uint8_t last[size]; - const uint8_t *apply = mask; - unsigned int i; + unsigned int i; + const uint8_t *spec = item->spec; + const uint8_t *last = item->last; + const uint8_t *m = item->mask ? item->mask : mask; - if (item->mask) - apply = item->mask; - for (i = 0; i < size; ++i) { - spec[i] = ((const uint8_t *)item->spec)[i] & apply[i]; - last[i] = ((const uint8_t *)item->last)[i] & apply[i]; - } - ret = memcmp(spec, last, size); + if (!spec && (item->mask || last)) + goto error; + if (!spec) + return 0; + /* + * Single-pass check to make sure that: + * - item->mask is supported, no bits are set outside mask. + * - Both masked item->spec and item->last are equal (no range + * supported). + */ + for (i = 0; i < size; i++) { + if (!m[i]) + continue; + if ((m[i] | mask[i]) != mask[i]) + goto error; + if (last && ((spec[i] & m[i]) != (last[i] & m[i]))) + goto error; } - return ret; + return 0; +error: + rte_errno = ENOTSUP; + return -rte_errno; } /** -- 2.17.0