summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJonas Gorski <jonas.gorski@bisdn.de>2024-06-12 08:22:48 (GMT)
committerJonas Gorski <jonas.gorski@bisdn.de>2024-08-30 08:54:23 (GMT)
commitd60535c9fa995dea1e7e0e5085dce94a1e2e240f (patch)
tree3a6f39f8ba3e80aa416bce5040ce0266e340a563 /lib
parent22b6cf5c95fcc57f3dcf41056db9b776f60a5f56 (diff)
downloadlibnl-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.c21
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) \