diff --git a/src/main/java/org/ice4j/ice/ConnectivityCheckServer.java b/src/main/java/org/ice4j/ice/ConnectivityCheckServer.java index fdcaa59e..8d3fa713 100644 --- a/src/main/java/org/ice4j/ice/ConnectivityCheckServer.java +++ b/src/main/java/org/ice4j/ice/ConnectivityCheckServer.java @@ -150,16 +150,10 @@ public void processRequest(StunMessageEvent evt) return; } - //detect role conflicts - if( ( parentAgent.isControlling() - && request.containsAttribute(Attribute.ICE_CONTROLLING)) - || ( ! parentAgent.isControlling() - && request.containsAttribute(Attribute.ICE_CONTROLLED))) - { - if (!repairRoleConflict(evt)) - return; - } - + // Learn the peer reflexive candidate, even if we are going to send a + // role conflict error. This allows us to learn faster, and compensates + // for a buggy peer that doesn't switch roles when it gets a role + // conflict error. long priority = 0; boolean useCandidate = request.containsAttribute(Attribute.USE_CANDIDATE); @@ -177,6 +171,16 @@ public void processRequest(StunMessageEvent evt) evt.getLocalAddress(), priority, remoteUfrag, localUFrag, useCandidate); + //detect role conflicts + if( ( parentAgent.isControlling() + && request.containsAttribute(Attribute.ICE_CONTROLLING)) + || ( ! parentAgent.isControlling() + && request.containsAttribute(Attribute.ICE_CONTROLLED))) + { + if (!repairRoleConflict(evt)) + return; + } + Response response = MessageFactory.createBindingResponse( request, evt.getRemoteAddress());