Commit 4003c9e7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull networking fixes from Paolo Abeni:
 "Including fixes from netfilter, bluetooth and wireless.

  No known regressions outstanding.

  Current release - regressions:

   - wifi: nl80211: fix assoc link handling

   - eth: lan78xx: sanitize return values of register read/write
     functions

  Current release - new code bugs:

   - ethtool: tsinfo: fix dump command

   - bluetooth: btusb: configure altsetting for HCI_USER_CHANNEL

   - eth: mlx5: DR, use the right action structs for STEv3

  Previous releases - regressions:

   - netfilter: nf_tables: make destruction work queue pernet

   - gre: fix IPv6 link-local address generation.

   - wifi: iwlwifi: fix TSO preparation

   - bluetooth: revert "bluetooth: hci_core: fix sleeping function
     called from invalid context"

   - ovs: revert "openvswitch: switch to per-action label counting in
     conntrack"

   - eth:
       - ice: fix switchdev slow-path in LAG
       - bonding: fix incorrect MAC address setting to receive NS
         messages

  Previous releases - always broken:

   - core: prevent TX of unreadable skbs

   - sched: prevent creation of classes with TC_H_ROOT

   - netfilter: nft_exthdr: fix offset with ipv4_find_option()

   - wifi: cfg80211: cancel wiphy_work before freeing wiphy

   - mctp: copy headers if cloned

   - phy: nxp-c45-tja11xx: add errata for TJA112XA/B

   - eth:
       - bnxt: fix kernel panic in the bnxt_get_queue_stats{rx | tx}
       - mlx5: bridge, fix the crash caused by LAG state check"

* tag 'net-6.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (65 commits)
  net: mana: cleanup mana struct after debugfs_remove()
  net/mlx5e: Prevent bridge link show failure for non-eswitch-allowed devices
  net/mlx5: Bridge, fix the crash caused by LAG state check
  net/mlx5: Lag, Check shared fdb before creating MultiPort E-Switch
  net/mlx5: Fix incorrect IRQ pool usage when releasing IRQs
  net/mlx5: HWS, Rightsize bwc matcher priority
  net/mlx5: DR, use the right action structs for STEv3
  Revert "openvswitch: switch to per-action label counting in conntrack"
  net: openvswitch: remove misbehaving actions length check
  selftests: Add IPv6 link-local address generation tests for GRE devices.
  gre: Fix IPv6 link-local address generation.
  netfilter: nft_exthdr: fix offset with ipv4_find_option()
  selftests/tc-testing: Add a test case for DRR class with TC_H_ROOT
  net_sched: Prevent creation of classes with TC_H_ROOT
  ipvs: prevent integer overflow in do_ip_vs_get_ctl()
  selftests: netfilter: skip br_netfilter queue tests if kernel is tainted
  netfilter: nf_conncount: Fully initialize struct nf_conncount_tuple in insert_tree()
  wifi: mac80211: fix MPDU length parsing for EHT 5/6 GHz
  qlcnic: fix memory leak issues in qlcnic_sriov_common.c
  rtase: Fix improper release of ring list entries in rtase_sw_reset
  ...
parents 8f7617f4 2409fa66
Loading
Loading
Loading
Loading
+28 −10
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ F: include/net/ieee80211_radiotap.h
F:	include/net/iw_handler.h
F:	include/net/wext.h
F:	include/uapi/linux/nl80211.h
N:	include/uapi/linux/nl80211-.*
F:	include/uapi/linux/wireless.h
F:	net/wireless/
@@ -514,7 +515,7 @@ F: drivers/hwmon/adm1029.c
ADM8211 WIRELESS DRIVER
L:	linux-wireless@vger.kernel.org
S:	Orphan
F:	drivers/net/wireless/admtek/adm8211.*
F:	drivers/net/wireless/admtek/
ADP1050 HARDWARE MONITOR DRIVER
M:	Radu Sabau <radu.sabau@analog.com>
@@ -6207,7 +6208,7 @@ F: Documentation/process/cve.rst
CW1200 WLAN driver
S:	Orphan
F:	drivers/net/wireless/st/cw1200/
F:	drivers/net/wireless/st/
F:	include/linux/platform_data/net-cw1200.h
CX18 VIDEO4LINUX DRIVER
@@ -13994,6 +13995,7 @@ MARVELL LIBERTAS WIRELESS DRIVER
L:	libertas-dev@lists.infradead.org
S:	Orphan
F:	drivers/net/wireless/marvell/libertas/
F:	drivers/net/wireless/marvell/libertas_tf/
MARVELL MACCHIATOBIN SUPPORT
M:	Russell King <linux@armlinux.org.uk>
@@ -15663,7 +15665,7 @@ M: Ajay Singh <ajay.kathat@microchip.com>
M:	Claudiu Beznea <claudiu.beznea@tuxon.dev>
L:	linux-wireless@vger.kernel.org
S:	Supported
F:	drivers/net/wireless/microchip/wilc1000/
F:	drivers/net/wireless/microchip/
MICROSEMI MIPS SOCS
M:	Alexandre Belloni <alexandre.belloni@bootlin.com>
@@ -16449,6 +16451,23 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git
F:	Documentation/devicetree/bindings/net/wireless/
F:	drivers/net/wireless/
X:	drivers/net/wireless/ath/
X:	drivers/net/wireless/broadcom/
X:	drivers/net/wireless/intel/
X:	drivers/net/wireless/intersil/
X:	drivers/net/wireless/marvell/
X:	drivers/net/wireless/mediatek/mt76/
X:	drivers/net/wireless/mediatek/mt7601u/
X:	drivers/net/wireless/microchip/
X:	drivers/net/wireless/purelifi/
X:	drivers/net/wireless/quantenna/
X:	drivers/net/wireless/ralink/
X:	drivers/net/wireless/realtek/
X:	drivers/net/wireless/rsi/
X:	drivers/net/wireless/silabs/
X:	drivers/net/wireless/st/
X:	drivers/net/wireless/ti/
X:	drivers/net/wireless/zydas/
NETWORKING [DSA]
M:	Andrew Lunn <andrew@lunn.ch>
@@ -17833,7 +17852,7 @@ M: Christian Lamparter <chunkeey@googlemail.com>
L:	linux-wireless@vger.kernel.org
S:	Maintained
W:	https://wireless.wiki.kernel.org/en/users/Drivers/p54
F:	drivers/net/wireless/intersil/p54/
F:	drivers/net/wireless/intersil/
PACKET SOCKETS
M:	Willem de Bruijn <willemdebruijn.kernel@gmail.com>
@@ -19110,7 +19129,7 @@ PURELIFI PLFXLC DRIVER
M:	Srinivasan Raju <srini.raju@purelifi.com>
L:	linux-wireless@vger.kernel.org
S:	Supported
F:	drivers/net/wireless/purelifi/plfxlc/
F:	drivers/net/wireless/purelifi/
PVRUSB2 VIDEO4LINUX DRIVER
M:	Mike Isely <isely@pobox.com>
@@ -19661,7 +19680,7 @@ M: Igor Mitsyanko <imitsyanko@quantenna.com>
R:	Sergey Matyukevich <geomatsi@gmail.com>
L:	linux-wireless@vger.kernel.org
S:	Maintained
F:	drivers/net/wireless/quantenna
F:	drivers/net/wireless/quantenna/
RADEON and AMDGPU DRM DRIVERS
M:	Alex Deucher <alexander.deucher@amd.com>
@@ -19741,7 +19760,7 @@ RALINK RT2X00 WIRELESS LAN DRIVER
M:	Stanislaw Gruszka <stf_xl@wp.pl>
L:	linux-wireless@vger.kernel.org
S:	Maintained
F:	drivers/net/wireless/ralink/rt2x00/
F:	drivers/net/wireless/ralink/
RAMDISK RAM BLOCK DEVICE DRIVER
M:	Jens Axboe <axboe@kernel.dk>
@@ -21500,7 +21519,6 @@ F: include/linux/slimbus.h
SFC NETWORK DRIVER
M:	Edward Cree <ecree.xilinx@gmail.com>
M:	Martin Habets <habetsm.xilinx@gmail.com>
L:	netdev@vger.kernel.org
L:	linux-net-drivers@amd.com
S:	Maintained
@@ -21709,7 +21727,7 @@ SILICON LABS WIRELESS DRIVERS (for WFxxx series)
M:	Jérôme Pouiller <jerome.pouiller@silabs.com>
S:	Supported
F:	Documentation/devicetree/bindings/net/wireless/silabs,wfx.yaml
F:	drivers/net/wireless/silabs/wfx/
F:	drivers/net/wireless/silabs/
SILICON MOTION SM712 FRAME BUFFER DRIVER
M:	Sudip Mukherjee <sudipm.mukherjee@gmail.com>
@@ -26209,7 +26227,7 @@ F: mm/zbud.c
ZD1211RW WIRELESS DRIVER
L:	linux-wireless@vger.kernel.org
S:	Orphan
F:	drivers/net/wireless/zydas/zd1211rw/
F:	drivers/net/wireless/zydas/
ZD1301 MEDIA DRIVER
L:	linux-media@vger.kernel.org
+12 −0
Original line number Diff line number Diff line
@@ -56,6 +56,18 @@ config BT_HCIBTUSB_POLL_SYNC
	  Say Y here to enable USB poll_sync for Bluetooth USB devices by
	  default.

config BT_HCIBTUSB_AUTO_ISOC_ALT
	bool "Automatically adjust alternate setting for Isoc endpoints"
	depends on BT_HCIBTUSB
	default y if CHROME_PLATFORMS
	help
	  Say Y here to automatically adjusting the alternate setting for
	  HCI_USER_CHANNEL whenever a SCO link is established.

	  When enabled, btusb intercepts the HCI_EV_SYNC_CONN_COMPLETE packets
	  and configures isoc endpoint alternate setting automatically when
	  HCI_USER_CHANNEL is in use.

config BT_HCIBTUSB_BCM
	bool "Broadcom protocol support"
	depends on BT_HCIBTUSB
+41 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ static bool force_scofix;
static bool enable_autosuspend = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTOSUSPEND);
static bool enable_poll_sync = IS_ENABLED(CONFIG_BT_HCIBTUSB_POLL_SYNC);
static bool reset = true;
static bool auto_isoc_alt = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTO_ISOC_ALT);

static struct usb_driver btusb_driver;

@@ -1085,6 +1086,42 @@ static inline void btusb_free_frags(struct btusb_data *data)
	spin_unlock_irqrestore(&data->rxlock, flags);
}

static void btusb_sco_connected(struct btusb_data *data, struct sk_buff *skb)
{
	struct hci_event_hdr *hdr = (void *) skb->data;
	struct hci_ev_sync_conn_complete *ev =
		(void *) skb->data + sizeof(*hdr);
	struct hci_dev *hdev = data->hdev;
	unsigned int notify_air_mode;

	if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT)
		return;

	if (skb->len < sizeof(*hdr) || hdr->evt != HCI_EV_SYNC_CONN_COMPLETE)
		return;

	if (skb->len != sizeof(*hdr) + sizeof(*ev) || ev->status)
		return;

	switch (ev->air_mode) {
	case BT_CODEC_CVSD:
		notify_air_mode = HCI_NOTIFY_ENABLE_SCO_CVSD;
		break;

	case BT_CODEC_TRANSPARENT:
		notify_air_mode = HCI_NOTIFY_ENABLE_SCO_TRANSP;
		break;

	default:
		return;
	}

	bt_dev_info(hdev, "enabling SCO with air mode %u", ev->air_mode);
	data->sco_num = 1;
	data->air_mode = notify_air_mode;
	schedule_work(&data->work);
}

static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb)
{
	if (data->intr_interval) {
@@ -1092,6 +1129,10 @@ static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb)
		schedule_delayed_work(&data->rx_work, 0);
	}

	/* Configure altsetting for HCI_USER_CHANNEL on SCO connected */
	if (auto_isoc_alt && hci_dev_test_flag(data->hdev, HCI_USER_CHANNEL))
		btusb_sco_connected(data, skb);

	return data->recv_event(data->hdev, skb);
}

+47 −8
Original line number Diff line number Diff line
@@ -1242,10 +1242,28 @@ static bool slave_can_set_ns_maddr(const struct bonding *bond, struct slave *sla
	       slave->dev->flags & IFF_MULTICAST;
}

/**
 * slave_set_ns_maddrs - add/del all NS mac addresses for slave
 * @bond: bond device
 * @slave: slave device
 * @add: add or remove all the NS mac addresses
 *
 * This function tries to add or delete all the NS mac addresses on the slave
 *
 * Note, the IPv6 NS target address is the unicast address in Neighbor
 * Solicitation (NS) message. The dest address of NS message should be
 * solicited-node multicast address of the target. The dest mac of NS message
 * is converted from the solicited-node multicast address.
 *
 * This function is called when
 *   * arp_validate changes
 *   * enslaving, releasing new slaves
 */
static void slave_set_ns_maddrs(struct bonding *bond, struct slave *slave, bool add)
{
	struct in6_addr *targets = bond->params.ns_targets;
	char slot_maddr[MAX_ADDR_LEN];
	struct in6_addr mcaddr;
	int i;

	if (!slave_can_set_ns_maddr(bond, slave))
@@ -1255,7 +1273,8 @@ static void slave_set_ns_maddrs(struct bonding *bond, struct slave *slave, bool
		if (ipv6_addr_any(&targets[i]))
			break;

		if (!ndisc_mc_map(&targets[i], slot_maddr, slave->dev, 0)) {
		addrconf_addr_solict_mult(&targets[i], &mcaddr);
		if (!ndisc_mc_map(&mcaddr, slot_maddr, slave->dev, 0)) {
			if (add)
				dev_mc_add(slave->dev, slot_maddr);
			else
@@ -1278,23 +1297,43 @@ void bond_slave_ns_maddrs_del(struct bonding *bond, struct slave *slave)
	slave_set_ns_maddrs(bond, slave, false);
}

/**
 * slave_set_ns_maddr - set new NS mac address for slave
 * @bond: bond device
 * @slave: slave device
 * @target: the new IPv6 target
 * @slot: the old IPv6 target in the slot
 *
 * This function tries to replace the old mac address to new one on the slave.
 *
 * Note, the target/slot IPv6 address is the unicast address in Neighbor
 * Solicitation (NS) message. The dest address of NS message should be
 * solicited-node multicast address of the target. The dest mac of NS message
 * is converted from the solicited-node multicast address.
 *
 * This function is called when
 *   * An IPv6 NS target is added or removed.
 */
static void slave_set_ns_maddr(struct bonding *bond, struct slave *slave,
			       struct in6_addr *target, struct in6_addr *slot)
{
	char target_maddr[MAX_ADDR_LEN], slot_maddr[MAX_ADDR_LEN];
	char mac_addr[MAX_ADDR_LEN];
	struct in6_addr mcast_addr;

	if (!bond->params.arp_validate || !slave_can_set_ns_maddr(bond, slave))
		return;

	/* remove the previous maddr from slave */
	/* remove the previous mac addr from slave */
	addrconf_addr_solict_mult(slot, &mcast_addr);
	if (!ipv6_addr_any(slot) &&
	    !ndisc_mc_map(slot, slot_maddr, slave->dev, 0))
		dev_mc_del(slave->dev, slot_maddr);
	    !ndisc_mc_map(&mcast_addr, mac_addr, slave->dev, 0))
		dev_mc_del(slave->dev, mac_addr);

	/* add new maddr on slave if target is set */
	/* add new mac addr on slave if target is set */
	addrconf_addr_solict_mult(target, &mcast_addr);
	if (!ipv6_addr_any(target) &&
	    !ndisc_mc_map(target, target_maddr, slave->dev, 0))
		dev_mc_add(slave->dev, target_maddr);
	    !ndisc_mc_map(&mcast_addr, mac_addr, slave->dev, 0))
		dev_mc_add(slave->dev, mac_addr);
}

static void _bond_options_ns_ip6_target_set(struct bonding *bond, int slot,
+48 −11
Original line number Diff line number Diff line
@@ -2208,13 +2208,11 @@ mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
	return err;
}

static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
static int mv88e6xxx_port_db_get(struct mv88e6xxx_chip *chip,
				 const unsigned char *addr, u16 vid,
					u8 state)
				 u16 *fid, struct mv88e6xxx_atu_entry *entry)
{
	struct mv88e6xxx_atu_entry entry;
	struct mv88e6xxx_vtu_entry vlan;
	u16 fid;
	int err;

	/* Ports have two private address databases: one for when the port is
@@ -2225,7 +2223,7 @@ static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
	 * VLAN ID into the port's database used for VLAN-unaware bridging.
	 */
	if (vid == 0) {
		fid = MV88E6XXX_FID_BRIDGED;
		*fid = MV88E6XXX_FID_BRIDGED;
	} else {
		err = mv88e6xxx_vtu_get(chip, vid, &vlan);
		if (err)
@@ -2235,14 +2233,39 @@ static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
		if (!vlan.valid)
			return -EOPNOTSUPP;

		fid = vlan.fid;
		*fid = vlan.fid;
	}

	entry.state = 0;
	ether_addr_copy(entry.mac, addr);
	eth_addr_dec(entry.mac);
	entry->state = 0;
	ether_addr_copy(entry->mac, addr);
	eth_addr_dec(entry->mac);

	return mv88e6xxx_g1_atu_getnext(chip, *fid, entry);
}

static bool mv88e6xxx_port_db_find(struct mv88e6xxx_chip *chip,
				   const unsigned char *addr, u16 vid)
{
	struct mv88e6xxx_atu_entry entry;
	u16 fid;
	int err;

	err = mv88e6xxx_port_db_get(chip, addr, vid, &fid, &entry);
	if (err)
		return false;

	return entry.state && ether_addr_equal(entry.mac, addr);
}

	err = mv88e6xxx_g1_atu_getnext(chip, fid, &entry);
static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
					const unsigned char *addr, u16 vid,
					u8 state)
{
	struct mv88e6xxx_atu_entry entry;
	u16 fid;
	int err;

	err = mv88e6xxx_port_db_get(chip, addr, vid, &fid, &entry);
	if (err)
		return err;

@@ -2846,6 +2869,13 @@ static int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
	mv88e6xxx_reg_lock(chip);
	err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid,
					   MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC);
	if (err)
		goto out;

	if (!mv88e6xxx_port_db_find(chip, addr, vid))
		err = -ENOSPC;

out:
	mv88e6xxx_reg_unlock(chip);

	return err;
@@ -6614,6 +6644,13 @@ static int mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
	mv88e6xxx_reg_lock(chip);
	err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
					   MV88E6XXX_G1_ATU_DATA_STATE_MC_STATIC);
	if (err)
		goto out;

	if (!mv88e6xxx_port_db_find(chip, mdb->addr, mdb->vid))
		err = -ENOSPC;

out:
	mv88e6xxx_reg_unlock(chip);

	return err;
Loading