Updated bond_fill_info() to support extended arp_ip_target format. Forward and backward compatibility between the kernel and iprout2 is preserved. Signed-off-by: David Wilder --- drivers/net/bonding/bond_netlink.c | 29 +++++++++++++++++++++++++++-- include/net/bonding.h | 1 + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c index 5486ef40907e..64d314dc3c7e 100644 --- a/drivers/net/bonding/bond_netlink.c +++ b/drivers/net/bonding/bond_netlink.c @@ -701,8 +701,33 @@ 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].target_ip) { - if (nla_put_be32(skb, i, bond->params.arp_targets[i].target_ip)) + struct bond_arp_target *target = &bond->params.arp_targets[i]; + struct Data { + __be32 addr; + struct bond_vlan_tag vlans[BOND_MAX_VLAN_TAGS + 1]; + } data; + int size = 0, level; + + if (!target->target_ip) + break; + + data.addr = target->target_ip; + size = sizeof(target->target_ip); + + for (level = 0; target->flags & BOND_TARGET_USERTAGS && target->tags; level++) { + if (level > BOND_MAX_VLAN_TAGS) + goto nla_put_failure; + + memcpy(&data.vlans[level], &target->tags[level], + sizeof(struct bond_vlan_tag)); + size = size + sizeof(struct bond_vlan_tag); + + if (target->tags[level].vlan_proto == BOND_VLAN_PROTO_NONE) + break; + } + + if (size) { + if (nla_put(skb, i, size, &data)) goto nla_put_failure; targets_added = 1; } diff --git a/include/net/bonding.h b/include/net/bonding.h index 1989b71ffa16..2502cf8428b3 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h @@ -811,6 +811,7 @@ static inline netdev_tx_t bond_tx_drop(struct net_device *dev, struct sk_buff *s /* Helpers for handling arp_ip_target */ #define BOND_OPTION_STRING_MAX_SIZE 64 +#define BOND_MAX_VLAN_TAGS 5 #define BOND_VLAN_PROTO_NONE cpu_to_be16(0xffff) static inline char *bond_arp_target_to_string(struct bond_arp_target *target, -- 2.43.5