master/module.c
branchredundancy
changeset 2156 71425e6120d8
parent 2129 78efdac9ee87
child 2159 72ac85ee3729
--- a/master/module.c	Wed Nov 09 09:55:58 2011 +0100
+++ b/master/module.c	Wed Nov 09 12:05:44 2011 +0100
@@ -467,34 +467,43 @@
 
     for (i = 0; i < master_count; i++) {
         master = &masters[i];
+        ec_mac_print(net_dev->dev_addr, str);
 
         down(&master->device_sem);
-        if (master->main_device.dev) { // master already has a device
-            up(&master->device_sem);
-            continue;
-        }
-            
-        if (ec_mac_equal(master->main_mac, net_dev->dev_addr)
-                || ec_mac_is_broadcast(master->main_mac)) {
-            ec_mac_print(net_dev->dev_addr, str);
-            EC_INFO("Accepting device %s for master %u.\n",
+
+        if (!master->main_device.dev
+                && (ec_mac_equal(master->main_mac, net_dev->dev_addr)
+                    || ec_mac_is_broadcast(master->main_mac))) {
+
+            EC_INFO("Accepting %s as main device for master %u.\n",
                     str, master->index);
 
             ec_device_attach(&master->main_device, net_dev, poll, module);
             up(&master->device_sem);
-            
+
             snprintf(net_dev->name, IFNAMSIZ, "ec%u", master->index);
 
             return &master->main_device; // offer accepted
-        }
-        else {
+
+        } else if (!master->backup_device.dev
+                && ec_mac_equal(master->backup_mac, net_dev->dev_addr)) {
+
+            EC_INFO("Accepting %s as backup device for master %u.\n",
+                    str, master->index);
+
+            ec_device_attach(&master->backup_device, net_dev, poll,
+                    module);
             up(&master->device_sem);
 
-            if (master->debug_level) {
-                ec_mac_print(net_dev->dev_addr, str);
-                EC_MASTER_DBG(master, 0, "Master declined device %s.\n",
-                        str);
-            }
+            snprintf(net_dev->name, IFNAMSIZ, "ecb%u", master->index);
+
+            return &master->backup_device; // offer accepted
+
+        } else {
+
+            up(&master->device_sem);
+
+            EC_MASTER_DBG(master, 1, "Master declined device %s.\n", str);
         }
     }