Bonding: split bond_handle_vlan from bond_arp_send
authorHangbin Liu <liuhangbin@gmail.com>
Mon, 21 Feb 2022 05:54:54 +0000 (13:54 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Feb 2022 12:13:45 +0000 (12:13 +0000)
Function bond_handle_vlan() is split from bond_arp_send() for later
IPv6 usage.

Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c

index 57d182c..ca8613d 100644 (file)
@@ -2793,31 +2793,15 @@ static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
        return ret;
 }
 
-/* We go to the (large) trouble of VLAN tagging ARP frames because
- * switches in VLAN mode (especially if ports are configured as
- * "native" to a VLAN) might not pass non-tagged frames.
- */
-static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
-                         __be32 src_ip, struct bond_vlan_tag *tags)
+static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
+                            struct sk_buff *skb)
 {
-       struct sk_buff *skb;
-       struct bond_vlan_tag *outer_tag = tags;
-       struct net_device *slave_dev = slave->dev;
        struct net_device *bond_dev = slave->bond->dev;
-
-       slave_dbg(bond_dev, slave_dev, "arp %d on slave: dst %pI4 src %pI4\n",
-                 arp_op, &dest_ip, &src_ip);
-
-       skb = arp_create(arp_op, ETH_P_ARP, dest_ip, slave_dev, src_ip,
-                        NULL, slave_dev->dev_addr, NULL);
-
-       if (!skb) {
-               net_err_ratelimited("ARP packet allocation failed\n");
-               return;
-       }
+       struct net_device *slave_dev = slave->dev;
+       struct bond_vlan_tag *outer_tag = tags;
 
        if (!tags || tags->vlan_proto == VLAN_N_VID)
-               goto xmit;
+               return true;
 
        tags++;
 
@@ -2834,7 +2818,7 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
                                                tags->vlan_id);
                if (!skb) {
                        net_err_ratelimited("failed to insert inner VLAN tag\n");
-                       return;
+                       return false;
                }
 
                tags++;
@@ -2847,8 +2831,34 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
                                       outer_tag->vlan_id);
        }
 
-xmit:
-       arp_xmit(skb);
+       return true;
+}
+
+/* We go to the (large) trouble of VLAN tagging ARP frames because
+ * switches in VLAN mode (especially if ports are configured as
+ * "native" to a VLAN) might not pass non-tagged frames.
+ */
+static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
+                         __be32 src_ip, struct bond_vlan_tag *tags)
+{
+       struct net_device *bond_dev = slave->bond->dev;
+       struct net_device *slave_dev = slave->dev;
+       struct sk_buff *skb;
+
+       slave_dbg(bond_dev, slave_dev, "arp %d on slave: dst %pI4 src %pI4\n",
+                 arp_op, &dest_ip, &src_ip);
+
+       skb = arp_create(arp_op, ETH_P_ARP, dest_ip, slave_dev, src_ip,
+                        NULL, slave_dev->dev_addr, NULL);
+
+       if (!skb) {
+               net_err_ratelimited("ARP packet allocation failed\n");
+               return;
+       }
+
+       if (bond_handle_vlan(slave, tags, skb))
+               arp_xmit(skb);
+       return;
 }
 
 /* Validate the device path between the @start_dev and the @end_dev.