From: Tao Ren <taoren@fb.com>
To: "David S . Miller" <davem@davemloft.net>,
Maxim Mikityanskiy <maximmi@mellanox.com>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>,
Samuel Mendoza-Jonas <sam@mendozajonas.com>,
Jakub Kicinski <jakub.kicinski@netronome.com>,
Joel Stanley <joel@jms.id.au>, Andrew Jeffery <andrew@aj.id.au>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>
Cc: Tao Ren <taoren@fb.com>
Subject: [PATCH net v4] net/ncsi: handle overflow when incrementing mac address
Date: Wed, 24 Apr 2019 01:43:32 +0000 [thread overview]
Message-ID: <20190424014310.24253-1-taoren@fb.com> (raw)
Previously BMC's MAC address is calculated by simply adding 1 to the
last byte of network controller's MAC address, and it produces incorrect
result when network controller's MAC address ends with 0xFF.
The problem can be fixed by calling eth_addr_inc() function to increment
MAC address; besides, the MAC address is also validated before assigning
to BMC.
Fixes: cb10c7c0dfd9 ("net/ncsi: Add NCSI Broadcom OEM command")
Signed-off-by: Tao Ren <taoren@fb.com>
---
include/linux/etherdevice.h | 12 ++++++++++++
net/ncsi/ncsi-rsp.c | 6 +++++-
2 files changed, 17 insertions(+), 1 deletion(-)
Changes in v4:
- revert the changes in eth_addr_dec() function comment.
Changes in v3:
- squash changes in "etherdevice.h" into this patch.
- fix format issue in function comment.
Changes in v2:
- increment MAC address by calling eth_addr_inc() function.
- validate MAC address before assigning to BMC.
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h
index e2f3b21cd72a..aa8bfd6f738c 100644
--- a/include/linux/etherdevice.h
+++ b/include/linux/etherdevice.h
@@ -448,6 +448,18 @@ static inline void eth_addr_dec(u8 *addr)
u64_to_ether_addr(u, addr);
}
+/**
+ * eth_addr_inc() - Increment the given MAC address.
+ * @addr: Pointer to a six-byte array containing Ethernet address to increment.
+ */
+static inline void eth_addr_inc(u8 *addr)
+{
+ u64 u = ether_addr_to_u64(addr);
+
+ u++;
+ u64_to_ether_addr(u, addr);
+}
+
/**
* is_etherdev_addr - Tell if given Ethernet address belongs to the device.
* @dev: Pointer to a device structure
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
index dc07fcc7938e..802db01e3075 100644
--- a/net/ncsi/ncsi-rsp.c
+++ b/net/ncsi/ncsi-rsp.c
@@ -11,6 +11,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <net/ncsi.h>
@@ -667,7 +668,10 @@ static int ncsi_rsp_handler_oem_bcm_gma(struct ncsi_request *nr)
ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
memcpy(saddr.sa_data, &rsp->data[BCM_MAC_ADDR_OFFSET], ETH_ALEN);
/* Increase mac address by 1 for BMC's address */
- saddr.sa_data[ETH_ALEN - 1]++;
+ eth_addr_inc((u8 *)saddr.sa_data);
+ if (!is_valid_ether_addr((const u8 *)saddr.sa_data))
+ return -ENXIO;
+
ret = ops->ndo_set_mac_address(ndev, &saddr);
if (ret < 0)
netdev_warn(ndev, "NCSI: 'Writing mac address to device failed\n");
--
2.17.1
next reply other threads:[~2019-04-24 1:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-24 1:43 Tao Ren [this message]
2019-04-24 1:44 ` [PATCH net v4] net/ncsi: handle overflow when incrementing mac address Jakub Kicinski
2019-04-24 1:44 ` Jakub Kicinski
2019-04-24 3:49 ` Samuel Mendoza-Jonas
2019-04-24 4:16 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190424014310.24253-1-taoren@fb.com \
--to=taoren@fb.com \
--cc=andrew@aj.id.au \
--cc=bgolaszewski@baylibre.com \
--cc=davem@davemloft.net \
--cc=jakub.kicinski@netronome.com \
--cc=joel@jms.id.au \
--cc=linux-kernel@vger.kernel.org \
--cc=maximmi@mellanox.com \
--cc=netdev@vger.kernel.org \
--cc=openbmc@lists.ozlabs.org \
--cc=sam@mendozajonas.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.