drivers: replace NIPQUAD()
[safe/jmp/linux-2.6] / drivers / net / bonding / bond_sysfs.c
index 08f3d39..296a865 100644 (file)
@@ -50,9 +50,9 @@ extern struct bond_parm_tbl bond_mode_tbl[];
 extern struct bond_parm_tbl bond_lacp_tbl[];
 extern struct bond_parm_tbl xmit_hashtype_tbl[];
 extern struct bond_parm_tbl arp_validate_tbl[];
+extern struct bond_parm_tbl fail_over_mac_tbl[];
 
 static int expected_refcount = -1;
-static struct class *netdev_class;
 /*--------------------------- Data Structures -----------------------------*/
 
 /* Bonding sysfs lock.  Why can't we just use the subsystem lock?
@@ -111,7 +111,6 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
        char *ifname;
        int rv, res = count;
        struct bonding *bond;
-       struct bonding *nxt;
 
        sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
        ifname = command + 1;
@@ -122,7 +121,7 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
        if (command[0] == '+') {
                printk(KERN_INFO DRV_NAME
                        ": %s is being created...\n", ifname);
-               rv = bond_create(ifname, &bonding_defaults, &bond);
+               rv = bond_create(ifname, &bonding_defaults);
                if (rv) {
                        printk(KERN_INFO DRV_NAME ": Bond creation failed.\n");
                        res = rv;
@@ -134,7 +133,7 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
                rtnl_lock();
                down_write(&bonding_rwsem);
 
-               list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
+               list_for_each_entry(bond, &bond_dev_list, bond_list)
                        if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
                                /* check the ref count on the bond's kobject.
                                 * If it's > expected, then there's a file open,
@@ -351,9 +350,6 @@ static ssize_t bonding_store_slaves(struct device *d,
                if (dev) {
                        printk(KERN_INFO DRV_NAME ": %s: Removing slave %s\n",
                                bond->dev->name, dev->name);
-                       if (bond->setup_by_slave)
-                               res = bond_release_and_destroy(bond->dev, dev);
-                       else
                                res = bond_release(bond->dev, dev);
                        if (res) {
                                ret = res;
@@ -548,42 +544,37 @@ static ssize_t bonding_show_fail_over_mac(struct device *d, struct device_attrib
 {
        struct bonding *bond = to_bond(d);
 
-       return sprintf(buf, "%d\n", bond->params.fail_over_mac) + 1;
+       return sprintf(buf, "%s %d\n",
+                      fail_over_mac_tbl[bond->params.fail_over_mac].modename,
+                      bond->params.fail_over_mac);
 }
 
 static ssize_t bonding_store_fail_over_mac(struct device *d, struct device_attribute *attr, const char *buf, size_t count)
 {
        int new_value;
-       int ret = count;
        struct bonding *bond = to_bond(d);
 
        if (bond->slave_cnt != 0) {
                printk(KERN_ERR DRV_NAME
                       ": %s: Can't alter fail_over_mac with slaves in bond.\n",
                       bond->dev->name);
-               ret = -EPERM;
-               goto out;
+               return -EPERM;
        }
 
-       if (sscanf(buf, "%d", &new_value) != 1) {
+       new_value = bond_parse_parm(buf, fail_over_mac_tbl);
+       if (new_value < 0) {
                printk(KERN_ERR DRV_NAME
-                      ": %s: no fail_over_mac value specified.\n",
-                      bond->dev->name);
-               ret = -EINVAL;
-               goto out;
+                      ": %s: Ignoring invalid fail_over_mac value %s.\n",
+                      bond->dev->name, buf);
+               return -EINVAL;
        }
 
-       if ((new_value == 0) || (new_value == 1)) {
-               bond->params.fail_over_mac = new_value;
-               printk(KERN_INFO DRV_NAME ": %s: Setting fail_over_mac to %d.\n",
-                      bond->dev->name, new_value);
-       } else {
-               printk(KERN_INFO DRV_NAME
-                      ": %s: Ignoring invalid fail_over_mac value %d.\n",
-                      bond->dev->name, new_value);
-       }
-out:
-       return ret;
+       bond->params.fail_over_mac = new_value;
+       printk(KERN_INFO DRV_NAME ": %s: Setting fail_over_mac to %s (%d).\n",
+              bond->dev->name, fail_over_mac_tbl[new_value].modename,
+              new_value);
+
+       return count;
 }
 
 static DEVICE_ATTR(fail_over_mac, S_IRUGO | S_IWUSR, bonding_show_fail_over_mac, bonding_store_fail_over_mac);
@@ -681,8 +672,8 @@ static ssize_t bonding_show_arp_targets(struct device *d,
 
        for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
                if (bond->params.arp_targets[i])
-                       res += sprintf(buf + res, "%u.%u.%u.%u ",
-                              NIPQUAD(bond->params.arp_targets[i]));
+                       res += sprintf(buf + res, "%pI4 ",
+                                      &bond->params.arp_targets[i]);
        }
        if (res)
                buf[res-1] = '\n'; /* eat the leftover space */
@@ -704,8 +695,8 @@ static ssize_t bonding_store_arp_targets(struct device *d,
        if (buf[0] == '+') {
                if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
                        printk(KERN_ERR DRV_NAME
-                              ": %s: invalid ARP target %u.%u.%u.%u specified for addition\n",
-                              bond->dev->name, NIPQUAD(newtarget));
+                              ": %s: invalid ARP target %pI4 specified for addition\n",
+                              bond->dev->name, &newtarget);
                        ret = -EINVAL;
                        goto out;
                }
@@ -713,8 +704,8 @@ static ssize_t bonding_store_arp_targets(struct device *d,
                for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
                        if (targets[i] == newtarget) { /* duplicate */
                                printk(KERN_ERR DRV_NAME
-                                      ": %s: ARP target %u.%u.%u.%u is already present\n",
-                                      bond->dev->name, NIPQUAD(newtarget));
+                                      ": %s: ARP target %pI4 is already present\n",
+                                      bond->dev->name, &newtarget);
                                if (done)
                                        targets[i] = 0;
                                ret = -EINVAL;
@@ -722,8 +713,8 @@ static ssize_t bonding_store_arp_targets(struct device *d,
                        }
                        if (targets[i] == 0 && !done) {
                                printk(KERN_INFO DRV_NAME
-                                      ": %s: adding ARP target %d.%d.%d.%d.\n",
-                                      bond->dev->name, NIPQUAD(newtarget));
+                                      ": %s: adding ARP target %pI4.\n",
+                                      bond->dev->name, &newtarget);
                                done = 1;
                                targets[i] = newtarget;
                        }
@@ -740,8 +731,8 @@ static ssize_t bonding_store_arp_targets(struct device *d,
        else if (buf[0] == '-') {
                if ((newtarget == 0) || (newtarget == htonl(INADDR_BROADCAST))) {
                        printk(KERN_ERR DRV_NAME
-                              ": %s: invalid ARP target %d.%d.%d.%d specified for removal\n",
-                              bond->dev->name, NIPQUAD(newtarget));
+                              ": %s: invalid ARP target %pI4 specified for removal\n",
+                              bond->dev->name, &newtarget);
                        ret = -EINVAL;
                        goto out;
                }
@@ -749,16 +740,16 @@ static ssize_t bonding_store_arp_targets(struct device *d,
                for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
                        if (targets[i] == newtarget) {
                                printk(KERN_INFO DRV_NAME
-                                      ": %s: removing ARP target %d.%d.%d.%d.\n",
-                                      bond->dev->name, NIPQUAD(newtarget));
+                                      ": %s: removing ARP target %pI4.\n",
+                                      bond->dev->name, &newtarget);
                                targets[i] = 0;
                                done = 1;
                        }
                }
                if (!done) {
                        printk(KERN_INFO DRV_NAME
-                              ": %s: unable to remove nonexistent ARP target %d.%d.%d.%d.\n",
-                              bond->dev->name, NIPQUAD(newtarget));
+                              ": %s: unable to remove nonexistent ARP target %pI4.\n",
+                              bond->dev->name, &newtarget);
                        ret = -EINVAL;
                        goto out;
                }
@@ -952,6 +943,45 @@ out:
 static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR, bonding_show_lacp, bonding_store_lacp);
 
 /*
+ * Show and set the number of grat ARP to send after a failover event.
+ */
+static ssize_t bonding_show_n_grat_arp(struct device *d,
+                                  struct device_attribute *attr,
+                                  char *buf)
+{
+       struct bonding *bond = to_bond(d);
+
+       return sprintf(buf, "%d\n", bond->params.num_grat_arp);
+}
+
+static ssize_t bonding_store_n_grat_arp(struct device *d,
+                                   struct device_attribute *attr,
+                                   const char *buf, size_t count)
+{
+       int new_value, ret = count;
+       struct bonding *bond = to_bond(d);
+
+       if (sscanf(buf, "%d", &new_value) != 1) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: no num_grat_arp value specified.\n",
+                      bond->dev->name);
+               ret = -EINVAL;
+               goto out;
+       }
+       if (new_value < 0 || new_value > 255) {
+               printk(KERN_ERR DRV_NAME
+                      ": %s: Invalid num_grat_arp value %d not in range 0-255; rejected.\n",
+                      bond->dev->name, new_value);
+               ret = -EINVAL;
+               goto out;
+       } else {
+               bond->params.num_grat_arp = new_value;
+       }
+out:
+       return ret;
+}
+static DEVICE_ATTR(num_grat_arp, S_IRUGO | S_IWUSR, bonding_show_n_grat_arp, bonding_store_n_grat_arp);
+/*
  * Show and set the MII monitor interval.  There are two tricky bits
  * here.  First, if MII monitoring is activated, then we must disable
  * ARP monitoring.  Second, if the timer isn't running, we must
@@ -1361,13 +1391,11 @@ static ssize_t bonding_show_ad_partner_mac(struct device *d,
 {
        int count = 0;
        struct bonding *bond = to_bond(d);
-       DECLARE_MAC_BUF(mac);
 
        if (bond->params.mode == BOND_MODE_8023AD) {
                struct ad_info ad_info;
                if (!bond_3ad_get_active_agg_info(bond, &ad_info)) {
-                       count = sprintf(buf,"%s\n",
-                                       print_mac(mac, ad_info.partner_system));
+                       count = sprintf(buf, "%pM\n", ad_info.partner_system);
                }
        }
 
@@ -1388,6 +1416,7 @@ static struct attribute *per_bond_attrs[] = {
        &dev_attr_updelay.attr,
        &dev_attr_lacp_rate.attr,
        &dev_attr_xmit_hash_policy.attr,
+       &dev_attr_num_grat_arp.attr,
        &dev_attr_miimon.attr,
        &dev_attr_primary.attr,
        &dev_attr_use_carrier.attr,
@@ -1412,19 +1441,9 @@ static struct attribute_group bonding_group = {
  */
 int bond_create_sysfs(void)
 {
-       int ret = 0;
-       struct bonding *firstbond;
-
-       /* get the netdev class pointer */
-       firstbond = container_of(bond_dev_list.next, struct bonding, bond_list);
-       if (!firstbond)
-               return -ENODEV;
+       int ret;
 
-       netdev_class = firstbond->dev->dev.class;
-       if (!netdev_class)
-               return -ENODEV;
-
-       ret = class_create_file(netdev_class, &class_attr_bonding_masters);
+       ret = netdev_class_create_file(&class_attr_bonding_masters);
        /*
         * Permit multiple loads of the module by ignoring failures to
         * create the bonding_masters sysfs file.  Bonding devices
@@ -1443,10 +1462,6 @@ int bond_create_sysfs(void)
                        printk(KERN_ERR
                               "network device named %s already exists in sysfs",
                               class_attr_bonding_masters.attr.name);
-               else {
-                       netdev_class = NULL;
-                       return 0;
-               }
        }
 
        return ret;
@@ -1458,8 +1473,7 @@ int bond_create_sysfs(void)
  */
 void bond_destroy_sysfs(void)
 {
-       if (netdev_class)
-               class_remove_file(netdev_class, &class_attr_bonding_masters);
+       netdev_class_remove_file(&class_attr_bonding_masters);
 }
 
 /*