From 310ec86b391ca94509db57e8bdbafee2ff6d39e7 Mon Sep 17 00:00:00 2001 From: roopa Date: Tue, 8 Jan 2013 05:29:10 -0800 Subject: [PATCH] Add ao_compare support to bridge family af_data This patch adds support for ao_compare operation to bridge link af data operations. Adds field ce_mask to struct bridge_data to work with the ATTR attributes. I can submit separate patches to introduce mask field to ATTR macros. Signed-off-by: Roopa Prabhu Signed-off-by: Wilson Kok Signed-off-by: Thomas Graf --- lib/route/link/bridge.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/route/link/bridge.c b/lib/route/link/bridge.c index 32fd38f..cd9f462 100644 --- a/lib/route/link/bridge.c +++ b/lib/route/link/bridge.c @@ -15,9 +15,12 @@ #include #include +#define BRIDGE_ATTR_PORT_STATE 0x0001 + struct bridge_data { uint8_t b_port_state; + uint32_t ce_mask; /* HACK to support attr macros */ }; static void *bridge_alloc(struct rtnl_link *link) @@ -46,6 +49,7 @@ static int bridge_parse_protinfo(struct rtnl_link *link, struct nlattr *attr, struct bridge_data *bd = data; bd->b_port_state = nla_get_u8(attr); + bd->ce_mask |= BRIDGE_ATTR_PORT_STATE; return 0; } @@ -55,7 +59,22 @@ static void bridge_dump_details(struct rtnl_link *link, { struct bridge_data *bd = data; - nl_dump(p, "port-state %u ", bd->b_port_state); + if (bd->ce_mask & BRIDGE_ATTR_PORT_STATE) + nl_dump(p, "port-state %u ", bd->b_port_state); +} + +static int bridge_compare(struct rtnl_link *_a, struct rtnl_link *_b, + int family, uint32_t attrs, int flags) +{ + struct bridge_data *a = (struct bridge_data *)_a->l_af_data; + struct bridge_data *b = (struct bridge_data *)_b->l_af_data; + int diff = 0; + +#define BRIDGE_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, BRIDGE_ATTR_##ATTR, a, b, EXPR) + diff |= BRIDGE_DIFF(PORT_STATE, a->b_port_state != b->b_port_state); + + return diff; +#undef BRIDGE_DIFF } static const struct nla_policy protinfo_policy = { @@ -70,6 +89,7 @@ static struct rtnl_link_af_ops bridge_ops = { .ao_parse_protinfo = &bridge_parse_protinfo, .ao_dump[NL_DUMP_DETAILS] = &bridge_dump_details, .ao_protinfo_policy = &protinfo_policy, + .ao_compare = &bridge_compare, }; static void __init bridge_init(void)