bonding: add slave_dev field for bond_opt_value
authorHangbin Liu <liuhangbin@gmail.com>
Tue, 21 Jun 2022 07:49:18 +0000 (15:49 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jun 2022 10:27:59 +0000 (11:27 +0100)
Currently, bond_opt_value are mostly used for bonding option settings. If
we want to set a value for slave, we need to re-alloc a string to store
both slave name and vlaue, like bond_option_queue_id_set() does, which
is complex and dumb.

As Jon suggested, let's add a union field slave_dev for bond_opt_value,
which will be benefit for future slave option setting. In function
__bond_opt_init(), we will always check the extra field and set it
if it's not NULL.

Suggested-by: Jonathan Toppins <jtoppins@redhat.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Acked-by: Jonathan Toppins <jtoppins@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/bond_options.h

index 1618b76..eade823 100644 (file)
@@ -83,7 +83,10 @@ struct bond_opt_value {
        char *string;
        u64 value;
        u32 flags;
-       char extra[BOND_OPT_EXTRA_MAXLEN];
+       union {
+               char extra[BOND_OPT_EXTRA_MAXLEN];
+               struct net_device *slave_dev;
+       };
 };
 
 struct bonding;
@@ -133,13 +136,16 @@ static inline void __bond_opt_init(struct bond_opt_value *optval,
                optval->value = value;
        else if (string)
                optval->string = string;
-       else if (extra_len <= BOND_OPT_EXTRA_MAXLEN)
+
+       if (extra && extra_len <= BOND_OPT_EXTRA_MAXLEN)
                memcpy(optval->extra, extra, extra_len);
 }
 #define bond_opt_initval(optval, value) __bond_opt_init(optval, NULL, value, NULL, 0)
 #define bond_opt_initstr(optval, str) __bond_opt_init(optval, str, ULLONG_MAX, NULL, 0)
 #define bond_opt_initextra(optval, extra, extra_len) \
        __bond_opt_init(optval, NULL, ULLONG_MAX, extra, extra_len)
+#define bond_opt_slave_initval(optval, slave_dev, value) \
+       __bond_opt_init(optval, NULL, value, slave_dev, sizeof(struct net_device *))
 
 void bond_option_arp_ip_targets_clear(struct bonding *bond);
 #if IS_ENABLED(CONFIG_IPV6)