diff options
author | Jonas Gorski <jonas.gorski@bisdn.de> | 2024-06-12 08:22:48 (GMT) |
---|---|---|
committer | Jonas Gorski <jonas.gorski@bisdn.de> | 2024-08-30 08:54:23 (GMT) |
commit | d60535c9fa995dea1e7e0e5085dce94a1e2e240f (patch) | |
tree | 3a6f39f8ba3e80aa416bce5040ce0266e340a563 /lib | |
parent | 22b6cf5c95fcc57f3dcf41056db9b776f60a5f56 (diff) | |
download | libnl-d60535c9fa995dea1e7e0e5085dce94a1e2e240f.zip libnl-d60535c9fa995dea1e7e0e5085dce94a1e2e240f.tar.gz libnl-d60535c9fa995dea1e7e0e5085dce94a1e2e240f.tar.bz2 |
link/bonding: implement comparing bond links
Implement comparing two bond links to know if their attributes changed.
Signed-off-by: Jonas Gorski <jonas.gorski@bisdn.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/route/link/bonding.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/route/link/bonding.c b/lib/route/link/bonding.c index ec3661d..48c6ad3 100644 --- a/lib/route/link/bonding.c +++ b/lib/route/link/bonding.c @@ -110,12 +110,33 @@ nla_put_failure: return -NLE_MSGSIZE; } +static int bond_info_compare(struct rtnl_link *link_a, struct rtnl_link *link_b, + int flags) +{ + struct bond_info *a = link_a->l_info; + struct bond_info *b = link_b->l_info; + uint32_t attrs = flags & LOOSE_COMPARISON ? b->ce_mask : ~0u; + int diff = 0; + +#define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR) + diff |= _DIFF(BOND_HAS_MODE, a->bn_mode != b->bn_mode); + diff |= _DIFF(BOND_HAS_ACTIVE_SLAVE, a->ifindex != b->ifindex); + diff |= _DIFF(BOND_HAS_HASHING_TYPE, + a->hashing_type != b->hashing_type); + diff |= _DIFF(BOND_HAS_MIIMON, a->miimon != b->miimon); + diff |= _DIFF(BOND_HAS_MIN_LINKS, a->min_links != b->min_links); +#undef _DIFF + + return diff; +} + static struct rtnl_link_info_ops bonding_info_ops = { .io_name = "bond", .io_alloc = bond_info_alloc, .io_clone = bond_info_clone, .io_put_attrs = bond_put_attrs, .io_free = bond_info_free, + .io_compare = bond_info_compare, }; #define IS_BOND_INFO_ASSERT(link) \ |