bridge: add template for bridge port flags
authorstephen hemminger <shemminger@vyatta.com>
Tue, 13 Nov 2012 07:53:06 +0000 (07:53 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Nov 2012 01:20:44 +0000 (20:20 -0500)
Provide macro to build sysfs data structures and functions
for accessing flag bits.  If flag bits change do netlink
notification.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_sysfs_if.c

index 13b36bdc76a79f19d48ac3ad35b460dfb77e5e8e..f26173d33d8d34b2f080d3afaf75eee55934fbcd 100644 (file)
@@ -34,6 +34,28 @@ const struct brport_attribute brport_attr_##_name = {                \
        .store  = _store,                                       \
 };
 
+#define BRPORT_ATTR_FLAG(_name, _mask)                         \
+static ssize_t show_##_name(struct net_bridge_port *p, char *buf) \
+{                                                              \
+       return sprintf(buf, "%d\n", !!(p->flags & _mask));      \
+}                                                              \
+static int store_##_name(struct net_bridge_port *p, unsigned long v) \
+{                                                              \
+       unsigned long flags = p->flags;                         \
+       if (v)                                                  \
+               flags |= _mask;                                 \
+       else                                                    \
+               flags &= ~_mask;                                \
+       if (flags != p->flags) {                                \
+               p->flags = flags;                               \
+               br_ifinfo_notify(RTM_NEWLINK, p);               \
+       }                                                       \
+       return 0;                                               \
+}                                                              \
+static BRPORT_ATTR(_name, S_IRUGO | S_IWUSR,                   \
+                  show_##_name, store_##_name)
+
+
 static ssize_t show_path_cost(struct net_bridge_port *p, char *buf)
 {
        return sprintf(buf, "%d\n", p->path_cost);
@@ -133,21 +155,7 @@ static int store_flush(struct net_bridge_port *p, unsigned long v)
 }
 static BRPORT_ATTR(flush, S_IWUSR, NULL, store_flush);
 
-static ssize_t show_hairpin_mode(struct net_bridge_port *p, char *buf)
-{
-       int hairpin_mode = (p->flags & BR_HAIRPIN_MODE) ? 1 : 0;
-       return sprintf(buf, "%d\n", hairpin_mode);
-}
-static int store_hairpin_mode(struct net_bridge_port *p, unsigned long v)
-{
-       if (v)
-               p->flags |= BR_HAIRPIN_MODE;
-       else
-               p->flags &= ~BR_HAIRPIN_MODE;
-       return 0;
-}
-static BRPORT_ATTR(hairpin_mode, S_IRUGO | S_IWUSR,
-                  show_hairpin_mode, store_hairpin_mode);
+BRPORT_ATTR_FLAG(hairpin_mode, BR_HAIRPIN_MODE);
 
 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)