Commit 6439a0e6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull networking fixes from Jakub Kicinski:
 "Including fixes from Bluetooth.

  Current release - fix to a fix:

   - usb: asix_devices: fix PHY address mask in MDIO bus initialization

  Current release - regressions:

   - Bluetooth: fixes for the split between BIS_LINK and PA_LINK

   - Revert "net: cadence: macb: sama7g5_emac: Remove USARIO CLKEN
     flag", breaks compatibility with some existing device tree blobs

   - dsa: b53: fix reserved register access in b53_fdb_dump()

  Current release - new code bugs:

   - sched: dualpi2: run probability update timer in BH to avoid
     deadlock

   - eth: libwx: fix the size in RSS hash key population

   - pse-pd: pd692x0: improve power budget error paths and handling

  Previous releases - regressions:

   - tls: fix handling of zero-length records on the rx_list

   - hsr: reject HSR frame if skb can't hold tag

   - bonding: fix negotiation flapping in 802.3ad passive mode

  Previous releases - always broken:

   - gso: forbid IPv6 TSO with extensions on devices with only IPV6_CSUM

   - sched: make cake_enqueue return NET_XMIT_CN when past buffer_limit,
     avoid packet drops with low buffer_limit, remove unnecessary WARN()

   - sched: fix backlog accounting after modifying config of a qdisc in
     the middle of the hierarchy

   - mptcp: improve handling of skb extension allocation failures

   - eth: mlx5:
       - fixes for the "HW Steering" flow management method
       - fixes for QoS and device buffer management"

* tag 'net-6.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (81 commits)
  netfilter: nf_reject: don't leak dst refcount for loopback packets
  net/mlx5e: Preserve shared buffer capacity during headroom updates
  net/mlx5e: Query FW for buffer ownership
  net/mlx5: Restore missing scheduling node cleanup on vport enable failure
  net/mlx5: Fix QoS reference leak in vport enable error path
  net/mlx5: Destroy vport QoS element when no configuration remains
  net/mlx5e: Preserve tc-bw during parent changes
  net/mlx5: Remove default QoS group and attach vports directly to root TSAR
  net/mlx5: Base ECVF devlink port attrs from 0
  net: pse-pd: pd692x0: Skip power budget configuration when undefined
  net: pse-pd: pd692x0: Fix power budget leak in manager setup error path
  Octeontx2-af: Skip overlap check for SPI field
  selftests: tls: add tests for zero-length records
  tls: fix handling of zero-length records on the rx_list
  net: airoha: ppe: Do not invalid PPE entries in case of SW hash collision
  selftests: bonding: add test for passive LACP mode
  bonding: send LACPDUs periodically in passive mode after receiving partner's LACPDU
  bonding: update LACP activity flag after setting lacp_active
  Revert "net: cadence: macb: sama7g5_emac: Remove USARIO CLKEN flag"
  ipv6: sr: Fix MAC comparison to be constant-time
  ...
parents 1c656b1e 91a79b79
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ add_addr_timeout - INTEGER (seconds)
	resent to an MPTCP peer that has not acknowledged a previous
	ADD_ADDR message.

	Do not retransmit if set to 0.

	The default value matches TCP_RTO_MAX. This is a per-namespace
	sysctl.

+1 −1
Original line number Diff line number Diff line
@@ -22174,7 +22174,7 @@ F: arch/s390/mm
S390 NETWORK DRIVERS
M:	Alexandra Winter <wintera@linux.ibm.com>
M:	Thorsten Winkler <twinkler@linux.ibm.com>
R:	Aswin Karuvally <aswin@linux.ibm.com>
L:	linux-s390@vger.kernel.org
L:	netdev@vger.kernel.org
S:	Supported
+1 −6
Original line number Diff line number Diff line
@@ -642,12 +642,7 @@ static int btmtk_usb_hci_wmt_sync(struct hci_dev *hdev,
	 * WMT command.
	 */
	err = wait_on_bit_timeout(&data->flags, BTMTK_TX_WAIT_VND_EVT,
				  TASK_INTERRUPTIBLE, HCI_INIT_TIMEOUT);
	if (err == -EINTR) {
		bt_dev_err(hdev, "Execution of wmt command interrupted");
		clear_bit(BTMTK_TX_WAIT_VND_EVT, &data->flags);
		goto err_free_wc;
	}
				  TASK_UNINTERRUPTIBLE, HCI_INIT_TIMEOUT);

	if (err) {
		bt_dev_err(hdev, "Execution of wmt command timed out");
+4 −4
Original line number Diff line number Diff line
@@ -543,9 +543,9 @@ static int ps_setup(struct hci_dev *hdev)
	}

	if (psdata->wakeup_source) {
		ret = devm_request_irq(&serdev->dev, psdata->irq_handler,
					ps_host_wakeup_irq_handler,
					IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
		ret = devm_request_threaded_irq(&serdev->dev, psdata->irq_handler,
						NULL, ps_host_wakeup_irq_handler,
						IRQF_ONESHOT,
						dev_name(&serdev->dev), nxpdev);
		if (ret)
			bt_dev_info(hdev, "error setting wakeup IRQ handler, ignoring\n");
+49 −18
Original line number Diff line number Diff line
@@ -95,13 +95,13 @@ static int ad_marker_send(struct port *port, struct bond_marker *marker);
static void ad_mux_machine(struct port *port, bool *update_slave_arr);
static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
static void ad_tx_machine(struct port *port);
static void ad_periodic_machine(struct port *port, struct bond_params *bond_params);
static void ad_periodic_machine(struct port *port);
static void ad_port_selection_logic(struct port *port, bool *update_slave_arr);
static void ad_agg_selection_logic(struct aggregator *aggregator,
				   bool *update_slave_arr);
static void ad_clear_agg(struct aggregator *aggregator);
static void ad_initialize_agg(struct aggregator *aggregator);
static void ad_initialize_port(struct port *port, int lacp_fast);
static void ad_initialize_port(struct port *port, const struct bond_params *bond_params);
static void ad_enable_collecting(struct port *port);
static void ad_disable_distributing(struct port *port,
				    bool *update_slave_arr);
@@ -1307,10 +1307,16 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
			 * case of EXPIRED even if LINK_DOWN didn't arrive for
			 * the port.
			 */
			port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION;
			port->sm_vars &= ~AD_PORT_MATCHED;
			/* Based on IEEE 8021AX-2014, Figure 6-18 - Receive
			 * machine state diagram, the statue should be
			 * Partner_Oper_Port_State.Synchronization = FALSE;
			 * Partner_Oper_Port_State.LACP_Timeout = Short Timeout;
			 * start current_while_timer(Short Timeout);
			 * Actor_Oper_Port_State.Expired = TRUE;
			 */
			port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION;
			port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT;
			port->partner_oper.port_state |= LACP_STATE_LACP_ACTIVITY;
			port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT));
			port->actor_oper_port_state |= LACP_STATE_EXPIRED;
			port->sm_vars |= AD_PORT_CHURNED;
@@ -1417,11 +1423,10 @@ static void ad_tx_machine(struct port *port)
/**
 * ad_periodic_machine - handle a port's periodic state machine
 * @port: the port we're looking at
 * @bond_params: bond parameters we will use
 *
 * Turn ntt flag on priodically to perform periodic transmission of lacpdu's.
 */
static void ad_periodic_machine(struct port *port, struct bond_params *bond_params)
static void ad_periodic_machine(struct port *port)
{
	periodic_states_t last_state;

@@ -1430,8 +1435,7 @@ static void ad_periodic_machine(struct port *port, struct bond_params *bond_para

	/* check if port was reinitialized */
	if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) ||
	    (!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LACP_STATE_LACP_ACTIVITY)) ||
	    !bond_params->lacp_active) {
	    (!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LACP_STATE_LACP_ACTIVITY))) {
		port->sm_periodic_state = AD_NO_PERIODIC;
	}
	/* check if state machine should change state */
@@ -1955,16 +1959,16 @@ static void ad_initialize_agg(struct aggregator *aggregator)
/**
 * ad_initialize_port - initialize a given port's parameters
 * @port: the port we're looking at
 * @lacp_fast: boolean. whether fast periodic should be used
 * @bond_params: bond parameters we will use
 */
static void ad_initialize_port(struct port *port, int lacp_fast)
static void ad_initialize_port(struct port *port, const struct bond_params *bond_params)
{
	static const struct port_params tmpl = {
		.system_priority = 0xffff,
		.key             = 1,
		.port_number     = 1,
		.port_priority   = 0xff,
		.port_state      = 1,
		.port_state      = 0,
	};
	static const struct lacpdu lacpdu = {
		.subtype		= 0x01,
@@ -1982,12 +1986,14 @@ static void ad_initialize_port(struct port *port, int lacp_fast)
		port->actor_port_priority = 0xff;
		port->actor_port_aggregator_identifier = 0;
		port->ntt = false;
		port->actor_admin_port_state = LACP_STATE_AGGREGATION |
					       LACP_STATE_LACP_ACTIVITY;
		port->actor_oper_port_state  = LACP_STATE_AGGREGATION |
					       LACP_STATE_LACP_ACTIVITY;
		port->actor_admin_port_state = LACP_STATE_AGGREGATION;
		port->actor_oper_port_state  = LACP_STATE_AGGREGATION;
		if (bond_params->lacp_active) {
			port->actor_admin_port_state |= LACP_STATE_LACP_ACTIVITY;
			port->actor_oper_port_state  |= LACP_STATE_LACP_ACTIVITY;
		}

		if (lacp_fast)
		if (bond_params->lacp_fast)
			port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;

		memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
@@ -2201,7 +2207,7 @@ void bond_3ad_bind_slave(struct slave *slave)
		/* port initialization */
		port = &(SLAVE_AD_INFO(slave)->port);

		ad_initialize_port(port, bond->params.lacp_fast);
		ad_initialize_port(port, &bond->params);

		port->slave = slave;
		port->actor_port_number = SLAVE_AD_INFO(slave)->id;
@@ -2513,7 +2519,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
		}

		ad_rx_machine(NULL, port);
		ad_periodic_machine(port, &bond->params);
		ad_periodic_machine(port);
		ad_port_selection_logic(port, &update_slave_arr);
		ad_mux_machine(port, &update_slave_arr);
		ad_tx_machine(port);
@@ -2883,6 +2889,31 @@ void bond_3ad_update_lacp_rate(struct bonding *bond)
	spin_unlock_bh(&bond->mode_lock);
}

/**
 * bond_3ad_update_lacp_active - change the lacp active
 * @bond: bonding struct
 *
 * Update actor_oper_port_state when lacp_active is modified.
 */
void bond_3ad_update_lacp_active(struct bonding *bond)
{
	struct port *port = NULL;
	struct list_head *iter;
	struct slave *slave;
	int lacp_active;

	lacp_active = bond->params.lacp_active;
	spin_lock_bh(&bond->mode_lock);
	bond_for_each_slave(bond, slave, iter) {
		port = &(SLAVE_AD_INFO(slave)->port);
		if (lacp_active)
			port->actor_oper_port_state |= LACP_STATE_LACP_ACTIVITY;
		else
			port->actor_oper_port_state &= ~LACP_STATE_LACP_ACTIVITY;
	}
	spin_unlock_bh(&bond->mode_lock);
}

size_t bond_3ad_stats_size(void)
{
	return nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_RX */
Loading