From 95542331854773171597bd8e16d54a8b9dec683a Mon Sep 17 00:00:00 2001
From: Shudong Zhou <shudongzhou@gmail.com>
Date: Wed, 30 Jan 2013 21:58:22 -0800
Subject: [PATCH] Send HA role request to switch when master controller gets
 permission error

---
 .../core/internal/Controller.java              | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index ae7f478f7..1716d27e9 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -987,8 +987,22 @@ public class Controller implements IFloodlightProviderService,
                     if (roleChanger.checkFirstPendingRoleRequestXid(
                             sw, error.getXid())) {
                         roleChanger.deliverRoleRequestError(sw, error);
-                    }
-                    else {
+                    } else if (error.getErrorCode() ==
+                            OFErrorType.OFPET_BAD_REQUEST.getValue() &&
+                            error.getErrorType() ==
+                            OFBadRequestCode.OFPBRC_EPERM.ordinal() &&
+                            role.equals(Role.MASTER)) {
+                        // We are the master and the switch returned permission
+                        // error. Send a role change request in case switch set
+                        // the master to someone else.
+                        // Only send if there are no pending requests.
+                        synchronized(roleChanger) {
+                            if (roleChanger.pendingRequestMap.get(sw) == null) {
+                                log.info("Tell switch {} who is the master", sw);
+                                roleChanger.submitRequest(Collections.singleton(sw), role);
+                            }
+                        }
+                    } else {
                         logError(sw, error);
 
                         // allow registered listeners to receive error messages
-- 
GitLab