lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1134101.1746883017@vermin>
Date: Sat, 10 May 2025 15:16:57 +0200
From: Jay Vosburgh <jv@...sburgh.net>
To: David J Wilder <wilder@...ibm.com>
cc: netdev@...r.kernel.org, pradeeps@...ux.vnet.ibm.com,
    pradeep@...ibm.com, i.maximets@....org, amorenoz@...hat.com,
    haliu@...hat.com
Subject: Re: [PATCH net-next v1 1/2] bonding: Adding struct arp_target

David J Wilder <wilder@...ibm.com> wrote:

>Replacing the definition of bond_params.arp_targets (__be32 arp_targets[])
>with:
>
>struct arp_target {
>        __be32 target_ip;
>        struct bond_vlan_tag *tags;
>};

	Since this struct is only for bonding, perhaps "struct
bond_arp_target"?

>To provide storage for a list of vlan tags for each target.
>
>All references to arp_target are change to use the new structure.
>
>Signed-off-by: David J Wilder <wilder@...ibm.com>
>---
> drivers/net/bonding/bond_main.c    | 29 ++++++++++++++++-------------
> drivers/net/bonding/bond_netlink.c |  4 ++--
> drivers/net/bonding/bond_options.c | 18 +++++++++---------
> drivers/net/bonding/bond_procfs.c  |  4 ++--
> drivers/net/bonding/bond_sysfs.c   |  4 ++--
> include/net/bonding.h              | 15 ++++++++++-----
> 6 files changed, 41 insertions(+), 33 deletions(-)
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index d05226484c64..ab388dab218a 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -3151,26 +3151,29 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
> {
> 	struct rtable *rt;
> 	struct bond_vlan_tag *tags;
>-	__be32 *targets = bond->params.arp_targets, addr;
>+	struct arp_target *targets = bond->params.arp_targets;
>+	__be32 target_ip, addr;
> 	int i;
> 
>-	for (i = 0; i < BOND_MAX_ARP_TARGETS && targets[i]; i++) {
>+	for (i = 0; i < BOND_MAX_ARP_TARGETS && targets[i].target_ip; i++) {
>+		target_ip = targets[i].target_ip;
>+		tags = targets[i].tags;
>+
> 		slave_dbg(bond->dev, slave->dev, "%s: target %pI4\n",
>-			  __func__, &targets[i]);
>-		tags = NULL;
>+			  __func__, &target_ip);

	Perhaps add the tags to the debug message?  It might be kind of
a pain to format, but seems like it would be useful.

	-J

> 
> 		/* Find out through which dev should the packet go */
>-		rt = ip_route_output(dev_net(bond->dev), targets[i], 0, 0, 0,
>+		rt = ip_route_output(dev_net(bond->dev), target_ip, 0, 0, 0,
> 				     RT_SCOPE_LINK);
> 		if (IS_ERR(rt)) {
>-			/* there's no route to target - try to send arp
>+			/* there's no route to target_ip - try to send arp
> 			 * probe to generate any traffic (arp_validate=0)
> 			 */
> 			if (bond->params.arp_validate)
> 				pr_warn_once("%s: no route to arp_ip_target %pI4 and arp_validate is set\n",
> 					     bond->dev->name,
>-					     &targets[i]);
>-			bond_arp_send(slave, ARPOP_REQUEST, targets[i],
>+					     &target_ip);
>+			bond_arp_send(slave, ARPOP_REQUEST, target_ip,
> 				      0, tags);
> 			continue;
> 		}
>@@ -3188,15 +3191,15 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
> 
> 		/* Not our device - skip */
> 		slave_dbg(bond->dev, slave->dev, "no path to arp_ip_target %pI4 via rt.dev %s\n",
>-			   &targets[i], rt->dst.dev ? rt->dst.dev->name : "NULL");
>+			   &target_ip, rt->dst.dev ? rt->dst.dev->name : "NULL");
> 
> 		ip_rt_put(rt);
> 		continue;
> 
> found:
>-		addr = bond_confirm_addr(rt->dst.dev, targets[i], 0);
>+		addr = bond_confirm_addr(rt->dst.dev, target_ip, 0);
> 		ip_rt_put(rt);
>-		bond_arp_send(slave, ARPOP_REQUEST, targets[i], addr, tags);
>+		bond_arp_send(slave, ARPOP_REQUEST, target_ip, addr, tags);
> 		kfree(tags);
> 	}
> }
>@@ -6102,7 +6105,7 @@ static int __init bond_check_params(struct bond_params *params)
> 	int arp_all_targets_value = 0;
> 	u16 ad_actor_sys_prio = 0;
> 	u16 ad_user_port_key = 0;
>-	__be32 arp_target[BOND_MAX_ARP_TARGETS] = { 0 };
>+	struct arp_target arp_target[BOND_MAX_ARP_TARGETS] = { 0 };
> 	int arp_ip_count;
> 	int bond_mode	= BOND_MODE_ROUNDROBIN;
> 	int xmit_hashtype = BOND_XMIT_POLICY_LAYER2;
>@@ -6296,7 +6299,7 @@ static int __init bond_check_params(struct bond_params *params)
> 			arp_interval = 0;
> 		} else {
> 			if (bond_get_targets_ip(arp_target, ip) == -1)
>-				arp_target[arp_ip_count++] = ip;
>+				arp_target[arp_ip_count++].target_ip = ip;
> 			else
> 				pr_warn("Warning: duplicate address %pI4 in arp_ip_target, skipping\n",
> 					&ip);
>diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
>index ac5e402c34bc..1a3d17754c0a 100644
>--- a/drivers/net/bonding/bond_netlink.c
>+++ b/drivers/net/bonding/bond_netlink.c
>@@ -688,8 +688,8 @@ static int bond_fill_info(struct sk_buff *skb,
> 
> 	targets_added = 0;
> 	for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
>-		if (bond->params.arp_targets[i]) {
>-			if (nla_put_be32(skb, i, bond->params.arp_targets[i]))
>+		if (bond->params.arp_targets[i].target_ip) {
>+			if (nla_put_be32(skb, i, bond->params.arp_targets[i].target_ip))
> 				goto nla_put_failure;
> 			targets_added = 1;
> 		}
>diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
>index 91893c29b899..54940950079e 100644
>--- a/drivers/net/bonding/bond_options.c
>+++ b/drivers/net/bonding/bond_options.c
>@@ -1090,7 +1090,7 @@ static int bond_option_arp_interval_set(struct bonding *bond,
> 			netdev_dbg(bond->dev, "ARP monitoring cannot be used with MII monitoring. Disabling MII monitoring\n");
> 			bond->params.miimon = 0;
> 		}
>-		if (!bond->params.arp_targets[0])
>+		if (!bond->params.arp_targets[0].target_ip)
> 			netdev_dbg(bond->dev, "ARP monitoring has been set up, but no ARP targets have been specified\n");
> 	}
> 	if (bond->dev->flags & IFF_UP) {
>@@ -1118,20 +1118,20 @@ static void _bond_options_arp_ip_target_set(struct bonding *bond, int slot,
> 					    __be32 target,
> 					    unsigned long last_rx)
> {
>-	__be32 *targets = bond->params.arp_targets;
>+	struct arp_target *targets = bond->params.arp_targets;
> 	struct list_head *iter;
> 	struct slave *slave;
> 
> 	if (slot >= 0 && slot < BOND_MAX_ARP_TARGETS) {
> 		bond_for_each_slave(bond, slave, iter)
> 			slave->target_last_arp_rx[slot] = last_rx;
>-		targets[slot] = target;
>+		targets[slot].target_ip = target;
> 	}
> }
> 
> static int _bond_option_arp_ip_target_add(struct bonding *bond, __be32 target)
> {
>-	__be32 *targets = bond->params.arp_targets;
>+	struct arp_target *targets = bond->params.arp_targets;
> 	int ind;
> 
> 	if (!bond_is_ip_target_ok(target)) {
>@@ -1166,7 +1166,7 @@ static int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target)
> 
> static int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target)
> {
>-	__be32 *targets = bond->params.arp_targets;
>+	struct arp_target *targets = bond->params.arp_targets;
> 	struct list_head *iter;
> 	struct slave *slave;
> 	unsigned long *targets_rx;
>@@ -1185,20 +1185,20 @@ static int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target)
> 		return -EINVAL;
> 	}
> 
>-	if (ind == 0 && !targets[1] && bond->params.arp_interval)
>+	if (ind == 0 && !targets[1].target_ip && bond->params.arp_interval)
> 		netdev_warn(bond->dev, "Removing last arp target with arp_interval on\n");
> 
> 	netdev_dbg(bond->dev, "Removing ARP target %pI4\n", &target);
> 
> 	bond_for_each_slave(bond, slave, iter) {
> 		targets_rx = slave->target_last_arp_rx;
>-		for (i = ind; (i < BOND_MAX_ARP_TARGETS-1) && targets[i+1]; i++)
>+		for (i = ind; (i < BOND_MAX_ARP_TARGETS - 1) && targets[i + 1].target_ip; i++)
> 			targets_rx[i] = targets_rx[i+1];
> 		targets_rx[i] = 0;
> 	}
>-	for (i = ind; (i < BOND_MAX_ARP_TARGETS-1) && targets[i+1]; i++)
>+	for (i = ind; (i < BOND_MAX_ARP_TARGETS - 1) && targets[i + 1].target_ip; i++)
> 		targets[i] = targets[i+1];
>-	targets[i] = 0;
>+	targets[i].target_ip = 0;
> 
> 	return 0;
> }
>diff --git a/drivers/net/bonding/bond_procfs.c b/drivers/net/bonding/bond_procfs.c
>index 7edf72ec816a..94e6fd7041ee 100644
>--- a/drivers/net/bonding/bond_procfs.c
>+++ b/drivers/net/bonding/bond_procfs.c
>@@ -121,11 +121,11 @@ static void bond_info_show_master(struct seq_file *seq)
> 		seq_printf(seq, "ARP IP target/s (n.n.n.n form):");
> 
> 		for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
>-			if (!bond->params.arp_targets[i])
>+			if (!bond->params.arp_targets[i].target_ip)
> 				break;
> 			if (printed)
> 				seq_printf(seq, ",");
>-			seq_printf(seq, " %pI4", &bond->params.arp_targets[i]);
>+			seq_printf(seq, " %pI4", &bond->params.arp_targets[i].target_ip);
> 			printed = 1;
> 		}
> 		seq_printf(seq, "\n");
>diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
>index 1e13bb170515..d7c09e0a14dd 100644
>--- a/drivers/net/bonding/bond_sysfs.c
>+++ b/drivers/net/bonding/bond_sysfs.c
>@@ -290,9 +290,9 @@ static ssize_t bonding_show_arp_targets(struct device *d,
> 	int i, res = 0;
> 
> 	for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
>-		if (bond->params.arp_targets[i])
>+		if (bond->params.arp_targets[i].target_ip)
> 			res += sysfs_emit_at(buf, res, "%pI4 ",
>-					     &bond->params.arp_targets[i]);
>+					     &bond->params.arp_targets[i].target_ip);
> 	}
> 	if (res)
> 		buf[res-1] = '\n'; /* eat the leftover space */
>diff --git a/include/net/bonding.h b/include/net/bonding.h
>index 95f67b308c19..709ef9a302dd 100644
>--- a/include/net/bonding.h
>+++ b/include/net/bonding.h
>@@ -115,6 +115,11 @@ static inline int is_netpoll_tx_blocked(struct net_device *dev)
> #define is_netpoll_tx_blocked(dev) (0)
> #endif
> 
>+struct arp_target {
>+	__be32 target_ip;
>+	struct bond_vlan_tag *tags;
>+};
>+
> struct bond_params {
> 	int mode;
> 	int xmit_policy;
>@@ -135,7 +140,7 @@ struct bond_params {
> 	int ad_select;
> 	char primary[IFNAMSIZ];
> 	int primary_reselect;
>-	__be32 arp_targets[BOND_MAX_ARP_TARGETS];
>+	struct arp_target arp_targets[BOND_MAX_ARP_TARGETS];
> 	int tx_queues;
> 	int all_slaves_active;
> 	int resend_igmp;
>@@ -522,7 +527,7 @@ static inline unsigned long slave_oldest_target_arp_rx(struct bonding *bond,
> 	int i = 1;
> 	unsigned long ret = slave->target_last_arp_rx[0];
> 
>-	for (; (i < BOND_MAX_ARP_TARGETS) && bond->params.arp_targets[i]; i++)
>+	for (; (i < BOND_MAX_ARP_TARGETS) && bond->params.arp_targets[i].target_ip; i++)
> 		if (time_before(slave->target_last_arp_rx[i], ret))
> 			ret = slave->target_last_arp_rx[i];
> 
>@@ -760,14 +765,14 @@ static inline bool bond_slave_has_mac_rcu(struct bonding *bond, const u8 *mac)
> /* Check if the ip is present in arp ip list, or first free slot if ip == 0
>  * Returns -1 if not found, index if found
>  */
>-static inline int bond_get_targets_ip(__be32 *targets, __be32 ip)
>+static inline int bond_get_targets_ip(struct arp_target *targets, __be32 ip)
> {
> 	int i;
> 
> 	for (i = 0; i < BOND_MAX_ARP_TARGETS; i++)
>-		if (targets[i] == ip)
>+		if (targets[i].target_ip == ip)
> 			return i;
>-		else if (targets[i] == 0)
>+		else if (targets[i].target_ip == 0)
> 			break;
> 
> 	return -1;
>-- 
>2.43.5
>

---
	-Jay Vosburgh, jv@...sburgh.net

Powered by blists - more mailing lists