role assertion failure is returned to DeviceProvider

Change-Id: Ic5189327c85fa37b3bbfa07d0e285cabae363712
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitch.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitch.java
index 424e63c..24e119c 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitch.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitch.java
@@ -105,4 +105,11 @@
      */
     public void disconnectSwitch();
 
+    /**
+     * Notifies the controller that role assertion has failed.
+     *
+     * @param role the failed role
+     */
+    void returnRoleAssertFailure(RoleState role);
+
 }
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitchListener.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitchListener.java
index c7cc287..53217da 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitchListener.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowSwitchListener.java
@@ -25,4 +25,12 @@
      * @param status the new state of the port.
      */
     public void portChanged(Dpid dpid, OFPortStatus status);
+
+    /**
+     * Notify that a role imposed on a switch failed to take hold.
+     *
+     * @param dpid the switch that failed role assertion
+     * @param role the role imposed by the controller
+     */
+    public void roleAssertFailed(Dpid dpid, RoleState role);
 }
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java
index ae36381..393246b 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java
@@ -213,6 +213,11 @@
     }
 
     @Override
+    public void returnRoleAssertFailure(RoleState role) {
+        this.agent.returnRoleAssertFailed(dpid, role);
+    }
+
+    @Override
     public abstract void startDriverHandshake();
 
     @Override
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/OpenFlowAgent.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/OpenFlowAgent.java
index 1261715..870f10a 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/OpenFlowAgent.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/OpenFlowAgent.java
@@ -2,6 +2,7 @@
 
 import org.onlab.onos.openflow.controller.Dpid;
 import org.onlab.onos.openflow.controller.OpenFlowSwitch;
+import org.onlab.onos.openflow.controller.RoleState;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 
 /**
@@ -74,4 +75,12 @@
      * @param m the message to process
      */
     public void processMessage(Dpid dpid, OFMessage m);
+
+    /**
+     * Notifies the controller that role assertion has failed.
+     *
+     * @param dpid the switch that failed role assertion
+     * @param role the failed role
+     */
+    public void returnRoleAssertFailed(Dpid dpid, RoleState role);
 }