Module Name: src Committed By: msaitoh Date: Thu Sep 12 06:19:47 UTC 2019
Modified Files: src/sys/dev/pci/ixgbe: ixgbe.h ixgbe_vf.c ixgbe_vf.h ixv.c Log Message: - Make SIOCADDMULTI returns ENOSPC when the Ethenet multicast address list exceeds the limit. - State "Ethernet" multicast address. - Use macro. To generate a diff of this commit: cvs rdiff -u -r1.56 -r1.57 src/sys/dev/pci/ixgbe/ixgbe.h cvs rdiff -u -r1.19 -r1.20 src/sys/dev/pci/ixgbe/ixgbe_vf.c cvs rdiff -u -r1.13 -r1.14 src/sys/dev/pci/ixgbe/ixgbe_vf.h cvs rdiff -u -r1.131 -r1.132 src/sys/dev/pci/ixgbe/ixv.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/ixgbe/ixgbe.h diff -u src/sys/dev/pci/ixgbe/ixgbe.h:1.56 src/sys/dev/pci/ixgbe/ixgbe.h:1.57 --- src/sys/dev/pci/ixgbe/ixgbe.h:1.56 Wed Jul 17 03:26:24 2019 +++ src/sys/dev/pci/ixgbe/ixgbe.h Thu Sep 12 06:19:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe.h,v 1.56 2019/07/17 03:26:24 msaitoh Exp $ */ +/* $NetBSD: ixgbe.h,v 1.57 2019/09/12 06:19:47 msaitoh Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -436,8 +436,6 @@ struct rx_ring { u64 flm; }; -#define IXGBE_MAX_VF_MC 30 /* Max number of multicast entries */ - struct ixgbe_vf { u_int pool; u_int rar_index; Index: src/sys/dev/pci/ixgbe/ixgbe_vf.c diff -u src/sys/dev/pci/ixgbe/ixgbe_vf.c:1.19 src/sys/dev/pci/ixgbe/ixgbe_vf.c:1.20 --- src/sys/dev/pci/ixgbe/ixgbe_vf.c:1.19 Wed Sep 11 04:59:55 2019 +++ src/sys/dev/pci/ixgbe/ixgbe_vf.c Thu Sep 12 06:19:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe_vf.c,v 1.19 2019/09/11 04:59:55 msaitoh Exp $ */ +/* $NetBSD: ixgbe_vf.c,v 1.20 2019/09/12 06:19:47 msaitoh Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -409,11 +409,11 @@ s32 ixgbe_update_mc_addr_list_vf(struct DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count); - if (mc_addr_count > 30) { + if (mc_addr_count > IXGBE_MAX_VF_MC) { device_printf(ixgbe_dev_from_hw(hw), - "number of multicast addresses exceeded the limit " - "(%u > 30)\n", mc_addr_count); - cnt = 30; + "number of Ethernet multicast addresses exceeded " + "the limit (%u > %d)\n", mc_addr_count, IXGBE_MAX_VF_MC); + cnt = IXGBE_MAX_VF_MC; } else cnt = mc_addr_count; msgbuf[0] = IXGBE_VF_SET_MULTICAST; Index: src/sys/dev/pci/ixgbe/ixgbe_vf.h diff -u src/sys/dev/pci/ixgbe/ixgbe_vf.h:1.13 src/sys/dev/pci/ixgbe/ixgbe_vf.h:1.14 --- src/sys/dev/pci/ixgbe/ixgbe_vf.h:1.13 Wed Apr 4 08:13:07 2018 +++ src/sys/dev/pci/ixgbe/ixgbe_vf.h Thu Sep 12 06:19:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe_vf.h,v 1.13 2018/04/04 08:13:07 msaitoh Exp $ */ +/* $NetBSD: ixgbe_vf.h,v 1.14 2019/09/12 06:19:47 msaitoh Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -42,6 +42,8 @@ #define IXGBE_VF_MAX_TX_QUEUES 8 #define IXGBE_VF_MAX_RX_QUEUES 8 +#define IXGBE_MAX_VF_MC 30 /* Max number of multicast entries */ + /* DCB define */ #define IXGBE_VF_MAX_TRAFFIC_CLASS 8 Index: src/sys/dev/pci/ixgbe/ixv.c diff -u src/sys/dev/pci/ixgbe/ixv.c:1.131 src/sys/dev/pci/ixgbe/ixv.c:1.132 --- src/sys/dev/pci/ixgbe/ixv.c:1.131 Thu Sep 5 10:01:30 2019 +++ src/sys/dev/pci/ixgbe/ixv.c Thu Sep 12 06:19:47 2019 @@ -1,4 +1,4 @@ -/*$NetBSD: ixv.c,v 1.131 2019/09/05 10:01:30 msaitoh Exp $*/ +/*$NetBSD: ixv.c,v 1.132 2019/09/12 06:19:47 msaitoh Exp $*/ /****************************************************************************** @@ -2920,7 +2920,41 @@ ixv_ioctl(struct ifnet *ifp, u_long comm case SIOCSIFFLAGS: IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)"); break; - case SIOCADDMULTI: + case SIOCADDMULTI: { + struct ether_multi *enm; + struct ether_multistep step; + struct ethercom *ec = &adapter->osdep.ec; + int mcnt = 0; + + /* + * Check the number of multicast address. If it exceeds, + * return ENOSPC. + * Update this code when we support API 1.3. + */ + ETHER_LOCK(ec); + ETHER_FIRST_MULTI(step, ec, enm); + while (enm != NULL) { + mcnt++; + + /* + * This code is before adding, so one room is required + * at least. + */ + if (mcnt > (IXGBE_MAX_VF_MC - 1)) { + device_printf(adapter->dev, + "number of Ethernet multicast addresses " + "exceeds the limit (%d)\n", + IXGBE_MAX_VF_MC); + error = ENOSPC; + break; + } + ETHER_NEXT_MULTI(step, enm); + } + ETHER_UNLOCK(ec); + if (error) + return error; + } + /*FALLTHROUGH*/ case SIOCDELMULTI: IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI"); break;