-static ssize_t show_group_addr(struct class_device *cd, char *buf)
-{
- struct net_bridge *br = to_bridge(cd);
- return sprintf(buf, "%x:%x:%x:%x:%x:%x\n",
- br->group_addr[0], br->group_addr[1],
- br->group_addr[2], br->group_addr[3],
- br->group_addr[4], br->group_addr[5]);
-}
-
-static ssize_t store_group_addr(struct class_device *cd, const char *buf,
- size_t len)
-{
- struct net_bridge *br = to_bridge(cd);
- unsigned new_addr[6];
- int i;
-
- if (!capable(CAP_NET_ADMIN))
- return -EPERM;
-
- if (sscanf(buf, "%x:%x:%x:%x:%x:%x",
- &new_addr[0], &new_addr[1], &new_addr[2],
- &new_addr[3], &new_addr[4], &new_addr[5]) != 6)
- return -EINVAL;
-
- /* Must be 01:80:c2:00:00:0X */
- for (i = 0; i < 5; i++)
- if (new_addr[i] != br_group_address[i])
- return -EINVAL;
-
- if (new_addr[5] & ~0xf)
- return -EINVAL;
-
- if (new_addr[5] == 1 /* 802.3x Pause address */
- || new_addr[5] == 2 /* 802.3ad Slow protocols */
- || new_addr[5] == 3) /* 802.1X PAE address */
- return -EINVAL;
-
- spin_lock_bh(&br->lock);
- for (i = 0; i < 6; i++)
- br->group_addr[i] = new_addr[i];
- spin_unlock_bh(&br->lock);
- return len;
-}
-
-static CLASS_DEVICE_ATTR(group_addr, S_IRUGO | S_IWUSR,
- show_group_addr, store_group_addr);
-
-